PROGRAMOVÁNÍ HER (2.část)
Tak vás vítám u dalšího dílu seriálu o programování her. Jelikož minule jsem to s náročností projektu poněkud přehnal, budu se to dnes snažit napravit tím, že vám předkládám plně komentovaný výpis demo hry napsané v Omicron Basicu. Tato hra se mimo jiné nachází také na disku.
Úvodní grafiku dělal J.Suchánek, zcela nový grafik na jehož dílka se můžete těšit. Grafika do hry je převzata z disku Stos Sprite 600. A program jsem vytvářel já (HEAD). Pozor! V této verzi se jedná pouze o velmi jednoduché zpracování, aby to celé bylo jednodušeji vysvětlitelné. Premiéru plné verze můžete čekat snad již příště. Co by v ní mělo být? Možnost hry dvou hráčů
Více Spriteů
Přehrávání 12 kHz samplů při hře již pro ST
Spousta zábavy
A možná ještě něco navíc . . .
Super hudba
To byla trocha předčasné reklamy, ale teď už raději k popisu celého programu. Jak již jsem řekl, celý program máte i na disku s koncovkou .BAS v archívu PROG_2.TOS. To, co bude následovat, bude sice listing téhož programu, avšak okořeněný o vysvětlení jednotlivých programátorských technik.
1 CLEAR 128000, 4096: REM VYREZERVOVAT 128000 BYTE PRO PRIKAZ MEMORY. POZOR!!! PRIKAZ MUSI BYT NA ZACATKU, MAZE TAKY VSECHNY PROMENNE
2 POKE $484, 0: REM vypnout zvuk kurzoru a repeat, kvuli Compileru
6 PRINT CHR$(27);"f";: REM vypnout kurzor
10 MEMORY_BLOCK 10, 11512, Sprites%L: WPOKE Sprites%L+11510, 0: REM pri prvnim volani zajistena inicializace, zajistuje WPOKE
20 MEMORY_BLOCK 11, 17662, Hero%L: REM banka sprite
21 MEMORY_BLOCK 12, 17202, Aliens%L: REM banka sprite-nepratele
22 MEMORY_BLOCK 14, 32066, Invaze%L: REM uvodni obrazek
23 MEMORY_BLOCK 16, 32, Barvy%L: REM BLOAD "Hero.COL", Barvy
24 FOR K%L= 0 TO 15: XBIOS (R%L, 7, K%L, WPEEK(Barvy%L+K%L*2), 0): NEXT K%L: REM zmenit paletu barev
25 MEMORY_BLOCK 13, 400, Copy32k%L
26 MEMORY_BLOCK 15, 194, Joy1%L: DEF USR = Joy1%L
To co předcházelo, byly všechno MEMORY_BLOCK (syntaxi jsme si vysvětlovali v minulém čísle, každopádně první je číslo banky, pak její délka a nakonec adresa na které se banka nachází. Tou adresu se naplní proměnná.) Funkce Joy a DEF USR= Joy si nevšímejte. V podstatě nahrazuje příkaz JOYSTICK, protože ten nám po zkompilování jaksi blbnul.
30 REM BLOAD "sprite.dat", Sprites: REM TOTO NAHRAVANI JE NUTNE POUZIT POUZE PRI PRVNIM POUZIVANI MEMORY_BLOCK, NEBO PRI VYTVARENI NOVYCH VERZI RUTIN, PAK POZOR NA VYREZERVOVANOU VELIKOST PAMETI PRIKAZEM MEMORY BLOCK
40 REM BLOAD "Hero.spr", Hero
45 REM bload "copy32k.dat", Copy32k
Když používáte banku poprvé, musíte do ní nahrát podprogramy, se kterými chcete pracovat, to je snad jasné, ne? Může tam být třeba i obrázek jako je tomu v MEMORY_BLOCKu 14. Ono se to stejně všechno uloží i s basicovým programem na disk do jednoho souboru. No není to perfektní?
110 DIM Strelba_Hero%B(8): RESTORE 115: FOR K%L= 0 TO 3: READ Strelba_Hero%B(K%L): NEXT K%L: REM CTU JEDNOTLIVE POZICE CHUZE DOPRAVA
115 DATA 2, 11, 12, 10, 1
120 DIM Vybuch%B(8): RESTORE 125: FOR K%L= 0 TO 7: READ Vybuch%B(K%L): NEXT K%L: REM CTU JEDNOTLIVE POZICE CHUZE DOLEVA
125 DATA 12, 13, 14, 15, 16, 17, 18, 19, 1
128 DIM Strela%B(4): RESTORE 130: FOR K%L= 0 TO 3: READ Strela%B(K%L): NEXT K%L
130 DATA 7, 8, 9, 19, 1
Na řádcích 110-130 probíhá načítání jednotlivých animačních pozic do polí. Čísla 1 na konci dat si nevšímejte, je tam zbytečně. Těchto polí je používáno kvůli tomu, že jednotlivé navazující animační pozice nejsou v bance spriteů za sebou.
132 DIM Move_X%(12), Move_Y%(12), Type_Alien%(12), Aliens_X%(12), Aliens_Y%(12), Fyz_Pozice%(12): Number_Of_A%= 0: Alien_Time%= Timea%: REM promenne informace o nepratelich
Definovaní polí pro nepřátele, např. Type_Alien je pole pro druh aliena, Move_X zase udává jak bude velký právě jeden krok aliena v Xové souřadnici.
300 REM DEFINOVANI SCREENU POMOCI MEMORY
310 Screen1%L= (( MEMORY(32256+8192)+256) AND $FFFF00): SCREEN 1, Screen1%L, 16: REM DEFINOVANI DRUHE VYMENNE OBRAZOVKY, ZAOKROUHLUJI PRITOM NA 256
320 Background%L= (( MEMORY(32256)+256) AND $FFFF00): REM DEFINOVANI ADRESY ZAKLADNI OBRAZOVKY BEZ SPRITE
325 SCREEN 1: PRINT CHR$(27);"f";: SCREEN 0: REM ZAKAZ KURZORU NA SCREENU 1
330 Obraz%L= LPEEK($44E): REM DEFINOVANI PRVNI VYMENNE OBRAZOVKY
340 SWAP Screen1%L, Obraz%L: REM DEFINOVANI ADRESY OBRAZOVKY, NA KTERY SE BUDE KRESLIT
ŕádky 300-340 pro vás budou patrně poněkud chaotické, ale v podstatě na řádku 300 se nadimenzuje asi 40 Kb, které používáme jako o něco vyšší obrazovku, potom se na ni rovnou nastaví viditelná obrazovka, to dělá příkaz SCREEN (Ten má jako parametr, nejdřív číslo definovaného Screenu, potom adresu budoucí obrazové paměti, a ukončuje to počet barev rozlišení).
Na řádku 320 se zase nadefinuje 32 Kb pro pozadí, které se v podstatě vždy před vykreslením spriteů musí nakreslit. 325, tam zapneme Screen 1 a zakážeme zobrazování kurzoru, totéž jsme dělali pro Screen 0 (základní) již na začátku programu.
330, Načte adresu obrazové paměti Screen 0.
340, Prohodí proměnné Obraz a Screen1. Nyní je zapnutý Screen 0, tzn. že budeme zapisovat grafiku do Screen 1, aby nedošlo k rušivým efektům při kreslení. Adresa Screen 1 je teď v proměnné Obraz.
996 GOTO Game_Over
Odskok na úvodní, ale i ukončující obrazovku.
997 X_Hero%L= 160: Y_Hero%L= 170: FOR K%= 1 TO 12: Type_Alien%(K%)= 0: NEXT K%
998 Anim_Hero%= 0: Zasah%= 0: Strelba%= 0: Close_Move%= 0: Fyz_Pozice%L= 2: Apos_Strelba%= 0: Score%L= 0: REM Raketa je v zakladni pozici
Zde jsem, jako na každém správném začátku vynuloval všechny proměnné, které jsou ve hře použity a jejichž nenulová hodnota by mohla pro hru znamenat menší chaos.
X_Hero udává souřadnici tvé rakety, Y_hero, pak Y. Následnovně mažeme všechny Type_Alien, což značí, že pro začátek nebude na obrazovce žádný Alien. Anim_Hero udává, jestli se naše raketa právě animuje, či nikoliv. Zasah indikuje, když někoho sestřelíme. Strelba naopak informuje o tom, když letí střela. Fyz_pozice udává, právě zapnutou animační pozici vaší rakety. Apos_Strelba udává animační pozici střely. Tedy číslo, které udává pořadí v poli Strelba_hero a Strela.
999 CALL Copy32k%L( HIGH(0), LOW(0), HIGH(Background%L), LOW(Background%L)): REM VYNULOVAT POZADI
Mažeme 32K pozadi. Takovýto způsob volání podprogramu Call32k to způsobuje, tj. když je počáteční adresa 0.
1000 REM TADY ZACINA SAMOTNY PROGRAM, TEDY PO UKONCENI INICIALIZACI
1005 Adr%L= LPEEK($44E): LPOKE $44E, Background%L: FOR K%= 0 TO 800: LINE COLOR = RND(15): DRAW RND(319), RND(199): NEXT K%
1050 FOR K%L= 0 TO 15: XBIOS (R%L, 7, K%L, WPEEK(Barvy%L+K%L*2)): NEXT K%L: REM zmenit paletu barev
Na řádcích 1005, 1050 kreslíme na pozadí 801 hvězdiček, a to tak, že změníme adresu HEX44E a tím se změní adresa pro výstupy TOS a VDI. Pak ty hvězdy na pozadí nakreslíme. Následuje změna palety barev, mění se 16 barev pomocí funkce xbiosu 7, kde první číslo po číslu funkce udává číslo barvy, další udává její hodnotu. Tentokrát ji čteme z paměti.
1500 CALL Copy32k%L( HIGH(Background%L), LOW(Background%L), HIGH(Obraz%L), LOW(Obraz%L)): REM UMISTIT AKTIVNI OBRAZOVKU
1510 GOSUB Draw_Sprites
Prsknutí pozadí na obrazovku a skok na vykreslení sprite.
1999 Alien_Time%L= TIMER
Nepřátelé budeme vypouštěť vždy v určitém časovém intervalu. TIMER je počítadlo, které se každou 1/200 sec změní, nelze ho nulovat.
2000 REM ZDE JSOU PROCEDURY PRO OVLADANI JOYSTICKEM
2003 Posic%L= USR(0): Cas_Begin%L= TIMER
Místo Posic= Usr(0), by v tomto případě mohlo klidně být Posic= Joystick(1). Kam budeme při příkazu USR skákat jsme nastavovali na začátku programu. Cas_Begin naplňujeme, protože obrazovku budeme překreslovat v určitém časovém období.
2005 IF TIMER -Alien_Time%L>600-Score%L*4 THEN Alien_Time%L= TIMER : GOSUB Pust_Aliena
Tento řádek zajišťuje vypuštění aliena po určitém časovém období, to závisí na počtu zabitých, tj. dosaženém score.
2195 IF Close_Move%>0 THEN Close_Move%= Close_Move%-1: GOTO No_Joy
Např. při ztrátě života se zakáže jakákoliv možnost pohybu, to hlídá tato proměnná.
2200 IF Strelba%= 0 THEN IF MOUSEBUT = 2 THEN Strelba%= 1: Fyz_Pozice%L= 2: Anim_Hero%= 1: Apos_Hero%= 0: Apos_Strelba%= 0: X_Strela%= X_Hero%L: Y_Strela%= Y_Hero%L-12: Fyz_Strel%L= 7: GOTO 2350
Když právě neletí střela, je možné vystřelit, potom se nastaví počáteční animační pozice a povolí se animace střely a rakety.
2280 IF Posic%L= 0 AND Anim_Hero%= 0 THEN Fyz_Pozice%L= 2: GOTO 2350
2290 IF Posic%L>7 THEN IF Posic%L<11 THEN IF Anim_Hero%= 0 THEN GOSUB Joy_Doprava: GOTO 2350
2300 IF Posic%L>3 THEN IF Posic%L<7 THEN IF Anim_Hero%= 0 THEN GOSUB Joy_Doleva: GOTO 2350
2280-2300 Testování pozic Joysticku, případný pokus o pohyb, nastavení Fyz_pozice doprava, nebo doleva. Při nulové pozici Joye, nastavit raketu na střed.
2350-No_Joy: REM sem skocime, pokud budou uzavreny vsechny pohyby pro joy, vetsinou po vystreleni
2400 GOSUB Draw_Sprites
2410 IF Strelba%= 1 THEN Zasah%= FN Testuj_Kolize%L(X_Strela%, Y_Strela%, 7, 0, 16, 4): REM budeme testovat strelu
Jestlize letí střela, testuje se, zdali nedošlo ke kolizi s alieny.
2420 IF Zasah% THEN Strela_Move%= 0: Strelba%= 0: Adr%L= LPEEK($44E): LPOKE $44E, Background%L: LOCATE 1, 1: Score%L= Score%L+10: PRINT "SCORE: ", Score%L: Zasah%= 0
Při zasažení, se zruší pohyb střely a pomocí změny obrazové paměti určené pro TOS a VDI výstupy se na pozadí zapíše score zvýšené o 10.
2421 REM na radce 2420 jsme pripisovali SCORE, informace o Score se umistuje rovnou do Backgroundu, proto musime zmenit adresu obrazove pameti, kam se adresuji VDI a TOS vstupy
2450 IF Anim_Hero%= 1 THEN Apos_Hero%= Apos_Hero%+1: Fyz_Pozice%L= Strelba_Hero%B(Apos_Hero%)
2460 IF Anim_Hero%= 1 THEN Apos_Strelba%= Apos_Strelba%+1: Fyz_Strel%L= Strela%B(Apos_Strelba%): IF Apos_Strelba%= 4 THEN Anim_Hero%= 0: Fyz_Strel%L= 19: Strela_Move%= 1: Fyz_Pozice%L= 2
Jestliže se hrdina animuje při vypouštění střely (Anim_hero je 1), tak se mění pozice animací v poli, kde jsou zapsány Fyz_pozice jednotlivých pozic. Podle toho je potom změněna další pozice animace.
2465 IF Anim_Hero%= 2 THEN Apos_Hero%= Apos_Hero%+1: Fyz_Pozice%L= Vybuch%B(Apos_Hero%): IF Apos_Hero%= 7 THEN GOTO Game_Over
Jestliže Anim_Hero je 2, tak se animuje výbuch, proto se animační pozice čtou z pole Vybuch.
2470 IF Strela_Move%= 1 THEN Y_Strela%= Y_Strela%-12: IF Y_Strela%<= 12 THEN Strelba%= 0: Strela_Move%= 0
Zde se zařizuje, aby se střela pohnula, když je aktivní. Jakmile dosáhne horního okraje obrazovky, ukonči se pohyb a střela zmizí. 2480 IF Anim_Hero%<>2 THEN IF FN Testuj_Kolize%L(X_Hero%L, Y_Hero%L, 0, 0, 29, 29) THEN Anim_Hero%= 2: Close_Move%= 120: Apos_Hero%= 0: Fyz_Pozice%= 12: REM animace vybuch, zakazany pohyb
Nebouchá-li naše raketa, musíme testovat kolizi s nepřítelem.
2485 IF TIMER -Cas_Begin%L<15 THEN GOTO 2485
Tento řádek zajišťuje, že nejrychlejší odskok na další krok bude uskutečněn minimálně za 15/200 sec. Toho jsme docílili odpočtením začátku počítání od konce.
2499 GOTO 2000: REM znovu testuj pohyb
2500 REM SAMOTNE PROCEDURY POHYBU
2510-Joy_Doprava: IF Anim_Hero%= 0 THEN Fyz_Pozice%L= 3
2520 Test_Pozadi(4, 0): REM budeme testovat pohyb o 4 body doprava, jestlize se budeme moci pohnou, pohneme se
2540 RETURN
2600-Joy_Doleva: IF Anim_Hero%= 0 THEN Fyz_Pozice%L= 1
2605 Test_Pozadi(-4, 0): REM testing a pohyb
2650 RETURN
Na řadcích 2500-2650 se provádí samotná testování pohybu, podle toho, zdali chceme jít doprava či doleva se testuje, jestli nebyla přesažena velikost obrazovky.
5000-Pust_Aliena: REM procedura zajistuje vypusteni jedne nepratelske rakety
5005 FOR K%= 1 TO 12: IF Type_Alien%(K%)= 0 THEN EXIT : REM hledame volnou pozici Aliena
5006 NEXT K%: IF K%= 13 THEN GOTO Navrat
Testujeme, ktere pole pro Aliena je volné, když není žádné, ukončí se podprogram. 5010 Type_Alien%(K%)= RND(3)+1: Aliens_X%(K%)= RND(300): Aliens_Y%(K%)= 0
5020 Move_X%(K%)= RND(8)-4: Move_Y%(K%)= RND(4)+3
Náhodně zvolíme souřadnice pohybu, typ aliena a kroky pohybu aliena.
5030 IF Type_Alien%(K%)= 1 THEN Fyz_Pozice%(K%)= 1: REM nastaveni prvni fyzicke pozice
5040 IF Type_Alien%(K%)= 2 THEN Fyz_Pozice%(K%)= 20
5050 IF Type_Alien%(K%)= 3 THEN Fyz_Pozice%(K%)= 39
Podle druhu aliena nastavíme jeho první fyzickou animační pozici.
5100-Navrat: RETURN
A nazpět.
5500-Kill1: IF Fyz_Pozice%(K%)<12 THEN Fyz_Pozice%(K%)= 12: ELSE : Kolize%= 0: REM odsud to skoci rovnou do hlavniho programu, za sprite draw
5501 RETURN
5520-Kill2: IF Fyz_Pozice%(K%)<28 THEN Fyz_Pozice%(K%)= 28: : ELSE : Kolize%= 0
5521 RETURN
5540-Kill3: IF Fyz_Pozice%(K%)<44 THEN Fyz_Pozice%(K%)= 44: ELSE : Kolize%= 0
5541 RETURN
Když byl Alien sestřelen, tak podle typu nastavíme počáteční animační pozici pro jeho výbuch.
10000-Draw_Sprites: REM PREKRESLOVANI SPRITE
10010 CALL Copy32k%L( HIGH(Background%L), LOW(Background%L), HIGH(Obraz%L), LOW(Obraz%L))
Překopírujeme pozadí na právě neviditelnou obrazovku.
10030 IF Strelba%= 1 THEN CALL Sprites%L( HIGH(Hero%L), LOW(Hero%L), HIGH(Obraz%L), LOW(Obraz%L), Fyz_Strel%L, X_Strela%, Y_Strela%)
Když právě letí střela, nakreslíme ji. Popis Call_Sprite je v minulém čísle. 10050 CALL Sprites%L( HIGH(Hero%L), LOW(Hero%L), HIGH(Obraz%L), LOW(Obraz%L), Fyz_Pozice%L, X_Hero%L+320, Y_Hero%L): REM 320 u x souradnice pridano kvuli divnemu chovani sprite na radku 0
Nakreslení naší rakety.
10060 FOR K%= 1 TO 12
10065 IF Type_Alien%(K%)<>0 THEN CALL Sprites%L( HIGH(Aliens%L), LOW(Aliens%L), HIGH(Obraz%L), LOW(Obraz%L), Fyz_Pozice%(K%), Aliens_X%(K%)+320, Aliens_Y%(K%)): ON Type_Alien%(K%) GOSUB Alien1, Alien2, Alien3
10066 NEXT K%
Nakreslení právě aktivních alienů. 10200 SCREEN 1, Obraz%L, 16
Přepnutí na právě překreslenou obrazovku Screen 1, tj. adresu Obraz.
10210 SWAP Screen1%L, Obraz%L
Prohození proměnných Screen1 a Obraz.
10220 RETURN
15000 DEF PROC Test_Pozadi(Move_X%L, Move_Y%L)
15010 IF Move_X%L>0 AND (X_Hero%L+Move_X%L)<= 290 THEN X_Hero%L= X_Hero%L+Move_X%L
15020 IF Move_X%L<0 AND (X_Hero%L+Move_X%L)>= 0 THEN X_Hero%L= X_Hero%L+Move_X%L
15030 RETURN
Na řádkdy 15000-15030 se skáče při každém pohybu rakety, testujeme tam, zdali by raketa nepřejela obrazovku, jestli ne, pak pohneme se souřadnicí X_Hero.
16000 DEF FN Testuj_Kolize%L(X_Sour%, Y_Sour%, Box_Beginx%, Box_Beginy%, Box_Widthx%, Box_Widthy%)
Funkci Testuj_Kolize jsem vymýšlel asi 2 dny (nevím proč tak dlouho, ale stalo se). Každopádně vstupní parametry jsou počáteční souřadnice testovaného objektu, relativní začátek testovaného obdelníku vůči začátku objektu a velikost objektu od tohoto relativního začátku. Vypadá to sice složitě, ale po přečtení následujícího listingu se vám to bude zdát spíše stupidní.
16010 X_Sour%= X_Sour%+Box_Beginx%: Y_Sour%= Y_Sour%+Box_Beginy%
Nastavení pozice absolutního testovaného obdelníku.
16020 FOR K%= 1 TO 12
16025 Kolize%= 0
Kolizi nastavit na nulu, kdo ví co v té proměnné zůstalo, že? ;-) 16030 IF Type_Alien%(K%)<>0 THEN ON Type_Alien%(K%) GOSUB Testa1, Testa2, Testa3
Podle typu Aliena odskočit na podprogram testování. Každý se druh se musí testovat zvlášť, protože je každý jinak velký.
16035 IF Kolize%= 1 THEN EXIT
Došlo-li ke kolizi, ukonči smyčku.
16040 NEXT K%
16050 RETURN Kolize%
Návrat, když se střetli vrátí funkce hodnotu 1, když ne, tak 0. Tato funkce platí obecně pro střet jakéhokoliv objektu s Alieny, tzn. jak střely, tak rakety.
20000-Alien1: Aliens_X%(K%)= Aliens_X%(K%)+Move_X%(K%): Aliens_Y%(K%)= Aliens_Y%(K%)+Move_Y%(K%)
Posuň aliena o jeden krok kupředu.
20010 IF Fyz_Pozice%(K%)= 11 THEN Fyz_Pozice%(K%)= 1: REM testujeme, jestli nemame animovat sprite znovu
Jestliže jsme na konci animačních pozic pro pohyb, začni opět znovu.
20012 Fyz_Pozice%(K%)= Fyz_Pozice%(K%)+1
Skok na další animační pozici.
20015 IF Fyz_Pozice%(K%)= 20 THEN Type_Alien%(K%)= 0: REM Alien absolutne vybouchl, tim jeho zivot konci
Jestliže dojde animace až sem, byla Fyz_pozice předtím nastavena na 12, tj. výbuch, proto dojde ke zrušení aliena.
20020 IF Aliens_X%(K%)<0 OR Aliens_X%(K%)>290 THEN Type_Alien%(K%)= 0
20030 IF Aliens_Y%(K%)>180 THEN Type_Alien%(K%)= 0
Když alien překročí mez obrazovky, zmizí. Ano, může to být vyřešeno i jinak, což v plné verzi také bude. 20050 RETURN
Návrat. Dále se bude opakovat totéž pro druh aliena 2 a 3, proto tuto pasáž vynecháme.
20100-Alien2: Aliens_X%(K%)= Aliens_X%(K%)+Move_X%(K%): Aliens_Y%(K%)= Aliens_Y%(K%)+Move_Y%(K%)
20110 IF Fyz_Pozice%(K%)= 27 THEN Fyz_Pozice%(K%)= 20
20112 Fyz_Pozice%(K%)= Fyz_Pozice%(K%)+1
20115 IF Fyz_Pozice%(K%)= 38 THEN Type_Alien%(K%)= 0
20120 IF Aliens_X%(K%)<0 OR Aliens_X%(K%)>300 THEN Type_Alien%(K%)= 0
20130 IF Aliens_Y%(K%)>180 THEN Type_Alien%(K%)= 0
20150 RETURN
20200-Alien3: Aliens_X%(K%)= Aliens_X%(K%)+Move_X%(K%): Aliens_Y%(K%)= Aliens_Y%(K%)+Move_Y%(K%)
20210 IF Fyz_Pozice%(K%)= 43 THEN Fyz_Pozice%(K%)= 39
20212 Fyz_Pozice%(K%)= Fyz_Pozice%(K%)+1
20215 IF Fyz_Pozice%(K%)= 54 THEN Type_Alien%(K%)= 0
20220 IF Aliens_X%(K%)<0 OR Aliens_X%(K%)>300 THEN Type_Alien%(K%)= 0
20230 IF Aliens_Y%(K%)>180 THEN Type_Alien%(K%)= 0
20250 RETURN
20298-Testa3: Alienx%= 15: Alieny%= 15: GOTO Testing: REM Testovaci velikost pro letajici talir
20299-Testa2: Alienx%= 14: Alieny%= 15: GOTO Testing: REM Testovaci velikost pro harmoniku
20300-Testa1: Alienx%= 28: Alieny%= 28: REM Testovaci velikost pro mixer
Na řádky 20298-20300 odskočí funkce Testuj_Kolize, podle druhu aliena se nastaví velikost jeho testovacího obdelníku a program odskočí na samotné testování.
20310-Testing: X_Colision%= Aliens_X%(K%)-X_Sour%: Y_Colision%= Aliens_Y%(K%)-Y_Sour%
Nejdříve zjistíme, jak moc jsou od sebe vzdáleny počáteční body kolizních obdelníků.
20311 IF X_Colision%<= 0 THEN X2_Colision%= Alienx%: ELSE X2_Colision%= Box_Widthx%
Když alien bude na obrazovce blíže nule než střela či raketa, pak musíme testovat velikost obdelníku podle Alienx, není-li tomu tak, pak se bude testovat velikost podle velikosti objektu (raketa, střela).
20312 IF Y_Colision%<= 0 THEN Y2_Colision%= Alieny%: ELSE Y2_Colision%= Box_Widthy%
Totéž, ale pro Y. Když tomu nevěříš, tak si to prostě nakresli, já bych na to taky bez nákresu nepřišel.
20325 IF ABS(X_Colision%)<= X2_Colision% THEN IF ABS(Y_Colision%)<= Y2_Colision% THEN Kolize%= 1: Move_X%(K%)= 0: Move_Y%(K%)= 0: ON Type_Alien%(K%) GOTO Kill1, Kill2, Kill3
Podle absolutní hodnoty ze vzdálenosti počátečních bodů obou objektů a podle velikosti kolizního obdelníku zjistíme, jestli ke kolizi došlo, nebo ne.
20380 RETURN
30000-Game_Over
30010 CLS
Vymazat obrazovku.
30020 FOR K%L= 0 TO 15: XBIOS (R%L, 7, K%L, WPEEK(Invaze%L+2+K%L*2), 0): NEXT K%L: REM zmenit paletu barev
Nastavit barvy obrázku 'SPACE INVADERS' od našeho super grafika.
30030 CALL Copy32k%L( HIGH(Invaze%L+34), LOW(Invaze%L+34), HIGH(Screen1%L), LOW(Screen1%L))
Překopírovat obrázek na právě aktivní obrazovku.
30040 IF MOUSEBUT <>2 THEN GOTO 30040
Čekat až bude chtít nějaký maniak hrát další hru.
30060 GOTO 997
A další hra . . . , ale to si snad domyšlíš sám.
Pochopitelně, že to co jsem vám sem nastínil není žádná super hra, ani geniální nápad, ale domnívám se, že krůček po krůčku můžete k nějaké genialitě dospět. Doufám, že vám tento článek alespoň něco dal, protože musím přiznat, že vytváření demonstrační hry (i když s ní nakonec udělám navíc i těžkou komerci) zabralo nejméně 30 hodin a napsání toho popisu další dvě hodiny.
Teď už je 2.30 a.m., takže půjdu raději spát a zítra to doopravím a začnu kompletovat celej Narsil.
HEAD