Pravidla hry jsou primitivní a zná je asi každý, ale pro jistotu je ještě
zopakuju. Základem je určité bludiště, ve kterém jsou rozmístěny kameny a
plošinky. Hráč, reprezentovaný nějakou postavičkou, musí všechny kameny
dotlačit právě na ty plošinky. V této činnosti ho omezuje jednak bludiště,
kterým se musí proplétat, a také fakt, že kameny může jen tlačit před sebou
a to vždy jen jeden kámen. Jednoduché, ale věřte tomu, že to dokáže pěkně
potrápit mozkovnu.
Začneme tím, že si vyjmenujeme aktéry naší hry:
Nyní již známe vše potřebné pro naší hru. Dáme se tedy do práce...
Začneme bludištěm. Je to určité pole, které obsahuje informace o
rozmístnění zdí, podlahy a plošinek. Může mít tvar čtverce nebo obdélníku.
Jeho nejvhodnější realizace je dvourozměrné pole obsahující kódy, které
reprezentují zdi a všecho ostatní. V Basicu by to vypadalo asi takhle:
Dim bludiste(19,19)
Teto příkaz (Dim) vytvoří v paměti dvourozměrné pole o rozměrech 20 řádků a
20 sloupců (souřadnice jsou vždy 0 až 19). Toto pole je potřeba naplnit daty,
které nám popíšou tvar bludiště. Nejdříve celé pole vynulujeme - třeba
nějakým For-Next cyklem. Tam, kde má být zeď, zapíšeme jedničku, podlahu
nahradíme dvojkou a plošinku trojkou (čísla mohou být samozřejmě libovolná).
Tím jsme získali jednoduchý popis levelu a můžeme se věnovat kamenům.
Pro kameny si vytvoříme zvláštní pole se stejnými rozměry, jaké má
bludiště (např. Dim kameny(20,20)). Toto pole také nejdříve vynulujeme a
pak do něj zapíšeme rozmístnění kamenů. Dejme tomu, že tam, kde má být kámen,
dáme čtyřku. Proč je potřeba další pole jen na kameny ? Mno, nemuselo by
být, ale ušetří to pár podmínek při vyhodnocování pohybů kamenů.
A co hráč ? Ten existuje v podobě dvou proměných, které udávají jeho
pozici v poli bludiste() a zároveň i v poli kameny(). Např. PlayerX (sloupec)
PlayrY (řádka).
Je taky dobré si někde pamatovat, kolik je kamenů ve hře a kolik znich
už je na svém místě. Proměnné "PocKamenu" a "Splneno" by měly stačit...
Toť vše. Nyní se můžeme věnovat vytváření vlastní logiky hry.
Je jednoduchá, ale je třeba ji navrhnout tak, aby fungovala zcela spolehlivě
ve všech situacích - jednoduše řečeno, aby byla dostatečně "blbuvzdorná".
Vyjmenujme si vše, co si musíme pohlídat:
Nejem si zcela jistej, jestli jste všechno pochopili. Řekl bych, že občas
jsem zmát i sám sebe :). No nic. Pokračujeme dále.
Předpokládejme, že nám logika už pracuje, že jsme zvládli ovládání (joy,
klávesnice, myš) i načítání levelů. Nyní je řada na zpracování zobrazování
bludiště, kamenů a hráče. Je jasné, že souřadnice, se kterými pracujeme
v polích Bludiste() a Kameny(), nejsou vhodné pro vykreslování na obrazovku.
Použijeme-li například rozlišení lowres (320x256), pak by bludiště zabíralo
plošku 20x20 pixelů kdesi v levém horním rohu. Nepomůže ani posunutí
vykreslování o nějakou konstantu (např. PlayerX+50 a PlayerY+50). Těžko
budete používat pro znázornění hráče, kamenů a všeho ostatního jen
jednopixelové miniatury, ale využijete "malých obrázků", např. spritů,
kreslených v nějakém rastru, třeba 10x10 bodů. Takže, je potřeba nejen
posunout začátek kreslení (viz výše), ale i vykreslovat po krocích daných
velikostí oněch "malých obrázků". Jinak řečeno, začneme vykreslovat třeba
od bodu [10,10] a s krokem třeba taky 10. Další sprajtík tedy vykreslíme
například na souřadnicích 10,20 nebo 20,10 nebo 20,20 nebo ... Je potřeba
sesmolit převodní vztah mezi souřadnicemi v poli Bludiste() a souřadnicemi
na obrazovce.
Pro souřadnici X (sloupce): X = (PX * krok) + posunx Pro Y: Y = (PY * krok) + posunyKde:
Takhle nějak by to mělo fungovat. Když ne, tak si to dolaďte :-). Není
to zrovna zcela úplnej popis všeho, co se ve hře nakonec musí vyskytnout
(ovládámí, zvuky, nařítání levelů a jejich formát zápisu na disk, a mnoho
dalšího, ale na druhou stranu - zkuste si taky na něco přijít sami...
Ale aby jste si nemysleli, že jsem nějakej kruťas, tak vám jako bonus
poskytnu odladěnej zdroják celý hry se vším všudy, a je to !
P.S. Ten zdroják je psanej v BLITZ Basicu II a jmenuje se "Soko-Source.bb2".
E.N.I.F.