Агуулгын хүснэгт:

Joystick болон IR хүлээн авагчтай Arduino хяналттай платформ тоглоом: 3 алхам (зурагтай)
Joystick болон IR хүлээн авагчтай Arduino хяналттай платформ тоглоом: 3 алхам (зурагтай)

Видео: Joystick болон IR хүлээн авагчтай Arduino хяналттай платформ тоглоом: 3 алхам (зурагтай)

Видео: Joystick болон IR хүлээн авагчтай Arduino хяналттай платформ тоглоом: 3 алхам (зурагтай)
Видео: КАК НАСТРОИТЬ L4D2 2024, Долдугаар сарын
Anonim
Joystick болон IR хүлээн авагчтай Arduino удирдлагатай платформ тоглоом
Joystick болон IR хүлээн авагчтай Arduino удирдлагатай платформ тоглоом

Өнөөдөр бид Arduino микроконтроллер ашиглан C#дээр суурилсан энгийн платформ тоглоомыг удирдах болно. Би Arduino -ийг ашиглан джойстик модулаас оролт авч, оролтыг Цуваа холболтоор сонсож, тайлдаг C# програм руу илгээдэг. Төслийг дуусгахын тулд танд видео тоглоом бүтээх талаар урьд өмнө туршлага хэрэггүй байсан ч "тоглоомын хүрд" дээр болж буй зарим зүйлийг шингээхэд хэсэг хугацаа шаардагдаж магадгүй бөгөөд үүнийг бид дараа хэлэлцэх болно.

Энэ төслийг дуусгахын тулд танд дараахь зүйлс хэрэгтэй болно.

  • Visual Studio нийгэмлэг
  • Arduino Uno (эсвэл үүнтэй төстэй)
  • Жойстик хянагчийн модуль
  • Тэвчээр

Хэрэв та эхлэхэд бэлэн бол үргэлжлүүлээрэй!

Алхам 1: Joystick болон IR LED -ийг холбоно уу

Joystick болон IR LED -ийг холбоно уу
Joystick болон IR LED -ийг холбоно уу
Joystick болон IR LED -ийг холбоно уу
Joystick болон IR LED -ийг холбоно уу

Энд холболт хийх нь маш энгийн. Би зөвхөн джойстикийг холбосон диаграмм, мөн миний ашиглаж буй тохиргоог оруулсан бөгөөд үүнд джойстик, тоглоомыг алсын удирдлагатай удирдах хэт улаан туяаны LED, олон Arduino иж бүрдэл дагалддаг. Энэ нь сонголттой боловч утасгүй тоглоом тоглох боломжтой байх нь гайхалтай санаа мэт санагдсан.

Тохиргоонд ашигладаг тээглүүрүүд нь:

  • A0 (аналог) <- Хэвтээ эсвэл X тэнхлэг
  • A1 (аналог) <- Босоо эсвэл Y тэнхлэг
  • Pin 2 <- Joystick Switch оролт
  • Pin 2 <- Хэт улаан туяаны LED оролт
  • VCC <- 5V
  • Газар
  • Газар #2

Алхам 2: Шинэ ноорог үүсгэх

Шинэ ноорог үүсгэх
Шинэ ноорог үүсгэх

Бид Arduino -ийн ноорог файлыг үүсгэж эхэлнэ. Энэ нь өөрчлөлтийн joystick -ийг санал болгодог бөгөөд эдгээр өөрчлөлтүүдийг хэдэн миллисекунд тутамд C# програм руу илгээдэг. Бодит видео тоглоом дээр бид цуваа портыг тоглоомын давталтад оруулдаг эсэхийг шалгадаг байсан, гэхдээ би тоглоомыг туршилт болгон эхлүүлсэн тул фрэймийн хурд нь цуваа порт дээрх үйл явдлын тоон дээр үндэслэсэн болно. Би уг төслийг боловсруулж буй Arduino эгчийн төсөл дээр хэрэгжүүлж эхэлсэн боловч энэ нь хамаагүй удаан байсан бөгөөд дэлгэц дээрх хайрцгийн тоог зохицуулж чадаагүй юм.

Тиймээс эхлээд Arduino код засварлагч програм дээр шинэ ноорог үүсгээрэй. Би кодоо үзүүлээд дараа нь юу хийдгийг тайлбарлах болно.

#"IRremote.h" оруулах

