SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Загрузка анимации для меню.
В этой теме 9 ответов, 3 участника, последнее обновление Bronks 7 года/лет, 2 мес. назад.
-
АвторСообщения
-
Здравствуйте, меня интересует вот такой вопрос: имеется 70 кадров анимации для меню. Как их лучше загрузить и проиграть?
Можно анимацию для каждого элемента меню хранить в строке таблицы тайлсета и проигрывать соответственно пробегая по строке. как в уроке 7 , когда проигрывали анимацию ходьбы игрока.
Боюсь это не сработает, так как анимация отредерена как отдельные картинки в разрешение 720p.
Как я сделал сейчас:
C++12345678910111213141516171819202122//получаем директорию, в которой находится .exe и прибавляем нужные файлы/папкиstring szDirFile(string filename){string sExePath = cExePath;return sExePath + filename;}//преобразовываем int в string с помощью stringstream//и возвращаем название нужного файлаstring szGetImg(int num){stringstream ssNum; ssNum << num;string sNum; ssNum >> sNum;if(num <= 9)return (szDirFile("img/menu_idle/test00000") + sNum + ".png");else if(num > 9 && num < 100)return szDirFile("img/menu_idle/test0000") + sNum + ".png";elsereturn szDirFile("img/menu_idle/test000") + sNum + ".png";}А это код отрисовки:
C++12345678910111213141516171819void menu(RenderWindow & window) {int iFrame = 0;while(isMenu){window.clear(Color(129, 181, 221));Texture menuBackground;menuBackground.loadFromFile(szGetImg(iFrame));Sprite menuBg(menuBackground);window.draw(menuBg);window.display();if(iFrame < 71)iFrame++;elseiFrame = 0;}}Но загружать каждый раз изображение как-то не очень, ведь я прав? Нужно это оптимизировать…
Как вариант: сперва загрузить всё в динамический массив, а потом уже покадрово отрисовывать всё.
Попробуй использовать вот такой способ.
C++1234567891011121314151617#pragma once#include<SFML\Graphics.hpp>typedef sf::Texture png;class Texture{public:png menu[71];Texture(void);~Texture(void);private:inline void Load(png& t, sf::String file);inline void LoadSmoth(png& t, sf::String file);};C++1234567891011121314151617181920212223242526#include "Texture.h"Texture::Texture(void){for(int i = 0; i < 71; i++){std::string c;c = std::to_string((int)i);Load(menu[i], "menu"+c+".png");}}inline void Texture::LoadSmoth(png& t, sf::String file){t.loadFromFile("Texture/"+file);t.setSmooth(true);}inline void Texture::Load(png& t, sf::String file){t.loadFromFile("Texture/"+file);}Texture::~Texture(void){}C++1234567891011121314151617void menu(RenderWindow & window) {Texture texture;int iFrame = 0;Sprite menuBg;while(isMenu){window.clear(Color(129, 181, 221));window.draw(menuBg);window.display();if(iFrame < 71)menuBg.setTexture(texture.menu[iFrame]);elseiFrame = 0;}}Большое спасибо, Heisenberg!
Палец вверх лучшее спасибо)
Есть еще один вопрос. Как можно ускорить ваш код, Heisenberg?
Имеется всего 155 картинок с анимацией, но уж больно долго они подгружаются. Может конечно потому что внутри конструктора, а не чисто в DrawMenu. Есть идеи по ускорению загрузки? Может быть попробовать несколько потоков?Нет от того что загрузка происходит в конструкторе ничего не меняет.
Просто у вас текстуры не маленькие и их количество тоже не пара штук.Для этого реализуют загрузку внутри игрового процесса.
Загружают текстуры и звуки по ситуации, то есть те, которые будут использоваться в данном уровне, или к примеру в главном меню.
Многопоточность должна ускорить загрузку, но с ней я вам не могу помочь.Heisenberg, собственно проблему я решил иначе. Раньше я рендерил image sequence в .png, а теперь в .jpeg. Вес уменьшился в 10 раз (раньше каждая по ~700-800 весила, теперь ~70-80).
В общем большое спасибо за помощь, потом, возможно, попробую с потоками.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.