Добавлено (09.05.2013, 22:49) --------------------------------------------- Научите пожалуйста правильно загружать и анимировать спрайты. Желательно с кодом-примером. Задача: есть 150 картинок звезды (так называемые "кадры") с разрешением 500х500 и форматом .png, они пронумированы так: "_000.png ... _150.png". Нужно загрузить в игру и отобразить. Я уже делал, работало, но очень пожалел, т.к. пришлось создавать 2 массива по 150 элементов. Кошмар, в общем. Как грамотно всё это дело сделать?
sf::Sprite sprite; sprite.getPosition();Тут возвращается вроде бы vector2f Еще можно вот так sprite.getPosition().x; sprite.getPosition.y; А тут возвращается тип float
ЦитатаSaitei ()
Научите пожалуйста правильно загружать и анимировать спрайты. Желательно с кодом-примером. Задача: есть 150 картинок звезды (так называемые "кадры") с разрешением 500х500 и форматом .png, они пронумированы так: "_000.png ... _150.png". Нужно загрузить в игру и отобразить. Я уже делал, работало, но очень пожалел, т.к. пришлось создавать 2 массива по 150 элементов. Кошмар, в общем. Как грамотно всё это дело сделать?
Вместо массивов можно использовать vector там не нужно будет париться по поводу кол-ва элементов и прочей лабуды.Для удобства делаются классы объектов.Например:
Код
#include <SFML/Graphics.hpp>
class Wall { private: sf::Texture Wall_texture; sf::Sprite wall; public: Wall(sf::String TextureFile,float posX,float posY,int imgX,int imgY,int imgW,int imgH); //Первым аргументом получаем Путь к файлу в котором лежит наша //текстура,координаты X Y с помощью которых мы будем указывать где будем отображать всё это дело,размеры текстуры X Y Ширина Высота. { if(!Wall_texture.loadFromFile(TextureFile))//Загружаем текстуру,если не загрузили выдаём ошибку {
} wall.setTexture(Wall_texture);//Задаём текстуру спрайту wall.setTextureRect(sf::IntRect(imgX,imgY,imgW,imgH))//Задаём необходимый участок отображений текстуры в спрайте wall.setPosition(X,Y);//Задаём позицию спрайту
}
void Draw(sf::RenderWindow &window)//Метод для отображения спрайта { window.draw(wall);//Тут мы рисуем наш спрайт } ~Wall(void) { //Оставим пустым } };
Код
#include <vector> #include <sstream>
ostringstream string_stream; //Объявляем поток вывода строк..Собственно нужен будет нам для загрузки 150 картинок std::vector<Wall*> Wall_List;//Объявляем вектор
//где-то в коде... for(int i = 0;i < 150;i++) { string_stream << '_' << i << ".png";//Тут мы суём всё что нужно в поток,поскольку картинки имеют имена в формате _000-150.png мы будем передавать в поток первым //Символ _ дальше i и только после этого .png дабы всё не спуталось и не было ошибок..Но код еще нужно будет додумать.Именно вот эту часть. Wall_List.push_back(new Wall(string_stream.str(),150,80,10,20,100,100))//Тут знакомый нам конструктор класса Wall который был написан заранее.. //Передаём нужные компоненты..Стоит обратить внимание на первый аргумент мы преобразуем поток вывода в строку тем самым получаем имя файла который будем //загружать }
//где-то в коде вовремя рендера for(int i = 0;i < Wall_List.size();i++) { Wall_List[i]->Draw(window); } //Тут всё просто делаем цикл в котором i бегает по каждому элементу вектора и вызываем метод отрисовки в который передаём наше окно в которое будем рисовать.
Ну вот собственно и всё...Разжевал как смог если что то не понятно пишите попробую объяснить