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 | ||
|
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(). | ||