从另一个类调用时类中方法的问题

时间:2010-02-20 15:53:07

标签: c++ opengl pointers scenegraph

我正在编写一个简单的场景图来保存一些对象,这样我就可以在OpenGL中控制这些对象的渲染和绘制。我有两个类,一个名为GameObject,它定义具有某些参数的对象,如位置和速度,以及如何绘制对象。它有一个名为update()的方法,用于计算位置的任何变化,然后调用draw()将自己绘制到屏幕上。

另一个类叫做sceneNode。该类控制用于存储对象的数据结构。这个类的一个实例包含一个指向GameObject实例的指针,允许我访问数据,一个sceneNode具有存储在向量中的类型为sceneNode的子节点。

每个班级都能很好地完成自己的工作。我可以将子项添加到场景图等中,我可以创建一个GameObject并告诉它绘制自己,一切都按预期工作。

然后我向sceneNode添加了一个名为render()的新方法,此方法获取指向gameObject的指针,并在对节点的任何子节点上调用render()之前调用它的更新函数。

问题是:调用update()方法并绘制GameObject,但它总是在同一个地方绘制,尽管速度和位置发生了变化但仍然不会移动。通过使用GameObject DOES实例调用update()函数绘制对象并在屏幕上移动对象。我一直盯着这段代码几个小时,看不出我错过了什么。对于指针和从另一个类调用方法的想法,我仍然相当新,所以我可能错过了一些明显的东西。

以下是相关方法:

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: 这就是在sceneNode中设置GameObject指针的方法

Protected:
GameObject* data;

我很遗憾为什么这个位置没有为render()方法改变,但是对于update()方法,因为它们都调用同样的东西?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这里有一些大问题。

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

您正在创建一个新对象,然后您忘记了该对象的指针。每次调用render时都会发生这种情况,所以你有大量的内存,你没有使用,随着时间的推移而增长。你可以说:

GameObject *go = NULL;

创建指针而不向其分配数据。

你也可以在任何地方省略this-&gt; foo。它隐含在所有课程中。

所以虽然我在这段代码中看不到错误,但很可能在其他地方,因为你用上面的指针犯了错误。你可能有指针指向你没有绘制的东西。如果你查看正在更新的内容的内存地址和render()中正在更新的内容的内存地址,它们实际上可能是不同的。如果他们那么你知道你没有在你正在绘制的相同的东西上调用更新。要获取内存地址,请在函数调用中查看“this”的值。写下来并确保它们与您绘制的对象相同。该错误不在此代码中。

答案 1 :(得分:0)

在SceneNode中,当您指定此 - &gt;要去的数据,你实际上是设置为null!拿出那个作业或者这样做 - &gt; data = new GameObject()而不是go。