Orodha ya maudhui:

Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR: Hatua 3 (na Picha)
Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR: Hatua 3 (na Picha)

Video: Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR: Hatua 3 (na Picha)

Video: Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR: Hatua 3 (na Picha)
Video: Leap Motion SDK 2024, Julai
Anonim
Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR
Mchezo wa Jukwaa la Kudhibiti Arduino na Joystick na Mpokeaji wa IR

Leo, tutatumia mdhibiti mdogo wa Arduino kudhibiti mchezo rahisi wa Jukwaa la C #. Ninatumia Arduino kuchukua pembejeo kutoka kwa moduli ya fimbo ya shangwe, na tuma pembejeo hiyo kwa programu ya C # ambayo inasikiliza na kumaliza pembejeo juu ya unganisho la Serial. Ingawa hauitaji uzoefu wowote uliopita katika kujenga michezo ya video ili kukamilisha mradi huo, inaweza kuhitaji muda kuchukua vitu kadhaa vinavyoendelea kwenye "kitanzi cha mchezo", ambacho tutazungumzia baadaye.

Ili kukamilisha mradi huu, utahitaji:

  • Jumuiya ya Studio ya Visual
  • Arduino Uno (au sawa)
  • Moduli ya mtawala wa shangwe
  • Uvumilivu

Ikiwa uko tayari kuanza, endelea!

Hatua ya 1: Hook Up Joystick na IR LED

Hook Up Joystick na IR LED
Hook Up Joystick na IR LED
Hook Up Joystick na IR LED
Hook Up Joystick na IR LED

Hapa, uhusiano ni rahisi sana. Nimejumuisha michoro inayoonyesha tu fimbo ya kufurahisha iliyounganishwa, pamoja na usanidi ninaotumia, ambao ni pamoja na shabaha ya furaha pamoja na taa ya infrared ya kudhibiti mchezo na rimoti, ambayo inakuja na vifaa vingi vya Arduino. Hii ni hiari, lakini ilionekana kama wazo nzuri kuweza kufanya michezo ya kubahatisha isiyo na waya.

Pini zinazotumiwa katika usanidi ni:

  • A0 (analog) <- Horizontal au X-axis
  • A1 (analog) <- Wima au Y-mhimili
  • Bandika 2 <- Ingiza pembejeo ya Joystick
  • Bandika 2 <- Uingizaji wa LED ya infrared
  • VCC <- 5V
  • Ardhi
  • Ardhi # 2

Hatua ya 2: Unda Mchoro Mpya

Unda Mchoro Mpya
Unda Mchoro Mpya

Tutaanza na kuunda faili yetu ya mchoro wa Arduino. Hii hupiga kura ya furaha kwa mabadiliko, na hutuma mabadiliko hayo kwa programu ya C # kila millisecond kadhaa. Katika mchezo halisi wa video, tungeangalia bandari ya serial kwenye kitanzi cha mchezo kwa pembejeo, lakini nilianza mchezo kama jaribio, kwa hivyo muafaka ni kweli kulingana na idadi ya hafla kwenye bandari ya serial. Kwa kweli nilikuwa nimeanza mradi katika mradi wa dada Arduino, Inasindika, lakini inageuka kuwa ilikuwa polepole sana, polepole na haikuweza kushughulikia idadi ya masanduku kwenye skrini.

Kwa hivyo, kwanza tengeneza Mchoro mpya katika mpango wa mhariri wa nambari ya Arduino. Nitaonyesha nambari yangu na kisha kuelezea inachofanya:

# pamoja na "IRremote.h"

// Vibadilishi vya int IR = 3; // Pini ya Ishara ya mpokeaji IR IRrecv irrecv (mpokeaji); // tengeneza mfano wa 'irrecv' decode_result results; // tengeneza mfano wa 'decode_results' // Joystick / vigeuzi vya mchezo int xPos = 507; int yPos = 507; furaha xPin = A0; furaha byteYPin = A1; furaha byteSwitch = 2; bonyeza teteCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; kasi ya sasa = 550; // Default = kasi ya wastani ya kasi ya kasiUzidishaji = 25; // Kiasi cha kuongeza / kupunguza kasi na pembejeo ya Y iliyosainiwa sasa ya muda mrefu = 0; // Anashikilia muhuri wa wakati wa sasa kusubiri = 40; // ms kusubiri kati ya ujumbe [Kumbuka: subiri chini = framerate haraka] kitufe cha bool teteBonyeza = uongo; // Pima ikiwa kitufe kinabonyeza usanidi batili () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); ambatisha kukatiza (0, kuruka, Kuanguka); sasa = millis (); // Weka wakati wa sasa // Weka mpokeaji wa infrared: irrecv.enableIRIn (); // Anzisha mpokeaji} // kuanzisha kitanzi batili () {int xMovement = analogRead (joyXPin); int yPos = AnalogSoma (furahaYPin); // Shikilia harakati ya Joystick X bila kujali majira: ikiwa (xMovement> minMoveHigh || xMovement ya sasa + subiri) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // Ikiwa tu imesogea kidogo…? SpeedSpeed //… rudisha tu kasi ya sasa: getSpeed (yPos); // Badilisha tu yPos ikiwa fimbo ya kufurahisha imehamia sana // int umbali =; Serial.print ((Kamba) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); sasa = millis (); }} // // loop int getSpeed (int yPos) {// Thamani hasi zinaonyesha Joystick imehamia juu ikiwa (yPos 1023? 1023: currentSpeed + speedIncrement;} vingine ikiwa (yPos> minMoveHigh) // Imefasiriwa "Chini" {// Kinga kutoka kwenda chini ya 0 kurudi kasiSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed void jump () {buttonPressed = true; // Onyesha kitufe kilibonyewa.} // ruka // Wakati kitufe kinabanwa kwenye kijijini, shughulikia jibu sahihi batili translateIR (decode_results results) // inachukua hatua kulingana na nambari ya IR iliyopokelewa {switch (results.value) {kesi 0xFF18E7: //Serial.println("2 "); kesi; 0xFF10EF: //Serial.println("4"); xPos = -900; println ("6"); xPos = 900; kuvunja; kesi 0xFF4AB5: //Serial.println ("8"); kuvunja;} // Kitufe cha kumalizia} // Tafsiri ya END

Nilijaribu kuunda nambari kuwa inayoelezea zaidi, lakini kuna mambo machache yanayofaa kutajwa. Jambo moja nililojaribu kuhesabu ni katika mistari ifuatayo:

int minYMoveUp = 520;

int minYMoveDown = 500;

Wakati programu inaendelea, pembejeo ya analojia kutoka kwa kiboreshaji cha furaha huelekea kuruka karibu, kawaida hukaa karibu 507. Ili kusahihisha hili, pembejeo haibadiliki isipokuwa ni kubwa kuliko minYMoveUp, au ndogo kuliko minYMoveDown.

pinMode (joySwitch, INPUT_PULLUP);

ambatisha kukatiza (0, kuruka, Kuanguka);

Njia ya kiambatishoInterrupt () inatuwezesha kukatisha kitanzi cha kawaida wakati wowote, ili tuweze kuchukua pembejeo, kama kitufe cha kubonyeza kitufe cha kitufe kinapobofya. Hapa, tumeambatanisha usumbufu kwenye mstari mbele yake, kwa kutumia njia ya pinMode (). Ujumbe muhimu hapa ni kwamba kushikamana na usumbufu kwenye Arduino Uno, lazima utumie pini 2 au 3. Aina zingine hutumia pini tofauti za kukatiza, kwa hivyo italazimika kuangalia ni pini zipi ambazo mtindo wako unatumia kwenye wavuti ya Arduino. Kigezo cha pili ni kwa njia ya kupiga tena simu, hapa inaitwa ISR au "Kukatiza Utaratibu wa Huduma." Haipaswi kuchukua vigezo vyovyote au kurudisha chochote.

Rekodi ya serial (…)

Huu ndio laini ambayo itatuma data zetu kwenye mchezo wa C #. Hapa, tunatuma usomaji wa mhimili wa X, usomaji wa mhimili wa Y, na ubadilishaji wa kasi kwa mchezo. Usomaji huu unaweza kupanuliwa kujumuisha pembejeo zingine na usomaji ili kufanya mchezo uwe wa kupendeza zaidi, lakini hapa, tutatumia michache tu.

Ikiwa uko tayari kujaribu msimbo wako, pakia kwenye Arduino, na ubonyeze [Shift] + [Ctrl] + [M] kufungua mfuatiliaji wa serial na uone ikiwa unapata pato lolote. Ikiwa unapokea data kutoka kwa Arduino, tuko tayari kuhamia kwenye sehemu ya C # ya nambari…

Hatua ya 3: Unda Mradi wa C #

Kuonyesha picha zetu, mwanzoni nilianzisha mradi katika Usindikaji, lakini baadaye niliamua itakuwa polepole sana kuonyesha vitu vyote tunavyohitaji kuonyesha. Kwa hivyo, nilichagua kutumia C #, ambayo ilionekana kuwa laini na msikivu zaidi wakati wa kushughulikia maoni yetu.

Kwa sehemu ya C # ya mradi, ni bora kupakua faili ya.zip na kuitoa kwenye folda yake mwenyewe, kisha urekebishe. Kuna folda mbili kwenye faili ya zip. Ili kufungua mradi katika Studio ya Visual, ingiza folda ya RunnerGame_CSharp katika Windows Explorer. Hapa, bonyeza mara mbili faili ya.sln (suluhisho), na VS itapakia mradi.

Kuna madarasa kadhaa tofauti ambayo nimeunda kwa mchezo. Sitaenda kwa maelezo yote juu ya kila darasa, lakini nitatoa muhtasari wa darasa kuu ni nini.

Darasa la Sanduku

Niliunda darasa la sanduku kukuwezesha kuunda vitu rahisi vya mstatili ambavyo vinaweza kuchorwa kwenye skrini katika fomu ya windows. Wazo ni kuunda darasa ambalo linaweza kupanuliwa kwa kutumia madarasa mengine ambayo yanaweza kutaka kuchora aina fulani ya picha. Neno la msingi la "virtual" hutumiwa ili madarasa mengine yaweze kuwabadilisha (kwa kutumia neno kuu la "override"). Kwa njia hiyo, tunaweza kupata tabia sawa kwa darasa la Mchezaji na darasa la Jukwaa wakati tunahitaji, na pia kurekebisha vitu hata hivyo tunahitaji.

Usijali sana juu ya mali zote na piga simu. Niliandika darasa hili ili niweze kuipanua kwa mchezo wowote au programu ya picha ambayo ningependa kuifanya baadaye. Ikiwa unahitaji kuchora tu mstatili juu ya nzi, sio lazima uandike darasa kubwa kama hii. Nyaraka za C # zina mifano mzuri ya jinsi ya kufanya hivyo.

Walakini, nitaweka baadhi ya mantiki ya darasa langu la "Box":

umma bool IsCollidedX (Box otherObject) {…}

Hapa tunaangalia migongano na vitu kwenye mwelekeo wa X, kwa sababu mchezaji anahitaji tu kuangalia migongano katika mwelekeo wa Y (juu na chini) ikiwa amejipanga nayo kwenye skrini.

umma bool IsCollidedY (Box otherObject) {…}

Tunapokuwa juu au chini ya kitu kingine cha mchezo, tunaangalia migongano ya Y.

umma bool IsCollided (Box otherObject) {…}

Hii inachanganya migongano ya X na Y, ikirudisha ikiwa kitu chochote kimegongana na hiki.

hadharani batili OnPaint (Picha za picha) {…}

Kutumia njia iliyo hapo juu, tunapitisha kitu chochote cha picha na kuitumia wakati programu inaendelea. Tunaunda mstatili wowote ambao unaweza kuhitaji kuchorwa. Hii inaweza kutumika kwa michoro anuwai, ingawa. Kwa madhumuni yetu, mstatili utafanya vizuri kwa majukwaa na kichezaji.

Tabia ya Tabia

Darasa la Tabia linaongeza darasa langu la Sanduku, kwa hivyo tuna fizikia fulani nje ya sanduku. Niliunda njia ya "CheckForCollisions" ili kuangalia haraka majukwaa yote ambayo tumeunda kwa mgongano. Njia ya "Rukia" inaweka kasi ya mchezaji kwenda juu kwa anuwai ya JumpSpeed, ambayo hubadilishwa sura-na-fremu katika darasa la MainWindow.

Migongano hushughulikiwa tofauti hapa kuliko katika darasa la Sanduku. Niliamua katika mchezo huu kwamba ikiwa tunaruka juu, tunaweza kuruka kupitia jukwaa, lakini itamnasa mchezaji wetu njiani ikiwa atagongana nayo.

Darasa la Jukwaa

Katika mchezo huu, ninatumia tu mjenzi wa darasa hili ambalo linachukua kuratibu X kama pembejeo, kuhesabu maeneo yote ya majukwaa ya X katika darasa la MainWindow. Kila jukwaa limewekwa kwa kuratibu Y bila mpangilio kutoka 1/2 skrini hadi 3/4 ya urefu wa skrini. Urefu, upana, na rangi pia hutengenezwa kwa nasibu.

Darasa la MainWindow

Hapa ndipo tunaweka mantiki yote ya kutumika wakati mchezo unaendelea. Kwanza, katika mjenzi, tunachapisha bandari zote za COM zinazopatikana kwa programu hiyo.

foreach (bandari ya kamba katika SerialPort. GetPortNames ())

Console. WriteLine ("BURE ZINAPATIKANA:" + bandari);

Tunachagua ni ipi tutakubali mawasiliano, kulingana na bandari yako Arduino tayari inatumia:

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

Zingatia sana amri: SerialPort. GetPortNames () [2]. [2] inaashiria ni bandari gani ya serial ya kutumia. Kwa mfano, ikiwa mpango unachapishwa "COM1, COM2, COM3", tungesikiliza COM3 kwa sababu nambari huanza saa 0 katika safu.

Pia katika mjenzi, tunaunda majukwaa yote na nafasi ya nusu-nasibu na uwekaji kwenye mwelekeo wa Y kwenye skrini. Majukwaa yote yanaongezwa kwenye kitu cha Orodha, ambacho katika C # ni njia rahisi sana ya kutumia na inayofaa ya kudhibiti muundo wa data kama safu. Kisha tunaunda Mchezaji, ambayo ni kitu chetu cha Tabia, weka alama hadi 0 na weka GameOver kuwa uwongo.

data tupu ya kibinafsi iliyopatikana (mtumaji wa kitu, SerialDataReceivedEventArgs e)

Hii ndiyo njia inayoitwa wakati data inapokelewa kwenye bandari ya Serial. Hapa ndipo tunapotumia fizikia yetu yote, kuamua ikiwa kuonyesha mchezo tena, kusogeza majukwaa, nk. Ikiwa umewahi kujenga mchezo, kwa ujumla una kile kinachoitwa "kitanzi cha mchezo", ambacho huitwa kila wakati fremu inaburudisha. Katika mchezo huu, njia ya Kupokea Data hufanya kama kitanzi cha mchezo, ikitumia fizikia tu kama data inapokelewa kutoka kwa mtawala. Inawezekana ilifanya kazi vizuri kusanidi Timer kwenye dirisha kuu, na uburudishe vitu kulingana na data iliyopokelewa, lakini kwa kuwa huu ni mradi wa Arduino, nilitaka kutengeneza mchezo ambao kwa kweli uliendesha kulingana na data inayoingia kutoka.

Kwa kumalizia, usanidi huu unatoa msingi mzuri wa kupanua mchezo kuwa kitu kinachoweza kutumika. Ingawa fizikia sio kamili kabisa, inafanya kazi vizuri kwa madhumuni yetu, ambayo ni kutumia Arduino kwa kitu ambacho kila mtu anapenda: kucheza michezo!

Ilipendekeza: