To read on your native language use your favourite machine translation.
RogueCore - маленький и аккуратный движок для создания Rogue-like игр на C#.
Исходный код не содержит комментариев, всё описание движка находится в этом Readme.
Что умеет движок:
- Эмулировать текстовой режим с курсором и 24-битным цветом. Я посчитал что в 2019-м нет смысла ограничиваться палитрой CGA :-)
- Обрабатывать ввод с клавиатуры
- Рисовать линии и окружности
- Находить путь на карте
- Просчитывать FOV ("туман войны")
- Содержит виджет для вывода потока сообщений + (more)
Для демонстрации возможностей движка была создана демка RogueDemo.
Движок находится в сборке RogueCore с одноименным пространством имен.
Пространство имен RogueCore содержит следующие классы:
- Screen: кастомный контрол для имитации текстового видеорежима
- Input: регистрация обработчиков ввода с клавиатуры
- Message: вывод потока игровых сообщений + (more)
- Dungeon: создание и управление картой подземелья
- Tracer: универсальный трейсер для трассировки линий, окружностей и путей на карте
Экран представляет собой массив символов (класс Char).
Char имеет следующие свойства:
- Color backColor: Цвет заднего фона
- Color frontColor: Цвет символа
- char character: Символ
Методы класса:
- Screen(): Конструктор экрана создает экран по умолчанию 80x25
- int ScreenWidth: Ширина экрана (при изменении размера экрана вся информация на нем теряется)
- int ScreenHeight: Высота экрана (при изменении размера экрана вся информация на нем теряется)
- void ClearScreen(): очистить экран
- void SetChar (int x, int y, Char character): Установить символ в указанных координатах
- Char GetChar (int x, int y): Получить символ по указанным координатам
- void SetCursor (Point point): Установить курсор
- Point GetCursor (): Получить координаты курсора
- void ShowCursor (): Показать курсор
- void HideCursor(): Скрыть курсор
- bool IsCursorVisible (): Получить состояние видимости курсора
- void ClearLine (int n): Очистить горизонтальную линию экрана
- void Print (int x, int y, string text): Вывести строку в указанные координаты (задний фон и цвет символов не меняется)
- void PutChar(char charValue, bool backward = false): Вывести указатель и подвинуть курсор. backward=true используется для вывода справа-налево
Класс Input преобразует KeyEventArgs во внутреннее представление (класс KeyInfo)
Методы класса:
- void RegisterHandler (InputHandler handler): Зарегистрировать обработчик
- void SendKey (KeyInfo key): Отправить KeyInfo зарегистрированному обработчику
- KeyInfo Translate (KeyEventArgs e): Транслировать KeyEventArgs в KeyInfo (используется в обработчике события OnKeyDown)
Если вы тут, то нет необходимости объяснять как выводятся сообщения в Rogue-like играх :-) Класс Message как раз для этого.
Методы класса:
- Message (int lineStart, int numLines): В конструкторе необходимо указать в каком месте экрана будет находится область сообщений (lineStart) и сколько строк она будет занимать (numLines)
- void Add (string msg): Добавить сообщение в очередь
- void Clear(): Очистить очередь сообщений
- void ShowMore (Screen screen): Показать часть очереди сообщений (та что влазиет на экран) и при необходимости вывести (more)
Движок не рисует линии и окружности прямо на экране. Для этого используется более универсальный способ - трассировка. Во время трассировки вместо вывода очередного символа вызывается TraceDelegate пользовательского приложения. Трассировка заканчивается, если TraceDelegate вернет значение < 0. Благодаря этому можно унифицировать рисование линий например для обработки "тумана войны" или для рисования анимации полета стрелы. Рисование окружностей можно превратить в рисование красочных взрывов или других спец-эффектов.
Все методы класса статические:
- List<Point> TraceLine(Point start, Point end, TraceDelegate cb, object ctx): Трассировка линии
- List<Point> TraceCircle(Point center, int radius, TraceDelegate cb, object ctx): Трассировка окружности
- List<Point> TraceFov(Point point, int radius, TraceDelegate cb, object ctx): Трассировка поля обзора
- List<Point> TracePath (Dungeon map, Point from, Point to, TraceDelegate cb, object ctx): Трассировка пути по карте
Подземелье представляет собой массив тайлов (класс Cell).
Cell содержит следуюшие свойства:
- bool visible: Используется во время обработки "тумана войны"
- bool solid: Используется во время трассировки пути, а также "тумана войы"
- Char character: Символ для отображения на экране, который соответствует данному тайлу
Методы класса:
- Dungeon (int w, int h): Создает подземелье указанного размера
- void Clear(): Очистить подземелье (заполняется пустыми тайлами)
- Cell GetCell (int x, int y): Получить тайл по указанным координатам
- void SetCell (int x, int y, Cell tile): Установить тайл по указанным координатам
- void Display(Screen screen, int lineStart): Отобразить подземелье на экране, начиная с указанной строки (lineStart)
- void FillLine(Point start, Point end, Cell tile): Заполнить линию указанным тайлом
- void FillRect(Rectangle rect, Cell tile): Заполнить прямоугольник указанным тайлом
- void FillCircle(Point center, int radius, Cell tile): Заполнить окружность указанным тайлом
- void ShowAll (): Показать все тайлы (установить флаг visible для всех)
- void HideAll(): Скрыть все тайлы (сбросить флаг visible для всех)
- void UpdateFov (Point point, int radius): Обновить "туман войны" в указанных координатах и с указанным радиусом обзора