Сегодня я добился значительного прогресса. Я научился (отчасти) правильно и эффективно использовать указатели, в том смысле, что некоторые вещи, которые я делал, не могли быть выполнены без них. Я также столкнулся с некоторыми странными вещами в C++, например, с тем, что вы не можете вернуть массив из функции.

Графика

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

Чтобы решить эту проблему, я создал функцию с именем compress_layers(). Эта функция берет все слои и помещает их в один слой (по порядку) ДО того, как консоль фактически распечатает их. Таким образом, каждый кадр — это только одна запись на консоль, а вся обработка слоев выполняется за кулисами. Это заметно улучшило производительность, но все же не до того уровня, который мне был нужен.

Моя следующая проблема заключалась в том, что мне было немного сложнее переодеться (и я все еще не доволен этим). Моя функция drawLayer() работала очень хорошо до этого момента, и она работала, просматривая каждый символ в слое и записывая его индивидуально в консоль (в указанном месте). Это дало мне свободу раскрашивать каждого персонажа так, как я хотел, что было здорово и придавало игре намного больше характера. Вот как выглядит мой *текущий код* со *старой* функцией drawLayer():

Красиво, правда? К сожалению, прохождение каждого персонажа убивало мою частоту кадров, поэтому мне пришлось писать каждую строку отдельно, то есть я не мог выбирать отдельные цвета. Я все еще ищу обходной путь для этого, и я наткнулся на http://www.tomshardware.com/forum/65918-13-technique-fast-win32-console-drawing, который может помочь мне с это, но пока у меня, к сожалению, остался один печатный цвет ☹.

Цикл игры

Сегодня я также реализовал очень простой игровой цикл, который запускает физику 20 раз в секунду, но позволяет компьютеру обновлять монитор так быстро, как только может. Это не идеально, потому что это означает, что мой компьютер работает намного усерднее, чем нужно, но он функционален, и на данный момент этого достаточно.

Физика

Сегодня я собственно добавил в игру физику. Сущность может быть либо помечена как подлежащая воздействию физики, либо нет. Если это не так, то физическая функция просто перемещает объект соответствующим образом, но если это так, она также попытается воздействовать на Сущность гравитацией (заставляя ее падать). На изображении выше «m» (летучая мышь) не подвержена влиянию гравитации, поэтому она просто летает влево и вправо по экрану, в то время как на игрока («p») действует гравитация, и поэтому падает.

Обработка ввода

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

Отражение

Оглядываясь назад на свой код, я очень доволен тем, как он настроен. Модули почти полностью независимы друг от друга; все объекты хранятся в векторе, который затем изменяется в каждом игровом состоянии и независимо рисуется на экране. Большинство функций и классов не зависят друг от друга (модуляризация), и это то, что я постоянно стремлюсь улучшить в своих играх. Моя основная функция очень лаконична и сама по себе выполняет очень мало работы. Одна вещь, которая все еще остается в функции Main(), которую я в идеале хотел бы отделить, это то, что вся обработка ввода находится внутри цикла main(): в идеале я бы хотел, чтобы она находилась в собственном заголовке.

Завтра

Завтра мой последний день, чтобы закончить эту игру. Завтра хочу добавить:

Надеюсь, я смогу решить проблему с цветом консоли: это настоящий облом, когда я не могу сделать ее красивее. Больше врагов + ИИ Актуальная система уровней, сохраненный прогресс (золото, бонусы и т.д.) Заглавный экран Сохранение игр (даже если это просто в текстовый файл) Загруженные уровни (из текстовых файлов) Взаимодействие между снарядами и врагами

Я не ожидаю, что смогу сделать все это, но я сделаю все, что смогу!

Первоначально опубликовано на savas.ca.