ዝርዝር ሁኔታ:

አርዱዲኖ-ቁጥጥር የሚደረግበት የመሣሪያ ስርዓት ጨዋታ ከጆይስቲክ እና አይአር ተቀባይ ጋር 3 ደረጃዎች (ከስዕሎች ጋር)
አርዱዲኖ-ቁጥጥር የሚደረግበት የመሣሪያ ስርዓት ጨዋታ ከጆይስቲክ እና አይአር ተቀባይ ጋር 3 ደረጃዎች (ከስዕሎች ጋር)
Anonim
አርዱዲኖ-ቁጥጥር የሚደረግበት የመሣሪያ ስርዓት ጨዋታ ከጆይስቲክ እና ከ IR ተቀባይ ጋር
አርዱዲኖ-ቁጥጥር የሚደረግበት የመሣሪያ ስርዓት ጨዋታ ከጆይስቲክ እና ከ IR ተቀባይ ጋር

ዛሬ እኛ ቀለል ያለ የ C#ላይ የተመሠረተ የመሣሪያ ስርዓት ጨዋታን ለመቆጣጠር የአርዱዲኖ ማይክሮ መቆጣጠሪያን እንጠቀማለን። እኔ ከጆይስቲክ ሞዱል ግብዓት ለመውሰድ አርዱዲኖን እየተጠቀምኩ ነው ፣ እና ያንን ግቤት በተከታታይ ግንኙነት ላይ ግቤትን ወደሚያዳምጥ እና ወደሚጽፍ ወደ C# መተግበሪያ እልካለሁ። ምንም እንኳን ፕሮጄክቱን ለማጠናቀቅ የቪዲዮ ጨዋታዎችን በመገንባት ውስጥ ምንም ቀዳሚ ተሞክሮ ባይኖርዎትም ፣ በኋላ ላይ የምንወያይበትን “የጨዋታ ዙር” ውስጥ ያሉትን አንዳንድ ነገሮች ለመቅሰም የተወሰነ ጊዜ ሊፈልግ ይችላል።

ይህንን ፕሮጀክት ለማጠናቀቅ የሚከተሉትን ያስፈልግዎታል

  • የእይታ ስቱዲዮ ማህበረሰብ
  • አርዱዲኖ ኡኖ (ወይም ተመሳሳይ)
  • ጆይስቲክ መቆጣጠሪያ ሞዱል
  • ትዕግስት

ለመጀመር ዝግጁ ከሆኑ ይቀጥሉ!

ደረጃ 1 - ጆይስቲክ እና አይአር ኤል ን ያገናኙ

ጆይስቲክ እና አይአር ኤል ን መንጠቆ
ጆይስቲክ እና አይአር ኤል ን መንጠቆ
ጆይስቲክ እና አይአር ኤል ን መንጠቆ
ጆይስቲክ እና አይአር ኤል ን መንጠቆ

እዚህ ፣ መንጠቆው በጣም ቀላል ነው። ከብዙ አርዱዲኖ ኪትዎች ጋር የሚመጣውን ጨዋታ በርቀት መቆጣጠሪያ ለመቆጣጠር ጆይስቲክን እና ኢንፍራሬድ LED ን ያካተተ ጆይስቲክን ብቻ ፣ እንዲሁም እኔ የምጠቀምበትን ቅንብር የሚያሳዩ ስዕሎችን አካትቻለሁ። ይህ አማራጭ ነው ፣ ግን ሽቦ አልባ ጨዋታዎችን መሥራት መቻል ጥሩ ሀሳብ ይመስላል።

በማዋቀሩ ውስጥ ጥቅም ላይ የዋሉት ፒኖች -

  • A0 (አናሎግ) <- አግድም ወይም ኤክስ-ዘንግ
  • A1 (አናሎግ) <- አቀባዊ ወይም Y- ዘንግ
  • ፒን 2 <- ጆይስቲክ ቀይር ግብዓት
  • ፒን 2 <- የኢንፍራሬድ LED ግቤት
  • ቪሲሲ <- 5V
  • መሬት
  • መሬት ቁጥር 2

ደረጃ 2 አዲስ ንድፍ ይፍጠሩ

