Щуролов
Як і в серіалі "Кремнієва долина", алгоритми стиснення можуть чарівним чином перетворити щось велике у маленьке. Єдина проблема полягає в тому, що декомпресор займає програмний простір, тому потрібен ідеальний баланс між складністю декомпресора та ступенем стиснення. Універсального рецепту не існує, але алгоритми RLE часто дають хороші результати.
Розглянемо спрайт танкової гармати з моєї гри
NLAW:
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
255 ■■■■■■■■■■■□■■■■ 239
255 ■■■■■■■■■■■□■■■■ 239
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
0 □□□□□□□□□□□□□□□□ 0
Він видається ідеальним для RLE-компресії: 4×0, 2×255, 14×0, 2×239, 10×0. Ми будемо кодувати дані як:
256 * (лічильник - 1) + значення
отримавши
DATA768,511,3328,495,2304. Всього 25 символів, щоб визначити спрайт 32×32.
Зрозуміло, що багато спрайтів відрізняються лише деталями, наприклад:
□□□□□□□■■■□□□□□□ □□□□□□□■■■□□□□□□
□□□□□□■■■■■□□□□□ □□□□□□■■■■■□□□□□
□□□□□□■□□□■□□□□□ □□□□□□■□□□■□□□□□
□□□□□□■□□□■□■□□□ □□□□□□■□□□■□■□□□
□□□□□■■■□■■■□□□□ □□□□□■■■□■■■□□□□
□□□□■■■■■■■■■□□□ □□□□■■■■■■■■■□□□
□□□■■■■■■■■■■■□□ □□□■■■■■■■■■■■□□
□□□■■□■■■■■■■■□□ □□□■■■■■■■■□■■□□
□□□□□□■■■■■□■■□□ □□□■■□■■■■■□□□□□
□□□□□□■□■□■□■■□□ □□□■■□■□■□■□□□□□
□□□□□□■■■■■■□□□□ □□□□□■■■■■■□□□□□
□□□□□■■■■■■■□□□□ □□□□□■■■■■■■□□□□
□□□□□■■■□■■■■□□□ □□□□■■■■□■■■□□□□
□□□□□■■■□□■■■□□□ □□□□■■■□□■■■□□□□
□□□□■■■□□□□□□□□□ □□□□□□□□□□■■■□□□
□□□□■■■□□□□□□□□□ □□□□□□□□□□■■■□□□
Якщо деякі байти збігаються з відповідними у попередньому спрайті, ми кодуємо дані як:
-(лічильник - 1)
що дає
-6 для фрагмента 8×7 пікселів у верхньому лівому куті.
Завдяки вищеописаному підходу я зберіг близько двох рядків коду у відзначеній нагородами грі NLAW.
Для визначення ковбойської графіки в
моїй грі на тему Дикого Заходу була використана зовсім інша техніка. Зображення описувалося лініями сканування, де два значення вказують початкові та кінцеві координати. Від’ємний початок запобігає переходу до наступної лінії сканування (використовується абсолютне значення). Нульовий кінець - це ознака зупинки.
SCRSHOT4.PNG
Важко втиснути багато рівнів у десять рядків, якщо кожен рівень представляє інший лабіринт або місцевість. Часто можна запакувати рівні у бітові мапи, подібно до спрайтів (наприклад, повітря=&B00, вода=&B01, сходи=&B10, цегла=&B11). Також застосовуються методи стиснення, описані вище.
Зовсім інший підхід — процедурна генерація. Він рідко використовується з BASIC, оскільки такі алгоритми, як правило, повільні. Однак у моїй грі
Escape! для Mattel Aquarius була реалізована процедурна генерація 5 рівнів.
SCRSHOT1.PNG