Урок 6 SFML. Работа со временем – обязательная часть SFML

В прошлом уроке научились двигать героя с помощью клавиатуры. Но как то он “подлагивает”, вам не кажется ? :-) А всё потому, 

что окно SFML в данном случае зависит от процессора. Если он не загружен – скорость движения героя быстрая, в противном случае – медленная. Если запустить на мощной машине – всё будет летать слишком быстро, а на слабой – жутко тормозить. Даже если сейчас вы расширите или развернете окно – вы увидите увеличение “торможения”, оно пропорционально размеру окна. Нас такой вариант конечно же не устраивает и для этого в sfml есть “время”.

Итак, время – бесконечный таймер, который работает, пока открыто окно sfml.

Это тот период времени, который проходит между двумя событиями. Задаётся в микросекундах , миллисекундах и секундах.

Вверху три переменных времени и все они равны по значению. (Мы будем использовать микросекунды. ) Время так же можно конвертировать с микросекунд в секунды, производить сравнения, сложение и другие операции.




Вобще говоря, наша задача сейчас использовать время именно в базовом смысле,без которого наша sfml игра просто не может существовать корректно и без глюков, зависящих от нагруженности или мощности процессора.

Если что то не понятно, просто запомните для себя – время обновляет (именно обновляет) игровую логику игры и само оно так же постоянно обновляется (а если быть точнее перезапускается) в бесконечном цикле.

Итак, объявляем переменную в ф-ции main()

В цикле “пока окно открыто”  (который while window.isOpen) пишем:

Скорость игры надо подобрать под свои нужды, нам нужно что-то среднее. Чем больше делитель (сейчас это 800) тем больше действий и плавности будет в игре, но тем требовательнее она будет к ресурсам ПК. Представьте, что это своего рода FPS (кол во кадров в сек), которое вы выставляете вручную. Если у вас тормозит – делите на число поменьше, я оставлю так.

Ниже напишите

Предварительно подключив вверху

Запустите программу и в целях большего понимания посмотрите на время в консоли. Посмотрели? Закрываем, кодим дальше :) Ах да – Сотрите строку с выводом времени в консоль, она нам больше не нужна.

Хочется сказать, что эту консоль можно убрать , но мы пока этого делать не будем. Она может пригодиться, когда вы захотите узнать значение какой – то переменной, через окно sfml это будет трудоемкой задачей. Консоль уберете, когда доделаете игру до конца 😉 я напишу об этом.

Вернемся к нашей задаче. Нам осталось использовать это время, чтобы сделать игру более плавной. В управлении персонажем домножим каждую скорость его смещения на наше время :

Теперь, когда вы запустите игру – она будет более плавной.

Весь пример был на структурном языке без ООП и всё это получается довольно громоздким, в последствии мы перепишем все в более удобной форме. Ну, после того, как разберем основные моменты.

На самом деле нам не нужно будет каждый раз писать “0.1*time” и тому подобное. Для этого для каждого класса пишется функция “update”, которая как бы заставляет класс “жить” в игре, благодаря бесконечному времени, от которого эта функция зависит. Кстати говоря, мы можем эту функцию наследовать, что говорит о том, что писать её придётся не для каждого класса. Всё будет зависеть от вашей текущей задачи.

А теперь рассмотрим пример как же извлечь пользу из этого времени, ведь эта “обязаловка” с уходом от мощности и загруженности процессора не даёт нам никакого удовольствия.

Представим , что у нас в игре есть движущаяся платформа. Как она меняет направление движения? Есть несколько вариантов решения – например при столкновении с какой-то стеной у нее меняется состояние с “ехать влево” на “ехать вправо”, или по расстоянию – пройденный путь больше расстояния-> разворот. Но и по таймеру тоже может – мы можем менять направление движения платформы каждые 3 секунды. Хочется заметить, что таких решений нужно избегать поскольку лишние таймеры очень грузят игру. Но это как пример, где время нам пригодилось бы.

Так же можно засечь время, прошедшее от начала игры до смерти игрока. Время идет, как только смерть – запоминаем и выводим на экран.

Или к примеру ваш персонаж взял бонус – ускорение, который действует 5 секунд. Аналогичным образом – взял бонус->скорость+20->  5 секунд таймер отсчитывает и как только >5 секунд – возвращает нормальную скорость игроку.




И таких примеров целая kychka :))

Я приведу такой обобщенный пример, который поможет понять логику таких действий. Платформ у нас еще нет, игрок умереть тоже пока не может, бонуса на ускорения тоже нету. Ну .. Давайте будем телепортировать игрока в определенное место каждые 3 секунды. =)

в функции main объявим переменную:

Сразу после определения скорости игры (time/800) пишем:

Таким образом наш герой будет появляться в данной координате каждые 3 секунды.

Избегайте таймеров там , где это возможно. Не забывайте их обнулять.

Листинг урока ниже, новые строки с комментами (как всегда).

 

 

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. А вот меня интересует тема с платформами, только у меня не платформа, а монстр в игре пакман, как сделать чтоб он при столкновении менял направление или еще лучше рандом сделать. И как сделать чтоб функции движения вправо и вниз не выполнялись одновременно т.е. у меня монстр ходит по диагонали

    1. Старайтесь задавать вопросы на форуме. Про направление движения есть частично в уроке 8 . С врагами будет урок, но попозже. Туда же потом запихну различные вариации реализации искусственного интеллекта.

Добавить комментарий