አዲስ ንድፍ ይፍጠሩ
አዲስ ንድፍ ይፍጠሩ

የእኛን የአርዱዲኖ ረቂቅ ፋይል በመፍጠር እንጀምራለን። ይህ ለለውጦች ጆይስቲክን ይመርጣል ፣ እና እነዚያን ለውጦች በየሲሊሰከንዶች ወደ C# ፕሮግራም ይልካል። በእውነተኛ የቪዲዮ ጨዋታ ውስጥ ፣ የግብዓት ጨዋታ ዙር ውስጥ ተከታታይ ወደቡን እንፈትሻለን ፣ ግን ጨዋታውን እንደ ሙከራ ጀመርኩ ፣ ስለዚህ ክፈፉ በእውነቱ በተከታታይ ወደብ ላይ ባሉት ክስተቶች ብዛት ላይ የተመሠረተ ነው። በእውነቱ ፕሮጄክቱን በአርዱዲኖ እህት ፕሮጄክት ውስጥ ጀምሬ ነበር ፣ ግን እሱ በጣም ፣ በጣም ቀርፋፋ እና በማያ ገጹ ላይ ያሉትን ሳጥኖች ብዛት ማስተናገድ አልቻለም።

ስለዚህ ፣ በመጀመሪያ በአርዱዲኖ ኮድ አርታኢ ፕሮግራም ውስጥ አዲስ ንድፍ ይፍጠሩ። እኔ ኮዴን አሳይሻለሁ እና ከዚያ ምን እንደሚሰራ አብራራለሁ-

#"IRremote.h" ን ያካትቱ

// የ IR ተለዋጮች int ተቀባይ = 3; // የ IR ተቀባዩ የምልክት ፒን IRrecv irrecv (ተቀባይ); // የ ‹irrecv› decode_results ውጤቶችን ምሳሌ ይፍጠሩ ፤ // የ ‹decode_results› ምሳሌን ይፍጠሩ // ጆይስቲክ/የጨዋታ ተለዋዋጮች int xPos = 507; int yPos = 507; ባይት joyXPin = A0; ባይት ደስታYPin = A1; ባይት joySwitch = 2; ተለዋዋጭ ባይት ጠቅታ ኮተር = -1; int minMoveHigh = 530; int minMoveLow = 490; int currentSpeed = 550; // ነባሪ = አማካይ የፍጥነት ፍጥነት ፍጥነት Increment = 25; // በ Y ግቤት ያልተፈረመ ረዥም የአሁኑን ፍጥነት = ለመጨመር ፍጥነት/መጠን። // የአሁኑን የጊዜ ማህተም int ይጠብቃል = 40; በመልእክቶች መካከል ለመጠባበቅ // ms // አዝራሩ ከተጫነ ባዶነት ማዋቀር () {Serial.begin (9600); pinMode (joySwitch ፣ INPUT_PULLUP); አባሪ መቋረጥ (0 ፣ ዝለል ፣ መውደቅ); የአሁኑ = ሚሊስ (); // የአሁኑን ጊዜ ያዋቅሩ // የኢንፍራሬድ መቀበያ ያዘጋጁ: irrecv.enableIRIn (); // ተቀባዩን ያስጀምሩ} // ማዋቀር ባዶነት loop () {int xMovement = analogRead (joyXPin); int yPos = analogRead (joyYPin); // የጊዜ ገደብ ምንም ይሁን ምን የጆይስቲክ ኤክስ እንቅስቃሴን ይያዙ - (xMovement> minMoveHigh || xMovement current + wait) {currentSpeed = yPos> minMoveLow && yPos <minMoveHigh // ትንሽ ቢንቀሳቀስ…? currentSpeed //… አሁን ያለውን ፍጥነት ይመልሱ: getSpeed (yPos); // ጆይስቲክ በከፍተኛ ሁኔታ ከተንቀሳቀሰ yPos ን ብቻ ይለውጡ // int ርቀት =; Serial.print ((String) xPos + "," + (String) yPos + ',' + (String) currentSpeed + '\ n'); የአሁኑ = ሚሊስ (); }} // loop int getSpeed (int yPos) {// አሉታዊ እሴቶች ጆይስቲክ ወደ ላይ ከፍ ካለ (yPos 1023? ከ 0 በታች መመለስ የአሁኑን ፍጥነት - የፍጥነት መጨመር / 0? የርቀት መቆጣጠሪያ ፣ ተገቢውን ምላሽ ባዶ ትርጉምን ያስተናግዱ IR (የዴኮድ_ ውጤት ውጤቶች) // በ IR ኮድ መሠረት እርምጃ ይወስዳል {መቀየሪያ (results.value) {case 0xFF18E7: //Serial.println("2 "); currentSpeed += speedIncrement * 2; ማቋረጥ ፤ መያዣ 0xFF10EF: //Serial.println("4 ") ፤ xPos = -900 ፤ ዕረፍት ፤ ጉዳይ 0xFF38C7: //Serial.println ("5") ፤ መዝለል () ፤ ዕረፍት ፤ ጉዳይ 0xFF5AA5: // ተከታታይ። println ("6"); xPos = 900; እረፍት; መያዣ 0xFF4AB5: //Serial.println("8 "); currentSpeed -= speedIncrement * 2; እረፍት; ነባሪ: //Serial.println (" ሌላ አዝራር "); እረፍት ፤} // ማብሪያ ማብቂያ} // መጨረሻ ተርጓሚ

