Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:driving-game

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

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í.
2014/driving-game.1421583317.txt.gz · Poslední úprava: 2015/01/18 13:15 autor: Stanislav Horký