Просмотр полной версии : Вопрос о тайловых картах
Привет всем кодерам спектурмистам.
У меня есть несколько глупых вопросов:
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 скролл постоянный, но и карта там рисуется подругому...
рисовать карту постоянно полностью имеет смысл при большом количестве движущихся по ней спрайтов (когда затраты на запоминание и восстановление фона становятся больше, чем время рисование карты), либо при анимированных тайлах карты. если игра типа CJ Antics - то действительно проще под этими 2-3 спрайтами фон запомнить.
рисовать карту постоянно полностью имеет смысл при большом количестве движущихся по ней спрайтов (когда затраты на запоминание и восстановление фона становятся больше, чем время рисование карты), либо при анимированных тайлах карты. если игра типа CJ Antics - то действительно проще под этими 2-3 спрайтами фон запомнить.
Спасибо!
Я тут поизучал код Stormlord и понял что там карта рисуется постоянно,причем тоже не очень быстро, а попиксельный скролл (вернее 2-х пиксельный) реализован четырьмя наборами "декранченых" тайлов и хитрым их рисованием (если интересно: #8cda).
Вобщем думаю....
У меня еще один вопрос: как лучше всего представить анимированные тайлы? в смысле, наверное обычным индексом уже не обойтись???
У меня еще один вопрос: как лучше всего представить анимированные тайлы? в смысле, наверное обычным индексом уже не обойтись???
Да запросто. Только теперь каждый индекс будет пересчитываться в определенном диапазоне.
Например, тайлы воды занимают индексы 16-19 (4 кадра), тогда процедура пересчета индекса будет примерно:
;a- old index
;c- mask
ld b,a
inc a
xor b
and c
xor b
для вышеуказанного примера c=3
ну я пробовал 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 с кучей возможностей). анимация в нем реализуется как раз вторым способом.
Круто! Спасибо!
И еще вопрос:
"Собираемые предметы", если их очень много, где лучше хранить, в тайловой карте ???
(их тоже хотелось анимировать)
Добавлено через 10 минут
Vitamin, спасибо!
ну если их много совсем, как в том же БолдерДаше алмазов - то да (прямо в карте) - а если типа Диззи - то наверно лучше отдельно - печатать спрайты поверх карты уже.
В Stormlord (1) и многих других играх использовался метод вывода графики без "теневого" экрана, сразу в экранную область (#4000-#5aff). Методика следующая:
1. Обрабатываются спрайты: записываются в спец массив линий.
2. Рисуется карта: рисуется линия тайлов, если в линию "попадают" спрайты, то
рисуются они и т.д. обрабатываем каждую линию. Такая методика позволяет рисовать спрайты практически без мерцания. (На некоторых эмулях все же видно)
У меня, возник вопрос: как происходит отсеивание и сортировка спрайтов в массив линий? Кто нибудь может рассказать о данной методике? И... если можно, поподробней...
тебе пример в коде нужен? на самом деле сейчас это уже не так актуально, так как можно программировать под 128К онли - использовать 2 экрана без всякого мерцания, что в принципе и советую =)
тебе пример в коде нужен? на самом деле сейчас это уже не так актуально, так как можно программировать под 128К онли - использовать 2 экрана без всякого мерцания, что в принципе и советую =) С "теневым" экраном я умею, меня интересует
именно эта "устаревшая" методикаю. ЗЫ: если можно, в коде?:v2_rolley
Shadow Maker
04.03.2009, 00:57
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё.
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё. И это тоже известно, был когда то Sc256zs, пробовал... Мне хочется постичь то, как кодили наши деды.:v2_wink2:
Shadow Maker
04.03.2009, 04:05
Если как деды - то я не понимаю в чем проблема-то. Там даже никаких массивов и сортировок не надо. Встроил проверку в процедуру печати тайловой линии на присутствие тут спрайта (ну то есть пробежался по всем спрайтовым объектам на этом тайловом экране - у тебя же должны где-то хранится координаты их для вывода - и проверил, они на этой строчке или не на этой) и напечатал.
Shadow Maker, тут как раз все зависит от скорости, т.е. уже никаких лишних расчетов. Отбираем и сортируем спрайты заранее, т.к. между выводом линии тайлов и выводом спрайтов тормозить уже низя!!! Я конечно понимаю, что это геморно, по сравнению с "теневым", или вторым экраном, но....
Вот игры, сделанные по данной технологии:
Stormlord demo, Stormlord 1 (1989), Zynaps (1987)
Ghost'n'Goblins (1986), Ghouls 'n' Ghosts (1989)
да еще туева хуча игр!
Shadow Maker
04.03.2009, 10:13
Ну в чем тогда проблема? Сделай тогда проверку перед выводом и нафигачь массив. Всё то же самое, только без вывода. Или я чего-то не понимаю?
Спасибо, я уже кое-что сообразил, как обойтись без сортировки, причем с небольшим массивом.
У меня, возник вопрос: как происходит отсеивание и сортировка спрайтов в массив линий
А мне вот тоже интересно.
1)Рисуется линия тайлов. И если туда попадает только часть спрайта, то что? только часть и рисуется? т.е. если тайл высотой 16 пикселей, то вот эти 16 линий пикселей от спрайта и рисуется? одновременно налагая на тайл маску по AND и спрайт по OR?
2)Такой методикой можно успеть не весь экран за прерывание отрисовать получается? в StormLord только 2/3 экрана, например. или в том же Zynaps.
3) Так все таки, что такое массив линий?
Может кодеры не заходят в ветку "Игры", но именно там я делаю все свои изыскания на примере конкретной задачи. Зацените текущую ревизию.
http://zx.pk.ru/showthread.php?p=256314#post256314
necroTrue
13.04.2010, 21:41
Он как бы не теневой, он как бы второй, там поэтому ничего не надо дополнительно перебрасывать никуда, как с теневым экраном - просто щелкаешь странички 5/7 как отрисовалось и всё.
я что-то пропустил.. :( это что, оказывается можно рендерить всё время в одно адрессное пространство и хлопать страницами вместо того что бы перекидывать все эти #1800/#1b00 байт руками на другой экран?! о_0
я что-то пропустил.. это что, оказывается можно рендерить всё время в одно адрессное пространство и хлопать страницами вместо того что бы перекидывать все эти #1800/#1b00 байт руками на другой экран?! о_0
"И на третий день заточения индеец Зоркий Глаз заметил, что у тюрьмы нет одной стены" :-D
necroTrue
13.04.2010, 22:14
не, а если серьйозно :) можно в картинках от 3х до 5ти?!
пока что я делаю так - см. приложеный файлек
necroTrue
13.04.2010, 22:41
кей, как включение 5й страницы в "верхней" памяти поможет делать двойную буферизацию?
прервите меня там где я неправ.
7я страница - 2й экран.
при влючении 5й банки все изменения сделаные в #4000-... мгновенно отображаются в #c000-... так как это физически то же пространство.
никакого копирования она не делает. это дубляж. не вижу почему была эйфория. объясните пожалуста.
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 писал последний раз. даже не помню знал ли я про это :)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot