Piszemy GRĘPo przepisaniu programu z dzisiejszego odcinka można będzie już zagrać w naszą grę. Pozostały tylko procedury zbierania przedmiotów i sprawdzania zderzeń, zliczanie i wyświetlanie punktów, paliwa i amunicji oraz procedura wytwarzająca efekty dźwiękowe. Procedura TAKE odpowiedzialna jest za zbieranie przedmiotów i zderzenia ludzika z helikopterami. Zderzenia sprawdzane są dwukrotnie, najpierw z głową, a później z nogami ludzika. I tu należy się kilka słów wyjaśnienia. Spotykałem się niejednokrotnie z programami, w których programista tylko raz obliczał adres obiektu na ekranie, a później według tego jednego adresu sprawdzał zderzenia z innymi obiektami umieszczonymi "pod", lub obok niego. Jest to jednak błędne, gdyż w taki sposób zderzenia sprawdzane są "zgrubnie" i może się zdarzyć, że zostaną wykryte przed faktycznym zetknięciem się z obiektem. Należy więc, tak jak w naszym przykładzie, obliczać adres każdego sprawdzanego punktu. Dla niewiernych powiem, że taki sposób zastosowany był w grach "Misja", "Fred", "Digi Duck" czy "Spy Master". W naszym przykładzie procedura TAKE dwukrotnie wywołuje procedurę CHK_TAKE, która po obliczeniu adresu punktu na ekranie sprawdza jego zderzenia z paliwem, amunicją, premią punktową i helikopterami. Z tymi ostatnimi jest pewien problem, gdyż są wyświetlane na sześciu fazach, a śmiertelne powinno być zetknięcie z każdą z nich. Procedura RESULT zajmuje się wyświetlaniem liczników i sprawdzaniem, czy został pobity rekord i czy graczowi nie brakło paliwa. Wszystkie liczniki wykorzystują tryb "dziesiętny" procesora, co oznacza, że w jednym bajcie można umieścić dwie cyfry od 0 do 9. Wyświetlaniem liczb w takim formacie zajmują się dwie procedurki SHW_DIG i SHW_CPH, z których pierwsza kilkukrotnie wywoływana jest z podprogramu RESULT. Procedury TAKE i RESULT sygnalizują programowi głównemu w zmiennej DEATH, że nasz gracz zakończył swój żywot. Wpisanie tam niezerowej wartości spowoduje śmierć ludzika. Procedura SOUNDS, jak sama nazwa wskazuje, odpowiedzialna jest za efekty dźwiękowe. Wpisanie niezerowej wartości do komórek SOUND1, SOUND2 lub SOUND3 spowoduje wywołanie odpowiedniego efektu dźwiękowego. Procedurka GAME_OVR to oczywiście koniec gry. Dźwiękowy i wizualny efekt wybuchu, a potem powrót na planszę tytułową. Na tym zakończyliśmy pisanie naszej gry, lecz myślę, że cykl będzie kontynuowany. Wszystko zależy od Was... inf_zero equ $2c audf1 equ $d200 audc1 equ $d201 * procedura zbierania * paliwa, amunicji i * punktow, a takze * sprawdzania zderzen * z helikopterami take equ * lda y_plr clc adc #2 jsr chk_take lda y_plr clc adc #13 chk_take equ * ldx <screen+5 stx adr1 ldx >screen+5 stx adr1+1 lsr @ lsr @ lsr @ lsr @ tax take_1 equ * dex bmi take_2 ldy #adr1 lda #scwidth jsr inad jmp take_1 take_2 equ * ldy #0 lda (adr1),y cmp #ammo beq tak_ammo cmp #fuel beq tak_fuel cmp #bonus beq tak_bonu sec sbc #heli cmp #$0e bcs #take_3 lda #255 sta death take_3 equ * rts tak_ammo equ * lda #$99 sta ammo_cou jmp cls_take tak_fuel equ * lda #$99 sta fuel_cou lda #$19 sta fuel_cou+1 jmp cls_take tak_bonu equ * lda #$50 jsr inc_scor * skasowanie zebranego * przedmiotu cls_take equ * lda #space jsr shw_adr lda #100 sta sound3 rts * wyswietlenie * stanu gry result equ * * sprawdzenie, czy * pobito rekord lda score cmp high lda score+1 sbc high+1 bcc no_high lda score sta high lda score+1 sta high+1 no_high equ * * sprawdzenie, czy * jest jeszcze paliwo ldx #255 lda fuel_cou ora fuel_cou+1 beq out_fuel ldx death sed lda fuel_cou sec sbc #$01 sta fuel_cou lda fuel_cou+1 scb #$00 sta fuel_cou+1 cld out_fuel equ * stx death ldy #$04 lda score+1 jsr shw_dig lda score jsr shw_dig ldy #14 lda high+1 jsr shw_dig lda high jsr shw_dig ldy #$24 lda fuel_cou+1 jsr shw_dig lda fuel_cou jsr shw_dig ldy #$34 lda ammo_cou * wyswietlenie * liczby dwucyfrowej shw_dig equ * pha lsr @ lsr @ lsr @ lsr @ jsr shw_cph pla * wyswietlenie cyfry shw_cph equ * and #$0f asl @ clc adc #inf_zero jsr shw_info iny iny rts * procedura obslugi * dzwieku sounds equ * lda sound1 beq no_1sou sta audcl clc adc #200 sta audfl dec soundl bne no_1sou lda #0 sta audcl sta audfl no_1sou equ * lda sound2 beq no_2sou ora #%01000000 sta audcl+2 lda #10 sta audfl+2 dec sound2 bne no_2sou lda #0 sta audcl+2 sta audfl+2 no_2sou equ * lda sound3 beq no_3sou clc adc #10 sta audfl+4 lda #230 sta audcl+4 lda sound3 sec sbc #5 sta sound3 bne no_3sou sta audcl+4 sta audfl+4 no_3sou equ * rts * wyciszenie dzwięku silence equ * ldy #7 lda #0 sta audfl,y dey bpl *-4 rts * zakonczenie gry game_ovr equ * jsr silence * efekt wybuchu ldy #l5 expl_1 equ * lda clock clc adc #2 cmp clock bne *-2 sty audcl tya clc adc #100 sta audfl sty colpm0 tya lsr @ sta colpm0+1 dey bpl expl_1 jsr silence jmp gme_strt sound3 dta b(0) high dta a(0)P.S. Do poprzednich odcinków wkradło się kilka błędów, a właściwie braków. Niestety z mojej winy. Serdecznie przepraszam i obiecuję poprawę. A oto errata: W odcinku 1 w linii po komentarzu * wyzerowanie zmiennychi instrukcji ldy #0zabrakło instrukcji tya W odcinku 2 zabrakło na końcu programu instrukcji: y_plr dta b(0) przesuw dta b(0)W odcinku 3 zabrakło na końcu programu instrukcji: score dta a(0) sound1 dta b(0) sound2 dta b(0) lstr dta b(0) Dariusz "De JET" Żołna
A oto gotowy program naszej gry w formacie Zgrywusa+. Zabawę można zacząć po połączeniu tego pliku z zestawem znaków, drukowanym w TA 3/93. 1000 REM *--------------------------* 1002 REM : HELI.OBJ : 1004 REM : autor: Dariusz Zolna : 1006 REM : (c) 1992 Tajemnice ATARI : 1008 REM *--------------------------* 1010 DATA ffff00a0b2a5208ca04c60a0a0 1020 DATA 0098998ba1c8c00e90f8a9048d 1030 DATA c002a9028dc102a9998d8da18d 1040 DATA 8ba1a9198d8ca1a9ff8dfc02a5 1050 DATA 14c514f0fca900854de6b9adfc 1060 DATA 02c91cd0034ceda020fca120a4 1070 DATA a22003a3205da3203aa420a5a4 1080 DATA 2026a5ad8ea1f0d04c8aa52044 1090 DATA a12054a120f3a2ad8402f0fba9 1100 DATA ff8dfc02adfc02c91cd0034ced 1110 DATA a0ad8402f007ad1fd0c906d0ea 1120 DATA 4c06a0200ea1a9c08d0ed4a903 1130 DATA 8d1dd0a004a9009908d08810fa 1140 DATA a9a88d07d4a9408d00d08d01d0 1150 DATA a9008d08d2a9038d0fd2207fa5 1160 DATA a000a92a2079a1c8c8c06090f5 1170 DATA a94085b8a000a5b82079a1c8c8 1180 DATA a9482079a1a5b818690285b898 1190 DATA 18690ea8c03290e460a514c514 1200 DATA f0fc200ea1a9408d0ed4a007a9 1210 DATA 009900d08810fa207fa5a9ff8d 1220 DATA fc0260a000a200bd99a185b0bd 1230 DATA 9aa185b1b1b048bd9ba191b068 1240 DATA 9d9ba1e8e8e8e02790e36048d8 1250 DATA ad0bd4290449041869b48d0ad4 1260 DATA 8d09d46840a0009848a9002082 1270 DATA a168a8c8c8d0f360a011981869 1280 DATA 4a9992a88810f6a0159818695c 1290 DATA 99b3a88810f6a00e9818697299 1300 DATA dca88810f6609900a809019901 1310 DATA a8609940a809019941a8600000 1320 DATA 0000000000000000000000002f 1330 DATA 023d3002c03102a10002300102 1340 DATA a1c40202c50204c6020ac70206 1350 DATA c80200c00204c102026f023170 1360 DATA 70f0d440a8d440a8d464a8d464 1370 DATA a8d488a8d488a8d4aca8d4aca8 1380 DATA d4d0a8d4d0a8d4f4a8d4f4a8d4 1390 DATA 18a9d418a9c400a8c400a8c420 1400 DATA a8c420a841c0a1ce97a1ad97a1 1410 DATA 8d04d430034c8ba2a9038d97a1 1420 DATA 8d04d4a94085b085b2a9a885b1 1430 DATA 85b3e6b2d002e6b3a206a000b1 1440 DATA b291b0c8c02390f7a90091b0a0 1450 DATA b0a924208ca2a0b2a924208ca2 1460 DATA ca10e0ad0ad2c932b03ea90885 1470 DATA b8ad0ad2c932b00829030a1869 1480 DATA 0285b8a96185b0a9a885b1ad0a 1490 DATA d22907aaca300aa0b0a924208c 1500 DATA a24c6ea2a000b1b0c8c811b0d0 1510 DATA 0688a5b84c9ca2601879000099 1520 DATA 0000a9007901009901006091b0 1530 DATA c8090191b060ac92a1a20fa900 1540 DATA 9920ac9920adc8ca10f6ac92a1 1550 DATA ad78022901d005c000f00188ad 1560 DATA 78022902d005c060b001c88c92 1570 DATA a1a5b929030a0a0a0aaaa90f85 1580 DATA b8bd10b59920acbd10b99920ad 1590 DATA c8e8c6b810ee60a000989900ab 1600 DATA 9900ac9900adc8d0f460ad8402 1610 DATA d04ead98a1f049ad8da1f044a9 1620 DATA 4385b0a9a885b1ad92a1186906 1630 DATA 4a4a4a4aaaca300aa0b0a92420 1640 DATA 8ca24c25a3a000b1b0c811b029 1650 DATA fec900d017a000a920209ca2f8 1660 DATA ad8da138e9018d8da1d8a9058d 1670 DATA 96a1ad84028d98a160a00084b7 1680 DATA b940a8c9089024c922b020a200 1690 DATA dd13a4f007e8e00d90f6b0128a 1700 DATA 0aaabd20a48d8aa3bd21a48d8b 1710 DATA a3209ba3a4b7c8c0fc90cc60a5 1720 DATA b92901f00160b940a81869024c 1730 DATA 82a1a9084c82a1a9002082a1c8 1740 DATA c898a206dd0ca4f026ca10f8b9 1750 DATA 40a8c902f022c904f01ec906f0 1760 DATA 1ac914f01638e908c90c900a88 1770 DATA a9202082a1c884b760a90120fa 1780 DATA a3a90f8d95a1a9144c82a1a5b9 1790 DATA 2901f00160a9004c82a1f8186d 1800 DATA 93a18d93a1a9006d94a18d94a1 1810 DATA d86022466a8eb2d6fa080a0c0e 1820 DATA 10121416181a1c1e209ba39ba3 1830 DATA 9ba39ba39ba3a4a394a394a394 1840 DATA a394a394a3eea3a9a3ad92a118 1850 DATA 69022049a4ad92a118690da245 1860 DATA 86b0a2a886b14a4a4a4aaaca30 1870 DATA 0aa0b0a924208ca24c56a4a000 1880 DATA b1b0c906f015c902f019c904f0 1890 DATA 2238e908c90eb005a9ff8d8ea1 1900 DATA 60a9998d8da14c9aa4a9998d8b 1910 DATA a1a9198d8ca14c9aa4a95020fa 1920 DATA a3a900209ca2a9648d8fa160ad 1930 DATA 93a1cd90a1ad94a1ed91a1900c 1940 DATA ad93a18d90a1ad94a18d91a1a2 1950 DATA ffad8ba10d8ca1f016ae8ea1f8 1960 DATA ad8ba138e9018d8ba1ad8ca1e9 1970 DATA 008d8ca1d88e8ea1a004ad94a1 1980 DATA 2011a5ad93a12011a5a014ad91 1990 DATA a12011a5ad90a12011a5a024ad 2000 DATA 8ca12011a5ad8ba12011a5a034 2010 DATA ad8da1484a4a4a4a201aa56829 2020 DATA 0f0a18692c2079a1c8c860ad95 2030 DATA a1f0168d01d21869c88d00d2ce 2040 DATA 95a1d008a9008d01d28d00d2ad 2050 DATA 96a1f01709408d03d2a90a8d02 2060 DATA d2ce96a1d008a9008d03d28d02 2070 DATA d2ad8fa1f01c18690a8d04d2a9 2080 DATA e68d05d2ad8fa138e9058d8fa1 2090 DATA d0068d05d28d04d260a007a900 2100 DATA 9900d28810fa60207fa5a00fa5 2110 DATA 14186902c514d0fc8c01d29818 2120 DATA 69648d00d28cc002984a8dc102 2130 DATA 8810e2207fa54c60a0e002e102 2140 DATA 00a0 |