我正在使用 openGL 和 c++ 制作一个小行星游戏。我遇到了一个问题,我现在将尝试描述。
我有一个小行星类,它有变量和方法。它有一个 create 方法来设置小行星的当前位置,还有一个 draw 方法用来随机改变小行星的位置。
当我尝试在我的主课中使用这颗小行星时,它工作正常。它会移动并做我想做的一切。
然后,我为创建小行星列表的 Asteroid Generator 创建了一个类,并且我还有一个方法可以初始化列表中每个元素的 draw 方法。但是当我运行它时,小行星并没有移动。我使用visual studio完成了我的代码,我发现在小行星的draw方法中值被正确更改,但是当再次绘制时,位置被重置回原来的值,所以它不会移动. 这可能与每个方法之后的 c++ 转储内存有关,所以我相信我搞砸了指针。如果您能帮我发现我的错误,我将不胜感激!
我添加了头文件和方法来展示我如何使用我的小行星生成器。
小行星生成器
#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.cpp
#include "asteroidgen.h"
void AsteroidGen::generateAsteroid(int amount, int delet){
if (delet == true)
listAsteroids.clear();
for (int i = 0; i < amount; i++)
{
Asteroid temp;
temp.Create();
listAsteroids.push_front(temp);
}
}
void AsteroidGen::DrawAsteroids(){
for each (Asteroid c in listAsteroids){
c.Draw();
}
}
小行星.h
#ifndef ASTEROID_H
#define ASTEROID_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 "position.h"
#include <glut.h> // for gluPerspective & gluLookAt
#include <cmath>
#include "textureTGA.h"
class Asteroid{
public:
GLuint textureId;
GLuint list;
Position pos;
float incX;
float incY;
float asteroidSpeed;
float radio;
float rotation;
bool status;
void Asteroid::GenSphere();
void Asteroid::Reset();
void Asteroid::Draw();
void Asteroid::Create();
};
#endif // ASTEROID_H
主文件
初始化一次
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();
}
谢谢你。