Хороші технологічні рішення для побудови карти ascii та переміщення символів у браузері (як карликова фортеця)? [зачинено]


10

Я хотів би створити веб-сайт для свого ігрового веб-сайту, який передбачає використання текстових символів для представлення тварин і людей, і змусити їх рухатись по картах з незалежними (серверними) AI.

Так по суті, карликова карта фортеці в браузері: карлик-фортеця-приклад З рухомими істотами, мобами, npcs та ПК. Хоча не те, що я не хочу досягти такої шкали, я, мабуть, почав би показувати чверть цього вмісту чи так у будь-який час.

Можливо, частина фонових / нерухомих плиток може бути завантажена статично. Але для істот / тварин і речей, які можуть рухатися, я не впевнений, які технологічні рішення були б найбільш ефективними.

Мені відомо, <canvas>хоча я не знаю, чи відповідають його можливості цьому випадку використання. Звичайно, знадобиться деяка кількість javascript.

Чи існують бібліотеки javascript або бібліотеки полотна, які відповідають цьому випадку використання? Ще одна технологія, про яку я не знаю? Хтось знає про будь-які приклади веб-сайтів, які зробили щось подібне до цього, щоб я міг створити ідеї з них?


1
Погляньте на rot.js ondras.github.com/rot.js/hp
Аларік

Що ж, rot.js може бути саме тим, що я шукав, але не знав цього.
Kzqai

Відповіді:


5

Я фактично створив бібліотеку відображення символів для Інтернету, Unicodetiles.js , яку я не лише витратив деякий час на оптимізацію, але і досліджує різні способи подання тексту; у нього є три рендері:

  1. DOM, який використовує матрицю <div> елементів для надання кожному гліфу з налаштованими кольорами переднього плану та фоном.
  2. Полотно, яке малює символів за допомогою <canvas>елемента. Це набагато швидше, і є тести на ефективність для підтвердження цього: http://tapiov.net/unicodetiles.js/tests/
  3. WebGL, який використовує елемент canvas для створення текстури шрифту, а потім надає за допомогою WebGL, який ще швидше і дуже масштабований до великих розмірів вікна перегляду, але не настільки добре підтримується в браузерах.

Зауважте, що пов'язані тести на ефективність можуть бути досить екстремальними, змінюючи кожен символ кожного кадру. На практиці навіть референт DOM досить швидкий для більшості цілей.

Якщо ви вирішили створити власну бібліотеку, я все-таки рекомендую використовувати полотно, оскільки воно, здається, працює краще, що дозволяє створювати великі сцени. Використання лише WebGL обмежить базу користувачів, і це складно реалізувати (у Unicodetiles є автоматичний механізм резервного копіювання).


Інша бібліотека, яку я чув , запропонував багато в останнім часом rot.js . Він спеціально орієнтований на негідників, як це стосується, наприклад, системи FOV та генераторів підземелля. Якщо ви хочете повний пакет, це може бути шлях.


Приємно. Я можу цим скористатися. Або принаймні вчитися з того, як це робив хтось інший, щоб повідомити про власний підхід, оскільки я хочу зробити шахрайство, але не таке, як схоже на шахрая. : D
Kzqai

@Tapio Я намагаюся реалізувати Pacman з однокоректилами, проблема - це гравець, завжди орієнтований на карті, це небажано для Pacman, чи можу я його деактивувати, чи можу я обійтись, не вказуючи гравця.
користувач3995789

6

Я думаю, що найефективнішим способом було б просто підробити це. Відображення якогось цільового елемента за допомогою власного вбудованого шрифту спрайту так, ніби ви рендеруєте звичайний двовимірний екран. Цей підхід гарантує, що не трапляється дивних речей, коли люди не вистачають шрифтів або використовують зовсім іншу мову (китайську, російську).

Шрифти та тексти - одне з найскладніших речей, щоб отримати піксель ідеальним у всіх регіонах у всіх браузерах. Навіть при вставці шрифту та використанні деяких магічних веб-переглядачів CSS та юзабіліті все ще можна його змінити та змінити. Для звичайних веб-сайтів ідеальний текст для пікселів не є проблемою, але в таких іграх, як Dwarf Fortress, декілька пікселів можуть призвести до надзвичайно непослідовної картини. Навіть коли не використовується браузер, але звичайна програма, виникають проблеми з передачею тексту. Тож навіть фортеця Карликів сама використовує описаний нами підхід.

http://en.wikipedia.org/wiki/Dwarf_Fortress

На екранні екрани використовуються трохи змінені кодові сторінки 437 символів у 16 ​​різних кольорах, реалізованих у вигляді растрових зображень, наданих за допомогою OpenGL

Редагувати: оскільки я отримав кілька коментарів, я трохи продовжив відповідь


Чи інші мови не є розширеннями, а не заміною ASCII? Чому звичайні веб-сайти, що містять текст, «не підробляють»?
Анко

1
Більшість проблем із кодуванням символів можна запобігти за допомогою кодування UTF-8.
Філіпп

Російська має інший шрифт, ніж ASCII, а китайська - ще більше. Звичайний веб-сайт дбає про естетику, яка включає в себе такі речі, як гліфи змінного розміру, кернінг, приємний "потік" тексту тощо. Гра, подібна до DF, піклується про регулярне розміщення літер, що неможливо надійно зробити у веб-браузері.
Ліосан

