Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2014:driving-game [2015/01/18 13:15] Stanislav Horký |
2014:driving-game [2015/01/18 14:45] (aktuální) Stanislav Horký |
||
---|---|---|---|
Řádek 34: | Řádek 34: | ||
===== Software ===== | ===== Software ===== | ||
+ | Aplikace byla vytvořena v prostředí [[https://mbed.org/|mbed.org]]. Pro řadiče **KS0108**, které jsou použité v displeji ATM12864D byla nalezena knihovna KS0108.h a pro akcelerometr **MMA8154Q** byla použita stejnojmenná knihovna. | ||
+ | V průběhu vývoje byla snaha o co nejjednodušší systém celé aplikace. Budou vytvořené okraje cesty, automobil bude jednoduchým čtvercem a snahou uživatele bude projet překážku, kterou bude představovat zeď s místem pro projetí. | ||
+ | |||
+ | ===== Realizace ===== | ||
+ | |||
+ | Při zapnutí jednotky je provedena inicializace displeje. Protože dle datasheetu nelze posílat ihned požadavky na displej, je nutné počkat na jeho nastartování. Zde se čeká cca 2 vteřiny. Následně je vygenerována úvodní obrazovka, jejíž průběh zobrazuje video níže. Již při tomto vykreslování bylo evidentní, že složitější objekty displej zobrazuje s viditelným zpožděním. Pro pozdější vizualizaci pohybu to bylo zásadní. | ||
+ | |||
+ | {{youtube>njTT77WgNNY?medium}} | ||
+ | |||
+ | Pro vykreslení úvodní obrazovky byla vytvořena funkce InitScreen(): | ||
<code cpp> | <code cpp> | ||
+ | void InitScreen() | ||
+ | { | ||
+ | int count = 0; | ||
+ | int distance = 0; | ||
+ | int dimensionX = 127; | ||
+ | int dimensionY = 63; | ||
+ | display.ClearScreen(); | ||
+ | display.SelectFont(System5x7,BLACK,ReadData); | ||
+ | display.GotoXY(0,0); | ||
+ | display.GotoXY(22,32); | ||
+ | display.PrintString("RedOut PRESENTS"); | ||
+ | wait(2); | ||
+ | display.ClearScreen(); | ||
+ | display.GotoXY(0,0); | ||
+ | display.GotoXY(52,32); | ||
+ | display.PrintString("GAME"); | ||
+ | | ||
+ | for(count = 0;count<12;count++) | ||
+ | { | ||
+ | distance = count*2; | ||
+ | | ||
+ | display.RoundRectangle(distance,distance,dimensionX,dimensionY,3,BLACK); | ||
+ | dimensionX = dimensionX - 4; | ||
+ | dimensionY = dimensionY - 4; | ||
+ | } | ||
+ | wait(2); | ||
+ | display.ClearScreen(); | ||
+ | drawCar(32,13); | ||
+ | wait_ms(500); | ||
+ | display.GotoXY(0,0); | ||
+ | display.GotoXY(45,0); | ||
+ | display.PrintString("DRIVING"); | ||
+ | wait_ms(800); | ||
+ | display.GotoXY(0,0); | ||
+ | display.GotoXY(18,48); | ||
+ | display.PrintString("MOVE TO CONTINUE"); | ||
+ | } | ||
</code> | </code> | ||
+ | |||
+ | Tato funkce obsahuje i funkci pro vykreslení graficky detailnějšího obrázku automobilu. Při tomto vykreslování již byla evidentní doba zobrazování, která může být pravděpodobně 100ms. | ||
+ | |||
+ | Dále byly vytvořeny funkce pro vytvoření cesty, objektu a auta. Jsou to funkce initRoad(), initCar() a initObstackle(). Dále bylo nutné rozlišovat v jakém stavu se hra nachází, pro toto byla vytvořena globální proměnná startFlag. Pro pohyb auta je použita funkce moveCar(): | ||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | void moveCar(int flag) | ||
+ | { | ||
+ | int speed = 4; | ||
+ | switch(flag) | ||
+ | { | ||
+ | case 1: | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); | ||
+ | carPositionY = carPositionY+speed; | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); | ||
+ | break; | ||
+ | case 2: | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); | ||
+ | carPositionY = carPositionY-speed; | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); | ||
+ | break; | ||
+ | case 3: | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); | ||
+ | carPositionX = carPositionX+speed; | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); | ||
+ | break; | ||
+ | case 4: | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); | ||
+ | carPositionX = carPositionX-speed; | ||
+ | display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Celý kód je obsáhlejší, z tohoto důvodu jej lze celý vidět na stránkách [[http://developer.mbed.org/users/standabassman/code/Driving_game/|mbedu]] (nutností je být zde přihlášen). | ||
+ | |||
+ | Pro aktivaci hry stačí pouze pohnout s deskou FRDM-KL25Z, objeví se startovní obrazovka a hra je spuštěna. Ovládání automobilu bylo provedeno, stejně jako pohyb překážky a ošetření kolize. Pokud se pohyboval pouze automobil, bylo vykreslování relativně v pořádku, ale jakmile byla přidána překážka, pohyb byl mnohem více trhaný a nepřehledný. Z tohoto důvodu nebyly doplněny další funkce jako zrychlování pohybu, náhodné překážky a podobně. Důvodem trhaného pohybu objektů byla vykreslovací rychlost a také různé rychlosti překážek a automobilu. Z tohoto důvodu bylo upuštěno od dalšího vývoje. Byly vyzkoušeny různé možnosti mazání a vykreslování objektů, ale nebylo dosaženo lepších výsledků. Níže je video zobrazující pohyb automobilu a překážky. | ||
+ | |||
+ | {{youtube>hs9kAkX7peg?high}} | ||
+ | |||
+ | |||
+ | ===== Závěr ===== | ||
+ | |||
+ | Ovládání displeje ATM12864D bylo umožněno ve spolupráci s deskou FRDM-KL25Z. Zobrazovací rychlost byla ale příliš malá a navrhovaná hra Driving nebyla kompletně dotvořena. Na videu lze vidět umožnění ovládání pomocí akcelerometru. Je zde také vidět kolize automobilu s překážkou a následný konec hry. Zdrojové kódy jsou k dispozici na serveru mbed.org. | ||
+ | |||
+ | Samotná kolize automobilu má nedokonalosti, je vytvářen pouze jedna překážka, která se objevuje po zmizení první znovu. Vykreslování displeje a tedy samotné pohyby objektů jsou viditelně trhané, což u automobilu není příliš velký problém, ale v případě překážky nelze úplně přesně odhadnout pozice. | ||
+ | |||
+ | K podobné aplikaci by bylo výhodnější použít jiný displej, který se hodí spíše pro zobrazování informací a ne k zobrazování a ovládání herních aplikací. |