PDA

Просмотр полной версии : Вопрос о тайловых картах



rjhaviy
20.02.2009, 23:07
Привет всем кодерам спектурмистам.
У меня есть несколько глупых вопросов:

GETILE:
macro ts
add a,a
ld l,a
ld h,ts>>8
ld sp,hl
pop hl
ld sp,hl
emacro
;GTILE

BLTILE:
macro nxt
dup 15
pop bc
ld (hl),c
inc l
ld (hl),b
add hl,de
edup

pop bc
ld (hl),c
inc l
ld (hl),b
ld bc,nxt
add hl,bc
emacro
;BLTILE

BLTMAP:
proc
ld (@SAVSP),sp
ld hl,(MAPBY-1)
ld l,0; Y*128
srl h
rr l
ld de,MAPBUF
add hl,de
ld de,(MAPBX)
add hl,de; +X
ex de,hl

ld bc,#0a71 ; b = map height, c = map width - 16

exx
ld hl,BSADDR ; back screen address
ld de,BSWDTH-1; back screen width -1
exx

@LOOP:
dup 15
ld a,(de)
inc e
GETILE TILSET; tile table address

exx
BLTILE -479
exx
edup
ld a,(de)
GETILE TILSET
exx
BLTILE 1
exx

ld a,e
add a,c
ld e,a
jr nc,$+3
inc d
dec b
jp nz,@LOOP

@SAVSP: equ $+1
ld sp,-1
ret
eproc
;BLTMAP

Слегка модифицированный код из CJ Antics Elephant
Карта там массив 128x20

А вопрос следующий:

Если кто помнит, то в CJ Antics слоненок находится по середине,
но как только достигает одного из краев, карта скроллируется возвращая его обратно на середину.
Как лучше организовать
игровой цикл? рисовать карту всегда (более 100 000T на прорисовку)
или рисуем один раз, а потом обновляем по мере необходимости, т.е. если нужен скролл, но фон под спрайтами нужно будет сохранять..
Например в Stormlord скролл постоянный, но и карта там рисуется подругому...

psndcj
21.02.2009, 05:50
рисовать карту постоянно полностью имеет смысл при большом количестве движущихся по ней спрайтов (когда затраты на запоминание и восстановление фона становятся больше, чем время рисование карты), либо при анимированных тайлах карты. если игра типа CJ Antics - то действительно проще под этими 2-3 спрайтами фон запомнить.

rjhaviy
21.02.2009, 07:44
рисовать карту постоянно полностью имеет смысл при большом количестве движущихся по ней спрайтов (когда затраты на запоминание и восстановление фона становятся больше, чем время рисование карты), либо при анимированных тайлах карты. если игра типа CJ Antics - то действительно проще под этими 2-3 спрайтами фон запомнить.
Спасибо!
Я тут поизучал код Stormlord и понял что там карта рисуется постоянно,причем тоже не очень быстро, а попиксельный скролл (вернее 2-х пиксельный) реализован четырьмя наборами "декранченых" тайлов и хитрым их рисованием (если интересно: #8cda).
Вобщем думаю....

rjhaviy
02.03.2009, 21:57
У меня еще один вопрос: как лучше всего представить анимированные тайлы? в смысле, наверное обычным индексом уже не обойтись???

Vitamin
02.03.2009, 22:56
У меня еще один вопрос: как лучше всего представить анимированные тайлы? в смысле, наверное обычным индексом уже не обойтись???
Да запросто. Только теперь каждый индекс будет пересчитываться в определенном диапазоне.

Например, тайлы воды занимают индексы 16-19 (4 кадра), тогда процедура пересчета индекса будет примерно:


;a- old index
;c- mask
ld b,a
inc a
xor b
and c
xor b

для вышеуказанного примера c=3

psndcj
02.03.2009, 23:01
ну я пробовал 2 варианта - либо каждый кадр менять саму графику тайлов, либо есть процедура, которая подставляет номер нужного тайла в анимацию... млин, непонятно вышло =)

1 вариант - карта 1 2 3 4 5 - тайлы 1,2 анимированные
каждый кадр в наборе графики (ну типа шрифта =) меняем графику для этих 2х символов - так сделано к примеру в Boulder Dash

2 вариант - та же карта, только выглядит 255 254 3 4 5 - 255 и 254 собсно номера анимированных тайлов
вот - перед выводом на экран вырезаем окно нужных размеров из общей тайловой карты (карта же наверняка больше экрана), и при этом подставляем вместо 255 номер выводимого тайла (то есть существует табличка 255 = (0,1,1,2,3,1,0), в которой для каждой анимашки записан порядок показа тайлов) - для упрощения кода проще всего сгруппировать все анимации в начало или конец индексов.

первый вариант хорош для случаев, когда анимация редкость, второй в принципе универсален.

и немного в сторону от вопроса - тайловые карты лучше всего (имхо) рисовать в Mappy (редактор под Win с кучей возможностей). анимация в нем реализуется как раз вторым способом.

rjhaviy
02.03.2009, 23:08
Круто! Спасибо!

И еще вопрос:
"Собираемые предметы", если их очень много, где лучше хранить, в тайловой карте ???
(их тоже хотелось анимировать)

Добавлено через 10 минут
Vitamin, спасибо!

psndcj
03.03.2009, 08:21
ну если их много совсем, как в том же БолдерДаше алмазов - то да (прямо в карте) - а если типа Диззи - то наверно лучше отдельно - печатать спрайты поверх карты уже.

rjhaviy
03.03.2009, 09:29
psndcj, спасибо!!!

rjhaviy
03.03.2009, 22:15
В Stormlord (1) и многих других играх использовался метод вывода графики без "теневого" экрана, сразу в экранную область (#4000-#5aff). Методика следующая:

1. Обрабатываются спрайты: записываются в спец массив линий.
2. Рисуется карта: рисуется линия тайлов, если в линию "попадают" спрайты, то
рисуются они и т.д. обрабатываем каждую линию. Такая методика позволяет рисовать спрайты практически без мерцания. (На некоторых эмулях все же видно)

У меня, возник вопрос: как происходит отсеивание и сортировка спрайтов в массив линий? Кто нибудь может рассказать о данной методике? И... если можно, поподробней...

psndcj
03.03.2009, 22:21
тебе пример в коде нужен? на самом деле сейчас это уже не так актуально, так как можно программировать под 128К онли - использовать 2 экрана без всякого мерцания, что в принципе и советую =)

rjhaviy
03.03.2009, 22:24
тебе пример в коде нужен? на самом деле сейчас это уже не так актуально, так как можно программировать под 128К онли - использовать 2 экрана без всякого мерцания, что в принципе и советую =) С "теневым" экраном я умею, меня интересует
именно эта "устаревшая" методикаю. ЗЫ: если можно, в коде?:v2_rolley

Shadow Maker
04.03.2009, 00:57
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё.

rjhaviy
04.03.2009, 01:29
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё. И это тоже известно, был когда то Sc256zs, пробовал... Мне хочется постичь то, как кодили наши деды.:v2_wink2:

Shadow Maker
04.03.2009, 04:05
Если как деды - то я не понимаю в чем проблема-то. Там даже никаких массивов и сортировок не надо. Встроил проверку в процедуру печати тайловой линии на присутствие тут спрайта (ну то есть пробежался по всем спрайтовым объектам на этом тайловом экране - у тебя же должны где-то хранится координаты их для вывода - и проверил, они на этой строчке или не на этой) и напечатал.

rjhaviy
04.03.2009, 04:39
Shadow Maker, тут как раз все зависит от скорости, т.е. уже никаких лишних расчетов. Отбираем и сортируем спрайты заранее, т.к. между выводом линии тайлов и выводом спрайтов тормозить уже низя!!! Я конечно понимаю, что это геморно, по сравнению с "теневым", или вторым экраном, но....

Вот игры, сделанные по данной технологии:

Stormlord demo, Stormlord 1 (1989), Zynaps (1987)
Ghost'n'Goblins (1986), Ghouls 'n' Ghosts (1989)

да еще туева хуча игр!

Shadow Maker
04.03.2009, 10:13
Ну в чем тогда проблема? Сделай тогда проверку перед выводом и нафигачь массив. Всё то же самое, только без вывода. Или я чего-то не понимаю?

rjhaviy
04.03.2009, 13:54
Спасибо, я уже кое-что сообразил, как обойтись без сортировки, причем с небольшим массивом.

ace210
04.09.2009, 17:48
У меня, возник вопрос: как происходит отсеивание и сортировка спрайтов в массив линий
А мне вот тоже интересно.
1)Рисуется линия тайлов. И если туда попадает только часть спрайта, то что? только часть и рисуется? т.е. если тайл высотой 16 пикселей, то вот эти 16 линий пикселей от спрайта и рисуется? одновременно налагая на тайл маску по AND и спрайт по OR?
2)Такой методикой можно успеть не весь экран за прерывание отрисовать получается? в StormLord только 2/3 экрана, например. или в том же Zynaps.
3) Так все таки, что такое массив линий?

ace210
12.02.2010, 10:47
Может кодеры не заходят в ветку "Игры", но именно там я делаю все свои изыскания на примере конкретной задачи. Зацените текущую ревизию.
http://zx.pk.ru/showthread.php?p=256314#post256314

necroTrue
13.04.2010, 21:41
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё.
я что-то пропустил.. :( это что, оказывается можно рендерить всё время в одно адрессное пространство и хлопать страницами вместо того что бы перекидывать все эти #1800/#1b00 байт руками на другой экран?! о_0

Vitamin
13.04.2010, 22:12
я что-то пропустил.. это что, оказывается можно рендерить всё время в одно адрессное пространство и хлопать страницами вместо того что бы перекидывать все эти #1800/#1b00 байт руками на другой экран?! о_0
"И на третий день заточения индеец Зоркий Глаз заметил, что у тюрьмы нет одной стены" :-D

necroTrue
13.04.2010, 22:14
не, а если серьйозно :) можно в картинках от 3х до 5ти?!

пока что я делаю так - см. приложеный файлек

necroTrue
13.04.2010, 22:41
кей, как включение 5й страницы в "верхней" памяти поможет делать двойную буферизацию?
прервите меня там где я неправ.

7я страница - 2й экран.
при влючении 5й банки все изменения сделаные в #4000-... мгновенно отображаются в #c000-... так как это физически то же пространство.
никакого копирования она не делает. это дубляж. не вижу почему была эйфория. объясните пожалуста.

Vitamin
13.04.2010, 23:10
render_cycle:
ld a,23
ld bc,32765
out (c),a
xor 10
ld (render_cycle+1),a
;render to #c000
...
jp render_cycle

necroTrue
13.04.2010, 23:22
звиняйте за тупость, лет 5-6 писал последний раз. даже не помню знал ли я про это :)