C ++ / SDL:向量/表面问题

时间:2011-09-15 22:14:27

标签: c++ sdl access-violation

这是我遇到的最新问题。我有一个名为Projectiles的类,它拥有射弹的基本构成。它的坐标和它使用的图像。这是基本结构:

class Projectile
{
    private:
        void load();

    public:
        SDL_Surface *surface;
        SDL_Surface* returnSurface()
        {
            return surface;
        }

        Projectile( int );
        void coordinates( int, int );

        int type;
        int width, height;

        int positionX, positionY;

        bool alive;
};

Projectile::Projectile( int type )
{
    type = 1;
    alive = true;
    width  = 83;
    height = 46;
}

void Projectile::load()
{
    SDL_Surface* loadedImage = NULL;

    loadedImage = IMG_Load( "hero.png" );
    surface = SDL_DisplayFormat( loadedImage );

    SDL_FreeSurface( loadedImage );
}

void Projectile::coordinates( int x, int y )
{
    positionX = x;
    positionY = y;
}

现在,我还有我的英雄级别,它将射弹物体保存在这样的矢量中:

  

矢量&lt; <弹丸>射弹;

我在英雄类中有一个方法可以制作一个新的射弹并将其推入这个矢量中:

void Hero::newProjectile( int type )
{
    projectiles.push_back( Projectile( type ) );
    projectileCount++;
}

然后是一个draw方法,在我的主循环的最后调用,它执行以下操作:

void Hero::drawProjectileState( SDL_Surface* destination )
{   
    for( int i = 0; i < projectileCount; i++ )
    {
        SDL_Rect offset;
        offset.x = positionX;
        offset.y = positionY;
        SDL_BlitSurface( projectiles[i].returnSurface(), NULL, destination, &offset );
    }
}
从概念上讲,我认为这样可以正常工作。最初我的射弹类在其自己的向量中保存了所有射弹坐标,但是当我想删除它们时遇到了一个问题。由于它们都使用了相同的表面资源,因此在屏幕上删除一个而另一个表面资源会导致游戏崩溃。我认为这可以解决问题(每个都有自己的表面资源),但我得到了

  

访问冲突读取位置0xccccccf8。

当它试图在下面绘制射弹时:

SDL_BlitSurface( projectiles[i].returnSurface(), NULL, destination, &offset );

我有一种感觉,我误解了表面参考的工作方式。什么是给每个射弹自己的表面最好的方法,以便我可以独立删除它们?

编辑:为了清除可能的混淆,我希望能够独立地释放曲面。一旦一个射弹死亡,一个表面释放,但另一个仍然在屏幕上是最初导致崩溃的原因。

1 个答案:

答案 0 :(得分:1)

Projectile::Projectile( int type )
{
    type = 1;
    alive = true;
    width  = 83;
    height = 46;
}

void Hero::newProjectile( int type )
{
    projectiles.push_back( Projectile( type ) );
    projectileCount++;
}

在上面的代码中,您从未加载过曲面。您甚至从未初始化surface,因此它指向空间,因此当您执行此操作时drawProjectileState中的访问冲突:

SDL_BlitSurface( projectiles[i].returnSurface(), NULL, destination, &offset );