变量在对象列表中不会更改 我用OpenGL和C++做了一个小行星游戏。 我遇到了一个问题,现在我将试着描述一下
我有一个小行星的类,它有变量和方法。它有一个设置小行星当前位置的创建方法和一个用于随机更改小行星位置的绘制方法 当我试着在我的主课上使用这颗小行星时,效果很好。它移动,做我想做的一切 然后,我为一个小行星生成器创建了一个类,它创建了一个小行星列表,我还有一个方法可以初始化列表中每个元素的draw方法。但当我运行它时,小行星不会移动。我使用visual studio对代码进行了一步检查,发现在小行星的draw方法中,值已正确更改,但当再次绘制时,位置将重置回其原始值,因此它不会移动。它可能与每种方法之后的C++抛出内存有关,所以我相信我用指针搞乱了。如果你能帮我发现我的错误,我将不胜感激 我添加了头文件和方法来显示我是如何使用我的小行星生成器的 第h代变量在对象列表中不会更改 我用OpenGL和C++做了一个小行星游戏。 我遇到了一个问题,现在我将试着描述一下,c++,list,class,draw,C++,List,Class,Draw,我有一个小行星的类,它有变量和方法。它有一个设置小行星当前位置的创建方法和一个用于随机更改小行星位置的绘制方法 当我试着在我的主课上使用这颗小行星时,效果很好。它移动,做我想做的一切 然后,我为一个小行星生成器创建了一个类,它创建了一个小行星列表,我还有一个方法可以初始化列表中每个元素的draw方法。但当我运行它时,小行星不会移动。我使用visual studio对代码进行了一步检查,发现在小行星的draw方法中,值已正确更改,但当再次绘制时,位置将重置回其原始值,因此它不会移动。它可能与每种方
#ifndef ASTEROIDGEN_H
#define ASTEROIDGEN_H
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h> // for timeGetTime()
#include <mmsystem.h> // ditto
#include <iostream> // I/O
#include "model3DS.h"
#include "Camera.h"
#include <glut.h> // for gluPerspective & gluLookAt
#include <List>
#include "asteroid.h"
#include "position.h"
class AsteroidGen{
public:
std::list<Asteroid> listAsteroids;
void AsteroidGen::generateAsteroid(int amount, int delet);
void AsteroidGen::DrawAsteroids();
};
#endif // ASTEROIDGEN_H
每帧绘制方法
asteroidgen.DrawAsteroids();
编辑:
谢谢。这只是一个猜测,但您的Astroid类的复制构造函数是否可能无法正确使用OpenGL?我注意到在generate方法中,您在堆栈上创建了一个新的astroid,调用create()函数,然后将其推送到列表中。在那个时候,列表中有一个创建的星体的副本,而不是一个叫做temp的副本。我会亲自在堆上创建一个星象,然后让列表成为指向星象的指针列表。只要你记得做所有适当的内存清理,这可能会有所帮助。让我知道这是不是很接近 我认为问题在于“for each”循环;它似乎是在按值迭代列表,因此获取列表中每个小行星的副本,然后在其Draw方法中进行修改,但这些修改会丢失,因为它只是一个副本 但我不能完全确定,因为这是非标准语法;就我所看到的,这是一些奇怪的Visual C++扩展。标准的书写方式是:
for (Asteroid& asteroid : listAsteroids) {
asteroid.Draw();
}
因为这是一个参考,所以更改应该保持不变。问题是
列出小行星
持有小行星,而不是指向小行星的指针。通过更改std::list list小行星来修复它代码>到<代码>标准::列出小行星列表代码>而不是小行星温度代码>do小行星*temp=新小行星
您的实际问题是由for循环引起的对于每个小行星(listAsteroids中的小行星c)
在这里,您可以通过值获得每个小行星实例的副本,即Asteroid c
,该副本随后会更改,而不会更改实际实例。在这里再次使用Asteroid*c
,这样您就可以得到一个指向实际实例的指针
通过这种方式,您的列表包含指向小行星实际实例的指针,而不是按值复制实例(这会导致对临时对象进行临时更改)
除了解决你的问题,这节省了时间和资源;例如,如果将列表用作函数中的参数,那么复制指针比复制值要快得多。只要记住使用->
而不是那些不应该编译的
,为什么要在类中使用作用域操作符:
?Draw()中的代码是什么?当我们看不到你如何实际更新职位时,很难提供帮助。对不起,我添加了draw方法。我不认为这是问题所在,但我想可能是。是的,我用了一种有点奇怪的方式,但我不知道如何用其他方式来做:(我对指针的使用非常糟糕。它确实会在随机位置创建随机生成的小行星。它们只是不移动,因为每次平局都会重置位置()这个语法似乎没有被认可。我猜你的Visual C++版本不支持C++ 0x?那完全可以。我知道这是指针的问题。我很困惑。非常感谢。我知道新一代的指针和引用会多么令人沮丧,它们是我至今为止最难学习的C++部分。但是继续编码,你最终会习惯的!
asteroidgen.generateAsteroid(1, false);
asteroidgen.DrawAsteroids();
void Asteroid::Draw(){
pos.z += asteroidSpeed;
pos.y += incY;
pos.x += incX;
rotation += 1;
glPushMatrix();
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(rotation, 1, 1, 1);
glBindTexture(GL_TEXTURE_2D,textureId);
glCallList(list);
glPopMatrix();
}
for (Asteroid& asteroid : listAsteroids) {
asteroid.Draw();
}