Я пишу простой граф сцены, содержащий некоторые объекты, чтобы я мог контролировать рендеринг и рисование этих объектов в OpenGL. У меня есть два класса, один из которых называется GameObject, который определяет объекты с определенными параметрами, такими как положение и скорость, а также способ рисования объекта. У него есть метод update (), который используется для расчета любого изменения положения, а затем вызывает метод draw () для рисования на экране.
Другой класс называется sceneNode. Этот класс управляет структурой данных, которую я использую для хранения объектов. Этот экземпляр этого класса содержит указатель на экземпляр GameObject, позволяющий мне получить доступ к данным, а у sceneNode есть дети типа sceneNode, хранящиеся в векторе.
Каждый класс отлично работает самостоятельно. Я могу добавить детей в граф сцены и т.д., и я могу создать GameObject и сказать ему, чтобы он рисовал сам, и все работает как положено.
Затем я добавил новый метод в sceneNode, который называется render (), этот метод получает указатель на gameObject и вызывает его функцию обновления перед вызовом render () для любого дочернего элемента узла.
Проблема в том, что метод update () вызывается, и GameObject рисуется, но он всегда рисуется в одном и том же месте и не перемещается, несмотря на скорость и изменение положения. Вызов функции update () с использованием экземпляра GameObject ОТОБРАЖАЕТ рисовать объект и перемещать объект по экрану. Я часами смотрю на этот код и не вижу, что мне не хватает. Я все еще плохо знаком с идеей указателей и вызовов методов из другого класса, поэтому, возможно, я упустил что-то очевидное.
Вот соответствующие методы:
GameObject.cpp:
Переменные положения, скорости и т. Д. Указаны как защищенные.
void GameObject::update(){
for (int i = 0; i<3;i++){
this->velocity[i] +=this->acceleration[i];
}
this->position[0] += this->velocity[0];
this->position[1] += this->velocity[1];
this->position[2] += this->velocity[2];
this->draw();
}
void GameObject::draw() {
glTranslatef(this->position[0], this->position[1], this->position[2]);
glBegin(GL_TRIANGLES);
for (int i = 0; i < this->num_tris; i++) {
for (int j = 0; j <3 ; j++) {
glVertex3fv(vertices[triangles[i].INDEXES[j]]);
}
}
glEnd();
}
sceneNode.cpp:
void sceneNode::render(){
GameObject *go = new GameObject();
go = this->data;
//data is the name of the variable storing a pointer to a GameObject
go->update();
//update() is a method that redraws the object and calc's new position etc
if (hasChildren()) { //if this node has children, render all of them aswell...
for (int i = 0; i< this->node_tree.size(); i++) {
this->node_tree.at(i).render();
}
}
sceneNode.h:
Вот как указатель GameObject устанавливается в sceneNode
Protected:
GameObject* data;
Я заблудился, почему позиция не меняется для метода render (), а для метода update (), поскольку они оба вызывают одну и ту же вещь?
Спасибо за любую помощь