Мазмуну:

Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну: 3 кадам (сүрөттөр менен)
Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну: 3 кадам (сүрөттөр менен)

Video: Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну: 3 кадам (сүрөттөр менен)

Video: Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну: 3 кадам (сүрөттөр менен)
Video: Титаниктин сыры: кантип алар айсбергди байкабай калышты?! Эң деталдуу окуя! 2024, Июль
Anonim
Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну
Джойстик жана IR алуучу менен Arduino көзөмөлдөгөн платформа оюну

Бүгүн биз C#негизделген жөнөкөй платформер оюнун башкаруу үчүн Arduino микроконтроллерин колдонобуз. Мен Arduino'yу джойстик модулунан киргизүү үчүн колдонуп жатам жана ал кирүүнү Сериялык туташуу аркылуу угууну жана декоддоону C# тиркемесине жөнөтөм. Долбоорду аяктоо үчүн видео оюндарды курууда мурунку тажрыйбаңыздын кереги жок болсо да, "оюн циклинде" болуп жаткан нерселерди өздөштүрүү үчүн бир аз убакыт талап кылынышы мүмкүн, аны биз кийинчерээк талкуулайбыз.

Бул долбоорду аяктоо үчүн сизге керек болот:

  • Visual Studio Community
  • An Arduino Uno (же окшош)
  • Джойстик контроллери модулу
  • Сабыр

Эгерде сиз баштоого даяр болсоңуз, улантыңыз!

1 -кадам: Джойстикти жана IR LEDди туташтырыңыз

Джойстикти жана IR LEDди туташтырыңыз
Джойстикти жана IR LEDди туташтырыңыз
Джойстикти жана IR LEDди туташтырыңыз
Джойстикти жана IR LEDди туташтырыңыз

Бул жерде туташуу абдан жөнөкөй. Мен кошулган джойстикти көрсөткөн схемаларды, ошондой эле мен колдонгон орнотууну коштум, анын ичинде джойстик жана оюнду алыстан башкаруу пульту менен башкаруучу инфракызыл диод бар, ал көптөгөн Arduino комплекттери менен келет. Бул милдеттүү эмес, бирок зымсыз оюндарды ойноо эң сонун идея сыяктуу көрүндү.

Орнотууда колдонулган казыктар:

  • A0 (аналогдук) <- Горизонталдык же X огу
  • A1 (аналогдук) <- Тик же Y огу
  • Pin 2 <- Joystick Switch киргизүү
  • Pin 2 <- Infrared LED киргизүү
  • VCC <- 5V
  • Жер
  • Жер #2

2 -кадам: Жаңы эскиз түзүү

Жаңы эскиз түзүү
Жаңы эскиз түзүү

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

Ошентип, алгач Arduino код редакторунун программасында жаңы эскиз түзүңүз. Мен кодумду көрсөтөм, анан ал эмне кыларын түшүндүрөм:

#"IRremote.h" кошуу

// IR өзгөрмөлөрү int ресивер = 3; // IR кабыл алуучунун сигнал PIN IRrecv irrecv (алуучу); // "irrecv" decode_results натыйжаларынын мисалын түзүү; // 'decode_results' экземплярын түзүңүз // Joystick/game variables int xPos = 507; int yPos = 507; байт joyXPin = A0; байт joyYPin = A1; байт joySwitch = 2; туруксуз байт clickCounter = -1; int minMoveHigh = 530; int minMoveLow = 490; int currentSpeed = 550; // Демейки = орточо ылдамдык int speedIncrement = 25; // Y киргизүү менен ылдамдыкты жогорулатуу/азайтуу суммасы кол коюлбаган узак ток = 0; // Учурдагы убакыт белгисин кармайт int wait = 40; кабарлар ортосунда күтүү үчүн // мс [Эскертүү: төмөнкү күтүү = тез кадрлашуу] туруксуз bool buttonPressed = false; // Баскыч басылганда өлчөгүлө void setup () {Serial.begin (9600); pinMode (joySwitch, INPUT_PULLUP); attachInterrupt (0, секирүү, FALLING); учурдагы = миллис (); // Учурдагы убакытты коюу // Инфракызыл алуучуну орнотуу: 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); // Джойстик олуттуу жылганда гана yPosту алмаштырыңыз // int distance =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); учурдагы = миллис (); }} // loop int getSpeed (int yPos) {// Терс маанилер Джойстиктин жогорулаганын көрсөтөт, эгерде (yPos 1023? 1023: currentSpeed + speedIncrement;} else if (yPos> minMoveHigh) // Interpreted "Down" {// Protect from 0 кайтып барат currentSpeed - speedIncrement <0? 0: currentSpeed - speedIncrement;}} // getSpeed void jump () {buttonPressed = true; // Көрсөтүү баскычы басылды.} // секирүү // Кнопка басылганда алыскы, туура жоопту иштетүү void translateIR (decode_results results) // алынган IR кодунун негизинде иш -аракет кылат {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; default; //Serial.println (" башка баскыч "); break;} // End switch} // END translateIR

Мен кодду негизинен өзүн-өзү түшүндүрүү үчүн түзүүгө аракет кылдым, бирок айта кете турган бир нече нерселер бар. Мен эсепке алууга аракет кылган бир нерсе төмөнкү саптарда болгон:

int minYMoveUp = 520;

int minYMoveDown = 500;

Программа иштеп жатканда, джойстиктен аналогдук кирүү секирип кетет, адатта 507дин тегерегинде калат. Муну оңдоо үчүн, minYMoveUp'дон чоңураак же minYMoveDownдан кичирээк болбосо, өзгөртүү өзгөрбөйт.

pinMode (joySwitch, INPUT_PULLUP);

attachInterrupt (0, секирүү, FALLING);

AttachInterrupt () ыкмасы кадимки циклди каалаган убакта үзгүлтүккө учуратууга мүмкүндүк берет, ошондо биз джойстик баскычы басылганда баскычты басуу сыяктуу киргизүүнү кабыл алабыз. Бул жерде биз pinMode () ыкмасын колдонуу менен үзгүлтүктү анын алдындагы сапка тиркеп койдук. Бул жерде маанилүү эскертүү: Arduino Uno үзгүлтүгүн тиркөө үчүн, сиз 2 же 3 -пинди колдонушуңуз керек. Башка моделдер ар кандай үзгүлтүк төөнөгүчтөрдү колдонушат, андыктан Arduino веб -сайтында сиздин моделиңиз кайсы казыктарды колдоноорун текшеришиңиз керек болот. Экинчи параметр кайра чалуу ыкмасы үчүн, бул жерде ISR же "Үзгүлтүккө учуроо кызматы" деп аталат. Ал эч кандай параметрлерди албашы же эч нерсе кайтарбашы керек.

Serial.print (…)

Бул биздин маалыматтарды C# оюнуна жөнөтө турган линия. Бул жерде биз X огунун окуусун, Y огунун окуусун жана ылдамдыктын өзгөрмөсүн оюнга жөнөтөбүз. Бул окууларды оюнду кызыктуу кылуу үчүн башка киргизүүлөрдү жана окууларды камтыган кеңейтүүгө болот, бирок бул жерде биз бир жупту гана колдонобуз.

Эгерде сиз кодуңузду сынап көрүүгө даяр болсоңуз, аны Arduinoго жүктөп, [Shift] + [Ctrl] + [M] баскычтарын басып сериялык мониторду ачыңыз жана сизде кандайдыр бир жыйынтык барбы же жокпу билиш үчүн. Эгерде сиз Arduinoдан маалымат алып жатсаңыз, анда биз коддун C# бөлүгүнө өтүүгө даярбыз …

3 -кадам: C# долбоорун түзүү

Графикаларыбызды көрсөтүү үчүн мен алгач Процесс иштетүү долбоорун баштадым, бирок кийинчерээк биз көрсөтүшүбүз керек болгон бардык объекттерди көрсөтүү өтө жай болуп калат деп чечтим. Ошентип, мен C#колдонууну тандадым, ал биздин киргизүүлөрдү иштетүүдө кыйла жумшак жана жооптуу болуп чыкты.

Долбоордун C# бөлүгү үчүн.zip файлын жөн эле жүктөп алып, аны өз папкасына чыгарып, анан аны өзгөртүү эң жакшы. ZIP файлында эки папка бар. Долбоорду Visual Studioдо ачуу үчүн Windows Explorerдеги RunnerGame_CSharp папкасын киргизиңиз. Бул жерде.sln (чечим) файлын эки жолу чыкылдатыңыз жана VS долбоорду жүктөйт.

Мен оюн үчүн жараткан бир нече түрдүү класстар бар. Мен ар бир класс жөнүндө толук маалымат бербейм, бирок негизги класстар эмнеге арналганын карап көрөм.

Box Class

Мен терезе түрүндө экранда тартыла турган жөнөкөй тик бурчтуу объекттерди түзүүгө мүмкүндүк берүү үчүн куту классын түздүм. Идея кандайдыр бир графиканы тарткысы келген башка класстарды колдонуу менен кеңейтиле турган классты түзүү. "Виртуалдык" ачкыч сөзү башка класстар аларды жокко чыгарышы үчүн колдонулат ("жокко чыгаруу" ачкыч сөзүн колдонуу менен). Ошентип, биз керек болгон учурда Player классына жана Платформа классына бирдей мамиле кыла алабыз, ошондой эле керек болгон нерселерди өзгөртө алабыз.

Бардык мүлктөр жөнүндө көп тынчсызданбаңыз жана чалууларды жасаңыз. Мен бул классты келечекте жасай турган оюндарга же графикалык программаларга узартуу үчүн жаздым. Эгерде сизге учуп баратканда эле тик бурчтук тартуу керек болсо, анда мындай чоң классты жазуунун кажети жок. C# документтеринде муну кантип жасоонун жакшы мисалдары бар.

Бирок, мен "Куту" классынын логикасын айтып берейин:

коомдук виртуалдык BoC IsCollidedX (Box otherObject) {…}

Бул жерде биз X багытындагы объекттер менен кагылышууну текшеребиз, анткени оюнчу экранда аны менен тизилген болсо, Y багытында (өйдө жана ылдый) кагылышууларды текшериши керек.

коомдук виртуалдык BoC IsCollidedY (Box otherObject) {…}

Башка оюн объектисинин үстүндө же астында болгондо, биз Y кагылышууларын текшеребиз.

коомдук виртуалдык бол IsCollided (Box otherObject) {…}

Бул X жана Y кагылышууларын айкалыштырып, кандайдыр бир объекттин бул объект менен кагылышуусун кайтарат.

коомдук виртуалдык боштук OnPaint (Графикалык графика) {…}

Жогорудагы ыкманы колдонуу менен биз каалаган графикалык объектти өткөрүп, программа иштеп жаткан учурда колдонобуз. Биз тартылышы мүмкүн болгон бардык тик бурчтуктарды түзөбүз. Бул ар кандай анимациялар үчүн колдонулушу мүмкүн. Биздин максаттар үчүн, тик бурчтуктар платформалар үчүн да, оюнчу үчүн да жакшы болот.

Character Class

Character классы менин Box классымды кеңейтет, андыктан бизде белгилүү физика бар. Мен кагылышуу үчүн жараткан бардык платформаларды тез текшерүү үчүн "CheckForCollisions" ыкмасын түздүм. "Секирүү" ыкмасы оюнчунун жогору ылдамдыгын JumpSpeed өзгөрмөсүнө коет, ал MainWindow классында кадрдан-кадрга өзгөртүлөт.

Кагылышуулар бул жерде Box классына караганда бир аз башкача башкарылат. Бул оюнда мен жогору карай секире турган болсок, биз платформа аркылуу секире алабыз деп чечтим, бирок ал биздин оюнчу менен сүзүшүп баратканда түшүп кетет.

Платформа классы

Бул оюнда мен MainWindow классындагы платформалардын бардык X жерлерин эсептеп, X-координатын киргизүү катары кабыл алган бул класстын конструкторун колдоном. Ар бир платформа туш келди Y координатында экрандын 1/2 бөлүгүнөн экрандын бийиктигинин 3/4 бөлүгүнө чейин орнотулган. Бийиктиги, туурасы жана түсү да туш келди жаратылган.

MainWindow классы

Бул жерде оюн иштеп жатканда колдонула турган логиканын бардыгын койдук. Биринчиден, конструктордо биз программага жеткиликтүү болгон COM портторунун бардыгын басып чыгарабыз.

foreach (SerialPort. GetPortNamesтеги сап порту ())

Console. WriteLine ("AVAILABLE PORTS:" + port);

Биз кайсы бир байланышты кабыл алаарыбызды тандайбыз, сиздин портуңузга ылайык сиздин Arduino буга чейин колдонуп жатат:

SerialPort = жаңы SerialPort (SerialPort. GetPortNames () [2], 9600, Parity. None, 8, StopBits. One);

Буйрукка жакшылап көңүл буруңуз: SerialPort. GetPortNames () [2]. [2] кайсы сериялык портту колдонууну билдирет. Мисалы, эгер программа "COM1, COM2, COM3" басып чыгарса, анда биз COM3ту угуп турмакпыз, анткени номерлөө массивде 0дөн башталат.

Ошондой эле конструктордо биз экранда Y багытында жарым кокустук аралык жана жайгаштыруу менен бардык платформаларды түзөбүз. Бардык платформалар List объектине кошулат, ал C# тилинде массивге окшош маалымат структурасын башкаруунун эң ыңгайлуу жана эффективдүү жолу. Андан кийин биз Плейерди түзөбүз, ал биздин Character объектибиз болуп саналат, упай 0го коюлат жана GameOver туура эмес деп коюлат.

жеке статикалык боштук DataReceived (объект жөнөтүүчү, SerialDataReceivedEventArgs e)

Бул сериялык портко маалымат келгенде чакырылган ыкма. Бул жерде биз бардык физикабызды колдонобуз, оюнду көрсөтүүнү, платформаларды жылдырууну ж. сергитет. Бул оюнда DataReceived ыкмасы оюн циклинин милдетин аткарат, жөн гана контролерден алынган маалыматтар физиканы башкарат. Негизги терезеде Таймерди орнотуу жана алынган маалыматтарга негизделген объекттерди жаңыртуу жакшыраак иштеши мүмкүн, бирок бул Arduino долбоору болгондуктан, мен чындыгында андан келген маалыматтарга негизделген чуркаган оюн жасагым келди..

Жыйынтыктап айтканда, бул орнотуу оюнду пайдалуу нерсеге кеңейтүү үчүн жакшы негиз берет. Физика жеткилең эмес болсо да, биздин максаттар үчүн жетишерлик жакшы иштейт, бул Ардуинону баарына жаккан нерсеге колдонуу: оюндарды ойноо!

Сунушталууда: