Игра "Трикси и алмазы" улучшена и переведена на современные системы разработки

?
в блоге Gamedev is Friendship!
Реализовал перенос своей 16-битной игры «Трикси и алмазы» на систему поновее, а также немного улучшил по разным параметрам.



Заняло 10 дней неспешной работы, с учетом того, что половину этого времени дорабатывал собственный игровой движок, на котором эта игра и сделана. Графику не переделывал, в основном — всё те же пиксельные PCX-спрайты.
Также не выполнял нормальную балансировку уровней — можно утверждать, что последний уровень сильно сложнее первого, но не более того.

Ссылка на архив с игрой:
tereshenkov.ru/trixie32bit/TrixieDiamonds-1.0.0.2-Win32.zip

Изменения по сравнению с 16-битной версией:
  • Работает на 32-битной версии Windows без всяких ухищрений :-)
  • Пять уровней аркады, отличающихся картами и сложностью
  • Укрупненный размер карт
  • Бонусы восстановления здоровья и маны
  • Режим свободной игры для каждого уровня

Управление и всё, что касается игровой механики, содержится во встроенной справке игры.
Игровой движок реализован на C++ Qt, слой OpenGL использует SFML.
Игровая логика — на JavaScript.
Документация к движку и исходники движка будут выгружены попозже, еще идет доработка.
Исходники же самой игры лежат в каталоге data со всеми спрайтами, картами и скриптами, и доступны, как и все мои понные наработки, по лицензии CC0.

Запуск игры — файл TrixieDiamonds.exe из каталога engine.

Не могу сказать, что это прям великая игра, попирающая сапогами Вселенную — но определенная прелесть в ней, как и в любой простенькой аркаде, наверно имеется. Играйте на здоровье. Если кому-то понравится улучшенная версия — дополню уровни, бонусы и расширю игровую механику. Теперь это сделать проще.

Под катом скрины игры

Главное меню

Справка

Маленький уровень

Уровень побольше

Победное окно

53 комментария

Ну… таки в ленту, таки повод.
Спасибо, вечно про это забываю.
Хм… Если смотреть со стороны конкретно игрока, но никак не разработчика (коим я не являюсь вообще) — да, есть у игры какая-то уникальность. В принципе вообще идея хорошая. На мой взгляд слабая сторона — слегка низкая скорость. Не сказать, что игра особо лёгкая ) Но с такой скоростью она, на мой взгляд, находится где-то между аркадой и тактической, где хорошо бы поставить на паузу и проанализировать расположение кристаллов, врагов и их перемещение, заряды — и подобрать маршрут ) Вспоминая Lode Runner и ему подобные — была в них динамика, хоть и скорость была чуть быстрей… Хм… мне кажется даже дело было бы лучше, если при остановке запас маны быстрее восстанавливался бы. Поначалу думал так и есть, потом что-то особо не увидел различий с ходьбой.
Хах, что называется «пока придумывал что сказать»врагам как бы пофиг, что Трикси проиграла )) Как и кристаллам
Кажется этот процесс бесконечен )))
Хм, заметил, что в аркаде ограничение на кристаллы… Но не врагов )
Не совсем так, в параметрах карт — файлах maps\map_x.json задан лимит

«MaxSpawnMonsters»:18,

но начиная с третьей карты этот параметр равен 9999 :-)
Как уже упоминал — над балансом я пока что не работал серьезно.
Кстати как по мне, так нарастание кристаллов друг на друга выглядит крайне прогрессивно ) если их вот так наращивать. Даже форма выглядит вполне хорошо ) Тупо между ними границу убрать и будут как монолитные башни разной высоты )
На самом деле, это побочный эффект от моей лени. По уму, кристаллы нужно спавнить рядом, но мне было лень делать алгоритм расстановки, так что я просто сделал сетку спавна и сдвигал на dy при новом кристалле.
Ты молодец, нашел баг. Действительно, после поражения спавн не останавливается, это косяк.
да, забыл закрыть )) они до сих пор там множатся )

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

Если не UE5, то даже читать дальше нет смысла)
не UE5

«Я жалкаааааая!»©

А если серьезно, хочу изучить, но всё руки не доходят.
Таже фигня. Очень любопытно, как эти наниты изнутри устроены.
Тебе то что любопытно, ты уже показал что любым инструментом только херню сделать можешь.
Я думаю, оратор выше про то, что чем современней инструмент, тем легче таки работать.
Если сравнивать 16-битный код реального режима, где половина в Ассемблере, а половину пишешь с точностью до байт (а то и бит, в некоторых видеорежимах) — и системы вроде Godot или Unity, то понятно, куда смотрит вектор прикладной разработки.
Имеет ли смысл (кроме спортивного интереса) в современных реалиях делать подобные низкоуровневые оптимизации для фан проектов? При этом я бесконечно уважаю программистов (ибо сам говнокодер) которые могут вместить в 96 килобайт большой 3D шутер или знают как и где применить грамотно самый хитрый из алгоритмов из Талмуда Кнута.
Для фан игрушек смысла особого нет… На нынешнем железе — ну будет у тебя не 300фпс а 250, разницы все равно не заметят.

Но чисто для себя, и для прокачки скилла — оно пользительно… бывают все еще моменты когда подоптимизировать таки надо, чтоб выжать максимум.
Нет, не имеет. Только из
спортивного интереса

ну вроде как пересекать Тихий океан на гребной лодке. И что характерно, пересекают, хотя конечно, на особых лодках, построенных по специальным проектам.
Шахматы вообще на IRL Engine.
Микроскопом гвозди забивать не комильфо.
Как же сильно решают анимации с звуковым сопровождением… Так же приятно удивил геймплей, что на деле оказался куда комплексное нежели ожидалось.

Очень раздражает что при потере жизни, теряешь возможность юзать магию в течении секунды. Бессмертие в течении этой секунды нифега не помогает ибо как правило за это время успеваешь оказаться внутри монстра из-за чего вновь теряешь жизнь и продолжаешь быть беспомощным овощем ещё на одну секунду дольше.
Рекомендация: любое действие игрока скипает состояние мигания.

На 4-м уровне слишком часто оказываюсь в патовой ситуации, когда маны нет, а на сейфзоне уже заспавнился монстр. По первичным наблюдениям показалось, что монстры не спаунятся в подземелии, пока ты в нём или был в нём на предыдущем ходу.
Рекомендация: при убийстве 2+ монстров за один выстрел, возвращать ману в количетсве убитых монстров — 1

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

Это так и задумано — чтобы не позволить игроку прыгать прямо в толпу монстров и размести их выстрелом.

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

Ага, это мой промах, по Esc должна быть игровая пауза с меню.
По «горячим» заметкам обновил игру, новая ссылка в посте.
1) Прекращается спавн после завершения игры
2) При нажатии Escape в игре включается пауза, с возможностью продолжить игру или вернуться в меню
Игровой движок реализован на C++ Qt, слой OpenGL использует SFML


Тут же вспомнилась эта книжка)
Пикча
Самое забавное, что Qt использован в основном ради QtScript, потому что это единственный способ нормально интегрировать JavaScript в проект на уровне объектов.
*ворчит* — вот дарована им Lua с одной dll-кой в 300 кило весом… нет, надо жабу тащить… а по сложности изучения Lua еще попроще жабоскрипта будет…
вот дарована им Lua с одной dll-кой в 300 кило весом

А я могу на Lua сделать так?
class MapViewer : public QObject
...
public slots:
    void doMagic(QScriptValue value) ;
...

MapViewer mapviewer ;
engine.globalObject().setProperty("mapviewer",&mapviewer) ;


после чего вызвать в скрипе просто и незатейливо

mapviewer.doMagic({x: 1, b: true, s: «OK» });

Думаю, нет. QtScript всё-таки очень могуч.
Можешь запросто, и при этом еще скрытых проверок например на допустимость параметров напихать, которые будут ошибку на любую сторону кидать, хоть в скрипт хоть в код…
(почитал) не так уж и запросто, приходится каждый метод передавать в скрипт, в то время как QtScript это делает сам за счет препроцессора.
Да и дополнительный синтаксис учить… JavaScript-то каждая собака знает.
Lua слишком странный (жс тоже странный, но не слишком)
Ой, да для JS тоже можно взять какой-нибудь легковесный интерпретатор в виде ДЛЛки небольшого размера, например muJS, с такой же точно богомерзкой стековой ВМ как у луа, к которой потом нужно корячить километровые малопонятные биндинги нативного кода, вручную преобразовывать переданные из скрипта параметры в нужные типы и так же вручную бросать исключения в JS если что-то не так, и можно даже проброс исключений из нативного языка сделать, если конечно нативный язык не pure c и они там есть, для обработки в try/catch внутри скрипта, типа такого bitbucket.org/cat-modera/4a-sdk-diy/src/master/source/main/Konfig_reader.pas, и радоваться количеству полученного кода, в Индии наверно это актуально

Но это всё абсолютно бесполезные в жизни знания, они не помогут получить у Деметры совет как перестать быть жучком в банке.
с такой же точно богомерзкой стековой ВМ как у луа
Как насчёт LuaJIT?
А что луаджит? У него такой же точно стековый API как у обычного ЛУА :)
Исходники же самой игры лежат в каталоге data со всеми спрайтами, картами и скриптами, и доступны, как и все мои понные наработки, по лицензии CC0.
Что-то я там не нахожу .pro-файла… Или это как-то по-другому собирается?
А вообще отличная тема — предыдущая и эта версия это прямо как ванильный DOOM и GZDoom =)
Что-то я там не нахожу .pro-файла… Или это как-то по-другому собирается?