እኔ በአብዛኛው ራስን ገላጭ ለመሆን ኮዱን ለመፍጠር ሞከርኩ ፣ ግን መጥቀስ የሚገባቸው ጥቂት ነገሮች አሉ። ለማስላት የሞከርኩት አንድ ነገር በሚከተሉት መስመሮች ውስጥ ነበር።

int minYMoveUp = 520;

int minYMoveDown = 500;

ፕሮግራሙ በሚሠራበት ጊዜ ፣ ከጆይስቲክ የመጣው የአናሎግ ግብዓት ዘልሎ የመግባት አዝማሚያ አለው ፣ ብዙውን ጊዜ ወደ 507 አካባቢ ይቆያል። ይህንን ለማስተካከል ፣ ግቡ ከ minYMoveUp ወይም ከ minYMoveDown ያነሰ ካልሆነ በስተቀር አይቀየርም።

pinMode (joySwitch ፣ INPUT_PULLUP);

አባሪ መቋረጥ (0 ፣ መዝለል ፣ መውደቅ);

እንደ ጆይስቲክ ቁልፍ ሲጫን እንደ አዝራር ተጭኖ ግብዓት መውሰድ እንድንችል የአባሪ ኢንተርፕራይዝ () ዘዴ በማንኛውም ጊዜ መደበኛውን ዑደት ለማቋረጥ ያስችለናል። እዚህ ፣ የ pinMode () ዘዴን በመጠቀም ፣ በፊቱ ያለውን ማቋረጫ አያይዘነዋል። እዚህ አንድ አስፈላጊ ማስታወሻ በአርዱዲኖ ኡኖ ላይ ማቋረጫ ለማያያዝ ፒን 2 ወይም 3. ሌሎች ሞዴሎችን የተለያዩ የማቋረጫ ፒኖችን መጠቀም አለብዎት ፣ ስለሆነም ሞዴልዎ በአርዲኖ ድርጣቢያ ላይ የትኛውን ፒን እንደሚጠቀም ማረጋገጥ ሊኖርብዎት ይችላል። ሁለተኛው ግቤት ለመልሶ ማግኛ ዘዴ ነው ፣ እዚህ ISR ወይም “Interrupt Service Routine” ተብሎ ይጠራል። ማንኛውንም መለኪያዎች መውሰድ ወይም ማንኛውንም ነገር መመለስ የለበትም።

Serial.print (…)

ይህ የእኛን ውሂብ ወደ ሲ# ጨዋታ የሚልክ መስመር ነው። እዚህ ፣ የኤክስ-ዘንግ ንባብ ፣ የ Y- ዘንግ ንባብ እና የፍጥነት ተለዋዋጭ ወደ ጨዋታው እንልካለን። ጨዋታው የበለጠ አስደሳች እንዲሆን ሌሎች ግብዓቶችን እና ንባቦችን ለማካተት እነዚህ ንባቦች ሊሰፉ ይችላሉ ፣ ግን እዚህ እኛ ጥንድ ብቻ እንጠቀማለን።

ኮድዎን ለመሞከር ዝግጁ ከሆኑ ወደ አርዱዲኖ ይስቀሉት እና ተከታታይ መቆጣጠሪያውን ለመክፈት እና ማንኛውንም ውጤት እያገኙ እንደሆነ ለማየት [Shift] + [Ctrl] + [M] ን ይጫኑ። ከ Arduino መረጃ እየቀበሉ ከሆነ ፣ ወደ ኮዱ C# ክፍል ለመሄድ ዝግጁ ነን…

ደረጃ 3 የ C# ፕሮጀክት ይፍጠሩ

የእኛን ግራፊክስ ለማሳየት በመጀመሪያ እኔ በማቀነባበር ላይ ፕሮጀክት ጀመርኩ ፣ በኋላ ግን እኛ ማሳየት ያለብንን ነገሮች ሁሉ ለማሳየት በጣም ቀርፋፋ እንደሚሆን ወሰንኩ። ስለዚህ ፣ ግቤታችንን በሚይዝበት ጊዜ በጣም ለስላሳ እና የበለጠ ምላሽ ሰጭ የሆነውን C#ን ለመጠቀም መረጥኩ።

ለፕሮጀክቱ ሲ# ክፍል በቀላሉ የ.zip ፋይልን ማውረድ እና ወደ ራሱ አቃፊ ማውጣቱ እና ከዚያ ማሻሻል የተሻለ ነው። በዚፕ ፋይል ውስጥ ሁለት አቃፊዎች አሉ። በእይታ ስቱዲዮ ውስጥ ፕሮጀክቱን ለመክፈት በዊንዶውስ ኤክስፕሎረር ውስጥ የ RunnerGame_CSharp አቃፊን ያስገቡ። እዚህ ፣.sln (መፍትሄ) ፋይልን ሁለቴ ጠቅ ያድርጉ ፣ እና ቪኤስ ፕሮጀክቱን ይጭናል።

ለጨዋታው የፈጠርኳቸው ጥቂት የተለያዩ ክፍሎች አሉ። ስለ እያንዳንዱ ክፍል ሁሉንም ዝርዝሮች አልገባም ፣ ግን ዋናዎቹ ክፍሎች ምን እንደሆኑ አጠቃላይ እይታ እሰጣለሁ።

የሳጥን ክፍል

በመስኮት ቅጽ ላይ በማያ ገጽ ላይ ሊስሉ የሚችሉ ቀለል ያሉ አራት ማእዘን ነገሮችን እንዲፈጥሩ ለማስቻል የሳጥን ክፍልን ፈጠርኩ። ሀሳቡ አንድ ዓይነት ግራፊክስ ለመሳል ሊፈልጉ የሚችሉ ሌሎች ክፍሎችን በመጠቀም ሊራዘም የሚችል ክፍል መፍጠር ነው። ሌሎች ክፍሎች እንዲሻሩባቸው (“ተሻጋሪ” ቁልፍ ቃሉን በመጠቀም) “ምናባዊ” ቁልፍ ቃል ጥቅም ላይ ውሏል። በዚያ መንገድ ፣ እኛ በተፈለገበት ጊዜ ለተጫዋቹ ክፍል እና ለመድረክ ክፍሉ ተመሳሳይ ባህሪን ማግኘት እንችላለን ፣ እንዲሁም እኛ የምንፈልገውን ነገር ሁሉ እንለውጣለን።

ስለ ሁሉም ንብረቶች በጣም ብዙ አይጨነቁ እና ጥሪዎችን ይሳሉ። ለወደፊቱ ላደርገው የምፈልገው ለማንኛውም የጨዋታ ወይም የግራፊክስ ፕሮግራም ማራዘም እችል ዘንድ ይህንን ክፍል ጽፌያለሁ። በዝንብ ላይ በቀላሉ አራት ማእዘን ለመሳል ከፈለጉ እንደዚህ ያለ ትልቅ ክፍል መፃፍ የለብዎትም። የ C# ሰነድ ይህንን እንዴት ማድረግ እንደሚቻል ጥሩ ምሳሌዎች አሉት።

ሆኖም ፣ የ “ሣጥን” ክፍሌን አንዳንድ አመክንዮ እዘረጋለሁ-

ይፋዊ ምናባዊ bool IsCollidedX (ሳጥን otherObject) {…}

እዚህ በ X- አቅጣጫ ካሉ ዕቃዎች ጋር ግጭቶችን እንፈትሻለን ፣ ምክንያቱም ተጫዋቹ በማያ ገጹ ላይ ከተሰለፈ በ Y አቅጣጫ (ወደ ላይ እና ወደ ታች) ግጭቶችን ብቻ መፈተሽ አለበት።

ይፋዊ ምናባዊ bool IsCollidedY (ሣጥን otherObject) {…}

እኛ ከሌላ ወይም ሌላ የጨዋታ ነገር በታች ስንሆን ፣ የ Y ግጭቶችን እንፈትሻለን።

ይፋዊ ምናባዊ bool IsCollided (ሳጥን otherObject) {…}

ይህ የ X እና Y ግጭቶችን ያጣምራል ፣ ማንኛውም ነገር ከዚህ ጋር ተጋጭቶ እንደሆነ ይመለሳል።

ይፋዊ ምናባዊ ባዶነት OnPaint (ግራፊክስ ግራፊክስ) {…}

ከላይ የተጠቀሰውን ዘዴ በመጠቀም ማንኛውንም የግራፊክስ ነገር እናስተላልፋለን እና ፕሮግራሙ እየሄደ ባለበት እንጠቀማለን። ሊስሉ የሚችሉ ማናቸውንም አራት ማዕዘኖች እንፈጥራለን። ምንም እንኳን ይህ ለተለያዩ እነማዎች ጥቅም ላይ ሊውል ይችላል። ለእኛ ዓላማዎች ፣ አራት ማዕዘኖች ለሁለቱም መድረኮች እና ለተጫዋቹ ጥሩ ይሰራሉ።

የባህሪው ክፍል

የባህሪው ክፍል የሳጥን ክፍሌን ያሰፋል ፣ ስለዚህ እኛ የተወሰኑ ፊዚክስ ከሳጥኑ ውስጥ አለን። ለግጭት የፈጠርናቸውን ሁሉንም መድረኮች በፍጥነት ለመፈተሽ የ “CheckForCollisions” ዘዴን ፈጠርኩ። የ “መዝለል” ዘዴው የተጫዋቹን ወደላይ ፍጥነት ወደ “JumpSpeed” ተለዋዋጭ ያዘጋጃል ፣ ከዚያ በዋናው መስኮት ክፍል ውስጥ ፍሬም-በ-ፍሬም ይቀየራል።

ግጭቶች እዚህ ከቦክስ ክፍል ይልቅ በመጠኑ በተለየ ሁኔታ ይስተናገዳሉ። ወደ ላይ ከዘለለ ፣ በመድረክ በኩል መዝለል እንደምንችል በዚህ ጨዋታ ውስጥ ወሰንኩ ፣ ግን ከእሱ ጋር ከተጋጨ የእኛን ተጫዋች በመንገዱ ላይ ይይዛል።

የመድረክ ክፍል

በዚህ ጨዋታ ውስጥ እኔ በዋናው መስኮት ክፍል ውስጥ ያሉትን ሁሉንም የመሣሪያ ስርዓቶች X ሥፍራዎችን በማስላት ኤክስ አስተባባሪን እንደ ግብዓት የሚወስደውን የዚህ ክፍል ገንቢን ብቻ እጠቀማለሁ። እያንዳንዱ የመሣሪያ ስርዓት በዘፈቀደ Y- አስተባባሪ ከ 1/2 ማያ ገጹ እስከ ማያ ገጹ ቁመት 3/4 ድረስ ይዘጋጃል። ቁመቱ ፣ ስፋቱ እና ቀለሙ እንዲሁ በዘፈቀደ የተፈጠሩ ናቸው።

ዋናው መስኮት ክፍል

ጨዋታው በሚካሄድበት ጊዜ ሁሉንም አመክንዮዎች እንዲጠቀሙበት የምናደርግበት ይህ ነው። በመጀመሪያ ፣ በግንባታው ውስጥ ፣ ለፕሮግራሙ የሚገኙትን ሁሉንም የ COM ወደቦች እናተምታለን።

foreach (በ SerialPort ውስጥ ሕብረቁምፊ ወደብ። GetPortNames ())

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

አርዱዲኖ በየትኛው ወደብ እንደሚጠቀም በየትኛው ላይ ግንኙነቶችን እንደምንቀበል እንመርጣለን-

SerialPort = አዲስ SerialPort (SerialPort. GetPortNames () [2] ፣ 9600 ፣ Parity. None ፣ 8 ፣ StopBits. One) ፤

ለትእዛዙ ትኩረት ይስጡ SerialPort. GetPortNames () [2]። [2] የትኛውን ተከታታይ ወደብ መጠቀም እንዳለበት ያመለክታል። ለምሳሌ ፣ ፕሮግራሙ “COM1 ፣ COM2 ፣ COM3” የታተመ ከሆነ ፣ ቁጥሩ በቁጥር 0 ውስጥ ስለሚጀምር COM3 ላይ እናዳምጣለን።

እንዲሁም በገንቢው ውስጥ ፣ ሁሉንም መድረኮች በከፊል የዘፈቀደ ክፍተት እና በማያ ገጹ ላይ ባለው የ Y አቅጣጫ ውስጥ እንፈጥራለን። ሁሉም የመሣሪያ ስርዓቶች በዝርዝሩ ነገር ላይ ተጨምረዋል ፣ ይህም በ C# ውስጥ በቀላሉ ድርድር የመሰለ የውሂብ አወቃቀርን ለማስተዳደር በጣም ለተጠቃሚ ምቹ እና ቀልጣፋ መንገድ ነው። ከዚያ የእኛ የባህርይ ነገር የሆነውን ማጫወቻውን እንፈጥራለን ፣ ውጤቱን ወደ 0 አስቀምጠን እና GameOver ን ወደ ሐሰት ያቀናጃል።

የግል የማይንቀሳቀስ ባዶነት DataReived (የነገር ላኪ ፣ SerialDataReceivedEventArgs e)

ይህ በተከታታይ ወደብ ላይ መረጃ ሲደርሰው የሚጠራው ይህ ዘዴ ነው። እኛ ሁሉንም ፊዚክስችንን የምንተገብርበት ፣ ጨዋታን ለማሳየት ፣ መድረኮችን ለማንቀሳቀስ ፣ ወዘተ የሚወስኑበት ጨዋታ ከመቼውም ጊዜ በአጠቃላይ ጨዋታ ከገነቡ በአጠቃላይ “የጨዋታ ዙር” የሚባል ነገር አለዎት ፣ ይህም በእያንዳንዱ ጊዜ ፍሬም ይባላል። ያድሳል። በዚህ ጨዋታ ውስጥ የ DataReceived ዘዴ እንደ የጨዋታ ዑደት ሆኖ ይሠራል ፣ መረጃው ከተቆጣጣሪው እንደተቀበለ ፊዚክስን ብቻ ያሽከረክራል። በዋናው መስኮት ውስጥ ሰዓት ቆጣሪን ማቀናበር ፣ እና በተቀበለው መረጃ ላይ በመመርኮዝ ዕቃዎቹን ማደስ የተሻለ ሰርቶ ሊሆን ይችላል ፣ ግን ይህ የአርዱዲኖ ፕሮጀክት እንደመሆኑ ፣ ከሱ በሚመጣው መረጃ ላይ የተመሠረተ በእውነቱ የሮጠ ጨዋታ መሥራት እፈልግ ነበር።.

ለማጠቃለል ፣ ይህ ማዋቀር ጨዋታውን ወደሚጠቅም ነገር ለማስፋፋት ጥሩ መሠረት ይሰጣል። ምንም እንኳን ፊዚክስ ፍጹም ባይሆንም ፣ ለዓላማችን በደንብ ይሠራል ፣ ይህም አርዱዲኖ ለሁሉም ለሚወደው ነገር - ጨዋታዎችን መጫወት!

የሚመከር: