středa 31. srpna 2005

Animace - díl šestý: The Final Countdown

autor: George K.

6.1 Animační menu '93

Než nadobro šestým dílem skončí seriál AnimAce, chtěl bych vás seznámit s mojí nabídkou pro eventuální AnimAci II, která se (bude-li zájem) může objevit v příštím ročníku ZX Magazínu. Seriál by se týkal výhradně sprajtové grafiky - časování sprajtů, synchronizace kreslení s přerušením, co nejrychlejších kreslících rutin, inteligentní nadstavby sprajtovacích rutin a dalších specialit, které jsem "objevil" za posledních pár let, kdy se o sprajty zajímám, a o které bych se s vámi rád podělil. Obsah seriálu by měl vést k tomu, aby člověk, který si ho důkladně prostuduje a pochopí, byl schopen napsat celkem kvalitní kostru akční hry, kterou někdo "obalí" neméně kvalitní grafikou - věřím tomu, že se to stane a že i u nás budou vznikat hry na úrovni RoboCopa, Cobry a dalších.
Uvítám i jakékoliv další animační náměty, o kterých by se dalo psát - snad kromě vektorové grafiky, o kteroužto jsem se doposud nezajímal, neboť mě nebaví hrát hry typu Diller (i když se o nich právem tvrdí, že jsou vysoce kvalitní); ale kdyby byl extra zájem... tak proč ne.
Abyste neřekli, že diskriminuji příznivce basicu, naposledy se k němu vrátím - proto následuje:

6.2 Novoroční překvapení

Toto je tedy můj dáreček všem čtenářům ZX Magazínu, věnovaný u příležitosti Nového roku, Nového státu, Štátu a Nového Oldřicha (cha, cha).
Prográmek přepište, pro jistotu se nejdříve posaďte a pak teprve spusťte (RUN). V proměnné S je převrácená velikost rychlosti pohybu (čím větší, tím pomalejší) - lze ji téměř libovolně měnit. Zbývá už jenom dodat, že autorem obrázku je Alex Cossac, zbytek mám na svědomí já a nad všemi pracemi dohlížela Fanča.
Silné nervy!
10 REM hotovka21
  30 LET v=SGN PI: LET s=2: LET z= BIN : LET l3=69: LET l1=l3: LET l2=6: LET l4=9
  35 LET a$="Jste Miroslav Hlavicka? A/N": GO SUB 2100
  40 LET mh= BIN : IF i$="a" THEN LET mh= SGN PI
  50 GO SUB 1000
  90 LET a$="STISKNI KLAVESU": GO SUB 2100: GO TO 180
 105 GO SUB 1505
 120 LET z=z+1: IF z=s THEN LET z=0: GO SUB 2000
 180 GO SUB 1510
 185 IF l1<>l4 THEN GO TO 105
 190 GO SUB 1505: IF dx THEN GO SUB 1510: GO TO 190
 195 IF l4=69 THEN LET i$="n": GO TO 205
 200 LET a$="NATAHNOUT? A/N": GO SUB 2100
 205 IF i$="n" THEN LET l4=69*(l4=9)+9*(l4=69): GO TO 230
 210 IF i$<>"a" THEN GO TO 200
 215 RESTORE 5010: LET l1=l1+v: LET l2=l2+v: LET v=-v
 220 IF dx<>-11 THEN GO SUB 1510: GO SUB 1505
 225 GO SUB 2000: IF l1
 230 LET l1=l1+v: LET l2=l2+v: LET v=-v: GO TO 90
1000 RESTORE 5100: GO SUB 2200
1060 FOR k=81 TO 71 STEP -1
1070 PLOT 130,k: DRAW 6,0
1080 NEXT k
1500 RESTORE
1505 READ dx,dy: IF NOT dy THEN GO TO 1500
1510 PLOT 128,88: DRAW dx, dy
1515 RETURN
2000 PLOT 123,88-l1
2010 LET l1=l1-v: LET l2=l2+v
2020 PLOT 133,88-l2: PLOT 130,88-l2: DRAW 6,0
2030 PLOT 130,77-l2: DRAW 6,0
2040 RETURN
2100 PRINT # BIN ; AT BIN ,(32-LEN a$)/2;a$
2105 LET i$=INKEY$ : IF i$="" THEN GO TO 2105
2110 PRINT # BIN ; AT BIN , BIN ;"                                ":
 REM v uvozovkach je 32 mezer
2115 RETURN
2200 READ c0
2205 IF c0=259 THEN RETURN
2210 READ c1
2215 IF c0<256 THEN DRAW c0,c1: GO TO 2200
2220 READ c2
2225 IF c0=256 THEN PLOT c1,c2: GO TO 2200
2230 READ c3
2235 IF c0=257 THEN CIRCLE c1,c2,c3: GO TO 2200
2240 GO TO 2200
5000 DATA -12,-23,-11,-24,-9,-26,-8,-27,-6,-28,-4,-29,-3,-29,-1,-29,0,-29,2,
 -29,4,-29,5,-28,7,-27,9,-26,10.-25,12,-23,13,-22
5005 DATA 12,-23,10,-25,9,-26,7,-27,5,-28,4,-29,2,-29,0,-29
5010 DATA -1,-29,-3,-29,-4,-29,-6,-28,-8,-27,-9,-26,-11,-24,0,0
5100 DATA 256,111,89,34,0,0,43,-34,0,0,-43,256,100,120,28,30,28,-30,257,
 127,110,13,256,127,110,0,8,256,127,109,-4,11
5105 DATA 256,123,88,0,-l1,256,133,88,0,-l2,256,142,136,0,13,-6,0,0,-7,256,114,
 136,0,20,256,109,155,10,0,256,106,152,16,0,256,104,149,18,0,256,109,146,10,0
5110 DATA 258,mh,1,5115,256,256,128,132,8,9,-15,0,8,-9,256,128,132,258,mh,0,5120
5115 DATA 256,136,142,-8,-10,-8,10,256,128,148,0,-15
5120 DATA 257,44,135,15,257,40,140,3,257,52,140,3,256,46,137,3,-6,-2,0,
 256,40,132,0,-3,4,-4,5,0,257,41,140,1,257,53,140,1
5130 DATA 256,44,154,0,10,256,44,116,0,-10,256,64,135,10,0,256,24,135,-10,
 0,256,41,145,3,0,1,-2,256,48,143,2,2,3,0
5140 DATA 256,30,123,-8,-8,256,60,147,8,8,256,32,148,-8,8,256,60,122,8,-8
5150 DATA 256,39,128,-2,-3,1,-1,2,0,2,2
5190 DATA 259 
 
A kdo to neopíše, ten Fanču, Cossaca i mě pěkně naštve!!!

sobota 4. prosince 2004

Animace - díl pátý: Zahraj to ještě jednou, Joe

autor: George K.


5.1 Události bez komentáře

