PDA

Просмотр полной версии : Sea Dragon GameBoy



nzeemin
26.04.2011, 18:53
Напомню, Андрей Жиглов (ace210) со товарищи сделал порт игры Sea Dragon на ZX Spectrum: http://zx.pk.ru/showthread.php?t=11233

Страница оригинальной игры для TRS-80: http://www.trs-80.org/sea-dragon/
Sea Dragon на SpeccyWiki: http://speccy.info/Sea_Dragon
Скриншоты с разных платформ на MobyGames: http://www.mobygames.com/game/sea-dragon/screenshots

Собственно, я задался целью сделать также порт под GameBoy, самую старую модель, вот такую:
http://img-fotki.yandex.ru/get/5901/nzeemin.6/0_4fbd1_270c3f18_M
Чёрно-белый экран (строго говоря, зелёно-серый без подсветки), 160x144 пиксела, 4 градации серого. Z80-like процессор 4 МГц.

http://img-fotki.yandex.ru/get/5407/nzeemin.6/0_562c4_a1fc0e34_M http://img-fotki.yandex.ru/get/5605/nzeemin.6/0_56319_b82654d9_M

На сегодня, 26.04.2011 сделан пока первый очень грубый набросок:
- Главный экран с надписью
- Игровой режим -- отрисовка ландшафта, скроллинг и управление лодкой
- Часть ландшафта -- до пещер и пещеры

Нужно делать дальше:
- Решить проблему с неровным скроллингом -- часто есть рывки
- Ограничить движение лодки
- Столкновения с ландшафтом и другими объектами
- Поведение мин и прочих объектов
- и ещё много всего прочего...

Исходники: http://code.google.com/p/nzeemin-opensrc/source/browse/#svn%2Ftrunk%2Fgameboy%2FSeaDragon

Проект открытый, буду рад любой помощи -- советам, подсказкам, тестированию, критике.

В аттаче файл seadragon.gb -- цепляем к любому эмулятору GB, например, VirtualBoyAdvance http://vba.ngemu.com/
Кнопка Start -- переход в игровой режим.

jerri
27.04.2011, 13:03
а там разве не 4 цвета? в смысле градации серого

nzeemin
27.04.2011, 13:07
а там разве не 4 цвета? в смысле градации серого

В принципе да. Но на практике, там (по современным меркам) просто ужасный экран, различать эти градации довольно сложно. Да и чем контрастнее -- тем лучше. Так что я пока остановился на чисто чёрно-белом варианте.

bigral
28.04.2011, 12:37
В принципе да. Но на практике, там (по современным меркам) просто ужасный экран, различать эти градации довольно сложно. Да и чем контрастнее -- тем лучше. Так что я пока остановился на чисто чёрно-белом варианте.

Даже буквы сливаются на заставке, лучше обрисовать их тонкой каемкой из более светлого черного (так же само можно сделать с краями берега).

jerri
28.04.2011, 13:09
nzeemin, на чем пишешь? чем компилишь?

nzeemin
28.04.2011, 20:44
Даже буквы сливаются на заставке, лучше обрисовать их тонкой каемкой из более светлого черного (так же само можно сделать с краями берега).

Слепленные буквы на заставке -- это уже традиция Sea Dragon, см. версию для Атари. Буквы нарисованы ландшафтом, поэтому как есть. Что касается обрисовки -- это явно снизит число вариантов комбинирования тайлов ландшафта. В общем, пока оставлю как есть.

---------- Post added at 20:23 ---------- Previous post was at 20:19 ----------


nzeemin, на чем пишешь? чем компилишь?

Пишу на асме в нотепаде.
Компилю и линкую пакетом RGBDS: http://www.otakunozoku.com/rednex-gameboy-development-system/
В качестве редактора уровней используется Tiled: http://sourceforge.net/apps/mediawiki/tiled/index.php?title=Main_Page
Пара мелких утилит для конвертации написаны на C#.
Гоняю в эмуляторе VisualBoyAdvance.

---------- Post added at 20:44 ---------- Previous post was at 20:23 ----------

Некоторые технические детали.

У GameBoy довольно интересная организация экрана. Как таковой сплошной экранной памяти (как в БК или хотя бы как в ZX Spectrum) вообще нету. Отдельно лежат тайлы 8x8 в количестве до 192 штук. На экран выводится проекция аж трёх планов, снизу вверх: фона, окна и объектов (т.е. спрайтов). И фон и окно -- это матрицы 32x32 индексов тайлов. И для фона и для окна можно задать координаты от угла, с точностью до пиксела -- тем самым, полноэкранный скроллинг не стоит буквально ничего, значение в регистр занести! Объекты (они же спрайты) -- это те же тайлы, но для каждого спрайта задано положение с точностью до пиксела, и цвет 00 считается прозрачным. При этом можно создать до 40-ка спрайтов размером 8x8 либо 8x16 (размер одинаков для всех спрайтов). Каждому спрайту можно задать отражение по вертикали и/или горизонтали -- тоже даром, один битик взвести. Но в одной строке может быть не более 10-ти спрайтов.
В общем, получается вещь довольно удобная для разного рода платформеров и скроллеров -- загружаем кучу тайлов, набираем из них игровую сцену, сверху плюхаем подвижные спрайты. С другой стороны, работать с экраном как со сплошным полем -- довольно тяжело.

