我正在使用openGL和c ++制作一个小行星游戏。
我遇到了一个问题,现在将尝试描述。

我有一个带有变量和方法的小行星类。它具有用于设置小行星当前位置的创建方法和用于随机更改小行星位置的绘制方法。

当我尝试在我的主班上使用这颗小行星时,它工作正常。它可以移动并完成我想要的所有操作。

然后,我为小行星生成器创建了一个类,该类创建了一个小行星列表,并且我还有一个方法可以初始化列表中每个元素的draw方法。但是当我运行它时,小行星不会移动。我使用Visual Studio遍历了代码,发现在小行星的draw方法中,值已正确更改,但是当再次发生绘制时,位置会重置为原始值,因此它不会移动。这可能与c ++在每种方法之后转储内存有关,因此我相信Im会弄乱指针。如果您能发现我的错误,我将不胜感激!

我添加了头文件和方法来显示Im如何使用小行星生成器。

小行星Gen.h

#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();
    }
}


小行星

#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


Main.cpp

初始化一次

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();
}


谢谢。

最佳答案

问题是listAsteroids持有小行星,而不是指向小行星的指针。通过将std::list<Asteroid> listAsteroids;更改为std::list<Asteroid*> listAsteroids;而不是Asteroid temp;执行Asteroid* temp = new Asteroid进行修复。

您的实际问题是在for循环中引起的。 for each (Asteroid c in listAsteroids)在这里,您将获得每个小行星实例的按值复制为Asteroid c,然后将其更改,并且不会更改实际实例。再次在此处使用Asteroid* c,这样您将获得一个指向实际实例的指针。

这样,您的列表将包含指向小行星实际实例的指针,而不是按值复制实例(这会导致对临时对象的那些临时更改)

除了解决问题外,还可以节省时间和资源。例如,如果您曾经使用列表作为函数中的参数,则复制指针比复制值要快得多。只要记住使用->而不是.

09-28 02:32