Satura rādītājs:

Arduino kontrolēta platformas spēle ar kursorsviru un IR uztvērēju: 3 soļi (ar attēliem)
Arduino kontrolēta platformas spēle ar kursorsviru un IR uztvērēju: 3 soļi (ar attēliem)

Video: Arduino kontrolēta platformas spēle ar kursorsviru un IR uztvērēju: 3 soļi (ar attēliem)

Video: Arduino kontrolēta platformas spēle ar kursorsviru un IR uztvērēju: 3 soļi (ar attēliem)
Video: Что Игроки Сделают С Флагом Украины | Роблокс тренд | Мира 2024, Jūlijs
Anonim
Arduino kontrolēta platformera spēle ar kursorsviru un IR uztvērēju
Arduino kontrolēta platformera spēle ar kursorsviru un IR uztvērēju

Šodien mēs izmantosim Arduino mikrokontrolleru, lai kontrolētu vienkāršu C#bāzes platformas spēli. Es izmantoju Arduino, lai ievadītu informāciju no kursorsviras moduļa un nosūtītu šo ievadi lietojumprogrammai C#, kas seriālā savienojumā klausās un atšifrē ievadi. Lai gan jums nav nepieciešama iepriekšēja pieredze videospēļu veidošanā, lai pabeigtu projektu, var paiet zināms laiks, lai absorbētu dažas lietas, kas notiek "spēļu ciklā", par kuru mēs vēlāk apspriedīsim.

Lai pabeigtu šo projektu, jums būs nepieciešams:

  • Visual Studio kopiena
  • Arduino Uno (vai līdzīgs)
  • Kursorsviras vadības modulis
  • Pacietību

Ja esat gatavs sākt, turpiniet!

1. darbība: pievienojiet kursorsviru un IR gaismas diodi

Pievienojiet kursorsviru un IR gaismas diodi
Pievienojiet kursorsviru un IR gaismas diodi
Pievienojiet kursorsviru un IR gaismas diodi
Pievienojiet kursorsviru un IR gaismas diodi

Šeit savienojums ir diezgan vienkāršs. Esmu iekļāvis diagrammas, kurās redzama tikai pieslēgta kursorsvira, kā arī mana izmantotā iestatīšana, kas ietver kursorsviru un infrasarkano gaismas diodi spēles vadīšanai ar tālvadības pulti, kas ir komplektā ar daudziem Arduino komplektiem. Tas nav obligāti, taču šķita forša ideja, lai varētu spēlēt bezvadu spēles.

Iestatījumā izmantotās tapas ir:

  • A0 (analogs) <- horizontāla vai X ass
  • A1 (analogs) <- vertikāla vai Y ass
  • 2. tapa <- kursorsviru slēdža ieeja
  • 2. tapa <- infrasarkanā LED ieeja
  • VCC <- 5V
  • Zeme
  • Zeme #2

2. darbība: izveidojiet jaunu skici

Izveidojiet jaunu skici
Izveidojiet jaunu skici

Mēs sāksim ar mūsu Arduino skices faila izveidi. Tas aptaujā kursorsviru izmaiņām un nosūta šīs izmaiņas programmai C# ik pēc dažām milisekundēm. Faktiskā videospēlē mēs pārbaudītu sērijas portu spēles cilpā, lai ievadītu, bet es sāku spēli kā eksperimentu, tāpēc kadru nomaiņas ātrums faktiski ir balstīts uz notikumu skaitu sērijas portā. Es faktiski biju sācis projektu Arduino māsas projektā Processing, bet izrādās, ka tas bija daudz, daudz lēnāk un nevarēju tikt galā ar ekrānā redzamo lodziņu skaitu.

Tātad, vispirms izveidojiet jaunu skici Arduino koda redaktora programmā. Es parādīšu savu kodu un pēc tam paskaidrošu, ko tas dara:

#ietver "IRremote.h"

