Вот новейшая проблема, с которой я сталкиваюсь.У меня есть класс под названием «Снаряды», который содержит базовый состав снаряда.Это координаты и изображение, которое он использует.Вот базовая структура:
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: просто чтобы устранить возможную путаницу, я хочу иметь возможность БЕСПЛАТНОповерхности независимо.Освобождение поверхности, как только один снаряд умирает, но другой все еще остается на экране - вот что первоначально вызывало сбои.