.pro файл — это для движка, исходники которого сейчас дорабатываю.
А в каталоге data находится исходник игры, которая этот движок через QtScript использует.

Раз возник запрос, вот движок и сишные исходники игры (кое-что недописано и документация устарела, но пусть)

tereshenkov.ru/trixie32bit/engine.zip

(в core исходники самого движка, в корне — файлы, отвечающие за игру, например, map и mapviewer)

SFML можно взять отсюда
www.sfml-dev.org/files/SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit.zip
в .pro файле вбить актуальные пути к SFML include и lib

На гитхабе через неделю думаю, уже будет, реально несколько багов закрыть и всё.
Приведи регистр имён файлов и регистр путей в коде к единому знаменателю, тогда под линуксом вроде даже нормально запускается)
Спойлер
А в случае ненайденного файла получается double free внутри ~PcxTexLoader()
под линуксом

Ага, есть такое. При работе под Windows привыкаешь плевать на регистр имен файлов.

PcxTexLoader

Это чисто для меня класс — не думаю, что кому-то понадобится реально работать с PCX-файлами. Хотя конечно, в список багов занес, спасибо.
Это чисто для меня класс
Ну а в итоге именно я угробил полчаса времени чтобы понять почему игра крашится ¯\_(ツ)_/¯ я не умею дебажить сишные проги памагити
В финальной версии движка все сообщения о ненайденных файлах и ошибках загрузки будут лететь либо в stderr, либо в заданный пользователем файл. Сильно поможет.
PCX-файлами

Почему PCX кстати? TGA проще и вменяемо поддерживается кучей софта.
Это не самостоятельная игра, это порт моей 16-битной разработки, а там были спрайты PCX.
Можно, конечно, было перегнать PCX в PNG, но я пошел по пути «вместо конвертации данных, напишем декодер данных». Чисто по приколу.
Хотя там вроде даже не double free, если я правильно понимаю, указатель data изначально инициализирован мусором и при попытке его делитнуть получается дичь
Да, там просто нет проверки на успешность загрузки файла.
Заценил игру. С технической точки зрения очень круто.
Что понравилось:
*Главный экран — идея где Трикси бегает за\от монстров хе-хе). Это добавляет «изюминку».
*Справка — тут тебе и небольшая история с картинками-персонажами, и даже анимации монстров.
*Уровни — собери n алмазов и не умри, используй ману с умом!

Что не понравилось\вызвало вопросы:
*Динамика — честно, я думал что в начале игры так медленно, потому что с набором алмазов будет увеличиваться скорость трикси (добавляя динамику и сужая время принятия решений). Какое же мое удивление было когда я этой механики не обнаружил, ни в аркаде, ни в свободном режиме (где она вообще сама прям напрашивается).
*Монстры — их много… но по факту их 2шт — которые летают и нет. Да, я заметил что некоторые быстрее других, но этого не достаточно что бы они влияли на игровой процесс по разному (слишком минимальна разница в скорости). Не знаю… может добавить монстров которые могут телепортироваться между ярусами, или которые могут иногда внезапно поменять направление или которые могут съесть алмазы и их надо опередить. Это дало бы больше игровых событий меняющих динамически тактику в зависимости от монстров на ярусе.
*Главный экран — идея

Увы, это не идея, это пасхалка, отсылающая к Prehistorik 2. В зависимости от настроения, это можно воспринимать как бесстыдное слизывание, или дани уважения.
1992-ой, 286-ой :-)

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

Это годная идея, и я попробую её развить, спасибо.
Про динамику, уже после завершения портирования, до меня дошло, что карта стала больше в 9 раз от оригинала, а скорость не изменилась. Тут надо подумать.
При пересечении двух врагов одновременно отнимается сразу две жизни, абыдна(
А при пересечении трёх врагов гарантированный геймовер(((
Это возможно, только если оба врага находятся на одной координате X и срабатывают в один такт игры.
Хотя по уму, действительно нужно проверку развернуть, спасибо. Записал.
У меня сейчас была ситуация, когда два врага случайно заспаунились на одной координате, а третьего я сам специально поджидал — и в итоге с тремя сердечками сразу умер) Жаль не додумался видео заснять, так что пруфов не будет)
А впрочем это даже примерно удалось повторить)
эпичный суицид)
Всё, понял. Прыжок в толпу монстров — одновременное срабатывание пересечений трех.
Нужно переместить проверку условия бессмертия в цикл.
Глупый баг с моей стороны.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.