Цитата Saitei (
)
а как тогда узнать координаты игрока?
Код
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 бегает по каждому элементу вектора и вызываем метод отрисовки в который передаём наше окно в которое будем рисовать.
Ну вот собственно и всё...Разжевал как смог если что то не понятно пишите попробую объяснить