C ++ / SDL: проблемы с вектором и поверхностью - PullRequest
0 голосов
/ 16 сентября 2011

Вот новейшая проблема, с которой я сталкиваюсь.У меня есть класс под названием «Снаряды», который содержит базовый состав снаряда.Это координаты и изображение, которое он использует.Вот базовая структура:

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

Теперь у меня также есть класс моего героя, который содержит объекты-снаряды в векторе, подобном таковому:

vector projectiles;

У меня есть метод в классе героя, который создает новый снаряд и помещает его в этот вектор следующим образом:

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

, а затем метод рисования, который вызывается приконец моего основного цикла, который делает следующее:

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

У меня такое ощущение, что я неправильно понимаю, как работает поверхностная привязка.Что было бы лучшим способом придать каждому снаряду свою собственную поверхность, чтобы я мог удалить его независимо?

edit: просто чтобы устранить возможную путаницу, я хочу иметь возможность БЕСПЛАТНОповерхности независимо.Освобождение поверхности, как только один снаряд умирает, но другой все еще остается на экране - вот что первоначально вызывало сбои.

1 Ответ

1 голос
/ 16 сентября 2011
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 );
...