Sadržaj:
- Korak 1: Priključite joystick i IC LED diodu
- Korak 2: Izradite novu skicu
- Korak 3: Izradite C# projekt
Video: Platformerska igra s Arduino kontrolom s joystickom i IC prijemnikom: 3 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:37
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
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
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:
Arduino LED upravljanje s analognom joystickom: 6 koraka
Arduino LED kontrola s analognom joystickom: U ovom vodiču naučit ćemo kako koristiti analognu joystick za upravljanje LED diodom. Pogledajte demonstracijski video
RC automobil s Bluetooth kontrolom, s kontrolom brzine i mjerenjem udaljenosti: 8 koraka
RC automobil s Bluetooth kontrolom i kontrolom brzine i mjerenjem udaljenosti: Kao klinac, uvijek su me fascinirali RC automobili. Danas možete pronaći mnoge vodiče za izradu jeftinih RC automobila s Bluetooth -om uz pomoć Arduina. Napravimo korak dalje i upotrijebimo svoje praktično znanje o kinematici za izračunavanje
Kutna pozicijska kontrola koračnog motora 28BYJ-48 s Arduino i analognom joystickom: 3 koraka
Kutna pozicijska kontrola koračnog motora 28BYJ-48 s Arduino i analognom joystickom: Ovo je shema upravljanja koračnim motorom 28BYJ-48 koju sam razvio da koristim kao dio svoje završne godine disertacijskog projekta. Nisam vidio da je to učinjeno prije pa sam mislio prenijeti ono što sam otkrio. Nadam se da će ovo pomoći nekome drugome u
Stolno pojačalo sa audio vizualizacijom, binarnim satom i FM prijemnikom: 8 koraka (sa slikama)
Stolno pojačalo sa audio vizualizacijom, binarnim satom i FM prijemnikom: Volim pojačala i danas ću podijeliti svoje stolno pojačalo male snage koje sam nedavno napravio. Pojačalo koje sam dizajnirao ima neke zanimljive značajke. Ima integrirani binarni sat i može dati vrijeme i datum te može vizualizirati zvuk koji se često naziva audio
8 Upravljanje relejem s NodeMCU -om i IC prijemnikom pomoću WiFi i IC daljinskog upravljača i aplikacije za Android: 5 koraka (sa slikama)
8 Upravljanje relejem s NodeMCU -om i IC prijemnikom pomoću WiFi i IC daljinskog upravljača i aplikacije za Android: Upravljanje 8 relejnih sklopki pomoću nodemcu -a i ir -prijemnika preko wi -fi -ja i daljinskog upravljača i android aplikacije. Daljinski upravljač radi neovisno o WiFi vezi. OVDJE JE KLIK AŽURIRANE VERZIJE OVDJE