Вывод спрайта с попиксельной адресацией координат.

Старый спектрумистский форум

Moderator: Shaos

Aprisobal_

Вывод спрайта с попиксельной адресацией координат.

Post by Aprisobal_ »

Товарищи, помогите. :cry:
Начал делать игру, да вот есть загвоздка:
нет нормальной подпрограммы вывода спрайта с попиксельной адресацией координат.
Сам пишу подпрограмму, но при выводе спрайта пропадают на экране куски спрайта.
Тоже самое и у вывода спрайтов в библиотеке GrLib Славы Медноногова.
Скачал и пересмотрел все журналы с Virtual Tr-Dos, но везде
X - знаком., Y - пикс. И пишут что X - пикс. сделаете сами.
А у самих наверное мозгов нехватает сделать X - пикс., т.к.
журнал не отказался бы от дополнительного материала.
Только в Adventurer 12 , был попиксельный способ, но
он зараза тоже глючит: когда в Alasm'e второй раз запустить
прогзу всё вешается.

Помогите, пожайлуста.

C ув., Aprisobal
spectre/ob

Post by spectre/ob »

Универсальная прцедура вывода спрайтов любого размера будет достаточно громоздкая и тормозная. Лучше выбери определенный размер спрайта по ширине (например 2 знакоместа), а такую процедуру (с фиксированной шириной спрайтов) написать совсем несложно. Могу помочь.
Aprisobal
Fanat
Posts: 78
Joined: 11 Jul 2002 05:28
Location: Минск

Post by Aprisobal »

Спасибо, но уже написал процедуру, так что всё O.K.
Но, конечно, мне было бы интересно посмотреть на другие процедуры вывода спрайтов.

Сейчас меня волнует другой вопрос: как сделать обработчик прерываний, чтобы возможно было использование стека под свои нужды (вывод спрайтов, таблицы и т.д.)...

Code: Select all

;Вывод спрайтов 2хX
;by aprisobal/ab
;Формат спр. - спрайт,маска,спрайт,маска...
;in IX - adr of sprite
;in E - Y (пикс.)
;in D - X (пикс.)
;in B - none
;in C - выс. (пикс.)
PUTPIX  PUSH    DE,BC,IX
        LD      A,E
        AND     #07
        LD      (PUTPRR+1),A
        LD      A,E
        AND     #F8
        RRCA 
        RRCA 
        RRCA 
        LD      E,A
        CALL    BCOORD
        LD      A,L
        LD      (PUTPI3+1),A
PUTPI1  PUSH    BC
        PUSH    HL
        XOR     A
        LD      H,255
        LD      L,A
PUTPRR  OR      0
        LD      D,(IX+1)
        LD      E,(IX)
        LD      B,(IX+3)
        LD      C,(IX+2)
        OR      A
        JR      Z,PUTPS1
PUTPR2  SRL     E
        RR      C
        RR      L
        SCF 
        RR      D
        RR      B
        RR      H
        DEC     A
        JR      NZ,PUTPR2
PUTPS1  LD      (PUTPS4+1),HL
        POP     HL
        LD      A,(HL)
        AND     D
        OR      E
        LD      (HL),A
        LD      A,L
        AND     31
        CP      31
        JR      NC,PUTPI6
        INC     L
PUTPS2  LD      A,(HL)
        AND     B
        OR      C
        POP     BC       
        LD      (HL),A
        LD      A,L
        AND     31
        CP      31
        JR      NC,PUTPI7
        INC     L
PUTPS4  LD      DE,0
PUTPS3  LD      A,(HL)
        AND     D
        OR      E
        LD      (HL),A
PUTPI2  DUP     4
        INC     IX
        EDUP 
PUTPI3  LD      L,0
        CALL    DOWN
        DEC     C
        JR      NZ,PUTPI1
PUTRET  POP     IX,BC,DE
        RET 
PUTPI6  POP     BC
PUTPI7  DUP     4
        INC     IX
        EDUP 
        JR      PUTPI3

DOWN    INC     H
        LD      A,H
        AND     7
        RET     NZ
        LD      A,L
        ADD     A,32
        LD      L,A
        LD      (PUTPI3+1),A
        RET     C
        LD      A,H
        SUB     8
        LD      H,A
        RET 

BCOORD  LD  A,D ;de(0-191,0-31) -- hl
        RRCA 
        RRCA 
        RRCA 
        AND #18         ;%00011000
BCOSCR  ADD A,#40       ;%01000000
        LD  H,A
        LD  A,D
        AND #07         ;%00000111
        ADD A,H
        LD  H,A
        LD  A,D
        RLA 
        RLA 
        AND #E0         ;%11100000
        OR  E
        LD  L,A
        RET 
Last edited by Aprisobal on 26 Mar 2005 06:47, edited 1 time in total.
Cyrax
Writer
Posts: 17
Joined: 24 Mar 2002 17:00

Ку

Post by Cyrax »

Для начала неплохо... ;) Походовая стратегия получится хорошей ;)
Если серьёзно, то надо определится, для чего процедура нужна (одно дело лазер сквад, другое - тот же Винни). для динамических игр сия прока слабовата (ускорить можно в несколько раз)
Про работу со стеком Слава (Медноногов который) написал хорошую статейку - так што читай прессу (5ти летней давности ;) )
spectre/ob

Post by spectre/ob »

Да, про скорость работы этой процедуры будут слагать легенды (как раз успеют пару легенд, пока она отработает) ;) А если серьезно, то даю тебе совет: брось дурное, не возись ты с попиксельной процедурой, потому что это будет медленно и громоздко (у тебя 171 байт). Также забудь про новомодный вывод стеком, а обрати внимание на LDI. Процедура вроде:

OUTSPR
PUSH BC
PUSH DE
DUP n-раз
LDI
EDUP
POP DE
POP BC
CALL INCD
DJNZ OUTSPR
RET

INCD INC D
LD A,D
AND 7
RET NZ
LD A,E
ADD A,#20
LD E,A
RET C
LD A,D
SUB 8
LD D,A
RET

И мало занимает и работает быстро (правда маску не накладывает), а чтобы спрайты выводились попиксельно их нужно заранее сдвинуть на все 8 фаз. Это делается простой процедурой. Маску тоже можно программно посчитать, а можно и нарисовать.

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

И как тебе уже писали, скажи какого жанра игрушка. От этого зависит надо ли тебе ее делать быстрой или компактной.
Aprisobal
Fanat
Posts: 78
Joined: 11 Jul 2002 05:28
Location: Минск

Post by Aprisobal »

2spectre/ob:
Я понял что надо на каждые 8 фаз сдвига делать отдельную процедурку.
Но у меня в игре только герой,оружие,враги выводятся попиксельно,
всё остальное выводится архибыстро.
Так что особо скоростная процедура не нужна.
Last edited by Aprisobal on 26 Mar 2005 06:45, edited 1 time in total.
Mishutka

Вывод спрайта с попиксельной адресацией координат

Post by Mishutka »

Более-менее быстро спрайт можно вывести лишь разложив его на
восемь фаз. Спрайт храним в форме байт маски, байт спрайта.
Обращаться к нему опять же очень хорошо с использованием стека.
Для примера - вывод спрайта 16 на 16.

; HL - адрес спрайтов в памяти расположенных один за одним
; D - х координата
; E - у координата

ld a,d
and #07
ld sp,hl
ld l,a
ld h,#00
dup 6
add hl,hl ; умножили на 64 (размер одного спрайта)
edup
add hl,sp
ld sp,hl ; все в SP адрес нужной фазы спрайта
call coord ; на выходе в HL адрес на экране
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc hl ; не забудьте проверить границу
pop de
; далее думаю ясно
Процедура писана в году не помню каком, но что-то в этом роде
я видел в буте 91-года выпуска.
Aprisobal
Fanat
Posts: 78
Joined: 11 Jul 2002 05:28
Location: Минск

Post by Aprisobal »

Спасибо, всё понял.
Удачи!