// IR хувьсагчид int хүлээн авагч = 3; // IR хүлээн авагчийн дохионы зүү IRrecv irrecv (хүлээн авагч); // 'irrecv' decode_results үр дүнгийн жишээ үүсгэх; // 'decode_results' жишээ үүсгэх // Joystick/тоглоомын хувьсагчид int xPos = 507; int yPos = 507; байт joyXPin = A0; байт баяр баясгалан YPin = A1; byte joySwitch = 2; дэгдэмхий байт clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int currentSpeed = 550; // Анхдагч = дундаж хурд int speedIncrement = 25; // Y оролтоор хурдыг нэмэгдүүлэх/бууруулах хэмжээ гарын үсэг зураагүй урт гүйдэл = 0; // Одоогийн цагийн тэмдгийг агуулна int wait = 40; Мессеж хооронд хүлээх // ms [Тэмдэглэл: бага хүлээх = илүү хурдан фрэймлэх] тогтворгүй bool buttonPressed = false; // Хэрэв товчлуур дарагдсан бол хэмжих void setup () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, үсрэх, УНАХ); одоогийн = миллис (); // Одоогийн цагийг тохируулах // Хэт улаан туяаны хүлээн авагчийг тохируулах: irrecv.enableIRIn (); // Хүлээн авагчийг эхлүүлэх} // void loop тохируулах () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // Joystick X хөдөлгөөнийг цаг хугацаанаас үл хамааран зохицуулна уу: if (xMovement> minMoveHigh || xMovement current + wait) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // Хэрэв бага зэрэг хөдөлвөл…? currentSpeed // … зүгээр л одоогийн хурдыг буцаана: getSpeed (yPos); // Зөвхөн joystick мэдэгдэхүйц хөдөлсөн тохиолдолд yPos -ийг өөрчилнө үү // int distance =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); одоогийн = миллис (); }} // loop int getSpeed (int yPos) {// Сөрөг утгууд нь (yPos 1023? 1023: currentSpeed + speedIncrement;} if if (yPos> minMoveHigh) // "Доош" гэж орчуулагдсан бол Жойстик дээш хөдөлсөн болохыг харуулж байна {// Хамгаалах 0 -ээс доош буцах currentSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed void jump () {buttonPressed = true; // Заагч товчлуур дарагдсан байна.} // үсрэх // Товчлуур дээр дарахад алсын зайнаас, зохих хариултыг зохицуулна уу. завсарлага; тохиолдолд 0xFF10EF: //Serial.println("4 "); xPos = -900; завсарлага; тохиолдолд 0xFF38C7: //Serial.println("5"); үсрэх (); завсарлага; 0xFF5AA5 тохиолдол: // Цуваа. println ("6"); xPos = 900; break; case 0xFF4AB5: //Serial.println("8 "); currentSpeed -= speedIncrement * 2; break; default: //Serial.println (" other button "); завсарлага;} // Төгсгөл шилжүүлэгч} // Орчуулгыг дуусгахIR

Би кодыг ихэвчлэн өөрөө тайлбарлахаар бүтээхийг хичээсэн боловч энд дурдах нь зүйтэй юм. Миний тооцоолох гэж оролдсон нэг зүйл бол дараах мөрүүд байв.

int minYMoveUp = 520;

int minYMoveDown = 500;

Хөтөлбөрийг ажиллуулж байх үед джойстикээс авсан аналог оролт нь ихэвчлэн 507 орчим байдаг. Үүнийг засахын тулд minYMoveUp -ээс том, эсвэл minYMoveDown -аас бага бол оролт өөрчлөгдөхгүй.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, үсрэх, УНАХ);

AttachInterrupt () арга нь ердийн давталтыг хүссэн үедээ тасалдуулах боломжийг олгодог бөгөөд ингэснээр бид joystick товчлуурыг дарахад товчлуур дарах гэх мэт оролтыг авах боломжтой болно. Энд бид pinMode () аргыг ашиглан тасалдлыг өмнөх мөрөнд хавсаргав. Энд нэг чухал тэмдэглэл бол Arduino Uno дээр тасалдал хавсаргахын тулд та 2 эсвэл 3 -р зүүг ашиглах шаардлагатай болно. Бусад загварууд нь өөр өөр таслах зүү ашигладаг тул Arduino вэбсайт дээр таны загвар ямар зүү ашиглаж байгааг шалгах шаардлагатай болж магадгүй юм. Хоёрдахь параметр нь ISR эсвэл "Тасалдлын үйлчилгээний горим" гэж нэрлэгддэг дуудлага хийх аргад зориулагдсан болно. Энэ нь ямар ч параметр авах эсвэл буцааж өгөх ёсгүй.

Serial.print (…)

Энэ бол бидний өгөгдлийг C# тоглоом руу илгээх шугам юм. Энд бид X тэнхлэгийн уншилт, Y тэнхлэгийн уншилт, хурдны хувьсагчийг тоглоом руу илгээдэг. Тоглоомыг илүү сонирхолтой болгохын тулд эдгээр уншилтыг бусад оролт, уншилт болгон өргөжүүлж болох боловч энд бид зөвхөн хосыг ашиглах болно.

Хэрэв та кодоо туршихад бэлэн байгаа бол Arduino -д байршуулаад [Shift] + [Ctrl] + [M] дарж цуваа дэлгэцийг нээгээд ямар нэгэн гаралт авч байгаа эсэхийг шалгаарай. Хэрэв та Arduino -аас мэдээлэл хүлээн авч байгаа бол бид кодын C# хэсэг рүү шилжихэд бэлэн байна …

Алхам 3: C# төслийг үүсгэнэ үү

Бидний графикийг харуулахын тулд би эхлээд боловсруулалт хийх төслийг эхлүүлсэн боловч дараа нь бидэнд үзүүлэх шаардлагатай бүх объектуудыг харуулах нь хэтэрхий удаан байх болно гэж шийдсэн. Тиймээс би C#-г ашиглахаар шийдсэн бөгөөд энэ нь бидний оруулсан мэдээлэлтэй ажиллахад илүү гөлгөр, илүү хариу үйлдэл үзүүлэх чадвартай болсон.

Төслийн C# хэсгийн хувьд.zip файлыг татаж аваад өөрийн хавтсанд задалж, дараа нь өөрчлөх нь зүйтэй. Зип файлд хоёр хавтас байна. Төслийг Visual Studio дээр нээхийн тулд Windows Explorer дээр RunnerGame_CSharp фолдерыг оруулна уу. Энд.sln (шийдэл) файлыг давхар товшвол VS төслийг ачаална.

Тоглоомонд зориулж миний үүсгэсэн хэд хэдэн өөр ангиуд байдаг. Би анги тус бүрийн талаар дэлгэрэнгүй мэдээлэл өгөхгүй, гэхдээ үндсэн ангиуд юунд зориулагдсаныг тоймлон өгөх болно.

Хайрцагны анги

Би цонхны хэлбэрээр дэлгэцэн дээр зурж болох энгийн тэгш өнцөгт объектыг бий болгох боломжийг олгох үүднээс хайрцагны ангийг үүсгэсэн. Гол санаа нь зарим төрлийн график зурахыг хүсч буй бусад ангиудыг ашиглан өргөтгөх боломжтой анги бий болгох явдал юм. "Виртуал" түлхүүр үгийг бусад ангиуд дарж дарж болохын тулд ашигладаг ("override" түлхүүр үгийг ашиглан). Ингэснээр бид шаардлагатай үед Player анги болон Platform ангийн ижил зан төлөвийг олж авч, шаардлагатай объектуудыг өөрчлөх боломжтой болно.

Бүх үл хөдлөх хөрөнгийн талаар хэт их санаа зовох хэрэггүй, дуудлага хийх хэрэггүй. Би энэ ангийг ирээдүйд хийхийг хүсч буй тоглоом эсвэл график програмын хувьд өргөжүүлэхийн тулд бичсэн. Хэрэв та зүгээр л тэгш өнцөгт зурах хэрэгтэй бол ийм том анги бичих шаардлагагүй болно. C# баримт бичигт үүнийг хэрхэн хийх талаар сайн жишээ бий.

Гэсэн хэдий ч би "Хайрцаг" ангийнхаа логикийг тайлбарлах болно.

нийтийн виртуал boC IsCollidedX (Box otherObject) {…}

Энд бид X чиглэлд байгаа объектуудтай мөргөлдөж байгаа эсэхийг шалгадаг, учир нь тоглогч зөвхөн Y чиглэлд (дээш, доош) мөргөлдөх эсэхийг шалгах шаардлагатай бөгөөд хэрэв тэр дэлгэц дээр эгнээд байвал.

нийтийн виртуал boL IsCollidedY (Box otherObject) {…}

Тоглоомын өөр объектын доор эсвэл доор байх үед бид Y мөргөлдөөн байгаа эсэхийг шалгадаг.

нийтийн виртуал бол IsCollided (Box otherObject) {…}

Энэ нь X ба Y мөргөлдөөнийг нэгтгэж, ямар нэгэн объект мөргөлдсөн эсэхийг буцаана.

нийтийн виртуал хоосон OnPaint (График график) {…}

Дээрх аргыг ашиглан бид ямар ч график объектыг нэвтрүүлж, програм ажиллаж байх үед ашигладаг. Бид зурах шаардлагатай бүх тэгш өнцөгтүүдийг бий болгодог. Үүнийг янз бүрийн анимац хийхэд ашиглаж болно. Бидний зорилгын үүднээс тэгш өнцөгтүүд нь платформ болон тоглуулагчийн хувьд сайн байх болно.

Тэмдэгтийн анги

Character анги нь миний Box ангийг өргөжүүлдэг тул бидэнд тодорхой физик байдаг. Би мөргөлдөхийн тулд бүтээсэн бүх платформоо хурдан шалгахын тулд "CheckForCollisions" аргыг бүтээсэн. "Үсрэх" арга нь тоглогчийн дээшлэх хурдыг JumpSpeed хувьсагч болгон тохируулдаг бөгөөд дараа нь MainWindow ангилалд фреймээр өөрчлөгддөг.

Мөргөлдөөнийг энд Box ангийнхаас арай өөрөөр зохицуулдаг. Хэрэв би дээшээ үсрэх юм бол бид тавцангаар үсрэх боломжтой, гэхдээ мөргөлдөх юм бол буух замдаа манай тоглогчийг барих болно гэж би энэ тоглоомонд шийдсэн.

Платформын анги

Энэ тоглоомонд би зөвхөн X координатыг оролт болгон ашигладаг энэ ангийн бүтээгчийг ашигладаг бөгөөд MainWindow ангийн бүх платформуудын X байршлыг тооцдог. Платформ бүрийг дэлгэцийн 1/2-аас дэлгэцийн өндрийн 3/4 хүртэл санамсаргүй Y координатаар тохируулсан болно. Өндөр, өргөн, өнгийг мөн санамсаргүй байдлаар үүсгэдэг.

MainWindow анги

Энд бид тоглоом ажиллаж байх үед ашиглах логикийг бүгдийг нь тавьсан болно. Нэгдүгээрт, бүтээгч дээр бид програмд байгаа бүх COM портуудыг хэвлэдэг.

foreach (SerialPort. GetPortNames дэх мөрийн порт ())

Console. WriteLine ("БОЛОМЖТОЙ ПОРТ:" + порт);

Бид аль холболтыг хүлээн авахаа сонгох бөгөөд таны Arduino аль порт дээр аль хэдийн ашиглаж байна.

SerialPort = шинэ SerialPort (SerialPort. GetPortNames () [2], 9600, Parity. None, 8, StopBits. One);

Дараах тушаалд анхаарлаа хандуулаарай: SerialPort. GetPortNames () [2]. [2] нь ямар цуваа порт ашиглахыг илэрхийлнэ. Жишээлбэл, хэрэв програм "COM1, COM2, COM3" -ыг хэвлэсэн бол дугаарлалт нь массивт 0 -ээс эхэлдэг тул бид COM3 -ийг сонсох болно.

Мөн бүтээгч дээр бид бүх тавцанг хагас санамсаргүй байдлаар байрлуулж, дэлгэцэн дээр Y чиглэлд байрлуулна. Бүх платформууд нь List объектод нэмэгдсэн бөгөөд энэ нь C# дээр массивтай төстэй өгөгдлийн бүтцийг удирдах маш энгийн бөгөөд үр дүнтэй арга юм. Дараа нь бид Тоглогчийг бүтээдэг бөгөөд энэ нь бидний Character объект бөгөөд оноог 0 болгож GameOver -ийг худал гэж тохируулдаг.

хувийн статик хүчингүй DataReceived (объект илгээгч, SerialDataReceivedEventArgs e)

Энэ бол цуваа порт дээр мэдээлэл хүлээн авах үед дуудагдах арга юм. Энд бид бүх физикээ ашиглаж, тоглоомыг харуулах, платформыг зөөх гэх мэтийг шийднэ. Хэрэв та хэзээ нэгэн цагт тоглоом барьж байсан бол танд ерөнхийдөө "тоглоомын хүрд" гэж нэрлэгддэг зүйл байдаг. сэргээдэг. Энэ тоглоомонд DataReceived арга нь тоглоомын давталтын үүрэг гүйцэтгэдэг бөгөөд өгөгдлийг хянагчаас хүлээн авдаг тул зөвхөн физикийг удирддаг. Үндсэн цонхонд таймер тохируулж, хүлээн авсан өгөгдөл дээр үндэслэн обьектуудыг шинэчлэх нь илүү үр дүнтэй байсан байж магадгүй, гэхдээ энэ бол Arduino төсөл тул би үүнээс ирж буй өгөгдөл дээр үндэслэн ажилладаг тоглоом хийхийг хүсч байсан..

Дүгнэж хэлэхэд, энэхүү тохиргоо нь тоглоомыг ашиглах боломжтой зүйл болгон өргөжүүлэх сайн үндэс болно. Физик нь төгс төгөлдөр биш ч гэсэн энэ нь бидний зорилгод хангалттай нийцдэг бөгөөд энэ нь Arduino -ийг хүн бүрийн дуртай зүйлд ашиглах явдал юм: тоглоом тоглох!

Зөвлөмж болгож буй: