我正在使用OpenGL编写我的第一个粒子系统,但我被一个无法解释的错误困住了。我的粒子结构的“active”属性是私有的(在调试这个问题时),我有accessor/mutator函数,用于在使用时将打印到控制台(同样用于调试)。
我在粒子结构中构造函数中实例化active=false。在main()方法中,我打印每个粒子的“active”值,并且它们都被设置为true,即使看起来没有调用mutator方法。
我只在由glutIdleFunc()回调函数调用的函数中调用mutator方法,该回调函数直到打印particle.active值的main()中的代码之后才设置。
下面是一些代码,如果它能提供洞察力的话:
struct RainDrop {
private:
bool active;
public:
glm::vec3 position, velocity, color;
float life;
RainDrop():
position(0.0f, 0.0f, 0.0f),
velocity(0.0f),
color(1.0f),
life(0.0f),
active(false)
{ }
void setActive(bool b, std::string caller) {
active = b;
}
bool getActive() {
return active;
}
};
struct Rain {
std::vector<RainDrop*> drops;
Rain() {
drops = std::vector<RainDrop*>();
RainDrop drop;
unsigned int i;
for (i = 0; i < NUM_RAIN_DROPS; i++) {
drop = RainDrop();
drops.push_back(&drop);
}
}
};
int main(int argc, char *argv[])
{
viewer.position.x = 400;
... more viewer setting
// Add all rain to inactive stack
for (unsigned int i = 0; i < NUM_RAIN_DROPS; i++) {
inactiveRain.push(rain.drops[i]);
}
srand(time(NULL));
initGraphics(argc, argv);
glEnable(GL_POINT_SMOOTH);
glutIdleFunc(stepRain);
glutMainLoop();
}
此处:
Rain() {
drops = std::vector<RainDrop*>();
RainDrop drop;
unsigned int i;
for (i = 0; i < NUM_RAIN_DROPS; i++) {
drop = RainDrop();
drops.push_back(&drop);
}
}
将raindrop
分配给局部变量drop
,然后将该局部变量的地址存储在成员向量中。一旦这个构造函数返回,本地的drop
就会消失。它的生命结束了。向量中的指针无效。以后取消引用它会调用未定义的行为。
您很可能希望使用std::vector
。要避免使用原始指针,如果没有理由使用间接级别,向量应该存储对象,而不是指向对象的指针。
我必须承认,我没有完全理解您的问题,但这个问题需要先解决,因为在存在未定义行为的情况下,代码可以做任何事情,也可以什么都不做。