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:42] Viktor Typovský [Inicializace] |
2016:brick-game [2017/01/13 17:49] (aktuální) Viktor Typovský |
||
---|---|---|---|
Řádek 133: | Řádek 133: | ||
Úkolem této funkce je zajištění konstantního pohybu oranžových svodidel na okrajích matice. Pohyb je dán rychlostí 1 pixel / 1 sekundu (podle nastavení časovače, který tuto funkci volá). | Úkolem této funkce je zajištění konstantního pohybu oranžových svodidel na okrajích matice. Pohyb je dán rychlostí 1 pixel / 1 sekundu (podle nastavení časovače, který tuto funkci volá). | ||
+ | <code cpp> | ||
+ | void SvodidlaPohyb(void) | ||
+ | { | ||
+ | int col; | ||
+ | int row; | ||
+ | int pom1; //pomocná proměnná | ||
+ | | ||
+ | pom1 = poleCerveny[7][0]; //uloží hodnotu v poslendím 8. radku | ||
+ | | ||
+ | //posune svodidla o 1 pozici směrem dolu při každém zavolání funkce | ||
+ | for(col=0;col < 8; col = col+7) //pracuje pouze v 1. a v posledním sloupci | ||
+ | { | ||
+ | for(row = 7; row > 0; row--) //7. až 1. řádek přepíše na 8. až 2. | ||
+ | { | ||
+ | poleCerveny[row][col] = poleCerveny[row-1][col]; | ||
+ | poleZeleny[row][col] = poleZeleny[row-1][col]; | ||
+ | } | ||
+ | } | ||
+ | //poslední řádek přepíše jako 1. | ||
+ | poleCerveny[0][0] = pom1; | ||
+ | poleCerveny[0][7] = pom1; | ||
+ | poleZeleny[0][0] = pom1; | ||
+ | poleZeleny[0][7] = pom1; | ||
+ | } | ||
+ | </code> | ||
==== AutaPohyb ==== | ==== AutaPohyb ==== | ||
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. 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(). | ||