nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Apr 2024 16:48



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

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

C ув., Aprisobal


11 Jul 2002 05:32
Reply with quote
Post 
Универсальная прцедура вывода спрайтов любого размера будет достаточно громоздкая и тормозная. Лучше выбери определенный размер спрайта по ширине (например 2 знакоместа), а такую процедуру (с фиксированной шириной спрайтов) написать совсем несложно. Могу помочь.


21 Jul 2002 05:09
Fanat

Joined: 11 Jul 2002 05:28
Posts: 78
Location: Минск
Reply with quote
Post 
Спасибо, но уже написал процедуру, так что всё O.K.
Но, конечно, мне было бы интересно посмотреть на другие процедуры вывода спрайтов.

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

Code:
;Вывод спрайтов 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.



26 Jul 2002 14:58
Profile ICQ
Writer

Joined: 24 Mar 2002 17:00
Posts: 17
Reply with quote
Для начала неплохо... ;) Походовая стратегия получится хорошей ;)
Если серьёзно, то надо определится, для чего процедура нужна (одно дело лазер сквад, другое - тот же Винни). для динамических игр сия прока слабовата (ускорить можно в несколько раз)
Про работу со стеком Слава (Медноногов который) написал хорошую статейку - так што читай прессу (5ти летней давности ;) )


28 Jul 2002 16:35
Profile
Reply with quote
Post 
Да, про скорость работы этой процедуры будут слагать легенды (как раз успеют пару легенд, пока она отработает) ;) А если серьезно, то даю тебе совет: брось дурное, не возись ты с попиксельной процедурой, потому что это будет медленно и громоздко (у тебя 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 высотой, то для таких фиксированных размеров вполне реально и процедуру с попиксельным выводом сделать, не так уж она и много жрать тактов будет (при таком размере спрайта).

И как тебе уже писали, скажи какого жанра игрушка. От этого зависит надо ли тебе ее делать быстрой или компактной.


30 Jul 2002 12:34
Fanat

Joined: 11 Jul 2002 05:28
Posts: 78
Location: Минск
Reply with quote
Post 
2spectre/ob:
Я понял что надо на каждые 8 фаз сдвига делать отдельную процедурку.
Но у меня в игре только герой,оружие,враги выводятся попиксельно,
всё остальное выводится архибыстро.
Так что особо скоростная процедура не нужна.


Last edited by Aprisobal on 26 Mar 2005 06:45, edited 1 time in total.



01 Aug 2002 14:16
Profile ICQ
Reply with quote
Более-менее быстро спрайт можно вывести лишь разложив его на
восемь фаз. Спрайт храним в форме байт маски, байт спрайта.
Обращаться к нему опять же очень хорошо с использованием стека.
Для примера - вывод спрайта 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-года выпуска.


28 Aug 2002 03:42
Fanat

Joined: 11 Jul 2002 05:28
Posts: 78
Location: Минск
Reply with quote
Post 
Спасибо, всё понял.

_________________
Удачи!


29 Aug 2002 22:42
Profile ICQ
Display posts from previous:  Sort by  
Reply to topic   [ 8 posts ] 

Who is online

Users browsing this forum: No registered users and 53 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.