Cov txheej txheem:

Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais: 3 Kauj Ruam (nrog Duab)
Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais: 3 Kauj Ruam (nrog Duab)

Video: Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais: 3 Kauj Ruam (nrog Duab)

Video: Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais: 3 Kauj Ruam (nrog Duab)
Video: Arduino Controlled Game 2024, Lub Xya hli ntuj
Anonim
Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais
Arduino-Controlled Platformer Game Nrog Joystick thiab IR Txais

Hnub no, peb tab tom yuav siv Arduino microcontroller los tswj kev yooj yim C#-based platformer game. Kuv tab tom siv Arduino coj cov tswv yim los ntawm tus lej joystick, thiab xa cov ntaub ntawv ntawd mus rau C# daim ntawv thov uas mloog thiab txiav txim siab tawm tswv yim hla qhov txuas txuas. Txawm hais tias koj tsis xav tau kev paub dhau los hauv kev tsim cov vis dis aus game kom ua tiav txoj haujlwm, nws yuav xav tau qee lub sijhawm los nqus qee yam uas tau tshwm sim hauv "game loop," uas peb yuav tham tom qab.

Txhawm rau ua tiav txoj haujlwm no, koj yuav xav tau:

  • Zej Zog Studio Zej Zog
  • Arduino Uno (lossis zoo sib xws)
  • Joystick tswj module
  • Ua siab ntev

Yog tias koj npaj tau pib, nqa mus!

Kauj Ruam 1: Nqa Tus Joystick thiab IR LED

Nqa Tus Joystick thiab IR LED
Nqa Tus Joystick thiab IR LED
Nqa Tus Joystick thiab IR LED
Nqa Tus Joystick thiab IR LED

Ntawm no, kev sib txuas yog yooj yim haum. Kuv tau suav nrog cov duab qhia pom tsuas yog lub joystick sib txuas, nrog rau kev teeb tsa kuv tab tom siv, uas suav nrog lub joystick ntxiv rau infrared LED rau kev tswj cov kev ua si nrog kev tswj chaw taws teeb, uas los nrog ntau cov khoom siv Arduino. Qhov no yog nyob ntawm yeem, tab sis nws zoo li lub tswv yim txias kom tuaj yeem ua wireless gaming.

Cov pins siv hauv kev teeb tsa yog:

  • A0 (analog) <- Kab rov tav lossis X-axis
  • A1 (analog) <- Ntsug lossis Y-axis
  • Pin 2 <- Joystick Hloov cov tswv yim
  • Pin 2 <- Infrared LED input
  • VCC <- 5V
  • Hauv av
  • Hauv av #2

Kauj Ruam 2: Tsim Tus Qauv Tshiab

Tsim ib daim duab tshiab
Tsim ib daim duab tshiab

Peb yuav pib nrog tsim peb cov ntawv kos duab Arduino. Qhov no xaiv qhov joystick rau kev hloov pauv, thiab xa cov kev hloov pauv mus rau C# program txhua ob peb lub vib nas this. Hauv qhov kev ua yeeb yaj kiab tiag tiag, peb yuav tshuaj xyuas qhov chaw nres nkoj hauv qhov game game rau kev nkag mus, tab sis kuv tau pib qhov kev ua si raws li kev sim, yog li tus lej yog qhov tseeb raws tus lej ntawm cov xwm txheej ntawm qhov chaw nres nkoj. Kuv tau pib qhov haujlwm hauv Arduino tus muam txoj haujlwm, Ua tiav, tab sis nws hloov tawm nws yog ntau, qeeb dua thiab tsis tuaj yeem lis tus lej ntawm lub npov ntawm lub vijtsam.

Yog li, xub tsim tus Sketch tshiab hauv Arduino code editor program. Kuv yuav qhia kuv cov cai thiab tom qab ntawd piav qhia nws ua dab tsi:

#suav nrog "IRremote.h"

