SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Работа со временем, сильно тормозит приложение
В этой теме 7 ответов, 2 участника, последнее обновление Heisenberg 9 года/лет назад.
-
АвторСообщения
-
Раньше не было замечено за приложениями такого. Персонаж ужасно тормозит, будет бегать, только если поставить делитель времени на 45
C++12345Clock clock;float time;time = clock.GetAlapsedTime().asMicroSeconds();clock.restart();time=time/45;торомоза, только при использовании анимации из класса с ф-ей control( )
C++12345678910111213141516171819202122232425262728293031Control(float time){if ((Keyboard::isKeyPressed(Keyboard::W))||(Keyboard::isKeyPressed(Keyboard::Up)))//Идем вверх{H_DIR = 0; H_SPEED = 0.2;CurrentFrame += 0.009 * time;if (CurrentFrame > 3) CurrentFrame -= 3;sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 97, 30, 32));}if ((Keyboard::isKeyPressed(Keyboard::S)) || (Keyboard::isKeyPressed(Keyboard::Down)))//Вниз{H_DIR = 1; H_SPEED = 0.2;CurrentFrame += 0.009 * time;if (CurrentFrame > 3) CurrentFrame -= 3;sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 0, 30, 32));}if ((Keyboard::isKeyPressed(Keyboard::A)) || (Keyboard::isKeyPressed(Keyboard::Left)))//Влево{H_DIR = 2; H_SPEED = 0.2;CurrentFrame += 0.009 * time;if (CurrentFrame > 3) CurrentFrame -= 3;sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 33, 30, 32));}if ((Keyboard::isKeyPressed(Keyboard::D)) || (Keyboard::isKeyPressed(Keyboard::Right)))//Вправо{H_DIR = 3; H_SPEED = 0.2;CurrentFrame += 0.009 * time;if (CurrentFrame > 3) CurrentFrame -= 3;sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 65, 30, 32));}}Время задаю в ф-ии int main( ), как было в уроках.
Попробуй вынести
C++1sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 97, 30, 32));из условия нажатия клавиши
И меняй анимацию вот таким условием
C++1234if(H_DIR == 0) // За пределами if(клавиша нажата){sprite.setTextureRect(IntRect(int(CurrentFrame) * 30, 97, 30, 32));}Нет, все по-прежнему .Пытался и вовсе без анимации запускать, убирая ее, ничего не меняется. При использовании того же кода анимации, без класса, записывая структурно, как в уроке 7, хорошо работает анимация, ничего не виснет. Похоже дело не в самой анимации, а в классе, надо как-то по-другому время ему передавать. Я же это делал через метод “update(float time)”
C++123456789101112131415update(float time){Control(time);switch (H_DIR){case 0: dx = 0; dy = -H_SPEED; break;//вверхcase 1: dx = 0; dy = H_SPEED; break;//винзcase 2: dx = -H_SPEED; dy = 0; break;//влевоcase 3: dx = H_SPEED; dy = 0; break;//вправо}H_SPEED = 0;x += dx*time; y += dy*time;sprite.setPosition(x, y);}, когда вызывал его в в ф-ии int main( ), в цикле while(window.isOpen()), передавал переменную времени.
А ты нигде не применяешь?
C++1window.setFramerateLimit(60)?Проверь, возможно дело в твоём присвоении времени.
Посмотри на скрин, поймёшь о чём я говорю.
Сейчас тестировал.Вложения:
You must be logged in to view attached files.window.setFramerateLimit(60) не применял, если честно, то даже не слышал об этой функции) Извини, не совсем понял про присвоение.
Да уже не обращай внимания, там мой косяк.
Вывед время в консоль, что оно показывает, сколько берёт за еденицу времени. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.