Popis: Hra typu Boulder Dash vytvořená jako semestrální projekt do kurzu ZPG (Základy počítačové grafiky) na UIVT FEI VUT v Brně
Autor: Pavel Lipenský (xlipen00@stud.fee.vutbr.cz)
Datum: 14. ledna 2001
kurzorové šipky - pohyb hráče
SHIFT + šipky - odsávání a odkopávání ze sousedních políček
Esc - konec (autodestrukce)
P, levé tlačítko myši - Pauza
účelem je nasbírat stanovený počet diamantů a opustit level otevřeným východem
hráč může horizontálně posunovat nebo odkopávat kameny a trhaviny, je-li za nimi volné místo
hráč může odsávat diamanty a trávu ze sousedních políček
hráč by se měl vyhýbat kontaktu s příšerami (při správném načasování si příšera hráče v protipohybu nevšimne), dále pak všem shora padajícím objektům (kameny, diamanty, trhaviny) a explozím
shozením kamene na příšeru lze získat až 9 prémiových diamantů
trhaviny se aktivují buď pádem nebo explozí (postupné výbuchy)
- vytvořen a odladěn v jazyce Turbo Pascal 7
- binární soubory (na rychlejších CPU Intel je potřeba použít patch TPPATCH.EXE):
BMEDIT.EXE - editor map
TBMBASE.EXE - test algoritmu resp. jednotky BMBASE.PAS, navržený jen pro malé mapy
- zdrojové soubory: \SRC\TP\*.*
kombinace objektů (hráč, příšera, tráva, kámen, mezera,... ) tvoří matici objektů, kde každý objekt je reprezentován unikátním bytem
mapa objektů se načítá z *.MAP souborů, kde první 2 byty obsahují x a y rozměr uložené matice objektů a zbytek tvoří výpis objektů po řádcích z levého horního do pravého dolního rohu
pro záznam událostí objektů se používá matice událostí, která má stejné rozměry jako matice objektů a na pozici x, y tak každému objektu odpovídá událost
protože pouze události (navíc jen některé: pohyb, exploze, vysávání,...) způsobují změnu v mapě objektů, je ve hře implementován algoritmus (TRP - tabulka s rozptýlenými položkami) na jejich vyhledávání, místo neefektivního sekvenčního průchodu celou mapou událostí. TRP (lineární seznamy indexované podle řádků) tedy tvoří skupinu vybraných objektů, kterou se prochází buď shora dolů (přednost pak mají události objektů z vyššího řádku) nebo zdola nahoru (u explozí)
použitím více skupin objektů je vyřešena posloupnost událostí a jejich kolize. Prioritu mají exploze pak padající objekty (kameny, diamanty, trhaviny) a nakonec příšery. Hráč se řeší zvlášť (ne jako skupina) jako poslední. Objekt může událost provést pouze pokud žádné z potřebných políček ještě nezískalo událost od objektu s vyšší prioritou (např. hráč nemůže provést pohyb, jestliže na něj nebo do cílového políčka dopadává kámen)
celý algoritmus je zapouzdřen do jednotky BMBASE.PAS a ke komunikaci s ní se používají pouze 4 operace: LoadMap - nahrání mapy objektu, InitBMEEvents – vytvoření počátečních událostí, UpdateMap – zpracování událostí (úprava mapy objektů), UpdateEvents – vytvoření dalších událostí podle minulých
při vytvoření událostí je do BME.R zapsán výpis významných událostí mapy (dopad kamene, exploze,...), a to zejména pro ulehčení práce s možnými zvukovými efekty
- vytvořené v Borland Delphi 3
- binární soubory:
BMAN.EXE - vlastní hra
BMICONS.BMP - bitmapa ikonek objektů
BMPICT.BMP - bitmapa pozadí aplikace
- zdrojové soubory: \SRC\BD\*.*
hra využívá dvě pomocné bitmapy, zdrojovou SrcBM) pro uložení ikonek z BMICONS.BMP do paměti a výstupní (OutBM) pro vykreslování scény do paměti, před tím, než se celá zobrazí na obrazovku (odstranění blikání obrazu)
pro každou událost každého objektu je definována animace která má 4 (ASTEPS) kroky. Mapovací funkcí AnimRect je vždy určeno, která ikonka ze SrcMB se má v daném kroku zobrazit a s jakým posunutím
je realizováno sekvenčním průchodem zobrazovanou částí mapy objektů (resp. událostí) a transformací dané události objektu na příslušnou ikonku
jelikož se scéna vykresluje po řádcích z levého horního do pravého dolního rohu, jsou zobrazovány nejprve objekty bez události eLOCK a tím se zabrání, že vykreslená posunutá ikonka nebude v dalším kroku překreslena. Vzniklá prázdná místa překreslí až objekt, který si políčko zablokoval
protože minulý bod neřeší prázdná místa vzniklá od objektu vstupujícího do scény, je implementována ještě procedura DrawBorderLocked. Stará scéna je tedy vždy zcela překreslena novou, čímž se problém scrollování redukuje pouze na vykreslení posunuté scény s jedním sloupcem čí řádkem navíc ve směru pohybu hráče
v případě, že je mapa větší než scéna, je funkcí ScrollCheck zajištěno že hráč bude vždy ve scéně (pokud možno uprostřed). Stejná funkce zajišťuje také správné scrollování scény a zobrazení mapy v levém horním rohu, je-li velikost mapy menší než velikost scény
hra pro ovládání klávesami využívá události OnKeyDown, která je závislá na nastavení klávesnice systému. Problém prodlevy a opakování kláves měla řešit událost OnKeyUp (hráč opakoval minulý pohyb, dokud nebyla klávesa uvolněna nebo stisknuta nová), ovšem vlivem pravděpodobně malé periody tiků Timeru, nedokázal OS Windows odchytit všechny události klávesnice a plynulost hry se ještě více zhoršila . Snadnějšího ovládaní se dá proto dosáhnout nastavením minimální prodlevy a maximální rychlosti opakování kláves
z časových důvodů nebyly již implementovány zvukové efekty