// IR variables int tus txais = 3; // Teeb liab Pin ntawm IR tus txais IRrecv irrecv (tus txais); // tsim qhov piv txwv ntawm 'irrecv' decode_results cov txiaj ntsig; // tsim qhov piv txwv ntawm 'decode_results' // Joystick/game variables int xPos = 507; yPos = 507; byte joyXPin = A0; byte joyYPin = A1; byte joySwitch = 2; volatile byte clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int tam sim noSpeed = 550; // Default = qhov nruab nrab ceev int speedIncrement = 25; // Tus nqi kom nce/txo nrawm nrog Y cov tswv yim tsis kos npe ntev tam sim no = 0; // Tuav lub sijhawm tam sim no int tos = 40; // ms tos ntawm cov lus [Nco tseg: qis tos = nrawm dua framerate] volatile bool button Xovxwm = cuav; // Ntsuas yog tias lub pob raug nias tsis muaj teeb tsa teeb tsa () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, dhia, FALLING); tam sim no = millis (); // Teeb tsa lub sijhawm tam sim no // Teeb tsa tus neeg txais infrared: irrecv.enableIRIn (); // Pib tus txais} // teeb tsa lub voj void () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // Tuav lub Joystick X txav tsis hais txog sijhawm: yog (xMovement> minMoveHigh || xMovement tam sim no + tos) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // Yog tias tsuas yog txav me ntsis …? currentSpeed //… tsuas yog xa qhov nrawm tam sim no: getSpeed (yPos); // Tsuas yog hloov yPos yog joystick txav mus zoo // int nrug =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); tam sim no = millis (); }} // loop int getSpeed (int yPos) {// Cov txiaj ntsig tsis zoo qhia tias Joystick tau txav mus yog (yPos 1023? mus hauv 0 rov qab currentSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed void dhia () {buttonPressed = true; // Qhia khawm tau raug nias.} // dhia // Thaum lub pob nyem rau ntawm tej thaj chaw deb, tuav cov lus teb kom raug tsis muaj dab tsi translateIR (txiav txim siab cov txiaj ntsig tau tshwm sim) // ua raws li IR cov cai tau txais {hloov (cov txiaj ntsig.value) {rooj plaub 0xFF18E7: //Serial.println("2 "); currentSpeed += speedIncrement * 2; tawg; rooj 0xFF10EF: //Serial.println("4 "); xPos = -900; tawg; rooj 0xFF38C7: //Serial.println("5"); dhia (); tawg; rooj 0xFF5AA5: // Serial. println ("6"); xPos = 900; so; case 0xFF4AB5: //Serial.println("8 "); currentSpeed -= speedIncrement * 2; so; default: //Serial.println (" lwm lub pob "); so;} // Xaus qhov kawg} // Xaus translateIR

Kuv tau sim tsim cov cai kom feem ntau piav qhia tus kheej, tab sis muaj qee yam uas tsim nyog hais txog. Ib yam uas kuv tau sim suav nrog yog hauv kab hauv qab no:

int minYMoveUp = 520;

int minYMoveDown = 500;

Thaum qhov kev zov me nyuam tab tom khiav, cov tswv yim sib piv los ntawm joystick zoo li dhia ib puag ncig, feem ntau nyob ib puag ncig 507. Txhawm rau kho qhov no, cov tswv yim tsis hloov pauv tshwj tsis yog nws loj dua minYMoveUp, lossis me dua minYMoveDown.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, dhia, FALLING);

Tus txheej txheem attachInterrupt () tso cai rau peb cuam tshuam lub voj ib txwm nyob rau txhua lub sijhawm, yog li peb tuaj yeem siv cov lus nkag, zoo li lub pob nyem thaum lub khawm joystick tau nyem. Ntawm no, peb tau txuas qhov cuam tshuam hauv kab ua ntej nws, siv tus pinMode () txoj kev. Ib qho ntawv tseem ceeb ntawm no yog txhawm rau txhawm rau cuam tshuam ntawm Arduino Uno, koj yuav tsum siv tus pin 2 lossis 3. Lwm tus qauv siv tus pin cuam tshuam sib txawv, yog li koj yuav tsum txheeb xyuas tus lej twg koj tus qauv siv hauv Arduino lub vev xaib. Qhov ntsuas thib ob yog rau txoj kev hu rov qab, ntawm no hu ua ISR lossis "Interrupt Service Routine." Nws yuav tsum tsis txhob siv ib qho kev ntsuas lossis xa rov qab dab tsi.

Serial.print (…)

Nov yog kab uas yuav xa peb cov ntaub ntawv mus rau C# game. Ntawm no, peb xa X-axis nyeem ntawv, Y-axis nyeem ntawv, thiab hloov pauv nrawm rau qhov kev ua si. Cov kev nyeem no tuaj yeem nthuav dav kom suav nrog lwm cov tswv yim thiab kev nyeem kom ua rau qhov kev ua si zoo dua, tab sis ntawm no, peb tsuas yog siv ob peb leeg.

Yog tias koj npaj txhij los tshuaj xyuas koj cov cai, xa nws mus rau Arduino, thiab nias [Ua haujlwm] + [Ctrl] + [M] kom qhib lub ntsuas saib thiab saib yog tias koj tau txais ib qho tso tawm. Yog tias koj tau txais cov ntaub ntawv los ntawm Arduino, peb npaj txhij txav mus rau C# feem ntawm cov cai…