// IR mainīgie int uztvērējs = 3; // IR uztvērēja signāla tapa IRrecv irrecv (uztvērējs); // izveidot instanci 'irrecv' decode_results rezultātiem; // izveidot instanci 'decode_results' // Kursorsvira/spēles mainīgie int xPos = 507; int yPos = 507; baits joyXPin = A0; baits joyYPin = A1; baitu prieksSlēdzis = 2; gaistošs baits clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int strāvas ātrums = 550; // Noklusējums = vidējais ātrums int speedIncrement = 25; // Daudzums, lai palielinātu/samazinātu ātrumu ar Y ievades neparakstītu garo strāvu = 0; // Tur pašreizējo laika zīmogu int wait = 40; // ms jāgaida starp ziņojumiem [Piezīme: zemāka gaidīšana = ātrāks kadru nomaiņas ātrums] nepastāvīga boola pogaNospiests = nepatiess; // Mērītājs, ja poga tiek nospiesta void setup () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, lēciens, FALLING); strāva = milis (); // Iestatīt pašreizējo laiku // Iestatīt infrasarkano uztvērēju: irrecv.enableIRIn (); // Sākt uztvērēju} // setup void loop () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // Rīkojieties ar kursorsviras X kustību neatkarīgi no laika: if (xMovement> minMoveHigh || xMovement current + wait) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // Ja tikai nedaudz pārvietotos…? currentSpeed //… vienkārši atgrieziet pašreizējo ātrumu: getSpeed (yPos); // Mainīt yPos tikai tad, ja kursorsviru ievērojami pārvietoja // int distance =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); strāva = milis (); }} // cilpa int getSpeed (int yPos) {// Negatīvās vērtības norāda, ka kursorsviru pārvieto uz augšu, ja (yPos 1023? 1023: currentSpeed + speedIncrement;} cits, ja (yPos> minMoveHigh) // Interpretēts "uz leju" {// Aizsargāt no iet zem 0 atgriezties strāva tālvadības pults, apstrādājiet pareizo atbildi void translateIR (decode_results results) // veic darbības, pamatojoties uz saņemto IR kodu {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; noklusējums: //Serial.println (" cita poga "); break;} // Beigu slēdzis} // END translateIR

Es mēģināju izveidot kodu, lai tas lielākoties būtu pašsaprotams, taču ir dažas lietas, kuras ir vērts pieminēt. Viena lieta, ko es mēģināju uzskaitīt, bija šādās rindās:

int minYMoveUp = 520;

int minYMoveDown = 500;

Kad programma darbojas, vadības sviras analogā ieeja mēdz lēkt apkārt, parasti paliekot ap 507. Lai to labotu, ievade nemainās, ja vien tā nav lielāka par minYMoveUp vai mazāka par minYMoveDown.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, lēciens, FALLING);

Metode attachInterrupt () ļauj mums jebkurā laikā pārtraukt parasto cilpu, lai mēs varētu ievadīt informāciju, piemēram, nospiežot pogu, kad tiek noklikšķināts uz kursorsviru pogas. Šeit mēs esam pievienojuši pārtraukumu rindā pirms tās, izmantojot metodi pinMode (). Svarīga piezīme šeit ir tāda, ka, lai Arduino Uno pievienotu pārtraukumu, jums jāizmanto 2. vai 3. tapa. Citos modeļos tiek izmantotas dažādas pārtraukšanas tapas, tāpēc jums, iespējams, būs jāpārbauda, kuras tapas jūsu modelis izmanto Arduino vietnē. Otrs parametrs ir paredzēts atzvanīšanas metodei, ko šeit sauc par ISR vai “Pārtraukt pakalpojumu kārtību”. Tam nevajadzētu ņemt nekādus parametrus un neko neatgriezt.

Sērijas nospiedums (…)

Šī ir līnija, kas nosūtīs mūsu datus uz C# spēli. Šeit mēs nosūtām spēlei X ass rādījumu, Y ass rādījumu un ātruma mainīgo. Šos rādījumus var paplašināt, iekļaujot citus ievadus un rādījumus, lai padarītu spēli interesantāku, taču šeit mēs izmantosim tikai pāris.

Ja esat gatavs pārbaudīt savu kodu, augšupielādējiet to Arduino un nospiediet [Shift] + [Ctrl] + [M], lai atvērtu seriālo monitoru un pārbaudītu, vai iegūstat izvadi. Ja jūs saņemat datus no Arduino, mēs esam gatavi pāriet uz koda C# daļu…

3. darbība: izveidojiet C# projektu

Lai parādītu mūsu grafiku, sākotnēji es sāku projektu apstrādē, bet vēlāk nolēmu, ka būs pārāk lēni parādīt visus parādāmos objektus. Tātad, es izvēlējos izmantot C#, kas izrādījās daudz vienmērīgāks un atsaucīgāks, apstrādājot mūsu ievadīto informāciju.

Projekta C# daļai vislabāk ir vienkārši lejupielādēt.zip failu un izvilkt to savā mapē, pēc tam modificēt. ZIP failā ir divas mapes. Lai atvērtu projektu programmā Visual Studio, programmā Windows Explorer ievadiet mapi RunnerGame_CSharp. Šeit veiciet dubultklikšķi uz faila.sln (risinājums), un VS ielādēs projektu.

Spēlei izveidoju dažas dažādas klases. Es neiedziļināšos visās detaļās par katru klasi, bet sniegšu pārskatu par to, kam paredzētas galvenās nodarbības.

Kastes klase

Es izveidoju lodziņu klasi, lai ļautu jums izveidot vienkāršus taisnstūra objektus, kurus ekrānā var uzzīmēt Windows formā. Ideja ir izveidot klasi, kuru var paplašināt, izmantojot citas klases, kuras varētu vēlēties uzzīmēt kāda veida grafiku. Atslēgvārds "virtuālais" tiek izmantots, lai citas klases varētu tos ignorēt (izmantojot atslēgvārdu "ignorēt"). Tādā veidā mēs varam iegūt tādu pašu uzvedību spēlētāju klasei un platformas klasei, kad mums tas ir nepieciešams, kā arī mainīt objektus, kā mums tas ir nepieciešams.

Neuztraucieties par visiem īpašumiem un zvaniet. Es uzrakstīju šo klasi, lai varētu to pagarināt jebkurai spēlei vai grafikas programmai, kuru es varētu vēlēties izveidot nākotnē. Ja jums ir nepieciešams vienkārši uzzīmēt taisnstūri, jums nav jāraksta liela klase. C# dokumentācijā ir labi piemēri, kā to izdarīt.

Tomēr es izklāstīšu dažas savas "Box" klases loģikas:

publisks virtuālais bool IsCollidedX (Box otherObject) {…}

Šeit mēs pārbaudām sadursmes ar objektiem X virzienā, jo spēlētājam ir jāpārbauda sadursmes tikai Y virzienā (uz augšu un uz leju), ja viņš ar to ir ierindots ekrānā.

publisks virtuālais bool IsCollidedY (Box otherObject) {…}

Kad esam pāri vai zem cita spēles objekta, mēs pārbaudām, vai nav Y sadursmju.

publisks virtuālais bool IsCollided (Box otherObject) {…}

Tas apvieno X un Y sadursmes, atgriežot, vai kāds objekts nav sadūries ar šo.

publisks virtuālais tukšums OnPaint (grafiskā grafika) {…}

Izmantojot iepriekš minēto metodi, mēs nododam jebkuru grafikas objektu un izmantojam to programmas darbības laikā. Mēs izveidojam visus taisnstūrus, kas varētu būt jāzīmē. Tomēr to var izmantot dažādām animācijām. Mūsu nolūkiem taisnstūri derēs gan platformām, gan atskaņotājam.

Rakstzīmju klase

Rakstzīmju klase paplašina manu Box klasi, tāpēc mums ir zināma fizika. Es izveidoju "CheckForCollisions" metodi, lai ātri pārbaudītu visas mūsu izveidotās platformas, vai nav sadursmes. Metode "Pārlēkt" nosaka spēlētāja augšupvērsto ātrumu uz mainīgo JumpSpeed, kas pēc tam MainWindow klasē tiek mainīts pa kadriem.

Sadursmes šeit tiek risinātas nedaudz savādāk nekā Box klasē. Šajā spēlē es nolēmu, ka, lecot uz augšu, mēs varam izlēkt caur platformu, bet tas sasniegs mūsu spēlētāju lejupceļā, ja ar to sadursies.

Platformas klase

Šajā spēlē es izmantoju tikai šīs klases konstruktoru, kas ievada X koordinātu, aprēķinot visas platformas X atrašanās vietas MainWindow klasē. Katra platforma ir iestatīta pēc nejaušas Y koordinātas no 1/2 ekrāna līdz 3/4 no ekrāna augstuma. Augstums, platums un krāsa tiek ģenerēti arī nejauši.

MainWindow klase

Šeit mēs ievietojam visu loģiku, kas jāizmanto spēles laikā. Pirmkārt, konstruktorā mēs izdrukājam visus programmai pieejamos COM portus.

foreach (virknes ports SerialPort. GetPortNames ())

Console. WriteLine ("PIEEJAMIE PORTI:" + ports);

Mēs izvēlamies, kurā no tiem pieņemsim sakarus, atkarībā no tā, kuru portu jūsu Arduino jau izmanto:

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

Pievērsiet uzmanību komandai: SerialPort. GetPortNames () [2]. [2] norāda, kuru seriālo portu izmantot. Piemēram, ja programma izdrukātu “COM1, COM2, COM3”, mēs klausītos COM3, jo numerācija sākas ar 0 masīvā.

Arī konstruktorā mēs izveidojam visas platformas ar daļēji nejaušu atstarpi un izvietojumu ekrānā Y virzienā. Visas platformas tiek pievienotas saraksta objektam, kas C# ir vienkārši ļoti lietotājam draudzīgs un efektīvs veids, kā pārvaldīt masīvam līdzīgu datu struktūru. Pēc tam mēs izveidojam atskaņotāju, kas ir mūsu raksturs, iestatām rezultātu uz 0 un iestatām GameOver uz nepatiesu.

privāts statisks spēkā neesošs DataReceived (objekta sūtītājs, SerialDataReceivedEventArgs e)

Šī ir metode, kas tiek izsaukta, kad dati tiek saņemti seriālajā portā. Šeit mēs pielietojam visu savu fiziku, izlemjam, vai parādīt spēli, pārvietot platformas utt. Ja esat kādreiz izveidojis spēli, jums parasti ir tā saucamā "spēles cilpa", kas tiek saukta katru reizi kadrā atsvaidzina. Šajā spēlē DataReceived metode darbojas kā spēles cilpa, manipulējot tikai ar fiziku, jo dati tiek saņemti no kontroliera. Iespējams, labāk būtu izdevies iestatīt taimeri galvenajā logā un atsvaidzināt objektus, pamatojoties uz saņemtajiem datiem, taču, tā kā šis ir Arduino projekts, es gribēju izveidot spēli, kas faktiski darbojās, pamatojoties uz datiem, kas no tā tika iegūti..

Visbeidzot, šī iestatīšana dod labu pamatu spēles paplašināšanai par kaut ko lietojamu. Lai gan fizika nav gluži perfekta, tā darbojas pietiekami labi mūsu mērķiem, proti, izmantot Arduino kaut kam, kas patīk visiem: spēļu spēlēšanai!

Ieteicams: