Minule jste viděli velmi primitivní Preview naší hry Space Invaders, jejíž plnou verzi budou moci spatřit vaše oči v následujících měsících. Dnes kromě demoverze Whiper Snapper's race , která je však již zkompilovaná, žádnou další ukázku patrně neuvidíte. Připravili jsme pro vás ale další dvě knihvny pro vytváření vašich her v Omicron Basicu.
Jako první je to knihovna Collide, která má toto volání:
CALL Testuj_Kolize(X_sour%, Y_sour%, Box_Beginx%, Box_Beginy%, Box_Widthx%, Box_Widthy%, HIGH (SEGPTR), LOW (SEGPTR), HIGH (Type_Sprites), LOW (Type_sprites) , HIGH (Sprites_X) , LOW (Sprites_X), HIGH (Sprites_Y), LOW (Sprites_Y), HIGH (VARPTR (Kolize%)), LOW (VARPTR (Kolize%)).
Ano, nedá se říci, že by se jednalo zrovna na první pohled jednoduše vypadající funkci (na druhý je složitější), ale jakmile do ní proniknete, budete ji určitě hojně ve svých hrách využívat.
Takže teď snad na vysvětlenou:
X_sour% - X souřadnice vašeho sprite, ten bude testován na kolizi se všemi ostatními.
Y_sour% - Y souřadnice vašeho sprite.
Box_Beginx% - jelikož jsem předpokládál, že váš sprite nebude začínat hned od prvního bodu fyzického sprite (většinou se dávájí několik bodů od kraje volné místo pro případné animování apod.). Hodnota Box_Beginx% udává počet volných bodů v X souřadnici od počátku, tzn. až od této pozice bude sprite testován.
Box_Beginy% - totéž pro Y souřadnici.
Box_Widthx% - šíře vašeho sprite od Beginx%.
Box_Widthy - výška vašeho sprite od Beginy%.
Teď krátké shrnutí:
Testování vašeho sprite v podstatě proběhne od souřadnic X_sour% + Box_Beginx%, Y_sour% + Box_Beginy% až X_sour% + Box_Beginx% + Box_Widthx%, Y_sour% + Y_Beginy% Box_Widthy%.
Dalšími proměnnými jsou Type_Sprites, Sprites_X, Sprites_Y. Ty musí být nejdříve naplněny ve vašem programu. Type_Sprites = VARPTR (Type_Sprite%(0)), přičemž Type_Sprite% je pole o libovolném počtu prvků, musí se ale jednat o slova (to naznačuje V Basicu znak ' % '.). V něm jsou pak obsaženy čísla jednotlivých typů sprite. Jestliže obsahuje nějaký prvek pole nulu, znamená to, že se jedná o neaktivní sprite a jeho kolize je ignorována. Pokud zapíšete číslo větší než 0 (myslím, že max. 32767), tak se bude obdelník vašeho sprite testovat se spritem, jehož souřadnice jsou v polích jím určených.
Teď pozor!!! Počet testovaných položek (položek může mít vaše pole kolik chcete, ale pokud nějak nenaznačíte asembleru, že chcete testovat polí více, bude se jich testovat jen standardních 12). Takže zápis testovaných položek polí probíhá takto: WPOKE Collide+170, Polozek+1. Teď se nám bude testovat právě tolik položek, kolik chceme. Kde ale sebrat souřadnice ostatních sprite?
Nejdříve musíme nastavit adresy těchto polí do proměnných:
Sprites_X = VARPTR( Sprite_X%(0))
Sprites_Y = VARPTR( Sprite_Y%(0))
Teď stačí mít v každém poli (POZOR!!! začínejte vždy až 1. prvkem, nultý naše funkce ignoruje) informace o Xové a Yové souřadnici.
A kde jsou šířky jednotlivých typů SPRITE?
Zápis o jednotlivých šířkách prověďte následovně:
WPOKE Collide+190, X_Sprite_Width_1
WPOKE Collide+192, Y_Sprite_Height_1
WPOKE Collide+194, X_Sprite_Width_2
WPOKE Collide_196, X_Sprite_Height_2
a tak dále . . .
POZOR!!! Podle počtu sprite ve vaší bance by měla být alokována také pamět MEMORY_BLOCK, tzn. používate-li například 200 typů sprite, musí mít vaše banka velikost 190 (testovací rutina) + 200*4 (200 sprite po 4 bajtech (1 word X_šířka, druhý word Y_výška)).
Takže v tomto případě musíte alokovat pamět následovně. MEMORY_BLOCK Číslo Banky, Collide, 990.
Teď už zbývá jediná věc, jak se dozvědět, kdy ke kolizi vlastně dochází . . .
Při volání samotné funkce používáme ukazatel (VARPTR) na proměnnou Kolize%, do ní se uloží zpráva o tom, jestli došlo ke střetu či nikoliv. Pokud je tato proměnná rovna 0, k žádné kolizi nedošlo, je-li hodnota nenulová, došlo ke střetu a v proměnné Kolize% je uložena hodnota (pořadí) kolidujícího hráče.
Dalším příkazem, kterému se budeme věnovat, je Keyb_Irq, jedná se o naši vlastní rutinu přerušení pro klávesnici, protože už jsme se nemohli dívat na to, jak se chová po zkompilování příkaz MOUSEBUT a JOYSTICK.
Tato funkce má pouze dva způsoby zavolání:
CALL Keyb_Irq(1, HIGH (VARPTR (Joy_1%)), LOW (VARPTR (Joy_1%)), HIGH (VARPTR (Joy1_fire%)), LOW (VARPTR (Joy1_fire%)), HIGH (VARPTR (Scan_code%)), LOW (VARPTR (Scan_code%)))
Toto volání nahradí původní přerušení klávesnice naším vlastním. POZOR!!! Od této chvíle až do zavolání CALL Keyb_Irq (0) nelze v Omicron Basicu nic psát pomocí klávesnice. Od této chvíle se pouze proměnná Joy_1% naplňuje informací o poloze Joye 1, Joy1_fire% o tlačítku a Scan_code% zase SCAN kódem klávesnice. Jednotlivé hodnoty doporučuji experimentálně zjistit, nebo si je někde přečíst, např. SPACE BAR má scan_kód $39.
Druhé volání je již dříve řečené CALL Keyb_Irq (0). Poté se navrátí standardní rutina klávesnicového přerušení a vy můžete opět editovat váš program.
Doporučené použití je asi následující.
10 POKE $484, 0: REM ZÁKAZ KEY REPEAT
20 CALL Keyb_irq(1, (SEM ZAPIŠTĚ VŠECHNY DŕÍVE ŕEČENÉ PARAMETRY)).
30 PRINT Scan_code%, Joy1_fire%, Joy_1%
40 if Scan_code<>$39 then goto 30: REM ČEKÁ NA SPACEBAR
50 call Keyb_irq(0): REM KONEC
Kdybychom nezakázali KEY REPEAT, došlo by po ukončení přerušení k nechtěnému opakovanému stisku klávesy.
To je pro dnešek z nových příkazů vše, ale v archívu PROGRAM3.TOS ještě najdete CONV_MBK.BAS, program na konverzi banky sprite s koncovkou *.MBK na naši banku s koncovkou *.SPR, dále SPRC_OM.BAS, program, který vám umožní spojit více bank *.SPR do jedné veliké banky *.SPR. A jako poslední a také nejdůležitější je to program SPRITE.PRG na editaci vlastních sprite s koncovkou *.MBK.
Takže hodně štěstí při programování a příště zase u dalších příkazů.
HEAD
P.S. Knihovna Collide je v souboru COLLIDE.DAT a knihovna Keyb_Irq je v souboru KEYB_IRQ.DAT. Vše v archívu PROGRAM3.TOS.