Narsil č. 07

Programování Her (1. část)

↑

Bylo asi tak 9 hodin večer, právě jsem hrál Pixie a Dixie a najednou jsem si vzpomněl na jeden dotazník, který vyplnil jeden ze čtenářů ve kterém psal, že i on by rád programoval hry. A když jsem tak nad tím zauvažoval, musel jsem přiznat, že není důvod, proč by i obyčejný nadšenec u nás nemohl nějakou hru naprogramovat. Ano, tohle je jedna z cest, jak oživit zájem o ST u nás. Co se týče programování, tak seriál Motorola bude pokračovat samozřejmě i dál, ale ode dneška, až do skonání Narsilu (tak brzo :-)) budeme uvádět jednotlivé knihovny pro výrobu her, a to do Omicron Basicu. Proč právě do něj? 1) Omicron Basic musel dostat každý, kdo si koupil ST po roce 1988

2) Omicron Basic je jeden z mála basiců dobrých basiců na ST, jehož výkonost jsem pochopil právě při programování v Asembleru. Udělal jsem rutinu na nakreslení čáry, a pln očekávání, jak smetu rychlostí Omicron jsem si změřil nakreslení 1000 čar, přičemž jsem dosáhl závratného čísla 7.58 s (bavím se o čáře, která je dlouhá 320 bodů diagonálně). No a Omicronu to stejné trvalo 8.4 sekundy. Myslím, že to dostatečně mluví za to, jak je tento Basic výkonný.

3) Se mi nejvíce líbí.

Přestaňmě však rozebírat, proč se mi tento jazyk líbí, a raději se věnujme prvním knihovnám, které jsme pro vás připravili.

! ! ! ! POZOR ! ! ! !

Tyto články nebudou suplovat učebnici programování jazyku Basic, ale pouze pomáhat programátorům, kteří již Basic umí, ale nemají čas ani chuť se kvůli programování her učit celý systém ATARI ST (Podobně pracuji i já na PC, děkuji Themie Gouthas za XLIB).

V Omicron Basicu programoval snad každý, ale zdaleka ne každý se pokoušel v něm spolupracovat se strojovým kódem. Takže, na počátku vašeho programu musíte použít příkaz CLEAR, který vyrezervujete pamět pro GEMDOS, tj. pamět volnou pro soubory, které budete do hry přidávat a pamět pro zásobník (to se vůbec nemusíte zatěžovat).

Původní nastavení je CLEAR 65536,4096. To znamená 64 kb pro GEMDOS a 4 kb pro zásobník.

Vy si touto cestou musíte vyrezervovat minimálně 400 kb na 1 MB strojích a alespoň 128 kb na 0.5 megách, jelikož při programování her se používají dosti velké datové soubory.

Takže na 0.5 megách napište:

10 CLEAR 131072,4096

a na megách

10 CLEAR 409600,4096

Pochopitelně pokud máte počítače s větším rozsahem paměti RAM, tak se nemusíte nijak omezovat.

Teď se vám po spuštění programu zmenší pamět určená pro samotný Basicový kód o určenou velikost.

Takže na megabajtu vám zbyde něco kolem 420 kb a na půlmegu asi 150 kb, ale i to je pro basicový kód až dost, rezervace bude vždy záviset na odhadu autora.

Další příkaz, který budete používat právě pro datové soubory je MEMORY.

Jakmile si vyrezervujete paměť příkazem CLEAR, je potřeba také nějak určit paměťovou oblast na kterou budete nahrávat svá data. ŕekněme, že z těch 400 kb potřebujeme uvolnit právě 96102 bajtů pro naši grafiku, takže napíšeme:

20 Picture=MEMORY(96102)

Nyní máme v proměnné Picture adresu volných 96102 bajtů.

Tento postup můžeme opakovat tolikrát, dokud se nebudeme požadovat více paměti, než jsme si si vyrezervovali pro GEMDOS. Všechny rezervace zrušíme opětovným příkazem CLEAR, ten však maže i proměnné, takže se nedoporučuje čistit někde jinde než na začátků programu.

Posledním příkazem, který stojí v Omicron Basicu za povšimnutí z hlediska strojového kódu je MEMORY_BLOCK. Jeho dokumentace není v žádné knize Omicronu, ale jeho význam je každopádně vysoký.

Tímto příkazem si rezervujete 25000 byte, které se budou odteď vždy zapisovat spolu s programem.

20 MEMORY_BLOCK 12,25000,Sampl

Do proměnné Sampl se podobně jako u příkazu MEMORY zapíše číslo ukazující na 25000 bajtů volné paměti, ale rozdíl je v tom, že těchto 25000 bajtů se od této chvíle bude pokaždé ukládat současně s vašim basicovským programem. Číslo 12 označuje číslo použité pamětově banky, které mají rozsah 00-99, chraňte se však používat menší číslo než 10, nepochodili byste. Adresa bloku paměti se automaticky inicializuje, jakmile program spustíte a až program dojde na řádek, na kterém jste provedli inicializaci.

20 MEMORY_BLOCK 12,25000,Sampl

Po spuštění teď máte v proměnné opět ukazatel na volné místo v paměti.

Dalšími důležitým standardními příkazy Omicron Basicu pro vás budou MOUSEX, MOUSEY, MOUSEBUT, MOUSE ON, MOUSE OFF, jejichž význam snad nemusím vysvětlovat. Jeden příkaz, který však chybí v základní dokumentaci je JOYSTICK. Chceme-li tedy vědět momentální polohu páky 1 (to je ta co v ní není myš), napíšeme:

Joy=JOYSTICK(1)

Pro páku 0 platí zase:

