Obsah:

Platformová hra ovládaná Arduinom s joystickom a IR prijímačom: 3 kroky (s obrázkami)
Platformová hra ovládaná Arduinom s joystickom a IR prijímačom: 3 kroky (s obrázkami)

Video: Platformová hra ovládaná Arduinom s joystickom a IR prijímačom: 3 kroky (s obrázkami)

Video: Platformová hra ovládaná Arduinom s joystickom a IR prijímačom: 3 kroky (s obrázkami)
Video: Arduino-Hra-Návod pro správné sestavení 2024, Júl
Anonim
Platformová hra ovládaná Arduinom s joystickom a IR prijímačom
Platformová hra ovládaná Arduinom s joystickom a IR prijímačom

Dnes použijeme mikrokontrolér Arduino na ovládanie jednoduchej plošinovej hry na báze C#. Používam Arduino na vstup z modulu joysticku a odoslanie tohto vstupu do aplikácie C#, ktorá počúva a dekóduje vstup cez sériové pripojenie. Aj keď na dokončenie projektu nepotrebujete žiadne predchádzajúce skúsenosti s tvorbou videohier, môže chvíľu trvať, kým absorbujete niektoré veci, ktoré sa odohrávajú v „hernom cykle“, o ktorom budeme diskutovať neskôr.

Na dokončenie tohto projektu budete potrebovať:

  • Komunita Visual Studio
  • Arduino Uno (alebo podobné)
  • Modul ovládača joysticku
  • Trpezlivosť

Ak ste pripravení začať, pokračujte!

Krok 1: Pripojte joystick a infračervenú LED diódu

Pripojte joystick a infračervenú LED diódu
Pripojte joystick a infračervenú LED diódu
Pripojte joystick a infračervenú LED diódu
Pripojte joystick a infračervenú LED diódu

Tu je pripojenie pomerne jednoduché. Zahrnul som schémy znázorňujúce iba zapojený joystick a tiež nastavenie, ktoré používam. Obsahuje joystick a infračervenú diódu LED na ovládanie hry pomocou diaľkového ovládača, ktorý je súčasťou mnohých súprav Arduino. Je to voliteľné, ale zdalo sa mi to ako skvelý nápad vykonávať bezdrôtové hry.

Kolíky použité v nastavení sú:

  • A0 (analógový) <- Horizontálna alebo os X
  • A1 (analógový) <- vertikálna alebo os Y
  • Pin 2 <- Joystick Prepínanie vstupu
  • Pin 2 <- infračervený vstup LED
  • VCC <- 5V
  • Zem
  • Pozemok č. 2

Krok 2: Vytvorte nový náčrt

Vytvorte nový náčrt
Vytvorte nový náčrt

Začneme vytvorením nášho súboru náčrtu Arduino. Toto bude zisťovať zmeny na joysticku a odosielať tieto zmeny do programu C# každých niekoľko milisekúnd. V skutočnej videohre by sme skontrolovali vstup sériového portu v hernej slučke, ale hru som začal ako experiment, takže snímková frekvencia je v skutočnosti založená na počte udalostí na sériovom porte. V skutočnosti som projekt začal v sesterskom projekte Arduino, spracovanie, ale ukázalo sa, že bol oveľa, oveľa pomalší a nedokázal zvládnuť počet políčok na obrazovke.

Najprv teda vytvorte nový náčrt v programe na úpravu kódu Arduino. Ukážem svoj kód a potom vysvetlím, čo robí:

#include "IRremote.h"

// IR premenné int receiver = 3; // Signálny pin IR prijímača IRrecv ircc (prijímač); // vytvorenie inštancie výsledkov 'unbcv' decode_results; // vytvorenie inštancie 'decode_results' // Joystick/herné premenné int xPos = 507; int yPos = 507; bajt joyXPin = A0; byte joyYPin = A1; byte joySwitch = 2; volatile byte clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int currentSpeed = 550; // Predvolené = priemerná rýchlosť int speedIncrement = 25; // Suma na zvýšenie/zníženie rýchlosti s Y vstupom bez znamienka dlhý prúd = 0; // Zachová aktuálnu časovú pečiatku int wait = 40; // ms na čakanie medzi správami [Poznámka: nižšie čakanie = rýchlejší snímkový kmitočet] volatile bool buttonPressed = false; // Meradlo, ak je tlačidlo stlačené, neplatí setup () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, jump, FALLING); prúd = milis (); // Nastaviť aktuálny čas // Nastaviť infračervený prijímač: unbcv.enableIRIn (); // Spustenie prijímača} // nastavenie void loop () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // Ovládajte pohyb joysticku X bez ohľadu na načasovanie: if (xMovement> minMoveHigh || xMovement current + wait) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // If only moving a little…? currentSpeed // … stačí vrátiť aktuálnu rýchlosť: getSpeed (yPos); // yPos zmeňte iba vtedy, ak sa joystick výrazne pohybuje // int distance =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); prúd = milis (); }} // loop int getSpeed (int yPos) {// Záporné hodnoty označujú, že sa joystick posunul nahor, ak (yPos 1023? 1023: currentSpeed + speedIncrement;} else if (yPos> minMoveHigh) // Interpretované „nadol“{// Ochrana pred klesne pod 0 spätný prúdSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed neplatný skok () {buttonPressed = true; // Indikuje, že bolo stlačené tlačidlo.} // skok // Keď stlačíte tlačidlo na vzdialený, zvládne správnu odpoveď void translateIR (decode_results results) // vykoná akciu na základe prijatého IR kódu {switch (results.value) {case 0xFF18E7: //Serial.println("2 "); currentSpeed += speedIncrement * 2; break; case 0xFF10EF: //Serial.println("4 "); xPos = -900; break; case 0xFF38C7: //Serial.println("5"); jump (); break; case 0xFF5AA5: // Serial. println ("6"); xPos = 900; break; case 0xFF4AB5: //Serial.println("8 "); currentSpeed -= speedIncrement * 2; break; default: //Serial.println (" other button "); break;} // Prepínač konca} // END translateIR

Pokúsil som sa vytvoriť kód tak, aby bol väčšinou samovysvetľujúci, ale stojí za zmienku niekoľko vecí. Jedna vec, ktorú som sa pokúsil vysvetliť, bola v nasledujúcich riadkoch:

int minYMoveUp = 520;

int minYMoveDown = 500;

Keď je program spustený, analógový vstup z joysticku má tendenciu preskakovať, zvyčajne sa pohybuje okolo 507. Aby sa to napravilo, vstup sa nezmení, pokiaľ nie je väčší ako minYMoveUp alebo menší ako minYMoveDown.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, jump, FALLING);

Metóda attachInterrupt () nám umožňuje kedykoľvek prerušiť normálnu slučku, aby sme mohli vstupovať, podobne ako stlačenie tlačidla pri kliknutí na tlačidlo joysticku. Tu sme pripojili prerušenie v riadku pred ním pomocou metódy pinMode (). Dôležitou poznámkou je, že na pripojenie prerušenia na Arduino Uno musíte použiť buď pin 2 alebo 3. Ostatné modely používajú rôzne piny prerušenia, takže možno budete musieť skontrolovať, ktoré piny váš model používa na webovej stránke Arduino. Druhý parameter je pre metódu spätného volania, tu sa nazýva ISR alebo „rutina prerušenia služby“. Nemalo by mať žiadne parametre ani nič vracať.

Serial.print (…)

Toto je riadok, ktorý bude odosielať naše údaje do hry C#. Tu do hry pošleme čítanie osi X, čítanie osi Y a premennú rýchlosti. Tieto hodnoty je možné rozšíriť o ďalšie vstupy a hodnoty, aby bola hra zaujímavejšia, ale tu použijeme iba pár.

Ak ste pripravení otestovať svoj kód, nahrajte ho do Arduina a stlačením klávesov [Shift] + [Ctrl] + [M] otvorte sériový monitor a zistite, či získavate výstup. Ak prijímate údaje z Arduina, sme pripravení prejsť na časť kódu v C#…

Krok 3: Vytvorte projekt C#

Aby som zobrazil našu grafiku, pôvodne som začal s projektom v programe Processing, ale neskôr som sa rozhodol, že bude príliš pomalé zobrazovať všetky objekty, ktoré potrebujeme na zobrazenie. Preto som sa rozhodol použiť C#, ktoré sa ukázalo byť oveľa plynulejšie a pohotovejšie pri spracovaní nášho vstupu.

Pre časť projektu C# je najlepšie jednoducho stiahnuť súbor.zip, extrahovať ho do vlastného priečinka a potom ho upraviť. V súbore zip sú dva priečinky. Ak chcete otvoriť projekt v programe Visual Studio, zadajte v Prieskumníkovi Windows priečinok RunnerGame_CSharp. Tu dvakrát kliknite na súbor.sln (riešenie) a VS načíta projekt.

Pre hru som vytvoril niekoľko rôznych tried. Nebudem rozpisovať všetky podrobnosti o jednotlivých triedach, ale uvediem prehľad toho, na čo slúžia hlavné triedy.

Boxová trieda

Vytvoril som triedu boxov, aby ste mohli vytvárať jednoduché obdĺžnikové objekty, ktoré je možné kresliť na obrazovku vo forme systému Windows. Cieľom je vytvoriť triedu, ktorú je možné rozšíriť o ďalšie triedy, ktoré môžu chcieť nakresliť nejaký druh grafiky. Kľúčové slovo „virtuálne“sa používa tak, že ostatné triedy ich môžu prepísať (pomocou kľúčového slova „prepísať“). Tak môžeme v prípade potreby dosiahnuť rovnaké správanie pre triedu Player a triedu Platform a tiež upravovať objekty, ako potrebujeme.

