Урок 14 SFML введение понятия “миссия” и показ инфы по нажатию клавиши

На этом sfml уроке введем понятие миссия в нашу игру, а так же попробуем с её помощью как-то сэкономить затрачиваемые ресурсы ПК. Будем выводить различный текст на экран, в зависимости от миссии. Вывод текста будет происходить на фоне свитка (изображение), а так же при нажатии клавиши TAB

Видеоверсия:

В main.cpp подключим:

Уберу жирность и подчеркивание текста, это была лишь демонстрация. В main.cpp удалю:

Но поставлю черный цвет текста:

 

Итак, создадим файл mission.h. В Нем будет содержаться различный текст, а так же храниться номер текущей миссии.

код в файле:

По комментариям думаю понятно.

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

Теперь в main.cpp объявим переменную:

и добавим картинку свитка:

Скачайте её, кстати:

sfml миссия
sfml миссия

 

Теперь, насколько помните из урока 2 у нас есть основной цикл, пока открыто окно и в нем событие “если окно закрыто”:

Так вот, у нас есть возможность обрабатывать не только событие закрытия окна, но и  , например, нажатия клавиши. Выглядит так: “if (event.type == Event::KeyPressed)
Вкратце говоря, весь код этого события теперь будет выглядеть так:

Вставьте и посмотрите. В студии он не будет таким корявым по форматированию, как тут.

Сюда же я перенес снизу переменную здоровья и её отображение, так же на нажатие клавиши TAB.

Получается, что если нажата клавиша ТАБ, то запускается switch, который имеет два состояния логической переменной (если нажата клавиша, то выполняется одно, иначе – другое.). Каждое нажатие меняет значение логической переменной showMissionText с истины на ложь или со лжи на истину.

Так же там есть такая строка:

Тут вызывается функция getTextMission (она возвращает текст миссии), которая принимает в качестве аргумента функцию getCurrentMission(возвращающую номер миссии), а уже эта ф-ция принимает в качестве аргумента функцию p.getplayercoordinateX() (эта ф-ция возвращает Икс координату игрока).

В конце , (где мы все рисуем с помощью window.draw()) до рисования текста (чтобы текст был поверх спрайта) напишем:

А рисование текста, как мы видим, немного переместилось и попало в условие.

Если запустить, то получится такой результат:

sfml урок 14
sfml урок 14

 

Как видите лев смог придти прямо на текст миссии. А всё потому, что мы устанавливаем позицию всего этого блока лишь при нажатии клавиши ТАБ. то есть обновление (update) происходит только в этот момент. Чтобы он не мог наступить на наш текст и свиток, необходимо будет перенести строки задания позиции текста и свитка в функцию “пока открыто окно”, например до рисования этих объектов. Таким образом рисование этих объектов будет постоянным, пока нажата клавиша TAB. Итак, вот эти строки

Перенесем туда же (не скопируем), в конец, получим:

 

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

С помощью увеличения миссии можно изменить игру до неузнаваемости. Новая миссия? Получай врагов с +1000к хп и +200 к дамагу:))

Работа с уровнями будет темой позднего урока, но это нечто похожее.

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

Получается, что я здесь для примера поменял спрайтики местами для символов ‘0’ и ‘ ‘. Я бы мог нарисовать там всё по другому просто еще один раз, но тогда ресурсов наша игра жрала бы больше, поскольку загружала бы намного больше спрайтов. В данном случае ресурсам игры пофиг, поскольку я ничего не добавлял, а лишь поменял местами для демонстрации. Но думаю вы поняли для чего это и где можно применить.

Скрин результата:

sfml урок 14
sfml урок 14

 

Так же, чтобы дать игроку понять, что он на новой миссии, где требуется нажать клавишу TAB и посмотреть задание, можно выдавать какое-то звуковое оповещение, или фразу “нажмите TAB” (это уже работа со звуком, урок в будущем). Или же, например, можно завести для этого дела надпись “нажмите таб”, каждый раз, когда значение миссии увеличивается. Еще вариант – выводить тайлик на карте (заранее задать ему символ, например ‘t’) с картинкой tab в соответствующем месте, когда миссия поменялась.




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

Для вопросов есть форум!:-)

 

код урока

main.cpp

 

 

mission.h

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. “Вот мы плавно переходим на ООП” – заявлено было в одном из уроков. Вынесли камеру и карту в отдельный файл, и то не полностью – продолжаем всё лепить в main. Когда мне захотелось что-то изменить или добавить в соответствии с уроком – у меня забомбило, потому что понять где что было не просто. Не так уж и сложно самому под ООП переписать, но как по мне – плохой пример подаёте. Надеюсь в уроках 15 и дальше вы исправились, но я их пока не смотрел.

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