luismrsilva / cg-micromachines

3D version of the first MicroMachines game, made for the Computer Graphics course (2015/2016) at IST, CS BSc
1 stars 0 forks source link

Inconsistência entre funções que alteram Vector3 #16

Closed luismrsilva closed 9 years ago

luismrsilva commented 9 years ago

Por exemplo: em Entity, get e set position recebem um ponteiro para Vector3 mas em DynamicObject get e setSpeed recebem um Vector3 .

Isto dificulta imenso as contas que têm de ser realizadas com Vector3. Atualmente, isto verifica-se quando o GameManager atualiza a _movingCamera.

nuno-silva commented 9 years ago

Em C++, devem usar referência e não ponteiros (referência vs ponteiros). Para além disso, quando passam um objeto a uma função devem usar referência. Por exemplo,

Vector3 Vector3::operator=(const Vector3 & vec) {
    _x = vec.getX();
    _y = vec.getY();
    _z = vec.getZ();

    return *this;
}

Tal como quando usam ponteiros, isto evita que vec seja copiado para o stack quando a função é chamada. Para além disso, não se esqueçam de usar const quando o objeto que estão a passar não será modificado.

A keyword const também pode ser usada para dizer que um método de uma classe não altera a instância da classe. Por exemplo

 Vector3 Vector3::operator*(GLdouble num) const {
    return Vector3(getX() * num, getY() * num, getZ() * num);
}

diz ao compilador que, sendo a um Vector3, a * 5 não modifica o objeto a.

Mais um exemplo:

void DynamicObject::setOrientation(const Vector3 & orientation) {
    _orientation = orientation.normalized();
    _angleZ = _orientation.angleBetweenZ( _initOrientation );
}
luismrsilva commented 9 years ago

Meti os argumentos de setPosition() e setCenter(), por exemplo, como referências. Também coloquei const quando relevante. getSpeed() e getPosition() continuam inconsistentes, mas o problema está resolvido.