Quote:Спасибо, кэп!
Я имел в виду - что это вообще за консоль, зачем её эмулировать, на чём она сделана - и как она привязана к нашему форуму? ...
Браузеры по умолчанию не содержат средств для создания приложений для терминалов - то есть приложений с текстовым интерфейсом и стандартной функциональностью. В своё время для Turbo Pascal была библиотека CRT, в которой был реализован базовый функционал для работы с консолью:
- Функции изменения цвета и фона выводимого текста
- Управление видимостью и положением курсора
- Установка текущего окна, относительно которого выводится текст и считаются координаты курсора
- Очистка текущего окна
- Вывод текста с поддержкой спецсимволов, таких, как перевод строки, которые должны быть обработанны по особому, а также автоматической прокрутки
- Проверка состояния клавиатуры, нажата ли в данный момент какая-либо клавиша
- Ожидание нажатия клавиши и получение её кода
- Сложная функция чтения ввода текста с поддержкой базового редактирования
Чем удобен текстовый интерфейс?
- В мире существуют десятки тысяч терминальных игр/программ, в том числе и на приставках/тетрисах
- Консольные игры писать проще, так как не нужна особая графика и музыка. Можно вложить силы в саму игру
- Консольные приложения писать проще, чем гуишные
HTML/Javascript содержит средства для написания эмулятора консоли и библиотеки функций для неё с приемлимыми трудозатратами (1400 строк текста, не кода).
Реализация основана на создании Ширина * Высота одиночных span-элементов, отображающих каждый по символу, что есть существенная нагрузка на браузер, особенно если консоль велика, но позволяет регулировать отображение (символ, цвет, фон, прозрачность) каждой отдельной ячейки. Как и во всех терминалах используется моноширенный шрифт без указания конкретного, что позволяет браузерам использовать те шрифты, которые у них есть. Нормальная кроссбраузерная работа с клавиатурой крайне тяжела по причине разности реализации браузеров, их багов и отсутствия спецификации в этой сфере. В то же время консоль требует вполне чёткой работы с полным контролем разрешения/запрета обработки стандартной реакции на клавиши.
Ещё одной проблемой является, собственно, ввод текста. Коды клавиш слабо корелируют с кодами символов. И здесь в браузерах огромная лажа.
Наконец, javascript использует один поток и везде, кроме Оперы, это ещё и основной поток вкладки. Это значит, что большинство функций по своей природе асинхронны, а мы привыкли писать: Write('Вас зовут: '); Name = Read();
Проблема асинхронности глобальная и моя реализация не берётся её решать (решение обычно сводится к эмуляции потока, как в примитивном виде сделано в Rpg Player). Для клавиатуры было выдвинуто требование работы с буфером обмена, по крайней мере конкретная вставка любого текста. Я использую элемент textarea (TMemo) единичного визуального размера за пределами экрана для перехвата событий клавиатуры. При потере фокуса элемент убирает красную границу с консоли, что сразу становится видно. Три ключевых события поддерживаемые браузерами (ИЕ здесь и далее не имеется в виду) KeyDown. KeyPress, KeyUp перехватываются. У каждого браузера свои особенности работы с ними, но в целом удалось вычленить общую функциональность и даже добавить новый тип событий Input, то бишь ввод. Таким образом в данный момент консоль полностью работоспособна.
Реализация змейки - просто интересное дело и, собственно, проверка работы на практике. Я планирую вторую версию с поддержкой хотсита, разными бонусами и врагами.
Идея создать эмуляцию терминала пришла к концу первой реализации ФЯП. Для того, чтобы из ФЯП можно было иметь доступ к консоли (а значит запускать игры на ФЯП из постов), нужно написать обёртку к каждой функции библиотеки, иначе кулхацкеры будут делать гадости.