Урок 13 SFML вывод времени, проведенного в игре, жизнь и смерть игрока, простая концовка

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

Видеоверсия: https://www.youtube.com/watch?v=aMbs3cCk2TU

у нашего персонажа еще нет жизни , врагов и прочих земных прелестей, поэтому выведем время в левом верхнем углу. Вы сможете его спрятать, а потом вывести типа так: if (player.getLife()) {вывод времени игры на экран;}

то есть программа спросит : “если жизнь игрока равна false, то {выводим игровое время;}”. Конечно, чтобы время не тикало дальше после смерти игрока вам следует в момент смерти запомнить его в переменную и уже потом её вывести.

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




В карту я накидал немного паинт-тайликов и вот он – великий и долгожданный апдейт карты:

map

Как видите это не работа со слоями – я не рисовал сердце на прозрачном фоне и не накидывал его на готовую плитку сверху. я просто взял плитку за основу (1ую), скопировал и нарисовал. Не лучший вариант, но для урока самый быстрый. Тайлмап редакторы и работу со слоями мы еще будем проходить.

В файле map.h добавим новые объекты:

f – flower, h-heart.

Теперь при прорисовке карты в конце две строки:

 

Запустим и увидим совершенно новую обновленную крутую мега карту полную опасностей и приключений шок смотреть всем 2015 :-)

Теперь добавим переменную отвечающую за жизни игрока.

 

В функции взаимодействия с картой “interactionWithMap” добавим:

А в конце update ф-ции добавим:

Если здоровье<=0 то игрок мертв. сюда же в действие можно добавить показ анимации взрыва, кровищи и чего угодно.

Итак – если сейчас запустим, наедимся волчьих ягод в размере трех штук (100хп-40дамага*3<=0), то ничего не произойдёт. Переменная здоровья действительно будет меньше нуля, а логическая переменная скажет “смерть”. Но игре все равно, мы этого не почувствуем. Почему? У нас в ф-ции main при управлении персонажем переприсваивается скорость. Отсюда такой результат. Выходов несколько : либо переносим управление в ф-цию update игрока, либо перед всем управлением делаем один большой if , который спрашивает жив ли игрок и если да, то он может ходить. Первый способ красивее, поскольку уберет нагромождение из main ф-ции и к тому же более структурирует программу. Но способ требует больше заморочек по времени на реализацию и для демонстрации сути я применю второй способ:

Всё – персонаж отравился :-)

Давайте выведем переменную здоровья и посмотрим как она себя ведет. Вместо собранных камней (я их коллекционирование у себя убираю, не нужно мне это больше. и вобще что это за лев такой , который камни собирает ?:-))

В конце main() вместо собирания камней меняю на здоровье:

Запускаю , смотрю как работает.

Теперь сделаю вывод игрового времени, которое дальше не тикает после смерти игрока. Код с комментами и новыми строчками . тут объявляем время:

 

И новая строка в конце примет вид:

Всё. Работает :)

Если хотите чтобы игрока вырвало когда он проиграет, пишем так:

 

Кстати, вот мой рекорд:

sfml

 

 

Можно по всякому закончить игру. Можно вывести время игры только после смерти,а не всегда в процессе игры его выводить. Или же если у вас платформер типа Марио, то вы можете показать игроку карту, чтобы он знал, сколько же он не прошел до конца. Для этого после смерти можно использовать движение камеры в нужном направлении. Обычно это вправо, например так:

Не сработает, пока не перенесем функцию

getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());

 в условие пока игрок жив. (Потому что будет перебивать вид, каждый раз следя за игроком.) Поэтому засунули и получилось вот так:

 

Теперь при смерти камера идет вправо, показывая непройденную оставшуюся карту.

Еще одна идейка – вывести надпись игра окончена, ваше время и прочая статистика и при этом плавно увеличить камеру именно на этот текст. view.zoom здесь будет использоваться.




Вариантов много, сколько людей, столько и идей. Делитесь своими идеями и реализациями на форуме в соответствующем разделе.

На следующем уроке немного поработаем с текстом , клавишами и координатами.

main.cpp урока:

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. Если у кого есть желание поиграть уже в эту версию игры, предлагаю генератор случайной карты. Правда придется внести некоторые изменения в код игры, но это не так уж и много.

     

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