Привет, ребята! Новую игру я делаю на своем старом движке текстового режима. Однако это псевдотрехмерная (2.5D) пиксельная игра с перспективой. Оказалось, что символьный ASCII движок может справиться с этой задачей, нужно только сделать пару апгрейдов.

Апгрейд первый: кастомный шрифт

Каждый символ шрифта - это просто картинка. В моем случае пиксельная. Если символы заменить на произвольные картинки, то можно создавать крутой Pixel Art из этого шрифта. В таком методе есть два ограничения:

  1. Шрифт у меня изначально монохромный. Буква может состоять из пикселей только одного цвета. Информация о цвете символа есть, но информации о цвете каждого пикселя внутри символа - нет. Это связано со способом создания шрифта в движке. Эту часть движка я решил не менять.

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

Сделал эту анимацию в подарок будущей жене
Сделал эту анимацию в подарок будущей жене

Из-за монохромности символов картинка получается в стиле Спектрума. А из-за ограничения набора символов я могу редактировать и тестировать различные конфигурации прямо в коде с помощью клавиатуры. Ведь, по сути, каждая картинка в игре соответствует клавише на моей клавиатуре. Одни плюсы.

Апгрейд второй: несколько алфавитно-цифровых слоев с переменным размером сетки

Представим, что сейчас 1978 год, и вы сидите перед алфавитно-цифровым дисплеем (VT100, например). Допустим, он может отображать 24 строки по 80 символов. Символы располагаются строго по сетке с фиксированным и одинаковым для каждой ячейки размером.

Теперь создаем несколько алфавитно-цифровых слоев, как если бы несколько компьютеров (или видеоадаптеров) передавали сигнал на ваш дисплей. Сигналы складываются, и вы видите совмещенное изображение - несколько текстовых слоев.

Позволим теперь каждому текстовому слою иметь свое собственное плавное смещение на экране, а также свой собственный размер ячейки под символы. Все. Теперь можно делать 2.5D Top-Down игру с перспективой. Нужно только правильно рассчитывать смещения алфавитно-цифровых слоев и задавать размеры их сеток.

Апгрейд третий, не аутентичный

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

Обратно в ASCII

Как-то раз, в процессе бесконечного тестирования и отладки игры, у меня кастомный шрифт переключился на изначальный - символьный. Картинка мне очень понравилась. Прямо как в другом мире. Матрица.

Решил сделать специальный режим. Если подойти к терминалу в игре, то можно переключиться в такой режим «матрицы». Поскольку название «Матрица» лучше не использовать, то назвал режим «Нео-Н». Есть отсылка к главному герою фильма, а так же название подчеркивает, что все светится неоном. Жена придумала.

Нахождение в этом режиме дает много преимуществ: монстры не наносят урон (а я им еще как могу), становятся видны скрытые проходы, и можно собирать специальные картриджи для построения колоды. После 15 секунд происходит автоматическое «выныривание» из этого режима.

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

Такой вот камбэк в ASCII, пусть и всего на 15-и секундные интервалы. Решил вам рассказать о таком необычном дизайне игры. Надеюсь, вам понравился стиль. Заходите на страничку игры в Steam, там уже доступна демка с этой фичей.

Текстовый движок становится все лучше и производительнее. Планирую вернуться к своему проекту мечты - игре ASCIIDENT (сюжетный крафтинг/выживание в текстовом режиме). Несколько лет назад не удалось реализовать проект с первого раза. Тогда не удалось достичь приемлемого качества. Сейчас я уже ближе к цели и намереваюсь полностью вернуться к ASCII. Но имеет ли право на существование такой ретро дизайн в нашу эпоху?

Всем спасибо, пока!