Jak jistě neuniklo minule vaší pozornosti, výpis animačního programu se skládal ze dvou částí - kratší (komentované), která ukládala Joa do paměti, a delší (nekomentované), která postavičku uváděla do pohybu. K této pasáži programu si nyní něco řekneme.
Za návěstím START je nejprve nastaveno přerušení IM 1 a je povoleno. To je důležité, protože jinak by nebylo možné použít instrukci HALT (u návěstí WA1) přesněji - program by se na ní zastavil a normálně už by s ním nikdo nehnul.
Proč je použití HALTu tak důležité? Tato instrukce nedělá nic jiného, než že podrží program do té doby, než naběhne přerušení. Pro nás je ovšem zajímavé, že v té samé chvíli začne obvod ULA od levého horního rohu přenášet obsah videoram na obrazovku televizoru (nekreslí se jen bitová videoram, ale i border - prostě úplně stejně, jako cokoliv jiného v televizi). To je třeba mít na paměti, protože takhle si co nejjednodušeji můžete zařídit, aby figurka při chůzi nepoblikávala. Při větším počtu sprajtů je potřeba napsat algoritmus poněkud lépe, ale pro našeho Joa, je ten uvedený až moc dorý.
Když je přerušení, tak jak má být, je obrazovka zaplněna vzorkem. Vzorek (ve výpisu -1, což je totéž jako 255, čili %11111111) můžete libovolně měnit, nejlépe je funkce masky vidět právě při hodnotě 255. Můžete samozřejmě nahrát do obrazovky cokoliv - třeba nějakou pěknou ulici, po které by Joe chodil.
Následuje inicializace. Podprogram INIT nastaví na počátek tabulku pozic, pak nastaví souřadnice Joa (ld hl,#4022) a schová do paměti obsah místa, kam bude postavička nakreslena (call HIDE). Potom je do hl dána adresa první fáze (P+0) a figurka je nakreslena (podprogram DRAW). Výchozí pozici Joa je možné měnit, jak je organizována videoram popisovat nebudu, to už vyšlo v každém časopise snad 50x. Číslo (oněch #4022) můžete měnit, ale sami si hlídejte, aby Joe "neodešel" do atributů a dál do paměti.
No a teď už jenom ta chůze. Řádkem ld b,80 chtěl autor říci, že figurka se 80-krát pohne, číslo lze opět měnit v rozsahu 0 - 255. Podprogram WAIT čeká (překvapivé, co?) a tím ovlivňuje rychlost Joeovy chůze. Zpomalení dosáhnete, když na řádku WAIT ld b,5 dáte do b číslo větší než 5, zrychlení, když je číslo menší než 5. Pozor, nula odpovídá 256.
Podprogram BACK vrací do videoram to, co tam bylo, než byl nakreslen Joe - tedy koná činnost naprosto opačnou k HIDE.
Teď je čas na to, aby byl nakreslen nový Joe a k tomu musí být známa jeho nová fáze a z té odvozena adresa její grafiky. To dělá část programu mezi návěstími POSIT a GO1.
Podíváte-li se na tab. DIRECT, můžete z ní vyčíst fáze pohybu: 2, 3, 4, 1, 5, 6, 7, 1. Fáze 1 je základní, kterou chůze začíná a která je vykreslena při inicializaci. Čísla zvětšená o 128 značí, že při kreslení této pozice bude potřeba zároveň posunout figurku o znak doprava. Nula na konci tabulky znamená skutečně jen konec tabulky a to, že tabulka se musí číst opět od začátku. V tabulce je "chyba": defw 128+1,0 je to samé jako defb 128+1,0,0,0 a jsou tam tedy dvě nuly navíc.
Další tabulka TABLE v sobě nese adresy grafických dat jednotlivých fází. Pro fázi 1 je to adr. P+68, atd.
Poslední tabulkou je SPACE, kam se ukládá původní obsah videoram, tedy místo, kam byl nakreslen Joe.
Nová pozice Joa je určena takto: de ukazuje na začátek a hl někam do tabulky fází (POSIT ld hl,DIRECT - to platí jen na počátku, v průběhu programu je adresa měněna!!!). Hl a de se navzájem zamění a z de je přečteno číslo fáze. Je-li to nula, proběhne záměna znovu a tím se dostáváme opět na počátek tabulky. Fáze je schována do registru b a pak je vymazán 7. bit (ono +128), číslo je vynásobeno dvěma a přičteno k hodnotě TABLE. Jelikož první pozice je 1 (2x1=2) a ne 0 (2x0=0), je třeba místo TABLE použít TABLE-2. Pak je z tabulky získána do de adresa grafických dat a je uložena pro další použití na adr. GO2+1. Do hl se dá adresa ve videoram a byl-li nastaven bit 7 v registru b (fáze), je proveden posun o znak vpravo (inc hl).
Pak už je postup stejný jako při inicializaci - nejprve je pozadí uloženo do tabulky SPACE (call HIDE) a pak je vykreslena nová figurka (call DRAW) a tento celý proces je opakován (djnz GOES). Toť vše.
Studium podprogramů HIDE a BACK si proveďte sami - jsou si navzájem dost podobné, dělají přibližně totéž a hlavně: dělají to dost rychle (ale ne nejrychleji). Rychlost by šla zvýšit nahrazením podprogramu NEXTHL jeho přímým zařazením do rutiny, ušetřilo by se 17 taktů v každém průchodu. Rychlejší instrukce přesunu než ldi už neexistují, ale daly by se obejít pomocí push a pop; v tom případě by musely být rutiny úplně předělány a navíc by bylo třeba v nich zakázat přerušení.
Pro zajímavost si zkuste napsat rutinu, mající tyto vstupní parametry: hl = volné místo v paměti, de = levý horní roh sprajtu, bc = 256*výška+šířka (nebo číst nějakým způsobem odpovídající); a přemisťující obdélník o šířce c znaků a výšce b bodů z videoram do paměti (nebo naopak). Pak tento podprogram protrasujte monitorem assembleru Prometheus a zjistěte jeho časovou náročnost (T-cykly) - schválně jak se vám to povede (pro porovnání kvality rutin musíte ovšem mít stejné vstupní parametry, resp. rozměry obdélníčku).
Kreslicí podprogram DRAW je dost podobný tomu z AnimAce č. 3. Všimnete si, že není univerzální (univerzální nejsou ani HIDE a BACK), a že dokáže kreslit jen sprajty o šířce dva znaky (výška může být libovolná). Pro rychlou animaci je výhodnější používat na míru šité rutiny, většinou tím odpadne nějaká opakovací smyčka a tím pádem se ušetří i spousta času.
Uvedený a popsaný algoritmus lze ještě krásně zoptimalizovat a zrychlit: když schováte do paměti pozadí a když vzápětí kreslíte novou figurku, pohybujete se na obrazovce vždy na tom samém místě - proč tedy nenapsat podprogram jeden, který by dělal obě dvě věci najednou? Ušetřil by se čas za opakovací smyčku a za předávání parametrů - uvědomíte-li si, jak často se podprogramy provádějí, pochopíte, že zde by neměl být "ani takt nazmar", protože může celkem drasticky ovlivnit výslednou rychlost programu.
Tímto končí nejen pátý díl AnimAce, ale vlastně i seriál samotný. Příště už se nebudeme pouštět do ničeho velkého, připravím pro vás jen nějaké vánoční překvapení (jak se znám, určitě to nebude nic hezkého...) a rozloučíme se. Rád bych se dozvěděl, zda vám byly mnou sdělené informace k něčemu dobré, zda vás seriál zaujal, co všechno byste chtěli vědět o animaci a bojíte se na to zeptat, zda má cenu pro příští rok připravovat pokračování a na jak složité úrovni. Zde bych upozornil, že nerad píšu pro úplné začátečníky - asi proto, že když jsem se sám učil programovat, nemohl jsem se z časopisů dozvědět nikdy víc než to, že znak vytiskneme RST #10, což omílali (a stále ještě omílají) všude nejmíň padesátkrát (oblíbené téma je i videoram na Spectru, jak jsem se zmínil již výše). Na výuku je nejlepší knížka, kde je všechno pohromadě - takových "učebnic" se dá sehnat několik na dost dobré úrovni.
Pokud tedy AnimAce II, pak jedině pro pokročilé.
(pokračování příště)

sobota 27. listopadu 2004

AnimAce - díl čtvrtý: Na hranicích animace

autor: George K.


4.1 Maskovaný Joe

Pamatujete se, jak jsem v prvním dílu (1.2.3) říkal, abyste si schovali obrazovku? Teď přišla ta pravá chvíle opět ji vytáhnout a trošku poupravit. K dvěma starým pozicím Joa přidámě několik nových, aby chůze byla plynulejší... takže začneme pěkně od levého okraje kreslit to, co vidíte tady vedle - pozor na dvě věci: 1) výška Joa vzrostla z 16 bodů na 17 (nad kloboukem přibyl prázdný řádek); 2) pozice kreslete těsně pod sebe (mezi hlavou a nohama zůstane 1 volný řádek, masky budou přiléhat k sobě). Malé čárky po stranách obrazu jsou čistě jen kůli orientaci (po osmi bodech); kreslení si poněkud zpříjemníme nastavením Attrs/Trasparent a Misc/Bright grid 1 (v ART studiu samozřejmě).
Postavičky představují fáze Joa v chůzi (všimněte si, že ruka se houpe na obě strany - dopředu i dozadu, ne jako např. u Manic Minera, kde jsou pouhé tři fáze a pak to při pohybu vypadá, že chodí neustále pravou (nevylučuji ani levou) nohou dopředu..., pozice za sebou následují v tomto pořadí: 1, 2, 3, 4, 1, 5, 6, 7 a tak pořád dokola. (Pro ty, kteří minule nedávali pozor připomímám, že ten černý flek vpravo je maska a že jí musí obkreslit se stejnou chutí jako Joa.)
Aby nám grafika vůbec k něčemu mohla posloužit, musíme ji v nějaké rozumné formě uložit do paměti, takže až skončíte s kreslením, nahrajte nějaký assembler (nejraději Prométhea protože na něm byl následující program odladěn a vy si tak ušetříte spoustu problémů při zjišťování, proč to jinde přesně takhle nefunguje) a opisujte...
Program CONVERT převádí postavičky z obrazovky do paměti. Použijeme ho následovně: program pouze přeložíme (ASSEMBLY) a vyskočíme do BASICu (BASIC). Nahrajeme obrazovku s panáčky (LOAD [*]"JménoObr"SCREEN$) a spustíme konvertor (PRINT USR 45e3). V levém horním rohu obrazovky by mělo být číslo 60476, z kterého můľete usoudit, že délka dat je právě 476 - pro jistotu si je uložíme SAVE [*]"Joe"CODE 6e4,476]. Co vlastě program udělal? Od adresy 60000 uložil po řádcích všechny masky, ale mezi každým bajtem nechal jednu mezeru (zdvojená instrukce - inc ix) - masky tedy leží na sudých adresách. Na liché adresy (počínaje 60001) byly uloženy pozice Joa (také po řádcích), takže jsme získali řádkově organizované sprajty a klidně se můžeme vrátit do assembleru (GO TO 1) a celý program spustit (RUN).
Ještě jednou upozorňuji, že program se spouští na adrese START (dáno pseudoinstrukcí - ent START) a ta není 4500, ale o něco víc! Kdo program dobře opsal, tomu se po obrazovce celkem plynule prošel Joe. A to je vše. Pozn.: Čísla označená ve výpisu xx lze v rozumné míře měnit, aniľ by to program nějak iritovalo, nebo to vedlo k jeho (nervovému) zhroucení.
org 45000  ;překládej od adr. 45000
 ent START  ;preogram se spouští od adr. START

DATA equ 60000  ;kam ukládat grafiku
HI equ 17  ;výška sprajtu (v bodech)
WI equ 2  ;šířka sprajtu (ve znacích)
P equ DATA  ;první pozice leží na počátku dat
        
CONVERT ld hl,#4002 ;adresa první masky ve videoram
 ld ix,DATA  ;a odsuď se začnou ukládat
 ld bc,7*256*HI*WI ;b=7*hi (7 pozic pod sebou), c=WI (šířka)
 push bc  ;schovej pro příště
 call C01  ;ulož všechny masky
 pop bc  ;obnov rozměry
 ld hl,#4000 ;adresa první figurky ve videoram
 ld ix,DATA+1 ;a odsuď se začnou ukládat

C01 push bc  ;uschovej výšku
 push hl  ;a adresu ve VRAM
 ld b,c  ;do b dej šířku sprajtu
C02 ld a,(hl)  ;přečti byte z VRAM
 ld (ix+0),a ;a ulož ho do paměti
 inc hl  ;posuň se na následující byte
 inc ix  ;ale v paměti ukládej
 inc ix  ;"ob jedno"
 djnz C02  ;opakuj podle šířky (v našem případě 2x)
 pop hl  ;obnov adresu VRAM
 call NEXTHL  ;a jdi o jeden mikrořádek níž
 pop bc  ;obnov ukazatel výšky
 DJNZ C01  ;a pokud není 0 tak opakuj ukládání
 dec ix  ;ukazuj na 1. volný byte za grafikou (přiřaď bc=ix,
 ld b,hx  ;aby při volání z basicu (PRINT USR 45000) byla
 ld c,lx  ;tato hodnota vytištěna
 ret   ;vrať se

NEXTHL inc h  ;posuň se o jeden mikrořádek
 ld a,h  ;a pokud nedošlo k překročení
 and 7  ;osmi mikrořádek (tj. jednoho řádku),
 ret nz  ;tak se vrať
 ld a,l  ;jinak je nutno ošetřit
 add a,32  ;vstup na další řádek,
 ld l,a  ;a když to stačí,
 ret c  ;tak se vrať
 ld a,h  ;ale pokud byla překročena hranice mezi třetinami,
 sub 8  ;tak ještě správně dopočítej adresu a pak se vrať
 ld h,a  ;pozn.: znáte-li organizaci videoram, tak pro Vás
 ret   ;tento podprogram asi nebude takovou záhadou
 
;----------------------------
START ld iy,23610
 ld a,63
 ld i,a
 im 1
 ei

 ld hl,#4000
 ld de,#4001
 ld bc,#17ff
 ld (hl),-1
 ldir

 call INIT

 ld b,80
GOES push bc
 call WAIT
 call BACK

 ld de,DIRECT
POSIT ld hl,DIRECT
GOO ex de,hl
 ld a,(de)
 inc de
 or a
 jr z,GOO
 
 ld (POSIT+1),de
 ld b,a
 and 127
 ld hl,TABLE-2
 add a,a
 add a,l
 ld l,a
 ld a,h
 adc a,0
 ld h,a
 ld e,(hl)
 inc hl
 ld d,(hl)
 ld (GO2+1),de
 ld hl,(DR0+1)
 bit 7,b
 jr z,GO1
 inc hl
GO1 call HIDE
GO2 ld hl,0
 call DRAW
 pop bc
 djnz GOES
 ret

WAIT ld b,5
WAI halt
 djnz WAI
 ret
INIT ld hl,DIRECT
 ld (POSIT+1),hl
 ld hl,#4022
 call HIDE
 ld hl,P+0
DRAW ld bc,256*HI+WI
DR0 ld de,0
DR1 push bc
 push de
 ld b,c
DR2 ld a,(de)
 and (hl)
 inc hl
 or (hl)
 inc hl
 ld (de),a
 inc de
 djnz DR2
 ex de,hl
 pop hl
 call NEXTHL
 ex de,hl
 pop bc
 djnz DR1
 ret

HIDE ld bc,2*HI
 ld de,SPACE
 ld (DR0+1),hl
 jr HI1
HI0 dec hl
 dec hl
 call NEXTHL
HI1 ldi
 ldi
 jp pe,HI0
 ret

BACK ld bc,2*HI
 ld hl,SPACE
 ld de,(DR0+1)
 jr BA1
BA0 dec de
 dec de
 ex de,hl
 call NEXTHL
 ex de,hl
BA1 ldi
 ldi
 jp pe,BA0
 ret

DIRECT defb 2,3,4,128+1,5,6,7
 defw 128+1,0
TABLE defw P,P+68,P+136
 defw P+204,P+272,P+340
 defw P+408
SPACE defs 34
(pokračování příště)

sobota 21. srpna 2004

Hráli jste "HEROES '92"?

autor: George K.

Asi bych se spíš měl ptát: Dohráli jste "HEROES '92"? Dali jste lemmingovi deštník, vzali si Batmanův plášť, neodjeli taxíkem a odpověděli správně na otázku, kam jde kůň s hadem?
Jde kůň (klap, klap) a had (šš, šš). Na co jdou?
Povíme si něco o tom, kudy bylo správné se ubírat a kde to naopak nemělo smysl: první věc, která byla docela důležitá, bylo vzít papírek (prozkoumej kancelářský stolek, prozkoumej šuplík, vezmi papírek), který obsahoval výše uvedenou otázku, někdy v průběhu hry ho dát RoboCopovi II (použij papírek) a správné říci, že kůň s hadem jdou na nervy. V kanceláří u sekretářky byl neopomenutelný deštník, který se položil přede dveře výtahu a vychodivší lemming (po otvření dveří příkazem stiskni přivolávací tlačítko) si ho drze vzal a nezabil se tak pádem při chůzi z hlavní haly bůhvíkam na jih. Na parkovišti stačilo chvíli počkat a děly se věci: vybuchovala auta, batmobily a nakonec Batman zahodil svůj plášť (Vaše reakce: vezmi Batmanův převlek), hodící se při pádech z výšky ("pozor, schod!" je přece jenom nepřesné) do bahna. Na stanici metra Schwazreneggerova se také chvíli počká a neleze se hned do prvního metra, co se namane. Mezitím je dobré dívat se, co se děje a reagovat (prozkoumej mrtvou ženu, vezmi pistoli). Bez pistole je v metru veselo, ale když ji máte, v klidu přestřelku přežijete a ještě získáte nové kamarády (prozkoumej cestující), kteří s vámi vystoupí a zůstanou na stanici metra Stalloneova.
Je čas stát se někým jiným, vzít pár věcí a vzápětí se jich zbavit (vezmi malou krabičku, vezmi papírovou krabici, jdi na jih, polož papírovou krabici, prozkoumej papírovou krabici, polož malou krabičku). Pak se zase vrátíme do role Clouseaua a využijeme toho, co jsme si nadrobili (prozkoumej malou krabičku, vezmi hřebíky). Jdeme zpátky po kolejích do Arnoldovy stanice a odtud přes Manic Minera k bahnu. Zde - vezmi past na duchy, prozkoumej Batmanův převlek, použij Batmanův opasek - a jsme zpět v hlavní hale, hurá na vrátnici (pozor na RoboCopa I, nemá rád zbraně), ven na parkoviště (použij hřebíky, jdi do taxíku) a pokud s sebou nemáte moc věcí, dostaneme od Rodriga klobouk a bič. S tím sešviháte hada, ležícího na schodišti (použij bič), prozkoumáte osobnosti, Mirečka a vezměte si krabičku sirek. Výše zmíněnému RoboCopovi II dáte papírek a odpovíte, on vás za to pustí na střechu a nevypne reflektor, který na oblohu vrhá H, nebo-li znak Habermana (kdo viděl Batmana, chápe, ostatní mají smůlu). Se žralokem si hrát nepůjdeme, ale vylezeme na komín a skočíme do něj, on se o nás Haberman postará; pak položíme past na duchy do otvoru ve stěně, staneme se někým jiným, pro past si dojdeme a odneseme ji ke skleněné stěně, kde ji prozkoumáme, čímž vyvoláme ducha, pro kterého si přijdou krotiči duchů (to jsou ti noví kamarádi z metra) - ve stěně vzniknou díry, jimiž přileze lemming, projde nevšímavě kolem vás, probourá zeď komínu a odšplhá vzhůru. Konečně můžete být (Coleman a Clouseau) spolu, vítězství je na dosah ruky, stačí jen dojít k bombě a zapálit knot (použij krabičku sirek). Tak to byl stručný návod, přesně tak, jak to nemám rád, ale aspoň vidíte, že dohrát se to dalo a docela jednoduše.
Kdo udělal přesně tohle a nic víc, zažil asi 30% toho, co zažít mohl a získal ubohých nepostačujících cca 60 bodů. Body se přidělovaly následovně: 1 bod za každou navštívenou místnost (23-24 bodů), 2 body za každou objevenou věc (40-62 bodů) a zbytek za speciality, tedy za věci navíc, které nebylo nutno udělat, ale šlo to (0-34 bodů). (Čísla v závorkách udávají minimální a maximální bodové zisky, kterých lze dosáhnout.)
Hra má něco přes třicet místnosti, ale nekteré nesmíte navštívit - výtah, bazznek se žralokem, první metro, poslední sluj Manic Minera, atd. Ten jeden bod navíc získáte, když projdete tam a zpátky chodbou, kde byla spousta dveří.
Co se věcí týče, skoro pokaždé, když se vypsala zpráva "Objevil jsi ...", získali jste dva body. Takže v kanceláří jste pak mohli spatřit navíc telefonní kartu, krabičku cigaret, spodka kulového, velký kulový, jinde se objevila spousta klik a spousta problémů, po prozkoumání Clouseaua dokonce šimpán, atd. Programově vzato, dostávali jste body ne při samotném objevení, ale až na konci hry, kdy se zjišťovalo, které z vytipovaných předmětů jsou ve hře, což umožnilo několik dalších bodových ohodnocení, které by mohly patřit už spíše do specialit. Byly to: 1) živý vetřelec a 2) při dokončení hry Coleman a Clouseau v jedné místnosti. Co se vetřelce týká, byl neškodný, ale chudák. Ve chvíli, kdy jste si to přihasili na vrátnici s pistolí, RoboCop vás vyzval ji odhodit (a bylo záhodno ho poslechnout, protože jinak střílel - do vás), jenže na upuštěnou zbraň se vrhnul nic netušící "alien" a v zápětí byl postřelen on. Ani potom se ale nevyplatilo brát si pistolí zpět do rukou.
Nejzajímavější části hry ovšem byly speciality, které ukrývaly nejrůznější překvapení. Kdo chvíli trápil počítač příkazem použij teleportační přístroj (bylo zde podezřelé, že program hlásil "Nic se nestalo" - jindy (tj. při zbytecném použití věci) přece nepsal nic!!!), zažil určitě chvilku strachu, když napočtvrté teleport ožil, Coleman vlezl dovnitř a počítač zvesela oznámil, že "Z teleportu vylétla moucha..." - dobrý vtip, za který jste inkasovali pět bodů. Druhý teleport ne a ne naskočit, ale kdo měl výdrž, mohl tentokrát propadnout dojmu, že se program doopravdy "kousnul" - zase nic (krom pěti bodů), a pokud jste se vypořádali i s akční pasáží hry, bylo to dalších pět navíc.
Jinými specialitami bylo kouření a telefonování, které spolu částečně souvisely. Stačilo vzít telefonní kartu (byla v koši) a od sekretářky si zavolat (použij telefonní kartu) - bylo to Arthurovi Brownovi a za pět bodíků. Kdo zavolal dvakrát, prohloupil, protože karta se dala použít u Manic Minera v místnosti Útok mutantních telefonů, odkud bylo možno zavolat sekretářce (pět bodů). Když už jsme u toho Manika - chodit se tu dalo jen tak tak - jednou tam a podruhé zpátky; při třetím vstupu do místnosti jste došli do Návratu krále zvířat a ten se nedá přežít. Ale zpátky k hovoru se sekretářkou - vážně vás nenapadlo, že by svoje Velbloudy (v originále Camel) mohla chtít zpátky (pokud jste je odnesli)? Ano, vážně je chtěla (strašně řada totiž kouří), ale aby jste z toho taky něco měli (z toho kouření myslím), bylo dobré nejdřív získat sirky a zapálit si aspoň jednu cigaretu (pět bodů) a potom teprve hřebíčky do rakve vrátit sekretářce (jen čtyři body), která navíc jen tak z nudy reagovala na to, zda máte v kapse pistolí, či nikoliv.
Záludnou věci byl taxík (vlastně nejen on). Vejít se do něho dalo vždy, ale vylézt ven, to už bylo horší. První návštěva taxíku určitě dobře nedopadla, ale když mu nejdříve uděláte zimní antiskluzové obutí zapícháním hřebíků do pneumatik, v klidu můžete vstoupit. Chvilku se nic neděje (ani ven to nejde), ale nepřehánějte to s prozkoumáváním Rodriga, nebo se udusíte v kouří z jeho doutníků. Takž choďte do taxíku s minimálním počtem věci, jinak vám Rodrigo při pohledu na plné ruce nic nedá.
S duchem a krtkem to také nebylo jednoduché. Pokud se past nebo papírová krabice prozkoumají na nesprávných místech, ani se slizákem, ani s Montym už nehnete a můžete začít znovu. Pak navíc je potřeba na dně komínu past položit (západně do otvoru ve zdi), stát se někým jiným a past si vzít - tedy udáte tu ty samé grify, se kterými se setkáte u hřebíků (taky si je musíte podat pod stěnou a navíc v krabičce).
Krom HEROES samotných byla podstatnou částí soutěže halda otázek, jejichž správné zodpovězení přinášelo téměř polovinu bodů. Prozraďme si tedy, jak měly správné odpovědi (podle mne) vypadat:
1) Jednotlivé díly Horáců se jmenují HUNGRY HORACE, HORACE GOES SKIING, HORACE AND THE SPIDERS (což věděl skoro každý) a jejich autorem je WILLIAM TANG (což věděl málokdo).
2) Při nahrávání The Chip Factory chodí deset Tedů-techniků a ve hře hraje valčík NA KRÁSNÉM MODRÉM DUNAJI.
3) Autorství programů Gens, Mons, Colt, Pascal, C patří firmě HI-SOFT.
4) Za otce Spectra bych označil sira CLIVA MARLESE SINCLAIRA, autoři Spectra jsou STEVEN VICKERS (sw) a RICHARD ALTWASSER (hw).
5) Ochrana firmy OCEAN se jmenuje SPEEDLOCK (jejím autorem je David Aubrey Jones).
6) Hra Ghostbusters vznikla podle filmu... chvilka napětí... GHSTBUSTERS.
7) Rodina Weeků sestává z WALLYHO, HERBERTA a WILMY.
8) Autor PODRAZU III je FRANTIŠEK FUKA, jehož iniciály jsou F. F. Nezaměstnaný programátor není nikdo jiný než TIM COLEMAN a jeho přítelem je ARTHUR BROWN.
9) Ve hře Starquake je teleportů skutečně patnáct a ne jedenáct (omlouvám se všem, kterých se tento omyl dotknul): ALGOL, AMAHA, AMIGA, ASOIC, DELTA, EXIAL, IRAGE, KYZIA, OKTUP, QUAKE, RAMIX, SONIQ, TULSA, ULTRA, VEROX.
10) Na posledním obrázku ve hře Splitting Images je MARYLIN MONROE (kdepak Madonna...!).
11) Autorem her Green Beret, Hyperactive, Mikie, Cobra, Terra Cresta, Hypersport je JONATHAN SMITH (alias SMIFFF).
12) Všechny hry od Code Masters si můžete přečíst v jednom loňském Fifu (tak proto je měli všichni dobře...).
13) Třináctá otázka byla opravdu nešťastná a skoro každý ji měl alespoň trochu špatně. Martin Galway je pro většinu soutěžících zcela neznámou postavou, ačkoliv hělal hru do většiny her Jófy Smiffa. Jsem si téměř jistý těmito: COBRA, HYSTERIA, TERRA CRESTA (a možná i PING-PONG Bernie Dugggse). David Whittaker skládal většinou pro Code Masters, jeho hudba je v JET-BIKE SIMULATORu, SKI SIMULATORu, PLANTOONu, GHOSTBUSTERS II, GLIDE RIDER, atd. Nerad to říkám , ale Mike Follin není hudebník (na rozdíl od svého bratra Tima!), takže body inkasovali ti, kteří poroškrtli, nebo na uvedenou skutečnost upozornili (inu, chyták). František Fuka zhudebnil hry KABOOM, INDIANA JONES I-III, F. I. R. E., TETRIS 2, JET-STORY, BELEGOST. Proximální hudebník Miroslav Hlavička svoji hudbou doprovodil hry HEROES '92, (postřeh!), MAH JONGG, PERESTROJKA, AKCIONÁŘ II, BALLERIS a další (bohužel v Beerlandu žádná hudba není, natož poak Hlavičkova).
14) Proměny z vlka (vlkodlaka) v člověka a naopak se odehrávají ve hře KNIGHT LORE.
15) Academy 87 naprogramoval PETE COOKE, 3D hrami se proslavila firma INCENTIVE, jejich první byla DRILLER.
16) Knihy Hobbita Pán prstenů napsal JOHN RONALD REUEL TOLKIEN.
17) Autorem Města robotů byl ing. Vít Libovický (kdepak Kája Saudek!), heslo znělo KONVALINKA.
18) Free Copy má pravděpodobně na svědomí HAJASOFT.
19) Hlavní postava desetiboje je DALEY THOMPSON, autoři hry jsou PAUL OWENS a CHRISTIAN URQUHART.
20) Samantha Fox se svléká ve hře SAMANTHA FOX STRIP POKER.
21) Ve Winter Games si můžete zasportovat v těchto disciplínách: SKI JUMP, HOT DOG, SPEED SKATING, BIATHLON, BOBSLEIGH, FIGURAL SKATING.
22) Programy na tvorbu 48k hudby: ORFEUS (UNIVERSUM), WHAM! THE MUSIC BOX (MARK ALEXANDER), ZX-7 (JÁN DEÁK), MUSIC STUDIO (MS CID). (Pozn.: Ackoliv Miroslav Hlavička používá Orfea častěji než Universum, jeho autorem není. Stejně tak není autorem hry Krtek a autíčko, jak mylně uvedlo Fifo - autorem je Václav Lavička).
23) Hru Tetris na Spectru uvedl MIRRORSOFT, původni autoři programu jsou VADIM GERASIMOV a ALEXANDR PAŽITNOV.
24) V Terramexu máte na výběr z PĚTI dobrovolníků.
25) Dr. Blitzen vystupuje ve hrách DYNAMITE DAN a DYNAMITE DAN AND THE ISLAND OF ARCANUM.
26) Písničku Ghostbusters složil RAY PARKER, Jr., pro hru ji naprogramoval DAVID WHITTAKER (Rob Hubbard osobně se na Spectrech nevyskytuje), kadeřníkem byl NICK DAWSON.
27) Oba dva uvedené Bat many vrhla na trh firma OCEAN.
28) Názvy posledních tří levelů hry LEMMINGS jsou: SLEEPLEES NIGHTS, PRIDE COMES BEFORE..., ENVIROMENTALLY FRIENDLY.
29) Hi-Soft: GENS, Oasis Software: LASER GENIUS, T. R. C.: PIKOMON, Crystal Computing: ZEUS, Picturesque: EDITAS.
30) Ta nejklasičtější hra se jmenuje MANIC MINER a autorem je MATHEW SMITH.
Tak co, jak hodně jste uspěli v HEROES '92? Znáte teď svoje šance na umístění? Jestli se někomu hra zdála moc těžká - je mi líto, to jste asi nikdy těžkou hru neviděli. Oproti adventurám typu Larry I-V, The Sccret Of Monkey Island I-II, Main Street to nebylo nic moc (navíc jsou anglicky... grr!). Stačilo jenom trochu víc přemýšlet, trochu víc zkoušet - a bylo to...! Kdo dohrál, dá mi za pravdu, ostatním doporučují si to alespoň zkusit (i se všemi smrtonosnými konci), vždyť 26190 bajtů textu pro Desktop, se vyrovná povídce o deseti stránkách A4 (pro šťouraly - psáno strojem, řádkování 1,5).
Věřím, že jste se dobře bavili a že si zase rádi zahrajete nějakou další moji hru - třeba to bude tentokrát něco akčního, třeba... no necháme se překvapit.

A abych nezapomněl:
Jde kůň (klap, klap) a had (šš, šš). Na co jdou?

Poslední Návrat žijící smrti

autor: George K.

Začal nový rok, soutěž k deseti letům ZX Spectra tedy skončila a než bude kompletně vyhodnocena, povíme si (jen tak pro zajímavost) něco o podstatné části hry HEROES '92 - o ochraně The Return Of The Living Death (Návrat žijící smrti).
Nejdříve k ochranám vůbec - jsou dvojího typu: 1) chrání program před kopírováním, nebo 2) chrání program před zkoumáním. Slabinou každé ochrany je, že po jejím průchodu je program čistý a pokud se Vám podaří tuto chvíli vystihnout a do programu se vloupat - máte ho. Navíc, kde nemůže software, tam pomůže hardware, a tak člověk, který vítězoslavně stiskne tlačítko Multi-/Masterface nebo NMI si připadá jako bůhvíjaký bůh a přiblble dodá: "Kraknul jsem to." Možná, že někoho napadá otázka proč vůbec by se ochrana měla prolamovat - také by mě to zajímalo, ale jsou lidé, kteří si prostě musí dokázat, že jsou lepší než ti, kteří tu ochranu psali (což je většinou omyl). Návrat žijící smrti jsou vlastně ochrany dvě - Žijící smrt a pak její Návrat. Obě mají několik vrstev, které nejsou sice nijak geniální, ale dokáží znepříjemnit pěkné deštivé odpoledne.
Již po nahráti basicu asi začátečníka překvapí příkaz IF COPY THEN CAT & DOG a pak fakt, že výraz za RANDOMIZE USR není definován. Ve skutečnosti na tom není nic zvláštního, a tak za chvíli určitě přijdete na to, jak se program spouští - a je tu malé překvapení pro hackery používající obrazovkové monitory - rozpakování nechutně zničí prostřední třetinu a trošku poškodí basicový systém. Navazuje několik ldirů, které rozstrkají program po paměti (případně náhodou vymažou paměťový monitor... Vaše škoda, příště si ho nahrajte jinam) a identifikace, zda je program instalován z diskety nebo kazety - podle toho se také dále pokračuje (při nahrávání z pásky by neměla být připojena D40 - program se buď hroutí nebo vyvede něco "až potom" - samozřejmě naschvál).
Pak následuje nahrání zbytku programu - hra má vlastní loadery jak pro disk, tak pro pásku. Loadery jsou ke své škodě nedoceněny - dokáží totiž nahrávat paměť "napřeskáčku" (z čehož plyne, že kód na médiu je Vám na dvě věci - na ... a na nic), ale tato funkce není zcela využita (pouze u kazetové verze se na konci používá obrazovka, protože v paměti je zapotřebí mít současně víc věcí, než je možné) - snad někdy příště.
HEROES se nejdříve rozpakují (teď je pro změnu zničena spodní třetina); opět pár ldirů, operací se zásobníkem, obrázek, hudba a - heslo. Jediná možnost, jak heslo utajit, je, aby ho program sám neznal - proto, ať napíšete cokoliv, vždy se provede to samé, ale za chvíli se přijde do míst, která se správně odkódují jen při tom pravém hesle (to je ta chvíle, kdy se jinak program zhroutí) - existuje skutečně jen to jedno jediné. Při rozkódování musí program ležet na stejném místě, na jakém byl zakódován - místo je to více než nepříjemné: od spodní třetiny videoram až do konce paměti... všechny další skoky jsou prováděny přes zásobník a v tom se nepříliš dobře orientuje, a tak procesor nakonec dohopsá až k dalšímu rozpakování (leží podobně blbě jako odkódování), pak opět chvilka zásobníkových skoků a - konečně start.
Tedy - ne tak docela. Následuje další identifikace "páska versus disk" založená na stavech sběrnice a ROM (tato část se špatně trasuje), opět se spočítá hodnota zásobníku a pak se někudy vběhne do podprogramu, který program správně rozmístí po paměti a ještě pozmění pár adres.
Začíná hra - a to je chvíle pro Návrat žijící smrti. Jejím základem je přerušení (je podezřele velké, že?), které čas od času program odchytává a nechává ho pokračovat někde úplně jinde - kdo přerušení vypnul, dostal se trasováním ke zcela falešným podprogramům, které program ve skutečnosti nikdy nepoužívá (on ho totiž většinou hroutí). Ti, kteří rádi mačkají tlačítko SNAP, se asi dočkali překvapení - nefunguje. Milovníci upravených ROM, si také příliš neužili - aspoň na páskách. Návrat žijící smrti je organickou součástí programu a jen některé jeho pasáže je možné odstranit. Navíc je napsán úmyslně tak, aby odradil - je v něm spousta věcí navíc a špatně.
Kdo hledal texty, které by mu usnadnily hraní, našel, se vší pravděpodobností, vzkaz: THE RETURN OF THE LIVING DEATH: WELCOME TO THE 21st ROUND (ONLY 79 LAPS TO GO), jenž nebyl zdaleka jediným, co jsem tu pro hackery zanechal. Skutečné texty jsou zapakovány textovým pressorem Tolkien 4.0, což se samo o sobě skoro rovná ochraně - pro přečtení by se musely vybalit (bylo by jich asi o 9kB víc).
Poslední Návrat žijící smrti se vygeneruje v okamžiku, kdy hru dokončíte - program je smazán a zůstává pouze obrazovka a hudba (rozkódování bodovacího podprográmku je založeno na podobném principu jako to minulé). Bodování samotné je záležitostí jednoduchou, ale složitě napsanou - snad každý pokus o podvod je někde vidět, takže - kdo si přidal pár bodů a podle ASCII kódu vzniklého čísla domaloval vnitřní rámeček, doběhl sám sebe. Navíc je bodování uděláno tak, aby i při pěti naprosto stejných dokončeních hry vyprodukovalo pět rozdílných tabulek - to co, v těch tabulkách bylo vždy stejné, bylo přesně tím, co nic neznamenalo... K bodování neodmyslitelně patří pozice - slabé to místo všech textovek, protože v sobě musí nést údaje o stavu hry, které samozřejmě jdou pozměnit. Proto jsou prozice HEROES generovány na podobném principu jako finální tabulka - dvě pozice ve stejnou chvíli = dva rozdílné kódy.
Abych to neměl tak jednoduché, zpříjemnil mi život každý Didaktik, na kterého jsem narazil - některé části ochrany na nich prostě nechodily a já ještě doteď nevím proč. Základním problémem je, že každý Didaktik je ve své podstatě originál (tedy nenahraditelný) a koupíte-li si počítač, disketovku a Melodika, můžete hovořit o štěstí, když se spolu snesou. Programátor aby se pak zbláznil při zjišťování, zda je chyba v jeho programu, nebo ve výrobním programu nejmenované zahraniční společnosti. Ať již bylo Specter vyrobeno několik miliónů - nelišily se tak, aby programy na nich nechodily; to se bohužel o branách do světa výpočetní techniky říct nedá. Díky Didaktikům jsou tedy některé pasáže ochrany "mrtvé" - a to je škoda. Po deseti letech si Spectrum zasloužilo pořádnou ochranu, která by potrápila a která by vlastně pro hackery byla hrou ve hře. Proto jsem ji také psal. Škoda.
Veselá příhoda na závěr: Asi nejvíc mě vytočilo, když pásková verze nefungovala s hudebním obvodem AY - přesněji - fungovala se všemi AY, krom Melodiku. (To je vůbec věc, ten Melodik, ještě že nemám absolutní sluch, jinak bych asi vyletěl z kůže při zjištění, že zase hraje o dvě oktávy výše.)
Pokud jste tedy nezkoušeli ochranou projít, zkuste to - je to prča.

