Основные логические концепции приложения.

1. Отрисовка элементов игры.

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

2. Отрисовка персонажа.

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

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

3. Передвижение.

Для полноценной игры у пользователя обязательно должна быть возможность передвижения игрока. Для реализации этого создаем переменные dx и dy, которым изначально присваиваем значение 0. Далее в обработчике событий спрашиваем, нажата ли клавиша W или A или S или D? Если нажата W, то dy++; если S, то dy--; если A, то dx--; если D, то dx++;

Теперь, нажимая на эти кнопки, пользователь может передвигать игрока, но картинка не подвластна ни гравитации, ни направлению движения. Она остается статичной вечно.

4. Анимация.

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

1. Стоит и ничего не делает.

2. Идет.

3. Карабкается по лестнице.

4. Стреляет.

5. Прыгает.

Можно и больше, но мы остановимся на этих. Естественно для каждого из состояний нужна собственная анимация, но двигаться можно в разные стороны, а значит и модельку нужно будет зеркально отразить. Для этого не обязательно иметь две текстуры. Достаточно брать координаты справа-налево, а рисовать слева-направо. Плюс ко всему персонаж может идти и стрелять, карабкаться и стрелять, стоять и стрелять. Т.е. нужно написать обработку каждого состояния. Обработка будет заключаться в совмещении анимации и перемещения. Например, если под игроком ничего (или никого) нет, то персонаж переходит в состояние падения, в которое же он переходит в середине состояния прыжка. Чтобы из состояния прыжка вверх перевести персонажа в состояние падения, надо после промежутка времени после прыжка начать отнимать dy. Величина этого промежутка времени вкупе с быстротой отнимания dy будет являться подобием гравитации. Т.е. теперь, когда персонаж в состоянии падения, мы будем смещать его вверх и одновременно запрещать прыгать. Прервать это состояние может твердая поверхность под ногами. Но у нас пока ее нет.

5. Уровень.

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

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

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

6. Свойства.

Теперь мы имеем изображение объектов без свойств. Значит, пора добавить к графам элементов еще одну. Свойство. Свойством у нас будет имя. Итак все твердые тела мы назовем solid, все лестницы-ladder, все монетки-coin, всех врагов-enemy. Единственное отличие врагов от статических объектов будет их подвижность. Враги будут описываться отдельным классом, как и игрок и мало чем будут отличаться от оного.

У нас есть карта из объектов, имеющих различные свойства. Мы отрисовали игрока и карту и первый начал падать. Его спрайт накладывается на спрайты карты (при одинаковом размере игрока и тайлов, игрок максимально налегает на 9 тайлов). Теперь мы смотрим объекты вокруг и считываем их свойства. Перебрать нужно всего 9 штук. Если моделька персонажа налегает на тайл со свойством solid, то надо убрать игрока из твердого тела просто отнимая dx или dy( или и то и то) до тех пор, пока он полностью не вылезет, скажем, из стены. Если мы можем обрабатывать столкновения со стенами, то сможем и с врагами. Для убийства врага необходимо прыгнуть на него сверху. Так и сделаем. Если dy игрока > dy врага, то враг переходит в состояния «мертв» и удаляется из списка окружения, в противном случае у игрока отнимаем очки жизни, а если их не осталось, пишем game over и начинаем уровень сначала. Если же персонаж пересек монетку, то удаляем монетку, а счетчик результата инкриминируем.

7. Привязка камеры.

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

8. Построение меню.

Логика построения меню заключается в булевых переменных, решающих, находимся мы сейчас на пункте меню new game, Exit или еще каком. Также введена переменная ingame.

Если она равна 1, то рисуем уровень, если нулю, то рисуем меню.

Если переменные принимают newgame=1, ingame=0,exit=0, то при нажатии сейчас на кнопку выбора, получим newgame=0, ingame=1,exit=0.

9. Звук.

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

Практическая часть.

Наши рекомендации