|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
|
Page 1 of 1
|
[ 8 posts ] |
|
Вывод спрайта с попиксельной адресацией координат.
Author |
Message |
Aprisobal_
|
Товарищи, помогите. Начал делать игру, да вот есть загвоздка: нет нормальной подпрограммы вывода спрайта с попиксельной адресацией координат. Сам пишу подпрограмму, но при выводе спрайта пропадают на экране куски спрайта. Тоже самое и у вывода спрайтов в библиотеке GrLib Славы Медноногова. Скачал и пересмотрел все журналы с Virtual Tr-Dos, но везде X - знаком., Y - пикс. И пишут что X - пикс. сделаете сами. А у самих наверное мозгов нехватает сделать X - пикс., т.к. журнал не отказался бы от дополнительного материала. Только в Adventurer 12 , был попиксельный способ, но он зараза тоже глючит: когда в Alasm'e второй раз запустить прогзу всё вешается. Помогите, пожайлуста. C ув., Aprisobal
|
11 Jul 2002 05:32 |
|
|
spectre/ob
|
Универсальная прцедура вывода спрайтов любого размера будет достаточно громоздкая и тормозная. Лучше выбери определенный размер спрайта по ширине (например 2 знакоместа), а такую процедуру (с фиксированной шириной спрайтов) написать совсем несложно. Могу помочь.
|
21 Jul 2002 05:09 |
|
|
Aprisobal
Fanat
Joined: 11 Jul 2002 05:28 Posts: 78 Location: Минск
|
Спасибо, но уже написал процедуру, так что всё 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 |
|
|
Cyrax
Writer
Joined: 24 Mar 2002 17:00 Posts: 17
|
Для начала неплохо... Походовая стратегия получится хорошей Если серьёзно, то надо определится, для чего процедура нужна (одно дело лазер сквад, другое - тот же Винни). для динамических игр сия прока слабовата (ускорить можно в несколько раз) Про работу со стеком Слава (Медноногов который) написал хорошую статейку - так што читай прессу (5ти летней давности )
|
28 Jul 2002 16:35 |
|
|
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 высотой, то для таких фиксированных размеров вполне реально и процедуру с попиксельным выводом сделать, не так уж она и много жрать тактов будет (при таком размере спрайта). И как тебе уже писали, скажи какого жанра игрушка. От этого зависит надо ли тебе ее делать быстрой или компактной.
|
30 Jul 2002 12:34 |
|
|
Aprisobal
Fanat
Joined: 11 Jul 2002 05:28 Posts: 78 Location: Минск
|
2spectre/ob: Я понял что надо на каждые 8 фаз сдвига делать отдельную процедурку. Но у меня в игре только герой,оружие,враги выводятся попиксельно, всё остальное выводится архибыстро. Так что особо скоростная процедура не нужна.
Last edited by Aprisobal on 26 Mar 2005 06:45, edited 1 time in total.
|
01 Aug 2002 14:16 |
|
|
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-года выпуска.
|
28 Aug 2002 03:42 |
|
|
Aprisobal
Fanat
Joined: 11 Jul 2002 05:28 Posts: 78 Location: Минск
|
Спасибо, всё понял.
_________________ Удачи!
|
29 Aug 2002 22:42 |
|
|
|
Page 1 of 1
|
[ 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
|
|