1
@Liosan впевнений, що може. Просто використовуйте декларацію CSS, font-family:monospace;і веб-браузер використовуватиме шрифт моношпарту за замовчуванням.
Філіпп

Я насправді не впевнений, чим це може принести користь порівняно із вбудованим веб-шрифтом Monospace-сімейства css? Я маю на увазі, це займе більше рендерингу, maaaybe, це дозволить вирішити проблеми з інтервалом більш надійно, але з вбудованим шрифтом css це не має значення, якщо люди пропустили шрифт або використовували іншу мову? Хоча я думаю, це обмежило б операції лише вбудованим символьним набором веб-шрифтів, хммм.
Kzqai

3

Щоб дізнатись кількість рядків та стовпців, які потрібно вивести, слід перевірити ширину та висоту вікна та відповідно змінити їх. Не забудьте слухати події onResize та відповідно змінюйте ширину та висоту.

Коли ви хочете зробити це текстовим способом , ви можете зробити це за допомогою тексту з односхилим шрифтом та таблиці, де кожна комірка містить один символ.

Для адреси окремих символів ви можете створити a <table>з правильною кількістю рядків і стовпців, де кожен <td>має ідентифікатор, що складається з його x- і y- координат. Таким чином ви можете звертатися до окремих комірок за ідентифікатором та змінювати їх внутрішнійHTML, щоб змінити літеру та змінити їхній клас css, щоб змінити їх колір.

Однак використання полотна може бути швидшим, оскільки вам не доведеться маніпулювати великим деревом DOM для кожного символу, який потрібно замінити. Карликова фортеця робить до речі подібну річ. Символи, які використовуються для представлення об'єктів, насправді є растровими зображеннями, а не вірними текстовими виводами, і вони малюються за допомогою 2d графічних API. Полотно HTML5 добре обладнане для цього. Він має метод context.fillText, який дозволяє малювати текст на полотні. Це можна використовувати для малювання окремих символів. Ви можете змінити розмір і розмір шрифту, маніпулюючи змінними context.font та кольором кожної літери, зателефонувавши на контекст.fillStyle .

Зауважте, що виклик fillText у сотні разів за кадр може бути повільним, тому що растрування шрифтів коштує дорого, і жоден браузер, який я знаю, не використовує кешування. Це означає, що коли ви будете стовідсотково виводити один і той самий лист з тими ж налаштуваннями, він буде сто разів повторно растрований. Щоб збільшити продуктивність, ви можете кешувати растрований вигляд кожної літери з кожним кольором на прихованому полотні, а потім намалювати ці приховані полотна за допомогою контексту.drawImage . Копіювання з одного полотна на інше, як правило, набагато швидше, ніж растерізація шрифту.

Наразі я розробляю 2d гру за допомогою полотна, і помітив, що найбільшим пожирачем FPS був малюнок шрифту. Коли я додав кеш для растрового тексту, це значно покращило продуктивність.


Шрифти растрових зображень теж є правдивим текстом! Я використовую їх у терміналі весь час. Крім того, якщо полотно швидше, чому не відображається текст на StackExchange на полотні?
Анко

чорт, зараз я хочу написати для цього бібліотеку.
Філіп

@Anko термінал! = Веб-браузер. На який саме текст відображення ви посилаєтесь?
Філіп

1
Казка Анко, що як растрові шрифти є істинним текстом, він може використовувати їх у своєму терміналі - і це тим самим є його доказом того, що растрові шрифти є істинним текстом.
Полярний

0

Гаразд, це просто удар в темряві, і я не знаю, як це виводиться.

В основному ви використовуєте ті ж консолі трюку (ака-термінал), які робили за старих часів. Спочатку ви починаєте з шрифту монопростіру. У вас M рядків з N символами. Таким чином, ви просто скидаєте текст у розділ, який є достатньо широким (ширина: N em?) І додаєте кожному N символам розрив рядка; у цьому випадку <br/>замість а \n.

Трюк полягає в тому, щоб замінити буфер, або char на char, або весь вміст відразу на сценарій java.

Якщо ви хочете отримати дійсно конкретну інформацію, ви можете використовувати @ font-face, щоб переконатися, що ви є скрізь однаковим шрифтом монопростору.


Я також думав про це, але потім зрозумів, що це не буде гарною архітектурою, коли ти хочеш керувати кольором та кольором тла кожного окремого персонажа.
Філіпп

0

Подумайте з точки зору гліфів. Розв’яжіть відображення тексту від значення, яке стоїть за ним. Наприклад:

(псевдокод)

if (display.hitGlyph)
    glyph = Glyph.Asterisk;

display(glyph);

А потім у своєму базовому коді для визначення атласу гліфів просто виконайте щось так:

Glyph.Asterisk = "*";

Насправді атлас гліфів насправді може знаходитись у таблиці ascii з різними кодуваннями. Сенс у цьому полягає лише в тому, щоб розділити, коли відображати, з тим, що має відображатися. Я рекомендую зробити рамку з нуля. Це дало б вам більше свободи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.