středa 4. srpna 2004

AnimAce - díl třetí: Navštivte strojový kód

autor: George K.

Welcome to Machine Code! Možná, že je některým čtenářům líto, že jsem bezcitně opustil Basic a jistě se najdou i tací, co mi budou tvrdit, že v tom krásném jazyce by se dalo napsat daleko více, než jsem minule ukázal, ale moje letitá zkoušenost je, že animovat by se mělo ve strojáku a toho se ve zbytku seriálu budu držet. Tento díl nepřinese asi tolik konkrétních informací, jako ty předchozí, protože je třeba dohodnout se na určitých pojmech a výrazech, které budeme nadále používat a které mohou být pro někoho horkou novinkou.
Ti, kteří neovládají strojový kód, nemusejí zoufat, že jim budou následující stránky na nic - doporučuji sehnat si Universumovu knihu Assembler a ZX Spectrum - vždyť: kolik řečí znáš, tolikrát jsi člověkem...

3.1 Trochu (více) nudná teorie

Každá animace má svůj účel - většinou ji chceme využít v hrách - a na ten je třeba od samého počátku myslet. Neexistuje pravidlo, kdy jakou animaci použít - to je prostě na existenci jak postaviček tak pozadí, navíc je potřeba to všechno sladit (ne cukrem) a tady narazíme na ten největší problém: VZÁJEMNÉ PŘEKRÝVÁNÍ. Tomuto typu grafiky se říká sprajty (sprites) a využívá ho 90 % všech her. Díky náročnosti na rychlost nemůže být o Basicu ani řeč.
3.1.1 Nemaskované sprajty
Než abych složitě popisoval, co mám nemaskovaným sprajtem na mysli, bude jednodušší, když si nahrajete nějakou pěknou hru, kde na ně můžeme narazit. Jistě vám nemusím dvakrát připomínat Manic Manera; zde bylo většinou použito nemaskovaných sprajtů OR (pozadí a postavičky splývají do jednoho celku - přesvědčte se o tom).
Další bezmaskové sprajty najdete ve hrách PYJAMARAMA, ATIC ATAC, SAMANTHA (tam vlastně ne, tam jsou k vidění jiné zajímavé věci), STARQUAKE, atd; tentokrát to bude typ XOR (jako když nastavíte OVER 1 - nevypadá to moc hezky). Nesympatická na sprajtech OR a XOR je, jak se chovají k pozadí a k sobě navzájem; často není vůbec patrné, co se děje, zvláště navrství-li se několik sprajtů na sebe.
3.1.2 Zamaskované sprajty - to je ono!
Pyšní se jimi takové hry, jako je COBRA, GREEN BERET, BAT MAN, Jméno Růže (to musel dělat nějakej machr!), THREE WEEKS IN PARADISE, HERBERT, HIGHWAY, HEARTLAND a dalších pár stovek. Všimněte si např. v Green Beret co se stane, potká-li se víc chlapíků najednou (krom toho, že vás zabijí) - a to se ke všemu ještě roluje pozadí...! Klasickým příkladem sprajtu s maskou je šipka v Art Studiu, Desktopu, Orfeovi...
Co je myšleno maskou? Podívejte se na obrázek: jsou na něm tři typy čtverečků: 1) černé - to je Joe, tak jak ho znáte; 2) bílé - patří také Joeovi (tvoří mu vnitřek těla, obličej a jakousi ochranou čáru kolem); 3) šedé - a to je maska.Ve skutečnosti se grafika a maska nedají zakreslit do jednoho obrázku, udělal jsem to jenom kůli názorné ilustraci. Obrázky by správně měli být dva: na jednom by byla jen grafika a na druhém jen maska (obrázky musí mít stejné rozměry a když je dáte "na sebe" musí dohromady vypadat právě takto). V praxi se využije jednotlivých čtverečků následovně: maska se přiloží na pozadí a to, co "leží pod ní" zůstane zachováno. Vznikne "díra", do které se potom dokreslí grafika, a pak to vypadá přesně jako v Green Beret (Jonathan Smifff mi zaplatil, abych ho propagoval, tak se snažím). Uvědomte si, že tím, jak definujete masku, ovlivňujete výsledný efekt - když v masce necháte v místě skla "bílo", neuvidíte skrz lupu nic, když prostor skla vyplníte, zůstane "průhledné". Existují i masky založené na opačném principu, ale připadá mi výhodnější používat tyto.

3.2 Zákadní sprajtovací algoritmus

Všechny hry, využívající sprajty, vycházejí z jednoho systému jejich přemísťování, který je podle potřeby individuálně přizpůsobován a optimalizován, až k nepoznání. Jeho základ by mohl vypadat přibližně takto:
1. je-li to nutné, vykresli pozadí (např. při posunu ulice to nutné je)
2. nastav nové souřadnice sprajtů
3. polož všechny sprajty od nejspodnějšího k nejsvrchnějšímu (tento bod bývá konkretizován podle toho, zda se hraje ve 3D (BAT MAN, KNIGHT LORE) nebo "nadhledu z boku" (RENEGADE 1, 2, jízda městem v BAT MAN 3) nebo jen "pohledu z boku" (RoboCop, Green Beret) či "shora" (STAR DRAGON, LIGHT FORCE); obecně platí, že sprajty s nejnižším pořadovým číslem jsou "nejdál")
4. zvedni všechny sprajty od nejsvrchnějšího k nejspodnějšímu (viz. 3.)
5. zpátky na bod 1.
Vypadá to na první pohled trochu pochybně, ale hned si k tomu řekneme víc - je jisté, že něco vykreslit a vzápětí to smazat je hloupost - mezi bodem 3. a 4. se musí čekat, aby si člověk vůbec měl šanci sprajty prohlédnout, někdy se také musí otestovat pohyb a podoby, narazí na nejrůznější komplikace: program bude nechutně pomalý a při velkém počtu sprajtů bude obraz blikat až hrůza. Řešení spočívá v tom, že se všechny přípravné práce musejí provést někde v paměti a na obrazovku se dostane pouze nový "snímek", který bleskurychle překreje ten předcházející. Opět existuje několik způsobů, jak se vypořádat s přípravnými pracemi: tuším že v COBŘE se to dělá tak, že během jednoho přerušení se vyhodnotí nové pozice sprajtů, uloží se na odkazy na jejich data na zásobníku, a v dalším přerušení se to všechno nakreslí a to ještě zbyde čas na zvuk. Jiná varianta je mít někde v paměti rezervní obrazovku, jejíž obsah se bude kopírovat do videoram (bývá relativně pomalé), chytřejší programy kopírují pouze tu část, kde došlo ke změnám.

3.3 Prográmek na dobrou noc

Program byl odladěna na systému Prometheus - používáte-li jiný překladač, může dojít u pseudoinstrukcí k odlišnostem v zápisu. Program se snaží konkretizovat mlhavé představy o magické moci masky... Zkuste zpozorovat rozdíl, ke kterému dojde uvnitř čtverečku, když v datech změníte čísla 24 na 0.
ent START  ;pseudoinstrukce, udávající kde má program
    ;začátek
START ld hl,16384 ;bitová mapa videoram je zaplněna vzorkem
 ld de,16385 ;kvůli demonstraci účinků masky
 ld bc,6143
 ld (hl),255 ;číslo vzorku (255) je možno měnit podle libosti...
 ldir
 ld hl,DATA  ;HL ukazuje začátek dat sprajtu
 ld de,#4022 ;DE říká, kam do videoram se bude kreslit
 ld b,8  ;výška sprajtu je osm bodů
LOOP ld a,(de)  ;vezmi bajt z videoram
 and (hl)  ;a ponech pouze to, co je v masce
 inc hl  ;posuň se bajt grafiky
 or (hl)  ;a přidej ho k masce
 inc hl  ;posuň se na další masku
 ld (de),a  ;bajt polož do videoram
 inc d  ;posuň se ve videoram na další řádek
 djnz LOOP  ;opakuj 8x
 ret   ;konec - vrať se

DATA defb 0,0,0,126,0,66,24,66,24,66,0,66,0,126,0,0
(pokračování příště)

sobota 31. července 2004

AnimAce - díl druhý: BASIC je báječné místo pro život

autor: George K.

Jak jsem slíbil minule, přišel čas pro nenáročnou hru - nemám sice za cíl ukázat vám, jak se píší hry, ale v BASICu se dost dobře animovat nedá a hra je ten nejlepší způsob, jak si to ukázat. Připravte si znakovou sadu z kapitoly 1.3.1 a hurá do toho...

Jednoduchá hra v BASICu

2.1 Neotřelý originální námět

Ještě než začnete přepisovat výpis programu do počítače, prozradím vám, o co ve hře půjde. Joe se nachází v místnosti plné lávek a jeho úkolem není nic překvapivějšího, než dostat se z té nejhořejší na tu nejspodnější. Aby to nebylo tak jednoduché, ne po každé lávce se dá bez problémů chodit a padat se smí pouze z omezené výšky. A teď ... hurá do opisování!!!
100 LET j$="!""%&#$'()*-.+,/0": LET lives=3: LET level=1
 102 GO SUB 1000
 104 GO SUB 1100
 106 GO SUB 1300
 110 IF konec=1 THEN LET lives=lives-1: BEEP 1,-10: IF lives>0 THEN GO TO 102
 112 IF konec=0 THEN GO TO 104
 120 CLS : PRINT AT 10,11;"GAME OVER"
 999 PAUSE 0: INK 0: PAPER 7: BORDER 7: CLS : STOP
1002 INK 7: PAPER 0: BORDER 0: CLS : PRINT AT 10,12;"LEVEL ";level
1004 PAUSE 0: CLS
1006 LET pad=0: LET konce=0: LET time=1000
1018 RESTORE (level-1)*10+9000
1020 READ y,x: LET pos=1
1022 READ lin,col,ink,pap,t$
1024 IF t$="" THEN GO TO 1200
1026 PRINT AT lin,col; INK ink; PAPER pap;t$: GO TO 1022
1102 IF INKEY$="s" THEN BEEP .1,1: PAUSE 0: PAUSE 0: BEEP .1,10: RETURN
1104 IF INKEY$="a" THEN LET konec=1: RETURN
1106 IF pad>0 THEN GO TO 1180
1108 IF INKEY$="o" THEN GO TO 1150
1110 IF INKEY$<>"p" THEN RETURN
1120 IF x=30 THEN RETURN
1132 GO SUB 1200
1134 IF pos=1 OR pos=13 THEN LET pos=5: GO TO 1200
1136 IF pos=5 OR pos=9 THEN LET pos=1: LETx=x+1: GO TO 1200
1150 IF x=1 THEN RETURN
1162 GO SUB 1200
1164 IF pos=9 OR pos=5 THEN LET pos=13: GO TO 1200
1166 IF pos=13 OR pos=1 THEN LET pos=9: LET x=x-1: GO TO 1200
1180 GO SUB 1200
1182 LET y=y+(y<20)
1200 PRINT OVER 1;AT y,x;j$(pos TO pos+1); AT y+1,x;j$(pos+2 TO pos+3)
1205 RETURN
1300 LET pad2=pad
1302 IF SCREEN$ (y+2,x)=" " THEN IF SCREEN$ (y+2,x+1)=" " THEN LET pad=pad+1
1304 IF y=19 THEN LET konec=1
1306 IF pad=pad2 THEN LET pad=0: IF pad2>4 THEN LET konec=1
1310 RETURN
9000 DATA 2,10,4,5,0,7,"111111111111111"
9001 DATA 8,1,0,7,"111111111111111111111111",8,10,0,0,"  "
9002 DATA 13,8,0,7,"11111111111"
9009 DATA 0,0,0,0,""

2.2 Komentář výpisu programu

Přece jenom, ne všichni mají náladu zkoumat, co jsem napsal, a tak svůj produkt trochu osvětlím:


  • je provedena inicializace (100), tj. počet životů (3), startovní místnost (1) a všechny Joeovy pozice se uloží do řetězce



  • je vykreslena místnost (102), otestován pohyb (104) a pád (106) a nastala li smrt, je odečten život (110), v horším případě hra končí (120), v lepším pokračuje (112)



  • podprogram na vykreslení místnosti (1000) má jako vstupní parametr číslo místnosti v proměnné level. Místnosti leží v datech (9000, 9010, 9020...): první a druhé číslo udávají, kde má Joe na začátku stát, zbývající data jsou organizována takto: řádek, sloupec, inkoust, papír a co vytisknout. Posloupnost je ukončena prázdným řetězcem (""). Data jedné místnosti se musí vejít do posloupnosti řádků ...0-...9, jak je vidět podle výrazu na ř.1018. Do proměnné pos je dána 1, což označuje fázi Joa snožmo vpravo a vykreslení místnosti je ukončeno jejím zobrazením (skok z ř. 1024 na ř. 1200)



  • další podprogram hlídá pohyb Joa (1100) a je-li třeba, pak i jeho pád. Po stisku klávesy S bude provedena pauza, dokud opět něco nezmáčkneme. Klávesa A umožňuje spáchat sebevraždu - hodí se to ve chvíli, kdy už je jasné, že jste to zkazili. Pro pohyb Joa zůstaly klávesy O a P. Jde-li ještě jít doleva či doprava, je nejprve smazána stará pozice a potom do proměnné pos uložena nová a návrat se opět provede přes vykreslení pozice



  • podprogram vytisknutí pozice vychází z toho, že jedna pozice má 4 znaky, které lze získat z řetězce J$ basicovským příkazem TO. Proto jsou také pozice číslovány 1, 5, 9, 13, protože každé číslo zároveň udává i kolikátým znakem pozice v řetězci začíná



  • poslední podprográmek (1300) nastavuje pád. Je-li pod nohama Joa prázdno, je hodnota proměnné pad zvýšena o jedničku. Smrt pádem nastává buď při dopadu Joa na řádek 19, nebo když je pád delší než 4 (1306). V podprogramu pohybu (1100) je testována hodnota pad a je-li nenulová, sune se Joe po obrazovce směrem dolů (1180). (Pozn.: výraz na ř. 1182 postupně zvyšuje číslo řádku, dokud Y<20.)


  • 2.3 Play the game

    Po spuštění se na obrazovce objeví 4 plošinky z jedniček a pár znaků představující Joa. S tím se ovšem nesmíříme a konečně udáme tu znakovou sadu z minule. Napište
    CLEAR 49999: LOAD ""CODE 50000
    a nahrajte upavený font. Dále doplňte program následovně:
    1000 POKE 23606,0: POKE 23607,60
    (tj. tiskni sadu z ROM)
    1008 POKE 23606, A: POKE 23607,B
    (kde A, B si musíme spočítat - viz. 1.2.2)
    Také je dobré dopsat řádek 118, kde bude to samé co na ř. 1000. Protože jsme si definovali pouze několik prvních znaků, není vrácení původních hodnot tak nutné, ale, obecně vzato, tam patří. (Abych nezapomněl: zaměňte v datech dvojice "0,7" za "7,0".)
    Spustíte-li znovu program, bude po obrazovce běhat Joe. Prozatím nevyužité předefinované znaky zneužijeme k následujícímu: !3! použijeme jako zarážku a "4" jako nebezpečnou podlahu, s "2" si naložte dle libosti. Rozšíříme data místností:
    9002 DATA 3,5,6,0,"3",8,12,5,0,"44"
    Pro hru to nebude mít zatím žádné důsledky, ty musíme vyrobit my. Tedy...
    1122 IF pos=5 THEN IF SCREEN$(y+1,x+3)="3" THEN RETURN
    1152 IF pos=12 THEN IF SCREEN$(y+1,x-1)="3" THEN RETURN
    a teď již nejde jít tam, kde stojí v cestě "3".
    Na závěr mám pro vás úkol: doplňte program tak, aby se Joe zabil i v případě, že vstoupí nohama na "44". Protože vás nechci napínat až do příště, najdete řešení na konci dílu.

    2.4 Jak snadno přijít k penězům

    Hru můžete ještě vylepšit o následující: když ji Joe stoupne na "22", postupuje do další místnosti, délky smrtelných pádů nemusí být konstantní, po pádu nebo průchodu místností zahraje nějaká znělka, ovládání klávesami by mohlo být předefinovatelné, neškodilo by ani ošetřit kempston joystick. Zatím nevyužitá proměnná time se může zapojit do hry a omezit dobu určenou k průchodu místnostmi, atd. Jsou to všechno samozřejmě nesmysly, které nemají praktický význam, ale pokud to ještě neumíte, můžete se na nich naučit spousy postupů a triků... Nakonec doporučuji ke hře dodělat pěkný obrázek, dobře znějící hudbu, hezké intro, pár zajímavých vizuálních efektů, a všechno to poslat do PROXIMY k distribuci... příjemnou zábavu.
    Příště nadobro opustíme starý dobrý BASIC a zavítáme do strojového kódu, jehož rychlost nám umožní daleko více. Bohužel už se nesetkáte s celým výpisem, ale pouze s úryvky z nejhrůznějších (pardon, překlep - správně nejrůznějších) rutin...

    Řešení (ovšem že ne jediné):

    1308 IF SCREEN$(y+2,x)="4" THEN IF SCREEN$(y+2,x+1)="4" THEN LET konec=1
    (pokračování příště)