Sadržaj:

Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom: 3 koraka (sa slikama)
Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom: 3 koraka (sa slikama)

Video: Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom: 3 koraka (sa slikama)

Video: Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom: 3 koraka (sa slikama)
Video: Закодил Google Dino на Arduino! [Arduino GameDev] 2024, Srpanj
Anonim
Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom
Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom

Danas ćemo koristiti Arduino mikrokontroler za kontrolu jednostavne platformerske igre bazirane na C#. Koristim Arduino za preuzimanje unosa iz modula joystick -a i slanje tog unosa u aplikaciju C# koja sluša i dekodira ulaz preko serijske veze. Iako vam ne treba nikakvo prethodno iskustvo u izgradnji videoigara za dovršetak projekta, možda će vam trebati neko vrijeme da upijete neke stvari koje se događaju u "petlji igre", o čemu ćemo kasnije govoriti.

Da biste dovršili ovaj projekt, trebat će vam:

  • Zajednica Visual Studio
  • Arduino Uno (ili slično)
  • Modul upravljačke palice
  • Strpljenje

Ako ste spremni za početak, nastavite!

Korak 1: Priključite joystick i IC LED diodu

Priključite joystick i IC LED diodu
Priključite joystick i IC LED diodu
Priključite joystick i IC LED diodu
Priključite joystick i IC LED diodu

Ovdje je spajanje prilično jednostavno. Uključio sam dijagrame koji prikazuju samo priključen joystick, kao i postavke koje koristim, koje uključuju joystick i infracrvenu LED diodu za kontrolu igre s daljinskim upravljačem, koji dolazi s mnogo Arduino kompleta. Ovo nije obavezno, ali činilo se kao super ideja biti u mogućnosti baviti se bežičnim igranjem.

Igle koje se koriste u postavljanju su:

  • A0 (analogno) <- Vodoravna ili os X
  • A1 (analogno) <- Okomita ili Y-os
  • Pin 2 <- Ulaz prekidača za joystick
  • Pin 2 <- Infracrveni LED ulaz
  • VCC <- 5V
  • Uzemljenje
  • Teren #2

Korak 2: Izradite novu skicu

Izradite novu skicu
Izradite novu skicu

Počet ćemo s stvaranjem naše Arduino datoteke skice. Ovo anketira joystick za promjene i šalje te promjene u C# program svakih nekoliko milisekundi. U stvarnoj video igri provjeravali bismo serijski port u petlji igre radi unosa, ali igru sam započeo kao eksperiment, pa se framerate zapravo temelji na broju događaja na serijskom portu. Zapravo sam započeo projekt u sestrinskom projektu Arduino, Processing, ali pokazalo se da je bio puno, puno sporiji i da nisam mogao podnijeti broj kutija na ekranu.

Dakle, prvo stvorite novu skicu u programu za uređivanje kodova Arduino. Pokazat ću svoj kôd, a zatim objasniti što radi:

#include "IRremote.h"

// IR varijable int prijemnik = 3; // Signalni pin IC prijemnika IRrecv unrecv (prijemnik); // izrada instance 'unrecv' decode_results rezultata; // izrada instance 'decode_results' // Joystick/varijable igre int xPos = 507; int yPos = 507; bajt joyXPin = A0; bajt radostYPin = A1; bajt joySwitch = 2; volatile byte clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int currentSpeed = 550; // Zadano = prosječna brzina int speedIncrement = 25; // Iznos za povećanje/smanjenje brzine s Y ulazom nepotpisana duga struja = 0; // Zadržava trenutnu vremensku oznaku int wait = 40; // ms za čekanje između poruka [Napomena: niže čekanje = brži framerate] volatile bool buttonPressed = false; // Mjerenje ako je gumb pritisnut void setup () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, skok, PADANJE); struja = millis (); // Postavljanje trenutnog vremena // Postavljanje infracrvenog prijemnika: unrecv.enableIRIn (); // Pokretanje prijemnika} // postavljanje void loop () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // Rukovati Joystick X pokretom bez obzira na vrijeme: if (xMovement> minMoveHigh || xMovement current + wait) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // Kad bi se samo malo pomaknuo …? currentSpeed // … samo vratite trenutnu brzinu: getSpeed (yPos); // Promijenite yPos samo ako se joystick znatno pomaknuo // int distance =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); struja = millis (); }} // petlja int getSpeed (int yPos) {// Negativne vrijednosti pokazuju da je joystick pomaknut prema gore ako (yPos 1023? 1023: currentSpeed + speedIncrement;} inače if (yPos> minMoveHigh) // Tumačeno "Dolje" {// Zaštitite od ide ispod 0 return currentSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed void jump () {buttonPressed = true; // Označena tipka je pritisnuta.} // skok // Kada je tipka pritisnuta daljinski, rukuje odgovarajućim odgovorom void translateIR (decode_results results) // poduzima radnje na temelju primljenog IR koda {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: // Serijski. println ("6"); xPos = 900; break; case 0xFF4AB5: //Serial.println("8 "); currentSpeed -= speedIncrement * 2; break; default: //Serial.println (" drugi gumb "); break;} // Krajnji prekidač} // END translateIR

Pokušao sam stvoriti kôd koji će uglavnom biti jasan sam po sebi, ali postoji nekoliko stvari koje vrijedi spomenuti. Jedna stvar koju sam pokušao objasniti bila je u sljedećim redovima:

int minYMoveUp = 520;

int minYMoveDown = 500;

Dok je program pokrenut, analogni ulaz s upravljačke palice ima tendenciju preskakanja, obično na oko 507. Da bi se to ispravilo, ulaz se ne mijenja osim ako je veći od minYMoveUp ili manji od minYMoveDown.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, skok, PADANJE);

Metoda attachInterrupt () omogućuje nam prekid normalne petlje u bilo kojem trenutku, tako da možemo unositi unos, poput pritiska gumba kada se pritisne tipka upravljačke tipke. Ovdje smo priložili prekid u retku prije njega, koristeći metodu pinMode (). Ovdje je važna napomena da za priključivanje prekida na Arduino Uno morate koristiti pin 2 ili 3. Drugi modeli koriste različite pinove prekida pa ćete možda morati provjeriti koje pinove vaš model koristi na web stranici Arduino. Drugi parametar je za metodu povratnog poziva, koja se ovdje naziva ISR ili "Routine Service Interrupt". Ne bi trebao uzimati nikakve parametre niti vraćati bilo što.

Serial.print (…)

Ovo je linija koja će poslati naše podatke u igru C#. Ovdje u igru šaljemo očitanje osi X, očitanje osi Y i varijablu brzine. Ta se čitanja mogu proširiti uključivanjem drugih ulaza i čitanja kako bi igra postala zanimljivija, ali ovdje ćemo upotrijebiti samo nekoliko.

Ako ste spremni testirati svoj kôd, prenesite ga na Arduino i pritisnite [Shift] + [Ctrl] + [M] da biste otvorili serijski monitor i vidjeli imate li izlaz. Ako primate podatke iz Arduina, spremni smo za prijelaz na C# dio koda …

Korak 3: Izradite C# projekt

Kako bih prikazao našu grafiku, u početku sam započeo projekt u procesu obrade, no kasnije sam odlučio da bi bilo presporo prikazati sve objekte koje trebamo prikazati. Stoga sam odlučio koristiti C#, koji se pokazao mnogo glatkijim i osjetljivijim pri rukovanju našim unosom.

Za C# dio projekta, najbolje je jednostavno preuzeti.zip datoteku i izdvojiti je u vlastitu mapu, a zatim je izmijeniti. U zip datoteci postoje dvije mape. Da biste otvorili projekt u Visual Studiju, unesite mapu RunnerGame_CSharp u Windows Explorer. Ovdje dvaput kliknite.sln (rješenje) datoteku i VS će učitati projekt.

Postoji nekoliko različitih klasa koje sam stvorio za igru. Neću ulaziti u sve pojedinosti o svakom razredu, ali ću dati pregled čemu služe glavni razredi.

Klasa kutije

Napravio sam box box koji vam omogućuje stvaranje jednostavnih pravokutnih objekata koji se mogu nacrtati na zaslonu u Windows obliku. Ideja je stvoriti klasu koja se može proširiti pomoću drugih klasa koje možda žele nacrtati neku vrstu grafike. Ključna riječ "virtualno" koristi se tako da ih druge klase mogu nadjačati (koristeći ključnu riječ "nadjačati"). Na taj način možemo dobiti isto ponašanje za klasu Player i klasu Platform kada je to potrebno, a također i izmijeniti objekte kako god je potrebno.

Ne brinite previše o svim nekretninama i upućujte pozive. Napisao sam ovaj predmet kako bih ga mogao proširiti za bilo koju igru ili grafički program koji bih u budućnosti želio izraditi. Ako trebate jednostavno nacrtati pravokutnik u hodu, ne morate napisati veliku klasu poput ove. C# dokumentacija ima dobre primjere kako to učiniti.

Međutim, iznijet ću neke logike svoje klase "Box":

javni virtualni bool IsCollidedX (Box otherObject) {…}

Ovdje provjeravamo ima li sudara s objektima u X-smjeru, jer igrač treba provjeriti ima li sudara samo u Y smjeru (gore i dolje) ako je s njim poredan na ekranu.

javni virtualni bool IsCollidedY (Box otherObject) {…}

Kad smo iznad ili ispod drugog objekta igre, provjeravamo ima li Y sudara.

javni virtualni bool IsCollided (Box otherObject) {…}

Ovo kombinira sudare X i Y, vraćajući je li sudar bilo kojeg objekta s ovim.

javna virtualna praznina OnPaint (grafička grafika) {…}

Koristeći gornju metodu, prosljeđujemo bilo koji grafički objekt i koristimo ga dok je program pokrenut. Izrađujemo sve pravokutnike koje je potrebno nacrtati. To bi se ipak moglo koristiti za razne animacije. U naše svrhe, pravokutnici će dobro poslužiti i za platforme i za player.

Klasa likova

Klasa Character proširuje moju klasu Box, pa imamo određenu fiziku izvan okvira. Napravio sam metodu "CheckForCollisions" za brzu provjeru svih platformi koje smo stvorili radi sudara. Metoda "Jump" postavlja brzinu prema gore igrača na varijablu JumpSpeed, koja se zatim mijenja okvir po kadar u klasi MainWindow.

Ovdje se sudari rješavaju nešto drugačije nego u klasi Box. Odlučio sam u ovoj igri da, ako skočimo prema gore, možemo skočiti kroz platformu, ali ona će uhvatiti našeg igrača na putu prema dolje ako se sudari s njom.

Klasa platforme

U ovoj igri koristim samo konstruktor ove klase koji uzima X-koordinatu kao ulaz, računajući sve X lokacije platformi u klasi MainWindow. Svaka je platforma postavljena na nasumičnoj Y-koordinati od 1/2 zaslona do 3/4 visine zaslona. Visina, širina i boja također se nasumično generiraju.

Klasa MainWindow

Ovdje stavljamo svu logiku koja će se koristiti tijekom igre. Prvo, u konstruktoru ispisujemo sve COM portove dostupne programu.

foreach (niz za niz u SerialPort. GetPortNames ())

Console. WriteLine ("AVAILABLE PORTS:" + port);

Biramo na kojem ćemo prihvatiti komunikaciju, ovisno o tome koji port vaš Arduino već koristi:

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

Obratite posebnu pozornost na naredbu: SerialPort. GetPortNames () [2]. [2] označava koji serijski port koristiti. Na primjer, ako bi program ispisao "COM1, COM2, COM3", slušali bismo na COM3 jer numeriranje počinje s 0 u nizu.

Također u konstruktoru stvaramo sve platforme s polu-slučajnim razmakom i postavljanjem u smjeru Y na ekranu. Sve platforme dodane su objektu List, koji je u C# jednostavno vrlo jednostavan i učinkovit način upravljanja strukturom podataka nalik nizu. Zatim stvaramo Player, koji je naš objekt Character, postavljamo rezultat na 0 i GameOver postavljamo na false.

privatna statička praznina DataReceived (pošiljatelj objekta, SerialDataReceivedEventArgs e)

Ovo je metoda koja se poziva pri primitku podataka na serijski port. Ovdje primjenjujemo svu svoju fiziku, odlučujemo hoćemo li igru prikazati, premjestiti platforme itd. Ako ste ikada napravili igru, općenito imate ono što se naziva "petlja igre", koja se poziva svaki put kad se pojavi okvir osvježava. U ovoj igri DataReceived metoda djeluje kao petlja igre, samo manipulira fizikom dok se podaci primaju od kontrolera. Možda bi bolje funkcioniralo postavljanje mjerača vremena u glavnom prozoru i osvježavanje objekata na temelju primljenih podataka, ali kako se radi o Arduino projektu, želio sam napraviti igru koja se zapravo izvodi na temelju podataka koji dolaze iz njega.

Zaključno, ova postavka daje dobru osnovu za proširenje igre u nešto upotrebljivo. Iako fizika nije sasvim savršena, radi dovoljno dobro za naše potrebe, a to je korištenje Arduina za nešto što se svima sviđa: igranje igara!

Preporučeni: