Bubble Trouble Programátorská Dokumentace

Transkript

Bubble Trouble Programátorská Dokumentace
Bubble Trouble
Programátorská Dokumentace
Martin Hykl,
3. roč. MFF
Programátorská dokumentace
Celý běh hry řídí hlavní okno - třída MainWindow. Vlastní časovač, hrací pole POLE
(QVector QVectorů pointerů na jednotky) a QSety s jednotkami:
– bubbles (všechny bubliny)
– movingBubbles (bubliny, které se zrovna pohybují – šetří to čas, protože se nemusí pořád
procházet všechny bubliny kvůli pohybu několika málo z nich)
– fishes (všechny ryby včetně hrdiny)
– bonuses (všechny bonusy)
– effects (všechny efekty)
Efekty nejsou viditelné pro žádné jednotky (kromě hrdiny, který je vidí na svém monitoru),
jednotky se totiž dívají do POLE, kde jsou zapsané ostatní jednotky, ale efekty se tam nezapisují
(mj. kvůli složité implementaci překrývajících se výbuchů – na jedno políčko by se pak muselo dát
uložit neomezené množství pointerů, což by celou strukturu POLE zbytečně zesložitilo).
Vzhledem k nějakému automatickému paralelizmu na QTimeru, obsahuje třída MainWindow
i dva pomocné QVectory, ve kterých si pamatuje nově narozené a právě zemřelé ryby. Před
zavedením těchto vektorů docházelo k tomu, že po kousnutí zombií zemřela ryba a než stihla zmizet
z vektoru fishes, timer se s ní pokusil pohnout (ačkoliv už neexistovala). Při zabití bublinou tyto
problémy nenastávaly, protože v době, kdy se hýbou bubliny, jsou ryby už v klidu (pohyby úmyslně
obstarávají dva různé foreach cykly).
Načtení pole
Po kliknutí na OK v dialogu New game se ze složky files načte soubor vybrané mapy,
„natapetuje“ se na požadovanou velikost a uloží do QVector<QString> pole. Na začátku každého
levelu pak podle pole metoda void MainWindow::Init(int pts) vytvoří hrací plochu. Kódovací jazyk
je jednoduchý, kvůli snadné úpravě mapy, popřípadě výrobě nových:
– 0 – nic,
– 1 – bublina,
– 2 – výbušná bublina,
– 3 – pružná bublina,
– H – startovní místo hrdiny; pokud je jich na mapě víc, použije se jen první a ostatní mají
význam 0).
Hra
QTimer timer je provázaný s metodou void MainWindow::Tick(), která obstarává veškerý
pohyb po hrací ploše. Funguje přibližně takhle:
• „zamkne“ bool MainWindow::LOCK – zámek pro případ, že by počítač nestihl vykonat
všechno, co má za dobu jednoho tiknutí časovače
• aktualizuje informaci o zbývajícím čase
• každou celou vteřinu nechává generovat náhodné bonusy (obvykle to ale skončí tak, že
náhodné souřadnice míří na již obsazené políčko a bonus se tím pádem nevytvoří)
• pohne se všemi rybami
• pohne se všemi (pohybujícími se) bublinami
• nechá tiknout všechny efekty
• zkontroluje, jestli nemá hra skončit, nebo jestli někdo nezabil hrdinu a zachová se podle
toho
• odemkne LOCK
Efekty
Každý efekt umí jenom tikat (virtual void Effect::Tick()). Rozdíl je jenom v tom, co dělá
během tiku. Hrobeček nedělá nic. Ohnivému efektu tiknutím ubude život a navíc se pokusí zabít
cokoliv, co je zrovna na jeho políčku. Množství životů ohnivého efektu se liší podle zdroje a v
případě, že zdrojem je ExplosiveBubble, tak i podle vzdálenosti od epicentra výbuchu.
Jednotky
... jsou odvozené od QLabel. Jejich implementace je jednoduše vidět ze zdrojáků, proto se tu
omezím jen na zajímavější věci:
• okraj: pro jednodušší implementaci okraje hrací plochy jsem vytvořil třídu Absolute,
odvozenou od Unit. Tato jednotka existuje vždy jen v jedné instanci vlastněné MainWindow.
Pokaždé, když chce nějaká jednotka opustit pole, popřípadě kousnout mimo pole, je jí do
cesty strčena jednotka Absolute, která je naprosto netečná vůči jakémukoliv kousání apod.
• kousnutí: Unit::Bit() zavolá u->Bitted(this), kde Unit * u je jednotka na políčku před
kousajícím; odkaz na ni získá pomocí metody MainWindow::WhoStaysOn.
• identifikace: jednotka je identifikovatelná metodami whoami a wgroup, které vracejí jméno
jednotky a k jaké skupině přísluší. Skupiny jsou: bonus (bonusy), fish (všechny ryby včetně
hrdiny) a solid (všechny bubliny a okraj).
• pohyb: jednotka se přesune na další políčko v POLE až v okamžiku, kdy je nad ním celá,
tj. v případě, že rybička bude mezi políčky [0,0] a [1,0], bude se pohybovat směrem (1,0)
a na [0,0] přijede bublina, rybička umře; ve stejném případě, jen se směrem (-1,0) bublina
rybicku mine. V případě, že velikost políčka (30x30 px) není násobkem rychlosti jednotky,
dojde při přibližném dosažení políčka k zaokrouhlení a přizpůsobení pozice pozici políčka.
• virtual void Enemy::SelectWay() je mozek nepřítele; není moc chytrý, ale stačí na to, aby
hráči pořádně zatopil. Každý druh nepřítele má svůj specifický způsob volby cesty, ale mají
několik společných kroků:
▪ na začátku se nepřítel zeptá hry, kde je hrdina. Podle své polohy a dohledu dostane
buď hrdinovu polohu, nebo QPoint(-1, -1) (v tom případě si nechá starou informaci).
▪ zjistí, jestli náhodou nestojí na místě, kde by měl být hrdina a pokud ano (hrdinu tím
pádem ztratil z dohledu, jinak by měl aktuálnější informace), náhodně si vygeneruje
políčko na hrací ploše a tváří se, že je hrdina tam. Přitom doufá, že se k němu někde
cestou přiblíží natolik, že ho zahlédne (v tom případě podle prvního bodu získá nové
souřadnice).
▪ vymyslí, kudy se bude pohybovat a změní podle toho směr.
• kousnutí zombií: ryba, kterou zombie kousla, je zařazena do vektoru deadFishes. Mezitím
se do vektoru newFishes přidá nová zombie a po ukončení pohybu všech ryb všechny ryby
z deadFishes zemřou a ty z newFishes se přesunou do fishes.
Ovládání hry
Pro větší jednoduchost jsem ovládání implementoval pomocí menu a klávesových zkratek.
Tím se (oproti přetíženému eventu keyPress ve verzi 1) zjednodušilo zakazování některých akcí a
zároveň to umožnilo používat složitější klávesové zkratky.
GUI
Téměř celé grafické rozhraní jsem vytvořil pomocí nástroje QtDesigner. Výjimky jsou pouze
vytvoření dialogu New game v novém QDialogu a plnění QComboBoxu dostupnými mapami.
Hierarchie jednotek
modré = abstraktní

Podobné dokumenty

Bachovy esence pro zvirata

Bachovy esence pro zvirata Léčí slabost, neschopnost něco zvládnout pro únavu fyzickou i psychickou, například se dát do činnosti po období nečinnosti, naopak při vynucené nečin-nosti. Když jsou u nemocných zvířat příznaky r...

Více

Programa´torska´ dokumentace

Programa´torska´ dokumentace spojeny, kódovány a rozděleny do paketů. Pro náš projekt je nejdůležitějšı́ definice struktur použı́vaných v hovorové a RAS signalizaci. Doporučenı́ H.245 popisuje postupy pro otevı́r...

Více

CITIZEN EZ2000 6000PLUS Manuá EZ2000_6000plus

CITIZEN EZ2000 6000PLUS Manuá EZ2000_6000plus úkonů a směru pohybu – vytáhněte páku otevírání hlavy směrem od tiskárny a pak jí otočte dozadu nahoru.

Více

Multiplatformní GUI toolkity

Multiplatformní GUI toolkity { v gtkmm Gtk::Main::run() { v Qt QApplication:exec() (po nastavení hlavního widgetu pomocí QApplication::setMainWidget(w)) { ve wxWidgets pøetí¾ení metody wxApp::OnInit() a v ní vyt...

Více

Porovnani projektu Wikidata a DBpedia jako zdroju

Porovnani projektu Wikidata a DBpedia jako zdroju Data, který pro data stanovuje základní pravidla: Každá položka zveřejňovaných dat musí být jednoznačně identifikovatelná; při jejím prohlížení skrze Web musí uživatel dostat smysluplné informace v...

Více

002 - Kniha dejin Jezisa Krista

002 - Kniha dejin Jezisa Krista „Úsilí najít rys, ať už na rovině biblického textu či židovské tradice, který by měly tyto starozákonní ženy společný, není bezezbytku úspěšné. Rachab a Rút byly pohanky a rovněž i „ta, která byla ...

Více

openMagazin 2/2011

openMagazin 2/2011 možnost použití rychlé navigace, což je vyhledávací pole, do kterého zadáte, co KDevelop vyžaduje KDE (resp. knihovny). Je založeno na KDevPlatform. Na chcete najít. Např. název metody a postupně s...

Více

Značky HTML

Značky HTML • K JavaScriptu vždy vytvořit alternativu, vyhnout se navigaci pouze v JavaScriptu • K prezentaci ve Flashi vytvořit HTML verzi – ocení i někteří uživatelé • Rámy nejsou v principu špatné, ale při ...

Více

JavaHelp

JavaHelp • obsah (Table of Contents), • rejstřík (Index) • fulltextové vyhledávání (Fulltext Search) • oblíbené položky ( Favorites) • slovník (Glossary) Autor nápovědy může přidávat další navigátory, popří...

Více