Я работаю над игровым движком SFML (2.5.1-1) в C ++ уже несколько дней, и я застрял на одной и той же проблеме в течение того же промежутка времени ... Проблема в том, что SFMLрисует спрайты, но не каждый из них.И чтобы сделать его еще более странным, каждый раз, когда я перезапускаю исполняемый файл, он ведет себя по-разному (иногда он рисует все спрайты, иногда только половину из них, а иногда ни один из них).Я много пробовал и, похоже, ничего не помогло.Кто-нибудь из вас знает, в чем может быть проблема?
(упрощенная) структура кода:
Где-то при запуске кода все файлы изображений (bmp)считываются в текстуры в классе SpriteMap с некоторыми дополнительными опциями (в качестве размера плиток):
class SpriteMap{
sf::Texture texture;
int sizeX, sizeY;
};
Все SpriteMaps хранятся в std :: map, где ключом является строка (которая являетсяопция читается по коду запуска).При создании анимированных спрайтов индексы для фреймов считываются кодом запуска, записываются в класс Animation и сохраняются в std :: map.
class Animation{
std::string spritemap; // SpriteMap string identifier
std::vector<int> indexX;
std::vector<int> indexY;
std::string getMap(); // Returns spritemap
};
Затем, чтобы объединить оба этих элемента, существует объект Sprite,который содержит объект Sprite SFML, текстура которого задается при создании объекта.Объект спрайта также содержит функцию рисования, которая должна разместить спрайт на экране.Спрайт может быть анимированным или статическим.
class Sprite{
sf::Sprite spr;
bool animated;
// Static sprite
std::string spritemap;
int indexX, indexY;
// Animated sprite
std::string animation
int frame, maxFrames, speed, ticks;
int posX, posY;
void draw(sf::RenderWindow * window);
};
здесь есть функция рисования.'res' - это объект, который сохраняет карты Animation и Sprite с getAnimation и getSpriteMap в качестве функций для получения указателя на объекты (параметр является строковым идентификатором).В функции рисования мозаика устанавливается внутри текстуры, ее положение задается, и, если необходимо, выбирается следующий кадр.
void Sprite::draw(sf::RenderWindow * window){
std::string sprmap = spritemap;
if(animated)
sprmap = res->getAnimation(animation)->getMap();
SpriteMap * m = res->getSpriteMap(sprmap);
int x, y;
if(!animated){
x = indexX*m->sizeX;
y = indexY*m->sizeY;
}else{
Animation * a = res->getAnimation(animation);
x = a->getIndexX(frame)*m->sizeX;
y = a->getIndexY(frame)*m->sizeY;
}
spr.setTextureRect(sf::IntRect(y, x, m->sizeY, m->sizeX));
spr.setPosition(sf::Vector2f(posX, posY));
if(animated && speed!=0){
ticks++;
if(ticks>speed || ticks<0){
frame = (frame+1)%maxFrames;
ticks = 0;
}
}
window->draw(spr);
}
Где-то в программе std :: vector указателей на все объекты спрайта.хранится.Основной цикл программы проходит через все спрайты и рисует их на экране.
Полный код можно найти на github