Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2016:brick-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
2016:brick-game [2017/01/13 16:47]
Viktor Typovský [AutaPohyb]
2016:brick-game [2017/01/13 17:49] (aktuální)
Viktor Typovský
Řádek 161: Řádek 161:
 Tato funkce generuje auta počítače nalevo nebo napravo, v závislosti na hodnotě binární pseudonáhodné sekvence. Kromě rozsvicování LEDek v místech, kde se nachází auta počítače,​ však funkce musí dále zhasínat ty LEDky, kudy auto počítače prošlo. To řeší pomocí pomocných proměnných,​ které si pamatují předcházející polohy aut počítače,​ v závislosti na tom, zda byli vpravo či vlevo. Funkce je opět volána pomocí časovače každou 0,25 s. Tato funkce generuje auta počítače nalevo nebo napravo, v závislosti na hodnotě binární pseudonáhodné sekvence. Kromě rozsvicování LEDek v místech, kde se nachází auta počítače,​ však funkce musí dále zhasínat ty LEDky, kudy auto počítače prošlo. To řeší pomocí pomocných proměnných,​ které si pamatují předcházející polohy aut počítače,​ v závislosti na tom, zda byli vpravo či vlevo. Funkce je opět volána pomocí časovače každou 0,25 s.
  
-Tato funkce je příliš dlouhá a komplexní na to, abych ji sem dával nebo jenom její část.+Tato funkce je příliš dlouhá a komplexní na to, abych ji sem dával nebo jenom její část. Hlavní myšlenka je však stejná jako u předchozí funkce SvodidlaPohyb(),​ i když je tato funkce podstatně komplikovanější.
 ==== Pohyb ==== ==== Pohyb ====
 Tato funkce je volána v nekonečné smyčce a má na starost snímání Y-ové osy akcelerometru. Při překročení určitého prahu náklonu pak tato funkce rovnou zajistí změnu polohy autíčka počítače,​ ve kterém autíčko setrvá, dokud nedojde opět k překročení prahu náklonu (vlevo či vpravo). Tato funkce je volána v nekonečné smyčce a má na starost snímání Y-ové osy akcelerometru. Při překročení určitého prahu náklonu pak tato funkce rovnou zajistí změnu polohy autíčka počítače,​ ve kterém autíčko setrvá, dokud nedojde opět k překročení prahu náklonu (vlevo či vpravo).
- + 
 +Ukázka funkce pro náklon vpravo 
 +<code cpp> 
 +void Pohyb(void) 
 +{    
 +    prah = 0.3;          //​nastavení prahu, vymezující úhel detekce 
 +    ay = float(acc.getAccY()); ​         //​odečítání Y-ové osy akcelerometru 
 + 
 +       
 +    if((ay > prah)) ​    //​náklon vpravo 
 +    {        
 +        poloha =4;  //pravý (5.) sloupec 
 +        //rožnout auto hráče napravo 
 +        poleZeleny[4][poloha] = 1; 
 +        poleZeleny[5][poloha] = 1; 
 +        poleZeleny[6][poloha] = 1; 
 +        poleZeleny[4][poloha+1] = 1; 
 +        poleZeleny[5][poloha+1] = 1; 
 +        poleZeleny[6][poloha+1] = 1; 
 +        //zhasnout auto hráče vlevo 
 +        poleZeleny[4][poloha-2] =! 1; 
 +        poleZeleny[5][poloha-2] =! 1; 
 +        poleZeleny[6][poloha-2] =! 1; 
 +        poleZeleny[4][poloha-1] =! 1; 
 +        poleZeleny[5][poloha-1] =! 1; 
 +        poleZeleny[6][poloha-1] =! 1; 
 +    }  
 +
 +</​code>​
 ==== Kolize ==== ==== Kolize ====
 Tato funkce hlídá, jestli nejsou hodnoty červeného a zeleného pole v určitých definovaných místech shodné. Pokud ano, tak se jedná o kolizi autíček. Následné pak funkce zmrazí všechny pohyby, zobrazí místo autíčka hráče „vrak autíčka“ a zavolá funkci Reset. Tato funkce hlídá, jestli nejsou hodnoty červeného a zeleného pole v určitých definovaných místech shodné. Pokud ano, tak se jedná o kolizi autíček. Následné pak funkce zmrazí všechny pohyby, zobrazí místo autíčka hráče „vrak autíčka“ a zavolá funkci Reset.
  
 +<code cpp>
 +void Kolize(void)
 +{  ​
 +    if (poleZeleny[4][poloha] == poleCerveny[4][poloha] || poleZeleny[6][poloha] == poleCerveny[6][poloha])
 +    {
 +        //při detekci kolize dojde ke zmražení všech pohybů
 +        tick.detach(); ​
 +        tick2.detach();​
 +        ​
 +    //​-----zobrazí se oranžový vrak auta-----// ​   ​
 +        poleZeleny[4][poloha-1] = 1;
 +        poleZeleny[5][poloha] = 1;
 +        poleZeleny[6][poloha-1] = 1;
 +        poleZeleny[4][poloha+2] = 1;
 +        poleZeleny[5][poloha+1] = 1;
 +        poleZeleny[6][poloha+2] = 1;
 +        ​
 +        poleCerveny[4][poloha-1] = 1;
 +        poleCerveny[5][poloha] = 1;
 +        poleCerveny[6][poloha-1] = 1;
 +        poleCerveny[4][poloha+2] = 1;
 +        poleCerveny[5][poloha+1] = 1;
 +        poleCerveny[6][poloha+2] = 1;
 +        ​
 +        wait(2); //​zachování tohoto statického obrazu na dobu 2s
 +        Reset(); // zavolá funkci reset
 +    }
 +}
 +</​code>​
 ==== Reset ==== ==== Reset ====
 Z názvu funkce vyplývá, že tato funkce má na starost restart a reinicializaci počátečních podmínek a hodnot. Nejprve však celou RG LED matici vybarví na 2s do červena a následně provede reinicializaci a zruší zmražení všech pohybů. Z názvu funkce vyplývá, že tato funkce má na starost restart a reinicializaci počátečních podmínek a hodnot. Nejprve však celou RG LED matici vybarví na 2s do červena a následně provede reinicializaci a zruší zmražení všech pohybů.
 +
 +<code cpp>
 +void Reset(void)
 +
 +//---na 2s se zobrazí pouze červené LED na celé ploše matice---// ​   ​
 +    for(col = 0; col < 8; col++)
 +    {
 +        for(row = 0; row < 8; row++)
 +        {
 +            poleZeleny[row][col]=0;​
 +            poleCerveny[row][col]=1; ​
 +        }
 +    } 
 +    wait(2);
 +    ​
 +//​--------proběhne resetovací fáze--------//​
 +//zhasnutí celé LED matice
 +    for(col = 0; col < 8; col++)
 +    {
 +        for(row = 0; row < 8; row++)
 +        {
 +            poleCerveny[row][col]=0; ​
 +        }
 +    } 
 +//​re-inicializace ​   ​
 +    Inicializace();​
 +    pocitadlo = 0;
 +    rowAuto = 0;
 +    poloha =4;
 +    ​
 +//zrušení zmražení všech pohybů ​  
 +    tick.attach(&​SvodidlaPohyb,​ 1);
 +    tick2.attach(&​AutaPohyb,​ 0.25);
 +}
 +</​code>​
 +
 +====== Video ======
 +Aby nedošlo k jisté mistifikaci,​ chtěl bych podotknout, že hra ve videu začíná od restartu (červená plocha na počátku), z čehož je patrná následná reinicializace a opětovné spuštění hry.
 +
 +{{youtube>​gO0bwEQUUOA?​medium}}
 +
 +====== Závěr ======
 +Cílem tohoto projektu bylo zrealizovat hru z jednoho kdysi populárního herního zařízení pomocí RG LED 8x8 matice a vývojové desky FRDM KL25Z. ​ Zadání se podařilo splnit v plném požadovaném rozsahu. Byla využita barevnost matice. Ovládání bylo zrealizované pomocí akcelerometru.\\ ​
 +Hra je poměrně jednoduchá na ovládání a celkový chod programu byl vyladěn, aby nedošlo k nějakým zásadním chybám. Šlo by však uvažovat o následujících modifikacích. Hra je aktuálně jednoúrovňová,​ což znamená, že auta počítače se pohybují konstantní rychlostí. Bylo by však možné tuto rychlost měnit například pomocí slideru, který je zakomponován v desce KL25Z. Také by šlo nahradit psedonáhodnou binární sekvenci přímo generováním náhodných jedniček a nul pomocí funkce rand(). ​
  
2016/brick-game.1484322464.txt.gz · Poslední úprava: 2017/01/13 16:47 autor: Viktor Typovský