В Sea Dragon использую все три плана: фон скроллируется попиксельно, над ним статичные индикаторы в окне, а над этим всем подвижные спрайты.
Первая засада оказалась в том что окно, которое над фоном -- непрозрачно. Т.е. даже белые тайлы не позволяют увидеть под ними фон. Но оказалось, что можно ловить прерывание и перед каждой скан-строкой включать или выключать окно -- вывод строк окна приостанавливается или продолжается дальше.
У меня выводятся вверху 17 строк окна (верхние две строки надписей), затем 115 строк скроллируемого фона, затем ещё 12 строк окна (индикатор воздуха).
Получается, что высота видимой части фона -- примерно 14,5 знакомест. Поэтому ландшафт делается высотой в 15 тайлов. На хранении ландшафта не экономил, просто записываю линейно номера тайлов. Сейчас в целом ландшафт нарисован, занимает около 12 КБ.

jerri
29.04.2011, 09:25
кстати по поводу рывков - не видел
но есть 1 наблюдение

при копировании данных спрайтов через ДМА во всех играх которые я ломал
переброс осуществлялся из блока находящегося по адресу #ffхх
как то так

nzeemin
29.04.2011, 14:24
при копировании данных спрайтов через ДМА во всех играх которые я ломал
переброс осуществлялся из блока находящегося по адресу #ffхх
как то так

Хорошо бы пример, потому как то что вы говорите плохо согласуется вот с этим:
http://gbdev.gg8.se/wiki/articles/Video_Display#LCD_OAM_DMA_Transfers
Вы уверены что в вашем случае был GB а не GBC?

---------- Post added at 14:24 ---------- Previous post was at 13:01 ----------

В общем походу понял я про DMA.
В примерах везде переносят код работы с DMA в область High RAM. Дело в том, что пока работает DMA, чтение из памяти невозможно, кроме HRAM. Соответственно, код ожидания тоже может исполняться только оттуда.
Спасибо за подсказку.

jerri
29.04.2011, 14:57
я смотрел в Trip World (http://www.emu-land.net/portable/gb/roms?act=getrom&id=2811) там именно на адрес #ff80 переносится эта процедура.

ковырял no$gmb - там удобный дебуггер

nzeemin
01.05.2011, 12:33
Странное дело по поводу инструкций HALT.
Судя по доке, рекомендуется их применять как можно чаще, с тем чтобы экономить батарею, и HALT должен останавливать процессор до следующего прерывания. Но на практике я вижу что эмуляторы no$gmb и bgb отрабатывают появление HALT просто как зависание. При этом в эмуляторах KiGB и VisualBoyAdvance всё нормально.
Видимо, есть ещё какие-то тонкости вокруг этой инструкции.

jerri
01.05.2011, 15:20
кстати да в каких играх на gb используется halt? я таких не встречал :(

nzeemin
01.05.2011, 15:37
кстати да в каких играх на gb используется halt? я таких не встречал :(

Собственно, я вот об этом:
http://nocash.emubase.de/pandocs.htm#pwrusingthehaltinstruction

jerri
01.05.2011, 17:02
читал да :)
но не понял
а вот здесь все (http://nocash.emubase.de/pandocs.htm#interrupts) условия описаны?

---------- Post added at 17:02 ---------- Previous post was at 16:59 ----------

просто в трип ворлд есть halt
по адресу #6e78
но игра не виснет

jerri
04.05.2011, 11:20
Еще вопрос
в no$gmb я видел вот такую конструкцию

LDI (hl),a

что в принципе четко отображает ее функцию

но в грибшитах с реднекса
есть и
LD (HLI),a
и
LD (HL+),a

да и первое написание там тоже имеется
это нормально?
оно первый вариант то компилит?

nzeemin
04.05.2011, 21:43
Еще вопрос
в no$gmb я видел вот такую конструкцию

LDI (hl),a

что в принципе четко отображает ее функцию

но в грибшитах с реднекса
есть и
LD (HLI),a
и
LD (HL+),a

да и первое написание там тоже имеется
это нормально?
оно первый вариант то компилит?

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

nzeemin
06.05.2011, 21:17
Разбираюсь со звуком.
От ZX-версии Sea Dragon вполне можно использовать звуковые эффекты сделанные для GS -- насколько я понимаю, это 8-bit wave 37500 Hz.
На GameBoy имеется канал 3, через который можно проигрывать 4-bit wave. Частота задаётся в широких пределах, но буфер содержит всего 32 числа, и нужно успевать вовремя подгружать данные в буфер.

Легче всего привязать это к VBlank, 59.73 Hz.
Получаем частоту дискретизации: 32 x 59.73 = 1911.36 Hz.
Частота канала 3 задаётся формулой Frequency = 65536/(2048-x) Hz, где x = 0..2047, подбирая x получаем наиболее близкую частоту при x = 2014, частота = 1927.53 Hz. Не фонтан конечно, посмотрим что получится.
При этом одна секунда звука будет занимать 1928 / 2 = 964 байта -- вполне приемлемо, все эффекты займут примерно 7-8 КБ.

nzeemin
07.05.2011, 17:45
Попробовал сконвертировать звуки. Естественно, после ресемплинга потерялись все верхние частоты, очень глухо. Некоторые эффекты совсем "потерялись". Недоволен. Надо что-то придумывать.

jerri
07.05.2011, 21:18
надо всетаки переписать под их плеер
как вариант найти когото из музыкантов писавших под геймбой

nzeemin
08.05.2011, 16:23
http://img-fotki.yandex.ru/get/5303/nzeemin.6/0_568ac_21f79e9e_M

Сделан ландшафт до конца.
Сделаны торпеды.
Но столкновений по-прежнему нет.