Kauj Ruam 3: Tsim C# Project

Txhawm rau tso tawm peb cov duab, kuv pib pib qhov haujlwm hauv Kev Ua Haujlwm, tab sis tom qab txiav txim siab nws yuav qeeb dhau los qhia tag nrho cov khoom peb xav tau los tso saib. Yog li, kuv tau xaiv los siv C#, uas tau dhau los ua kom du dua thiab ua tau zoo dua thaum tuav peb cov lus nkag.

Rau C# ib feem ntawm txoj haujlwm, nws yog qhov zoo tshaj rau rub tawm cov ntawv.zip thiab muab rho tawm rau nws tus kheej daim ntawv, tom qab ntawd hloov nws. Muaj ob daim nplaub tshev hauv cov ntawv zip. Txhawm rau qhib qhov haujlwm hauv Visual Studio, nkag mus rau RunnerGame_CSharp nplaub tshev hauv Windows Explorer. Ntawm no, ob npaug nias rau.sln (daws) cov ntawv, thiab VS yuav thauj qhov haujlwm.

Muaj ob peb chav kawm sib txawv uas kuv tsim rau qhov kev ua si. Kuv yuav tsis nkag mus rau txhua qhov ntsiab lus hais txog txhua chav kawm, tab sis kuv yuav muab cov ntsiab lus ntawm cov chav kawm tseem ceeb yog rau dab tsi.

Lub Box Class

Kuv tsim lub thawv chav kawm kom tso cai rau koj los tsim cov khoom sib dhos yooj yim uas tuaj yeem kos rau ntawm lub vijtsam hauv daim ntawv qhov rai. Lub tswv yim yog los tsim chav kawm uas tuaj yeem txuas ntxiv siv lwm chav kawm uas yuav xav kos qee yam ntawm cov duab. Lo lus "virtual" tau siv kom lwm chav kawm tuaj yeem hla lawv (siv lo lus "override"). Txoj kev ntawd, peb tuaj yeem tau txais tus cwj pwm zoo ib yam rau Player chav kawm thiab Platform chav kawm thaum peb xav tau, thiab tseem hloov kho cov khoom tab sis peb xav tau.

Tsis txhob txhawj ntau txog txhua yam khoom thiab kos npe. Kuv tau sau cov chav kawm no yog li kuv tuaj yeem txuas nws rau txhua qhov kev ua si lossis duab uas kuv xav ua yav tom ntej. Yog tias koj xav tau yooj yim kos lub duab plaub ntawm ya, koj tsis tas yuav sau tawm chav kawm zoo li no. C# cov ntaub ntawv muaj cov piv txwv zoo ntawm yuav ua li cas.

Txawm li cas los xij, Kuv yuav teeb tsa qee qhov kev xav ntawm kuv chav kawm "Box":

pej xeem virtual bool IsCollidedX (Box otherObject) {…}

Ntawm no peb tshawb xyuas kev sib tsoo nrog cov khoom hauv X-kev taw qhia, vim tias cov neeg siv tsuas yog xav tau los tshuaj xyuas kev sib tsoo hauv Y txoj kev (nce thiab nqis) yog tias nws tau kab nrog nws ntawm lub vijtsam.

pej xeem virtual bool IsCollidedY (Box otherObject) {…}

Thaum peb dhau lossis qis dua lwm qhov khoom ua si, peb tshawb xyuas Y kev sib tsoo.

pej xeem virtual bool IsCollided (Box otherObject) {…}

Qhov no suav nrog X thiab Y kev sib tsoo, rov qab seb puas muaj ib yam khoom sib tsoo nrog qhov no.

pej xeem virtual void OnPaint (Cov duab nraaj) {…}

Siv cov txheej txheem saum toj no, peb hla txhua yam khoom siv duab hauv thiab siv nws raws li qhov haujlwm tau ua. Peb tsim cov duab plaub uas tej zaum yuav tsum tau kos. Qhov no tuaj yeem siv rau ntau yam kev ua yeeb yaj kiab, txawm hais tias. Rau peb lub hom phiaj, duab plaub yuav ua tau zoo rau ob lub platform thiab cov neeg ua si.

Chav Kawm Tus Cwj Pwm

Lub Cim Cim tau nthuav tawm kuv chav kawm Box, yog li peb muaj qee yam physics tawm ntawm lub thawv. Kuv tsim "CheckForCollisions" txoj hauv kev txhawm rau txheeb xyuas txhua lub platform uas peb tau tsim kom muaj kev sib tsoo. Txoj kev "Dhia" teeb tsa tus neeg ua si qhov nrawm tshaj rau JumpSpeed qhov sib txawv, uas tom qab ntawd hloov kho tus qauv-los-thav duab hauv chav MainWindow.

Kev sib tsoo tau daws qhov txawv me ntsis ntawm no dua li hauv Chav Kawm Ntawv. Kuv txiav txim siab hauv qhov kev ua si no yog tias dhia dhau, peb tuaj yeem dhia hla lub platform, tab sis nws yuav ntes peb cov neeg ua si ntawm txoj kev nqes yog tias sib tsoo nrog nws.

Chav Kawm Platform

Hauv qhov kev ua si no, Kuv tsuas yog siv tus tsim ntawm chav kawm no uas siv X-kev sib koom ua tswv yim, suav tag nrho cov platform 'X qhov chaw nyob hauv chav kawm MainWindow. Txhua lub platform tau teeb tsa ntawm qhov tsis sib xws Y-koom ua ke los ntawm 1/2 lub vijtsam mus rau 3/4 ntawm lub vijtsam qhov siab. Qhov siab, dav, thiab xim kuj raug tsim tawm.

Chav Kawm MainWindow

Nov yog qhov uas peb tso tag nrho cov logic los siv thaum qhov kev ua si tau khiav. Ua ntej, hauv tus tsim, peb luam tawm txhua qhov ntawm COM cov chaw nres nkoj muaj rau txoj haujlwm.

foreach (hlua chaw nres nkoj hauv SerialPort. GetPortNames ())

Console. WriteLine ("YUAV TSUM PORTS:" + chaw nres nkoj);

Peb xaiv qhov twg peb yuav lees txais kev sib txuas lus, raws li qhov chaw nres nkoj twg koj Arduino twb tau siv lawm:

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

Ua tib zoo mloog cov lus txib: SerialPort. GetPortNames () [2]. [2] qhia tias qhov chaw nres nkoj twg siv. Piv txwv li, yog tias txoj haujlwm luam tawm "COM1, COM2, COM3", peb yuav tau mloog ntawm COM3 vim tias cov lej pib ntawm 0 hauv kab.

Tsis tas li hauv tus tsim, peb tsim txhua lub platform nrog ib nrab ib ntus sib nrug thiab tso rau hauv Y cov lus qhia ntawm lub vijtsam. Txhua lub platform tau ntxiv rau Cov Npe Cov Khoom, uas hauv C# tsuas yog siv tau yooj yim heev thiab muaj txiaj ntsig zoo ntawm kev tswj hwm cov qauv zoo li cov ntaub ntawv. Peb tom qab ntawd tsim Tus Neeg Ua Haujlwm, uas yog peb tus yam ntxwv yam ntxwv, teeb tus qhab nia rau 0 thiab teeb GameOver rau qhov tsis tseeb.

ntiag tug zoo li qub tsis muaj dab tsi DataReceived (tus xa khoom, SerialDataReceivedEventArgs e)

Nov yog txoj hauv kev uas hu ua thaum tau txais cov ntaub ntawv ntawm Serial chaw nres nkoj. Nov yog qhov uas peb siv txhua yam ntawm peb lub cev, txiav txim siab seb puas yuav tso saib game dua, txav lub platform, thiab lwm yam. Yog tias koj puas tau tsim game, feem ntau koj muaj qhov hu ua "game loop", uas yog hu ua txhua lub sijhawm rov ua dua tshiab Hauv qhov kev ua si no, DataReceived txoj hauv kev ua raws li kev ua si, tsuas yog siv lub cev raws li cov ntaub ntawv tau txais los ntawm tus tswj. Nws yuav tau ua haujlwm zoo dua los teeb tsa Timer hauv lub qhov rai tseem ceeb, thiab rov ua dua cov khoom raws li cov ntaub ntawv tau txais, tab sis vim qhov no yog qhov haujlwm Arduino, Kuv xav ua qhov kev ua si uas tau ua tiav raws cov ntaub ntawv los ntawm nws.

Hauv kev xaus, qhov teeb tsa no muab lub hauv paus zoo rau nthuav kev ua si mus rau qee yam siv tau. Txawm hais tias lub cev tsis zoo tag nrho, nws ua haujlwm tau zoo txaus rau peb lub hom phiaj, uas yog siv Arduino rau qee yam uas txhua tus nyiam: ua si game!

Pom zoo: