Проблема с методом в классе при вызове из другого класса - PullRequest
0 голосов
/ 20 февраля 2010

Я пишу простой граф сцены, содержащий некоторые объекты, чтобы я мог контролировать рендеринг и рисование этих объектов в 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 (), поскольку они оба вызывают одну и ту же вещь?

Спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 20 февраля 2010

Здесь есть большие проблемы.

GameObject *go = new GameObject();
go = this->data;

Вы создаете новый объект, а затем вы забываете указатель на этот объект. Это происходит каждый раз, когда вы вызываете рендер, поэтому у вас есть тонны памяти, которые вы не используете, которые со временем растут. Вы можете просто сказать:

GameObject *go = NULL;

для создания указателя без выделения ему данных.

Вы также можете опустить this-> foo везде. Это подразумевается во всех классах.

Так что, хотя я не вижу ошибки в этом коде, скорее всего, она есть в другом месте, так как вы делаете ошибки с указателями, как указано выше. Возможно, у вас есть указатели, указывающие на то, что вы не рисуете. Если вы посмотрите на адреса памяти вещей, которые обновляются, и адреса памяти вещей, которые обновляются в render (), они могут фактически отличаться. Если это так, то вы знаете, что вы не вызываете update для тех же самых вещей, которые вы рисуете. Чтобы получить адрес памяти, посмотрите на значение this в вызове функции. Запишите их и убедитесь, что они совпадают с объектами, которые вы рисуете. Ошибка не в этом коде.

0 голосов
/ 20 февраля 2010

В SceneNode, когда вы назначаете this-> data для перехода, вы фактически устанавливаете go в null! уберите это назначение или сделайте это-> data = new GameObject () вместо использования go.

...