Комментарии (21)


  1. imageman
    11.05.2024 18:22
    +2

    Теперь создаем несколько алфавитно-цифровых слоев, как если бы несколько компьютеров (или видеоадаптеров) передавали сигнал на ваш дисплей.

    В реальности так (если я всё правильно понимаю) не получится.

    В целом - прикольно :-) [но я бы не играл]


    1. DuhaTheBest Автор
      11.05.2024 18:22
      +6

      Несколько десятков лет назад я работал на ПК Корвет. Там накладывались две картинки: одна текстовая, другая графическая. Генерировались разными микросхемами, но выводились на один экран. Независимые подсистемы.


      1. imageman
        11.05.2024 18:22
        +1

        Круто, не знал. Но подсистемы там, все-таки, не должно быть две. Независимые системы подрались бы за электронный луч, синхросигналы и т.п. Так что там должна быть строгая синхронизация. Может быть сигнал поочередно переключается с одной видеокарты на другую?


        1. DuhaTheBest Автор
          11.05.2024 18:22

          Подробностей не помню, но наверняка кто-то складывает сигналы перед выводом


          1. checkpoint
            11.05.2024 18:22
            +3

            На некоторых старых CGA адаптерах можно было быстро переключаться между видеорежимами - текстовым и графическим, при этом видеобуфер у них был в разных адресных пространствах. В начале 90х мне попадалась прога под MS-DOS которая используя этот эффект накладывала графики на текстовое изорабжение. Не смотря на то, что изображение было слегка мерцающим, мы тогда офигевали от такого эффекта. Сейчас я пытаюсь закодить свой CGA на ПЛИСе и мне стало понятно как это делалось.

            Кстати, палитра на первом скриншоте очень походит на дефолтную в CGA - чёрный, белый, зелёный и магента. :)


          1. igormu
            11.05.2024 18:22
            +2

            Они были "слоями" - графика в фоне, текст сверху. Графика три бита на пиксель. К ним применяется палитра из 16 значений. Наверно, были цвета, но у нас мониторы были ЧБ, поэтому получались градации яркости. При этом палитра делилась пополам - первые восемь значений для графики, вторые для текста. Цвет пикселя текста зависел от лежащего под ним пикселя графики. По умолчанию цвета графики были настроены от 0 до 7, а для текста все значения 15. Визуально получалась тёмно-серая графика и яркие белые символы сверху. Но можно было, например, настроить все цвета графики в 0, нарисовать невидимые при этом полоски, а палитру символов сделать градиентной. При этом получались полосатые символы на черном фоне.


            1. PrinceKorwin
              11.05.2024 18:22
              +1

              Прям олдскулы свело! Мой первый настоящий компьютер на котором успел изучить: basic, pascal, c и asm.


      1. checkpoint
        11.05.2024 18:22
        +1

        ЕМНИП, такая же фича была на УКНЦ.


  1. slepmog
    11.05.2024 18:22
    +1

    Оффтопик, но баг в ASCIILL-то планируется к починке?


    1. DuhaTheBest Автор
      11.05.2024 18:22
      +4

      Обязательно! Планирую накатить апдейт ASCIILL в начале этого лета.


  1. dyadyaSerezha
    11.05.2024 18:22

    Жена анимацией впечатлилась? И вы ей поверили?)


    1. DuhaTheBest Автор
      11.05.2024 18:22
      +2

      Тогда она еще не была женой))


  1. MasterMentor
    11.05.2024 18:22
    +3

    Так а где сам движок-то? (ссылка на гитхаб)


    1. DuhaTheBest Автор
      11.05.2024 18:22

      Движок жестко проприетарный (не решился показать пока)


  1. vaniacer
    11.05.2024 18:22
    +1

    Крутяк!


  1. Vorono4ka
    11.05.2024 18:22
    +1

    Круто! Мне очень нравится эффект параллакса при смене режима. А что в основе движка лежит? OpenGL, Vulkan?


    1. DuhaTheBest Автор
      11.05.2024 18:22

      В основе лежит простое рисование треугольников с текстурами. Раньше на Cocos2d-js делал, сейчас перешел на Unity.


      1. Vorono4ka
        11.05.2024 18:22

        Не совсем понял. В юнити ведь все равно используется одна из библиотек, что я упоминал. Генерация нового меша каждый кадр? «Простое рисование треугольников» для меня звучит именно так :) А если это действительно так, то для чего нужен Юнити?


        1. DuhaTheBest Автор
          11.05.2024 18:22

          Unity привлек возможностью одной кнопкой компильнуть под кучу платформ. Мобильных, в том числе.


          1. Vorono4ka
            11.05.2024 18:22

            Ну в этом вы правы, так действительно очень удобно работать и не заботится о компиляции.


  1. 4p4
    11.05.2024 18:22

    Если играть будет интересно, то и движок зайдёт.