Joy=JOYSTICK(0)

Když chceme testovat FIRE na Joyích, jak na to? Poradím vám, zkuste to dělat přes MOUSEBUT :-).

Základní příkazy OMICRONu nutné pro výrobu skutečně kvalitních her jsem vám řekl, teď se však pustíme do příkazů, které byli vyrobeny pod hlavičkou EMPTY HEAD a jejichž šíření je volné. Pokud by však někdo chtěl něco autorovi poslat, ať tak s klidem učiní, nebudeme se zlobit. Každopádně, jestliže za pomocí našich knihoven vyrobíte nějakou hru, tak mi alespoň pošlete jednu její kopii, díky.

Dnes se zmíníme o knihovnách, které jsem vytvořili pro potřeby právě vyvíjené hry, která je v podstatě nedokonalou kopií hry Montezumas Revenge z Atari 800, její značně rozdělaný kód jsem pro demonstraci umístil do archívu LIBRARY.TOS, kde naleznete všechno potřebné pro vlastní výrobu takového produktu. Dnes se o jednotlivých knihovnách zmíním pouze referenčně, podrobnější popis přinesu příště (až budu vědět, jak takovou hru vlastně programovat ;-)), spolu s tím možná už přijde skutečné Preview naší arkády. Takže, teď jmenovitě, co archív obsahuje:

BLOUMA.BAS - samotný basicový program předvádějící zhruba schopnosti knihovny (prozatím nedodělaná verze, protože jinak by Narsil vyšel až v prosinci ;-)

BLUDIŠTĚ.BLU - Soubor, který obsahuje 5 naeditovaných místností do hry, ostatní si můžete nakreslit sami :-)

BLOUMA.COL - barvy, které používá naše banka sprite i herní kostky

COPY32K.DAT - knihovna určená ke zkopírování 32000 byte paměti, tj. jedné obrazovky

Příklad v Basicu:

CALL Copy32k( high (Start), low (START), high (CIL), low (CIL))

Jestliže použijete jako adresu Start nulu, tak se 32000 byte obrazovky, začínajících na adrese CIL, vynuluje.

ROOM.DAT - knihovna určená k vykreslení jedné obrazovky o velikosti 20*10 znaků o velikosti 16*16. Příklad v Basicu:

CALL Room( High (ZNAKY), low (ZNAKY), high (OBRAZOVKA), low (OBRAZOVKA), high(BLUDISTE), low(BLUDISTE) )

Adresa ZNAKY ukazuje na tabulku předem definovaných znaků o velikot 16*16 bodů, tj. každý znak má 128 Byte.

Adresa OBRAZOVKA ukazuje číslo obrazovky na kterou máme kreslit

Adresa BLUDISTE ukazuje na právě aktivní obrazovku z bludistě. Každá z obrazovek je velká 200 byte.

SPRITE.DAT - knihovna pro vykreslovaní sprite z naší banky

Příklad v Basicu:

Call Sprites( high (BANKA_SPRITE),low (BANKA_SPRITE), high (OBRAZOVKA), low (OBRAZOVKA), CISLO_SPRITE, X_SPRITE, Y_SPRITE)

Adresa BANKA_SPRITE ukazuje na naší banku sprite, pro dnešek je to pouze BLOUMA.SPR, ale příště vám dodáme určitě i další.

CISLO_SPRITE je word, který označuje kreslenou pozici z banky sprite. Toto číslo musí být mezi 1 až počtem sprite v bance.

X_SPRITE a Y_SPRITE jsou souřadnice, kam se mají sprite kreslit.

REPLAY.DAT - banka, která přehrává 8 bitové samply v libovolném kmitočtu mezi 5-30 kHz

Příklad v Basicu:

Call Replay(high (ADRESA_SAMPLU), low (ADRESA_SAMPLU), high (DELKA_SAMPLU), low (DELKA_SAMPLU), KMITOCET)

ADRESA_SAMPLU ukazuje na adresu, kde je sampl uložen v paměti

DELKA_SAMPLU - zde bude zapsána délka přehrávaného samplu.

KMITOCET - jedná se o kmitočet přehrávání mezi 5 až 30.

POZOR!!! Tato banka není v našem demonstračním 'programu' použita, proto si ji musíte nainicializovat sami.

BLOUMA.MBK - náš hrdina BLOUMA, hrdina každé naší arkády v tomto stylu. POZOR!!! nepoužívát ve vašich produktech, je chráněn copyrightem (proto jsem ho také úmyslně mírně zmršil :-)).

KOSTKY.PI1 - kostky, které můžete editovat v libovolném programu, např. Cyber Paintu. Pozor na obrazovku se vleze pouze 240 kostek o velikosti 16*16

EDITOR.PRG - program na editování místností do hry.

PI1_TO - konverzní program, který konvertuje kostky nakreslené vedle sebe na obrazovce 320*200 na kostky seřazené za sebou. Těchto kostek zkonvertuje 240, což dělá délku 30720 byte.

KOSTKY.ZNA - kostky KOSTKY.PI1 zkonvertované pomocí.

PI1_TO.PRG, teď jsou tedy snesitelné pro naše podmínky.

Myslím, že napoprvé by to mohlo stačit, teď už můžete s klidem experimentovat. Pozor, před každým zásahem do programu si dobře promyslete své kroky, protože opravdu není jednoduché to vše pochopit. Pokud nebudete chtít pořád všechny banky nahrávat, stačí, abyste si je umístili do MEMORY_BANK . . .

Každopádně vám příště přineseme podrobnější vysvětlení k celému systém, což už dnes bohužel nestihneme, protože je 6. listopadu a Narsil už měl dávno vyjít.

HEAD