Nebojte sa príliš o všetkých vlastnostiach a kreslite hovory. Túto triedu som napísal, aby som ju mohol v budúcnosti rozšíriť o akúkoľvek hru alebo grafický program. Ak potrebujete za chodu jednoducho nakresliť obdĺžnik, nemusíte takto písať veľkú triedu. Dokumentácia C# má dobré príklady, ako to urobiť.

Vysvetlím však časť logiky svojej triedy „Box“:

verejný virtuálny bool IsCollidedX (Box otherObject) {…}

Tu kontrolujeme kolízie s predmetmi v smere X, pretože hráč potrebuje skontrolovať kolízie v smere Y (hore a dole) iba vtedy, ak je s ním zoradený na obrazovke.

public virtual bool IsCollidedY (Box otherObject) {…}

Keď sme nad alebo pod iným herným predmetom, skontrolujeme, či nedochádza k zrážkam Y.

public virtual bool IsCollided (Box otherObject) {…}

Toto kombinuje zrážky X a Y a vracia, či došlo k stretu akéhokoľvek objektu s týmto.

verejná virtuálna prázdnota OnPaint (grafická grafika) {…}

Vyššie uvedenou metódou odovzdáme ľubovoľný grafický objekt a použijeme ho, keď je program spustený. Vytvoríme akékoľvek obdĺžniky, ktoré bude potrebné nakresliť. Dalo by sa to však použiť na rôzne animácie. Na naše účely budú obdĺžniky vhodné pre platformy aj prehrávača.

Trieda postáv

Trieda Character rozširuje moju triedu Box, takže máme istú fyziku ako stvorenú. Vytvoril som metódu „CheckForCollisions“, aby som rýchlo skontroloval všetky platformy, ktoré sme vytvorili, kvôli kolízii. Metóda „Jump“nastavuje hráčovu rýchlosť nahor na premennú JumpSpeed, ktorá sa potom v triede MainWindow upravuje po jednotlivých snímkach.

Kolízie sú tu riešené trochu inak ako v triede Box. V tejto hre som sa rozhodol, že ak vyskočíme nahor, môžeme skočiť cez plošinu, ale ak sa s ňou zrazí, zachytí nášho hráča pri ceste dole.

Platformová trieda

V tejto hre používam iba konštruktor tejto triedy, ktorý používa ako vstup súradnicu X a vypočítava všetky polohy X platforiem v triede MainWindow. Každá platforma je nastavená v náhodnej súradnici Y od 1/2 obrazovky do 3/4 výšky obrazovky. Výška, šírka a farba sa tiež generujú náhodne.

Trieda MainWindow

Tu sme vložili všetku logiku, ktorá sa má použiť pri spustení hry. Najprv v konštruktéri vytlačíme všetky COM porty dostupné programu.

foreach (reťazcový port v SerialPort. GetPortNames ())

Console. WriteLine ("DOSTUPNÉ PORTY:" + port);

Vyberáme si, na ktorom budeme prijímať komunikáciu, podľa toho, ktorý port vaše Arduino už používa:

SerialPort = nový SerialPort (SerialPort. GetPortNames () [2], 9600, Parity. None, 8, StopBits. One);

Venujte veľkú pozornosť príkazu: SerialPort. GetPortNames () [2]. [2] označuje, ktorý sériový port sa má použiť. Ak by napríklad program vytlačil „COM1, COM2, COM3“, počúvali by sme COM3, pretože číslovanie začína na 0 v poli.

V konštruktéri tiež vytvárame všetky platformy s semi-náhodnými rozstupmi a umiestnením v smere Y na obrazovku. Všetky platformy sú pridané k objektu List, čo je v C# jednoducho užívateľsky príjemný a efektívny spôsob správy dátovej štruktúry podobnej poľu. Potom vytvoríme Player, ktorý je naším objektom Character, nastavíme skóre na 0 a GameOver na false.

private static void DataReceived (odosielateľ objektu, SerialDataReceivedEventArgs e)

Toto je metóda, ktorá sa volá pri príjme údajov na sériový port. Tu použijeme všetku svoju fyziku, rozhodneme sa, či hru chceme zobraziť, presunúť platformy atď. Ak ste niekedy vytvorili hru, spravidla máte takzvanú „hernú slučku“, ktorá sa nazýva zakaždým, keď sa zobrazí rámec. osviežuje. V tejto hre metóda DataReceived funguje ako herná slučka, pričom manipuluje s fyzikou iba vtedy, keď sú údaje prijaté z ovládača. Mohlo fungovať lepšie, ak v hlavnom okne nastavíte časovač a aktualizujete objekty na základe prijatých údajov, ale keďže ide o projekt Arduino, chcel som vytvoriť hru, ktorá by skutočne bežala na základe údajov, ktoré z nej pochádzajú..

Na záver, toto nastavenie dáva dobrý základ pre rozšírenie hry na niečo použiteľné. Aj keď fyzika nie je úplne dokonalá, funguje dostatočne dobre na naše účely, tj. Používanie Arduina na niečo, čo má každý rád: hranie hier!

Odporúča: