Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Вопрос о тайловых картах (http://zx-pk.ru/showthread.php?t=9566)

rjhaviy 21st February 2009 00:07

Вопрос о тайловых картах
 
Привет всем кодерам спектурмистам.
У меня есть несколько глупых вопросов:
Code:

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 21st February 2009 06:50

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

rjhaviy 21st February 2009 08:44

Quote:

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

Спасибо!
Я тут поизучал код Stormlord и понял что там карта рисуется постоянно,причем тоже не очень быстро, а попиксельный скролл (вернее 2-х пиксельный) реализован четырьмя наборами "декранченых" тайлов и хитрым их рисованием (если интересно: #8cda).
Вобщем думаю....

rjhaviy 2nd March 2009 22:57

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

Vitamin 2nd March 2009 23:56

Quote:

Originally Posted by rjhaviy (Post 186969)
У меня еще один вопрос: как лучше всего представить анимированные тайлы? в смысле, наверное обычным индексом уже не обойтись???

Да запросто. Только теперь каждый индекс будет пересчитываться в определенном диапазоне.

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

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

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

psndcj 3rd March 2009 00: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 3rd March 2009 00:08

Круто! Спасибо!

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

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

psndcj 3rd March 2009 09:21

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

rjhaviy 3rd March 2009 10:29

psndcj, спасибо!!!

rjhaviy 3rd March 2009 23:15

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

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

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


All times are GMT +4. The time now is 21:03.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.