ዝርዝር ሁኔታ:

ጥንቃቄ የጎደለው እሽቅድምድም አርዱinoኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች - 6 ደረጃዎች
ጥንቃቄ የጎደለው እሽቅድምድም አርዱinoኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች - 6 ደረጃዎች

ቪዲዮ: ጥንቃቄ የጎደለው እሽቅድምድም አርዱinoኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች - 6 ደረጃዎች

ቪዲዮ: ጥንቃቄ የጎደለው እሽቅድምድም አርዱinoኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች - 6 ደረጃዎች
ቪዲዮ: 5 CREEPY TRUE TARGET HORROR STORIES : ASMR HORROR BEFORE TO SLEEP 2024, ሀምሌ
Anonim
ግድ የለሽ እሽቅድምድም አርዱዲኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች
ግድ የለሽ እሽቅድምድም አርዱዲኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች
ግድ የለሽ እሽቅድምድም አርዱዲኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች
ግድ የለሽ እሽቅድምድም አርዱዲኖ OLED ጨዋታ ፣ AdafruitGFX እና Bitmaps መሠረታዊ ነገሮች

በዚህ መማሪያ ውስጥ አዳፍ ፍሬ_ጂኤፍኤክስ ቤተመፃሕፍትን በመጠቀም በጨዋታ ውስጥ እንደ ስፕሪቶች ዓይነት ቢትማፕዎችን እንዴት እንደሚጠቀሙ እንመለከታለን። እኛ ልናስበው የምንችለው ቀላሉ ጨዋታ የመኪና ጨዋታን የሚቀይር የጎን ማሸብለል ሌይን ነው ፣ በመጨረሻ የእኛ ቤታ ሞካሪ እና ረዳት ኮድ አድራጊው በሞተር መንገድ ላይ የተሳሳተ መንገድ ለመንዳት በጣም ግድየለሾች እንደመሆናቸው መጠን “ግድ የለሽ እሽቅድምድም” እንደ ስም ወስኗል !!.

የወረዳችን ንድፍ ከላይ በተካተቱት ስዕሎች ውስጥ ነው እና በመጨረሻው ፕሮጄክት/መማሪያችን ውስጥ እዚህ ተዘርዝሯል የእባቡ አስተማሪዎች ወረዳው እንዴት እንደሚሰራ የሚገልፅ።

እንፈልጋለን

Adafruit_GFX

Paint.net

አርዱዲኖ አይዲኢ ዊንዶውስ ሊኑክስ

እና እባክዎን ለተቀሩት መሣሪያዎች የእባቡን ትምህርት ይመልከቱ።

አቅርቦቶች

የእባብ ጨዋታ

ደረጃ 1: Paint.net ን በመጫን ላይ

Paint.net ን በመጫን ላይ
Paint.net ን በመጫን ላይ
Paint.net ን በመጫን ላይ
Paint.net ን በመጫን ላይ
Paint.net ን በመጫን ላይ
Paint.net ን በመጫን ላይ

ሶፍትዌሩ ነፃ ስለሆነ ሙሉ በሙሉ ነፃ ስለሆነ Paint.net ን እየተጠቀምን ነው እዚህ Paint. Net ን ማውረድ ይችላሉ።

Paint.net ን ለመጫን የወረደውን ፕሮግራም ሁለቴ ጠቅ ያድርጉ እና በሚቀጥለው ጊዜ አዎንታዊ መልስ ይስጡ ፣ አዎ ፣ እሺ ፣ እስማማለሁ እና ከላይ ያሉት ሥዕሎች አቅጣጫ ይሰጡዎታል።

ደረጃ 2 ቀለል ያለ ስፕላሽ ማያ ገጽ መሳል

ቀላል ስፕላሽ ማያ ገጽ መሳል
ቀላል ስፕላሽ ማያ ገጽ መሳል
ቀላል ስፕላሽ ማያ ገጽ መሳል
ቀላል ስፕላሽ ማያ ገጽ መሳል
ቀላል ስፕላሽ ማያ ገጽ መሳል
ቀላል ስፕላሽ ማያ ገጽ መሳል

በ paint.net ውስጥ ሲሆኑ ፋይል ከዚያም አዲስ ጠቅ በማድረግ አዲስ ምስል ይፍጠሩ ፣ የምስል መጠንን ወደ 1260x620 ያዘጋጁ (የመጀመሪያውን ስዕል ይመልከቱ) አዲስ ገጽ ሲኖርዎት እሺን ጠቅ ያድርጉ 2 እርሳስን በመጠቀም ጥቁር እና ነጭ ቀለሞችን ብቻ በመጠቀም የሚረጭ ማያ ገጽ ይሳሉ። መሣሪያ (ስዕል 2) ፣

የሚረጭ ማያ ገጽ ምስልዎን ሲስሉ (ወይም ሲለጠፉ) ፣ ምስሉ ላይ ጠቅ ያድርጉ እና ከዚያ መጠን (ምስል 4) ፣ በብቅ ባይ ውስጥ መጠኑን ከ 1260x620 ወደ 126x62 (2 ፒክሰሎች ከማሳያዎ ያነሱ) (pic5) እሺን ጠቅ ያድርጉ።

ቀጥሎ ጠቅ ያድርጉ ፋይል ምናሌ ከዚያ እንደ (pic6) ያስቀምጡ።

በፋይሉ ዓይነት ብቅ -ባይ ብቅ ይላል ምናሌ ተቆልቋይ ምናሌ BMP ን (ቢትማፕ) ን ይምረጡ።).

ደረጃ 3 BMP ን ወደ C Bitmap ፋይል መለወጥ

BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ
BMP ን ወደ C Bitmap ፋይል መለወጥ

አሁን ይህንን ለማድረግ ብዙ መሣሪያዎች መኖራቸውን አርዱዲኖ ሊረዳበት ወደሚችል ቅርጸት መለወጥ አለብን ፣ ግን የእኔ “ሂድ” ቦታው የማርሊን ድር ጣቢያ ጣቢያ ቢትማፕ መቀየሪያ መሣሪያ ነው…

marlinfw.org/tools/u8glib/converter.html

ስለዚህ በ pic1 ውስጥ የሚታየውን ድር ጣቢያ ለመክፈት ከላይ ያለውን አገናኝ በመጠቀም ይህንን ክፍል እንጀምራለን

ፋይልን ይምረጡ ላይ ጠቅ ያድርጉ እና ቀደም ብለው የፈጠሩትን bitmap ይምረጡ (pic2)

የማርሊን ቢትማፕ መቀየሪያ ምስልዎን በራስ -ሰር ወደ ሲ ኮድ ይቀይረዋል ፣ ግራ ኮዱን ማጉላት ያለበት ኮዱን ሁለቴ ጠቅ ያድርጉ ፣ ከዚያ በቀኝ ጠቅ ያድርጉ እና ቅጂን ጠቅ ያድርጉ (pic3)

ቀጥሎ እኛ በቀኝ ጠቅታ እንፈጥራለን እና አዲስ የጽሑፍ ሰነድ እንፈጥራለን (pic4)

አዲሱን ሰነድ ሁለቴ ጠቅ ያድርጉ ፣ ሲከፈት በቀኝ ጠቅ ያድርጉ እና ኮዱን ይለጥፉ (pic5)

በመቀጠል ከኮዱ አናት አጠገብ ያለውን መስመር ማከል አለብን #ያካተተ ይህ የ bitmap ውሂቡን በአርዲኖ ላይ ባለው ፍላሽ ማህደረ ትውስታ ውስጥ እንድናስቀምጥ ያስችለናል ፣ ከዚያ #መጠኑን ወርድ ፣ ቁመት እና ስም እነዚህን ለመጠቀም ቀላል ወደሆነ ነገር ቀይረናል በስዕል 6 ፣

እኛ በዘፈቀደ ከሚፈጠሩ ገጸ -ባህሪዎች እንሰይማቸዋለን ፣ ከዚህ በታች ወደተሰመረበት ምሳሌ እንሰይማቸዋለን

#LOGOWIDTH ን ይግለጹ

#LOGOHEIGHT ን ይግለጹ

const ያልተፈረመ char LOGOPIC PROGMEM

ቀጣይ ጠቅታ ፋይል ከዚያ እንደ አስቀምጥ ፣ ፋይሉን እንደ logo.c ቅርብ ማስታወሻ ደብተር ያስቀምጡ ፣ በ logo.c ላይ በቀኝ ጠቅ ያድርጉ እና ቅጂን ጠቅ ያድርጉ።

ደረጃ 4 DrawBitmap ን በመጠቀም LOGO ን ማሳየት

DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት
DrawBitmap ን በመጠቀም LOGO ማሳየት

አሁን የ arduino IDE ን እንጭነዋለን እና አዲስ ንድፍ እንፈጥራለን እና እንደ አርአዲኤምአፕ.ኖ የሚል ስም እናስቀምጠዋለን ፣ በአርዱዲኖ አይዲ ውስጥ እንደ ማታለል ቀጥሎ የፋይሉን ምናሌ ጠቅ ያድርጉ እና እንደ አስቀምጥ ፣ ወደ የፕሮጀክቱ አቃፊ ይመለሱ እና በቀኝ ጠቅ ያድርጉ እና በ.c ፋይል ውስጥ ይለጥፉ። (pic2) ከዚያ ሰርዝን ጠቅ ያድርጉ ፣ ይህ በፋይሉ ውስጥ ለመለጠፍ ወደ አቃፊው ማሰስዎን ያስቀምጥዎታል።

የሚከተለውን ኮድ ወደ አርዱዲኖ አይዲኢ ይተይቡ ወይም በኢኖ ውስጥ ያውርዱ።

(ለመቅዳት እና ለመለጠፍ ወይም ከዚህ በታች ያሉትን ፋይሎች ከመማር የተሻለውን ለመማር እንመክራለን)

#ያካትቱ /* ይህ እርስዎ በሚያከማቹበት ቦታ ላይ በመመርኮዝ ይለያያል

ኢኖው ብዙውን ጊዜ በአቃፊው ውስጥ C: / Users / ~ user name / Documents / Arduino / project ~ name

እና እኛ የእኛን ቢትማፕ */ እንዴት እንደምናገናኝ ነው/

#ያካትቱ

#ያካትቱ

uint8_t bmpX ፣ bmpY = 0; /* የመጠባበቂያ ማህደረ ትውስታ ለ 2 X 8 ቢት ኢንቲጀሮች ፣ እኛ 8 ቢት ኢንቶች ብቻ እንፈልጋለን

እሴቱ ከ 128 (ፒክሰሎች) ፈጽሞ የማይበልጥ በመሆኑ 8 ቢት ኢንች (ከፍተኛው 255 እሴት ያለው) በመጠቀም ቦታን መቆጠብ እንችላለን */

ባዶነት ማዋቀር ()

{መዘግየት (100); // በማሳያ ላይ ኃይል ለመስጠት ማሳያ ወዘተ ጊዜ ይስጡ (SSD1306_SWITCHCAPVCC ፣ 0x3C); // ይህ የማሳያ ማሳያውን የመጀመሪያ ማስጀመር ነው። // በባዶ ማያ ገጽ ይጀምሩ}

/* እባክዎን ያስተውሉ እነዚህ አስተያየቶች እነሱ ለማጣቀሻ ናቸው …………..

እኛ የምናተኩረው ትእዛዝ ማሳያ ነው። (bmpX ፣ የቢት ካርታው X መልህቅ ነጥብ በሚሆንበት ማያ ገጽ ላይ የ X ዘንግ እሴት ነው እና bmpX እና bmpY እንቅስቃሴን ለመፍጠር የምንፈልጋቸው እሴቶች ናቸው (bmpY ፣ Y መልህቅ ባለበት ማያ ገጽ ላይ የ Y ዘንግ እሴት ነው) የቢት ካርታው ነጥብ እኛ በ logo.c ውስጥ እንደገለፅናቸው የማጣቀሻ ስሞችን እናገኛለን (ሎግኦፒክ ፣ በ #በተካተተው ፋይል logo.c ውስጥ የቢት ካርዱ ስም ነው (LOGOWIDTH ፣ ለመሳል ስንት ፒክሰሎች በ (X) ነው) ከመልህቅ ነጥብ (LOGOHEIGHT ፣) ቢት ካርታውን ከመልህቅ ነጥብ ለመሳብ ምን ያህል ፒክስሎች ወደታች (Y) ነው X እና Y ፒክሰሎች በእጅ ሊገቡ ይችላሉ ፣ ግን ሁሉንም ከማስታወስ ይልቅ አስቀድሞ የተገለጹትን መጠቀም በጣም ቀላል ነው (1 ፣ ማያ ገጹ ሞኖ 0 ጥቁር 1 ነጭ በመሆኑ የመጨረሻው እሴት ቀለም ነው። እሺ ከቀጣዩ መስመር መተየብ ይጀምሩ - loD lol*/ void loop () {display.clearDisplay (); // ባዶውን ማያ ገጽ // ቢትማፕ ከ ከላይ በስተግራ ፣ x ፣ y ፣ የቢት ካርታ ስም ፣ ስፋት X ፣ ቁመት Y ፣ የቀለም ማሳያ። ይህ በእውነቱ ቋቱን ወደ ማሳያው ይሳባል}

አርዱዲኖ ኮድ ይስቀሉ እና እየሰራ መሆኑን ያረጋግጡ (pic3)።

ደረጃ 5 - የ Bitmap Sprite ን ማንቀሳቀስ

Image
Image
የ Bitmap Sprite ን ማንቀሳቀስ
የ Bitmap Sprite ን ማንቀሳቀስ
የ Bitmap Sprite ን ማንቀሳቀስ
የ Bitmap Sprite ን ማንቀሳቀስ

የቀደሙ መመሪያዎችን በመጠቀም paint.net ን ይጠቀሙ እና አዲስ ፋይል ያድርጉ 30x15 ፒክሰሎች (ፒክ 1) ያድርጉት እና ወጣቱ ዲዛይነራችን በመጀመሪያ በንፋስ ማያ ገጹ ይጀምራል (ስዕሎች 2 እና 3)።

እንደገና እንደ የመስኮት bmp ፋይል (እንደ ደረጃ 2) ያስቀምጡ ፣ ወደ ሲ ቢትማፕ (ደረጃ 3) ይለውጡ እና ልክ እንደ አዲስ የተፈጠረ አርዱinoኖ ኢኖ (ረቂቅ) በተመሳሳይ አቃፊ ውስጥ የ car.c ፋይልን (ወይም ምን እንደሚወስኑ) ያስቀምጡ። ፋይል።

(p.s. ብዙውን ጊዜ እኛን ለማውጣት ያገለገለውን በመኪና ውስጥ ያለውን #አካታች መስመር ማከልዎን ያስታውሱ)

መጀመሪያ የእርስዎን ተመጣጣኝ አ.ማ

#ያካትቱ

#አካት #አዳፍ ፍሬ_GFX.h> // https://github.com/adafruit/Afadruit-GFX- ቤተ-መጽሐፍት #አዳፍ ፍሬ_SSD1306 ን ያካተተ //

Adafruit_SSD1306 ማሳያ (128 ፣ 64); // የማሳያውን ጥራት ያዘጋጁ

/* bmpX/bmpY እነዚህን እሴቶች በመለወጥ እና እንደገና በመለዋወጥ እነዚህ ተለዋዋጮች እንዲሆኑ እንፈልጋለን

ማያ ገጹ የእንቅስቃሴ አኒሜሽን ውጤት እንዴት እንደምንፈጥር ነው። hitSide እና hitTop በማያ ገጹ ውስጥ sprite ን እንዴት እንደምናቆይ ነው */ uint8_t bmpX ፣ bmpY = 0; // የመጠባበቂያ ማህደረ ትውስታ ለ 2 8 ቢት ኢንቶች (0-255) እኛ ትልቅ 128 አያስፈልገንም ትልቁ ጥቅም ላይ የዋለው bool hitSide = 0; bool hitTop = 0;

ባዶነት ማዋቀር ()

{መዘግየት (100); // በማሳያ ላይ ኃይል ለመስጠት ማሳያ ወዘተ ጊዜ ይስጡ (SSD1306_SWITCHCAPVCC ፣ 0x3C); // ይህ የማሳያ ማሳያውን የመጀመሪያ ማስጀመር ነው። // በባዶ ማያ ገጽ ይጀምሩ

}

ባዶነት loop ()

{display.clearDisplay (); // ማያ ገጹን ባዶ/ // ከላይ በግራ በኩል የተወሰደ ቢትማፕ ፣ x ፣ y ፣ የቢት ካርታ ስም ፣ ስፋት X ፣ ቁመት Y ፣ የቀለም ማሳያ። // display.display (); // ይህ በእውነቱ ቋትውን ወደ ማሳያው ይሳባል/ * የማያ ገጹን ጠርዝ የምንከታተለው እና የፒክሰል ከላይ ወደ ታች ማንቀሳቀስ/ ማከል ወይም ፒክሴልን (ከታች ወደ ላይ ማንቀሳቀስ) */ ማብሪያ (መምታት)) // ይህ በቦሌው መሠረት የመኪናውን አቅጣጫ ይመርጣል {case 0: bmpX ++; ሰበር;

ጉዳይ 1 ፦

bmpX--; ሰበር; } // እነዚህ 2 መግለጫዎች ሐሰተኛውን ወደ እውነት ወይም ሐሰት ካደረጉ (bmpX == 0) {hitSide = 0; } ከሆነ (bmpX == 96) // መኪናው ሲቀንስ የማያ ገጹ ስፋት {hitSide = 1; } // ከላይ ለ Y ዘንግ ከሆነ (bmpY == 0) {hitTop = 0; } ከሆነ (bmpY == 49) // የማያ ገጽ ቁመት የመኪናውን ከፍታ ሲቀነስ {hitTop = 1; } ማብሪያ (hitTop) {case 0: bmpY ++; ሰበር; ጉዳይ 1 bmpY--; ሰበር; }

}

በተያያዘው ቪዲዮ ውስጥ ፕሮግራሙ ሲሠራ ማየት ይችላሉ

ደረጃ 6 የመንዳት ጨዋታ ማድረግ

Image
Image

በመጀመሪያ እኛ እንደ መጀመሪያዎቹ የመማሪያ ደረጃዎች ውስጥ ጥቂት የተለያዩ መኪናዎችን ወይም መሰናክሎችን በመሳል እንጀምራለን 30x15 ፒክሰሎች ያደርጋቸዋል። ከዚያ ወደ ሲ bitmaps እንለውጣቸዋለን እና በኮዱ ውስጥ አገናኝ።

#አካት / // እነዚህ መንገዶች ጥገኛን መለወጥ አለባቸው

// ፋይሎቹን የት በሚያስቀምጡበት ላይ // አርትዕ: - // በ ‹‹››› መተካትዎን አሁን አግኝቻለሁ ሙሉውን መንገድ // በእራስዎ ቤተመጽሐፍት #ያካትቱ

#ያካትቱ

#አካትት #አካትት

#ያካትቱ

#ያካትቱ // https://github.com/adafruit/Afadruit-GFX- ቤተ-መጽሐፍት #<አዳፍ ፍሬ_SSD1306 // https://github.com/adafruit/Afartafruit-GFX-Library ‹‹…

Adafruit_SSD1306 ማሳያ (128 ፣ 64); // የማሳያ ግቤቶችን ይግለጹ

ተለዋዋጮችን እና ቋሚ እሴቶችን ይግለጹ

// የግቤት ፒኖችን ይግለጹ እነዚህ በጭራሽ አይለወጡም በአርዱዲኖ ላይ ያሉት ፒኖች ናቸው #ይግለጹ #INTPIN 3 ን ይግለጹ // // ፒኖች 2 እና 3 ብቻ በ UNO ላይ እርስ በእርስ ሊጣመሩ የሚችሉ ፒን/ UPPIN 4 // እነዚህ ፒኖች የተገናኙ ናቸው tp አግባብነት ያለው ማብሪያ #መግለፅ DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // አቅጣጫዎችን ይግለጹ

#ይግለጹ DIRUP 1 // እነዚህ እሴቶች ለመወሰን “እባብ” የሚመለከተው-

#ገላጭ ድሪድ 2 // እባቡ የሚጓዝበትን አቅጣጫ #ገለፃ ቀጥታ 3 #ገላጭ ቀጥታ 4

uint8_t dirPressed = 0; / የትኛው ፒን ወደ ላይ እንደሄደ አቅጣጫን ለመመዝገብ // እሴት

// የቦሊኖች መደብር የትኛው ፒን ከፍ ብሏል

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; ለመኪናው አቀማመጥ uint8_t carPosX = 1/ ቫርስ; uint8_t carPosY = {0, 16, 32, 48}; // ድርድርን በማዋሃድ እሴት ይፈልጋል

uint8_t lanePosArr = {0, 16, 32, 48}; // እያንዳንዱ መስመር ባለበት ለማከማቸት ድርድር

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // ተለዋዋጮች በመንገድ ላይ ላሉት መስመሮች uint8_t roadLineX1 = 51; // እነዚህ በጅማሬ ቀድመው ተወስነዋል ከዚያም መስመሮቹ እንከን የለሽ ሆነው ይታያሉ uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// ይህ የመጫወቻ ስፍራው በአንድ ጊዜ ስንት ፒክሰሎች እንደሚንቀሳቀስ ነው

uint8_t drawSpeed = 4;

// ጠላቶች ለጠላት 0

uint8_t ጠላት 0PosX = 255; uint8_t ጠላት 0PosY = 0; uint8_t ጠላት 1PosX = 255; uint8_t ጠላት 1PosY = 0; uint8_t ጠላት 2PosX = 255; uint8_t ጠላት 2PosY = 0;

// መሰናክሎች የሌይን ቁጥርን በዘፈቀደ ለመመደብ ተለዋዋጭ

uint8_t laneGen = 0;

uint8_t laneGen0 = 0; uint8_t laneGen1 = 0; uint8_t laneGen2 = 0;

// የውጤት ቆጣሪ

ረጅም ውጤት = 0; // ይህ ውጤት ነው/ lol ረጅም ማወዳደር = 0; // ይህ ከረዥም highScore = 25 ጋር ለማወዳደር ውጤቱን በመጨረሻው ደረጃ ያከማቻል። uint8_t metreCnt = 0;

ተግባሮቹን የምንጀምረው እዚህ ነው

// ይህ ማቋረጫው ከነቃ ባዶ ጣልቃ ገብነት () {መዘግየት (150) ከሆነ የትእዛዞች ስብስብ ነው። updateDirection (); } // የ ‹DIR bools› ን በመፈተሽ የትኛው እሴት በአቅጣጫው ላይ እንዳለ ያዘምኑ // -------------------------- አዘምን አቅጣጫ (ተጫዋች)- ------------------------- ባዶነት አዘምን አቅጣጫ () {//Serial.println( updateDirection ተጠርቷል »); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); ከሆነ (BUTUP == true) {dirPressed = DIRUP; } ከሆነ (BUTDWN == true) {dirPressed = DIRDOWN; } ከሆነ (BUTLFT == true) {dirPressed = DIRLEFT; } ከሆነ (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- መኪና አንቀሳቅስ --------------- -------------------------

// ይህ መኪናውን የሚያንቀሳቅሰውን ማያ ገጹን ያዘምናል

ባዶ መንቀሳቀሻ መኪና ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ቶን (SND ፣ 100 ፣ 100); ከሆነ (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); ሰበር; መያዣ DIRDOWN: carPosYCnt ++; ቶን (SND ፣ 100 ፣ 100); ከሆነ (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; ሰበር; // አስተያየት ሰጥቷል መኪና የግራ እና የቀኝ ግጭት መፈለጊያ መንቀሳቀስ የሚችል ገና ጥሩ አይደለም /* ጉዳይ DIRLEFT: carPosX--; ከሆነ (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; ሰበር; */ መያዣ DIRRIGHT: // ለጨዋታ ብቻ በቀኝ ጠቅ ካደረጉ ጨዋታው የድምፅ ድምጽ ያሰማል (SND ፣ 100 ፣ 50) ፤ // carPosX ++; // ከሆነ (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; ሰበር; } አዘምን ማሳያ (); }

// -------------------------- RANDOM POS X ------------------- -----------

uint8_t randomPosX () // እነዚህ 2 አሰራሮች ለእንቅፋቶች የዘፈቀደ አቀማመጥ ያመነጫሉ

{uint8_t posValTmp = 0; posValTmp = በዘፈቀደ (129 ፣ 230); //Serial.println("random x "); //Serial.println(posValTmp); መመለስ (posValTmp); }

// --------------------------- RANDOM POS Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = የዘፈቀደ (0, 4); // በዘፈቀደ ተጨማሪ መስመርን ያክሉ ፣ ማለትም በዚያ መስመር ውስጥ በማያ ገጹ ላይ ምንም ነገር የለም //Serial.println("RandomY”); //Serial.println(lanePosArr [ላኔVal]); መመለስ (lanePosArr [laneVal]); }// ------------------------------- አዘጋጅ የጨዋታ ፍጥነት -------------- -------------- ባዶ setGameSpeed () // ይህ ጨዋታ ከ 20 በላይ ከፍ እንዲል ያቆማል ጨዋታ እንዳይጫወት {ከሆነ (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ ሰበርን ይፈልጉ ---------- ----------------------- ባዶ መፈለጊያ ብልሽት () {

ከሆነ (ጠላት 0PosX = 0 && enemy0PosY == carYTmp)

{// Serial.println ("ጨዋታ ከ CRAASSSSHHHHHHEEEEEDDD ወደ ትራፊክ 0"); ጨዋታው አለቀ(); } ከሆነ (enemy1PosX = 0 && enemy1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD ወደ ትራፊክ 1 "); ጨዋታው አለቀ(); } ከሆነ (enemy2PosX = 0 && enemy2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD ወደ ትራፊክ 2 "); ጨዋታው አለቀ(); }}

ማሳያውን የሚስሉ እነዚህ ልምዶች ናቸው።

// ------------------------------- መንገድ ይጎትቱ --------------- --------------------- ባዶ DraoRoad () // X ፣ Y ፣ ርዝመት ፣ ስፋት {display.fillRect (roadLineX1 ፣ 15 ፣ 30 ፣ 4 ፣ WHITE); display.fillRect (roadLineX1, 30, 30, 4, WHITE); display.fillRect (roadLineX1, 45, 30, 4, WHITE); display.fillRect (roadLineX2, 15, 30, 4, WHITE); display.fillRect (roadLineX2, 30, 30, 4, WHITE); display.fillRect (roadLineX2, 45, 30, 4, WHITE); display.fillRect (roadLineX3, 15, 30, 4, WHITE); display.fillRect (roadLineX3, 30, 30, 4, WHITE); display.fillRect (roadLineX3, 45, 30, 4, WHITE); display.fillRect (roadLineX4, 15, 30, 4, WHITE); display.fillRect (roadLineX4, 30, 30, 4, WHITE); display.fillRect (roadLineX4, 45, 30, 4, WHITE); display.fillRect (roadLineX5, 15, 30, 4, WHITE); display.fillRect (roadLineX5, 30, 30, 4, WHITE); display.fillRect (roadLineX5, 45, 30, 4, WHITE);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- ጠላቶችን መሳል ---- --------------------------------------- ባዶ ባዶ enemysDraw () {// X ፣ Y ፣ bmp ስም ፣ ስፋት ፣ ቁመት ፣ የቀለም ማሳያ ።drawBitmap (ጠላት 0PosX = ጠላት 0PosX-drawSpeed; ማሳያ። ጠላት 1PosX = ጠላት1PosX-drawSpeed; ማሳያ። enemy2PosX = enemy2PosX-drawSpeed; display.display (); ከሆነ (enemy0PosX> 231 && enemy0PosX231 && enemy1PosX <255) {enemy1PosX = randomPosX (); ጠላት 1PosY = randomPosY (); checkDuplicate (); }

ከሆነ (enemy2PosX> 231 && enemy2PosX <255) {enemy2PosX = randomPosX (); ጠላት 2PosY = randomPosY (); }} // ------------------------------------ ወቅታዊ ማሳያ -------- ---------------------------------------- ባዶነት ዝማኔ ማሳያ () {display.clearDisplay (); display.drawBitmap (carPosX ፣ carPosY [carPosYCnt] ፣ CARSPRITE ፣ 30 ፣ 15 ፣ 1) ፤ display.fillRect (100 ፣ 0 ፣ 28 ፣ 10 ፣ ጥቁር); display.setCursor (100, 0); display.setTextColor (ነጭ ፣ ጥቁር); display.println (ውጤት); display.display ();

}

// ------------------------- የፕሬስ loop ይጠብቁ ------------------- ------

// ይህ የመነሻ ማያ ገጽ ኮድ ባዶ ነው waitForPress () {splashScreen (); bool መጠበቅ = 0; // loop ያበቃል ይህ እውነተኛ ማሳያ ሲሆን። እያለ (በመጠበቅ ላይ == 0) {

display.fillRect (19, 20, 90, 32, ጥቁር); // ባዶ ዳራ ለጽሑፍ

display.setTextColor (ነጭ); display.setCursor (23, 24); display.setTextSize (0); display.println ("ግድ የለሽ"); display.setCursor (36, 34); display.println ("እሽቅድምድም"); display.drawBitmap (74 ፣ 24 ፣ CARSPRITE ፣ CARWIDTH ፣ CARHEIGHT ፣ 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, WHITE); // የድንበር እባብ ማሳያ.drawRect (19 ፣ 20 ፣ 90 ፣ 33 ፣ ነጭ); // የድንበር ሳጥን - 3 ማሳያ። ቅንብር ጠቋሚ (25 ፣ 43); display.setTextSize (0); // ቅርጸ -ቁምፊ ወደ መደበኛው display.println (“ማንኛውንም ቁልፍ ይጫኑ”); display.fillRect (0, 0, 127, 8, ጥቁር); display.setCursor (10, 0); display.print ("ከፍተኛ ውጤት:"); // ከፍተኛ ውጤት ማሳያውን ያሳዩ። ህትመት (highScore); display.display (); በመጠባበቅ ላይ = digitalRead (INTPIN); // ተጭኖ መቆየቱ dirPressed = 0 በሚሆንበት ጊዜ ወደ 1 ማብቂያ የሚለወጥ ከሆነ ለማየት ያረጋግጡ። // ዳግም አስጀምር አዝራር ወደ ምንም አቅጣጫ ይጫኑ}} // -------------------------------------- ----- የዘመነ ጨዋታ ----------------------------------------- ባዶ ዝማኔ ጨዋታ () {moveCar (); drawRoad (); enemysDraw (); // ጠላት 1 ድራ (); // ጠላት 2 ድራ (); metreCnt ++; deteCrash (); (metreCnt == 5) // ውጤቱን ለማቆየት ለእያንዳንዱ 10 ዑደቶች ነጥብን ያክላል {metreCnt = 0; ውጤት ++; } ከሆነ (ውጤት == ማወዳደር +5) // ጨዋታውን በየ 5 ነጥብ ወደ ከፍተኛ 20 ፍጥነት ያፋጥናል {ማወዳደር = ውጤት ፤ setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ ጨዋታው አለቀ---------------- ------------------------------

// ይህ የዕለት ተዕለት እንቅስቃሴ በሟቹ ጀግና መኪና ዙሪያ መስመሮችን ይሳሉ ከዚያም ጨዋታውን በማያ ገጽ ላይ ያሳያል

ባዶ ጨዋታ ()

{ቶን (SND ፣ 200 ፣ 200); // አጫውት ድምፅ uint8_t linePosX ፣ linePosY ፣ pixwidth ፣ pixheight = 0; // በመኪና መስመር ዙሪያ ሳጥኖችን ለመሳል ቫርሶችን ያዘጋጁ PosX = carPosY; linePosY = carYTmp; pixwidth = 30; ፒክሴይት = 15; display.drawRect (linePosX ፣ linePosY ፣ pixwidth ፣ pixheight ፣ WHITE); display.display (); ለ (int i = 0; i <= 26; i ++) // ይህ ፍንዳታን በሚመስል አራት ማዕዘኖች ውስጥ መኪናን ይከብባል {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth+4; ፒክሳይት = ፒክሴይት+4; display.drawRect (linePosX ፣ linePosY ፣ pixwidth ፣ pixheight ፣ BLACK); display.drawRect (linePosX ፣ linePosY ፣ pixwidth ፣ pixheight ፣ WHITE); display.display (); ቶን (SND ፣ i*20, 50); መዘግየት (10); } display.setTextSize (2); display.setTextColor (ነጭ ፣ ጥቁር); display.setCursor (10, 23); ቶን (SND ፣ 50 ፣ 500); display.print ("GAME"); display.display (); መዘግየት (500); ቶን (SND ፣ 40 ፣ 500); display.print ("OVER"); display.setTextSize (0); display.display (); መዘግየት (3000); ዳግም አስጀምር ጨዋታ (); waitForPress (); }

// ----------------------------------------- የመልሶ ጨዋታ ----- -------------------------------------------------- -----

ባዶ ዳግም ማስጀመር ጨዋታ () // ይህ ከፍተኛ ውጤት ይገለብጣል እና ሁሉንም ስታቲስቲክስን እንደገና ያስጀምራል እና የዘፈቀደ ቦታዎችን ያመነጫል

{ከሆነ (ውጤት> = highScore) // ነጥብ ከከፍተኛ ውጤት በላይ መሆኑን ለማየት ይፈትሹ {highScore = ውጤት ፤ // ነጠላ ከሆነ ስታንዲንግ ከፍተኛ ውጤት ለማዘመን}

ውጤት = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; ጠላት 0PosX = randomPosX (); ጠላት 0PosY = randomPosY (); ጠላት 1PosX = randomPosX (); ጠላት 1PosY = randomPosY (); ጠላት 2PosX = randomPosX (); ጠላት 2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -ቼክ ሁለት ----------------------------------------------- ------ ባዶ ባዶ ቼክ ብዜት () // እነዚህ ቼኮች መሰናክሎች ተመሳሳይ የጨዋታ ቦታ መያዛቸውን ለማየት {// Serial.println (“የተባዛ ምልክት የተደረገበት”) ፤ ከሆነ (enemy2PosX> 230 && enemy2PosX <255) {ሳለ (ጠላት 2PosY == enemy1PosY || enemy2PosY == enemy0PosY) {enemy2PosY = randomPosY (); }}

ከሆነ (ጠላት 0PosX> 230 && enemy0PosX230 && enemy2PosXenemy1PosX && enemy2PosX230 && enemy0PosXenemy1PosX && enemy0PosX

// ------------------------------------------- ስፕላሽ ስክሪን --- --------------------------------

ባዶ ባዶ ስክሪን ()

{display.clearDisplay (); display.drawBitmap (0 ፣ 0 ፣ CRASH ፣ CRASHWIDTH ፣ CRASHHEIGHT ፣ 1) display.display (); መዘግየት (2000); } // ---------------------------------------------- አዘገጃጀት ------------------------------------------------- ----------- ባዶነት ማዋቀር () {መዘግየት (100); // ነገሮች ይጀመሩ // Serial.begin (9600); // ይህንን እና ሁሉንም ተከታታይን አለመረዳት። ትዕዛዞች ለስህተት diag display.begin (SSD1306_SWITCHCAPVCC ፣ 0x3C); display.clearDisplay (); display.setTextColor (ነጭ ፣ ጥቁር); display.setTextWrap (ሐሰተኛ); display.dim (0); pinMode (INTPIN ፣ ማስገቢያ); pinMode (UPPIN ፣ ማስገቢያ); pinMode (DWNPIN ፣ ማስገቢያ); pinMode (LFTPIN ፣ ማስገቢያ); pinMode (RHTPIN ፣ ማስገቢያ);

አባሪ ማቋረጥ (digitalPinToInterrupt (INTPIN) ፣ የተቋረጠ ፣ RISING);

// እንቅፋቶችን ጠላት በዘፈቀደ ያስቀምጡ 0PosX = randomPosX (); ጠላት 0PosY = randomPosY (); ጠላት 1PosX = randomPosX (); ጠላት 1PosY = randomPosY (); ጠላት 2PosX = randomPosX (); ጠላት 2PosY = randomPosY (); checkDuplicate (); // የተባዙ ቦታዎችን ይፈትሹ // Serial.println ("ማዋቀር ተጠናቅቋል"); splashScreen (); waitForPress (); } // ---------------------------------------------- ----- ሎፕ ---------------------------------------------------- ----------

ባዶነት loop ()

{updateGame (); }

እና ያ በጣም ያ ነው ፣ ማንኛውም ማሻሻያዎች እና ግብረመልስ በደስታ ይቀበላሉ። የማያ ገጽ ብልጭ ድርግም የምንልባቸው ጉዳዮች እሱን እንዴት መቀነስ እንዳለብን መመርመር አለብን እና የጠላት መኪኖች አሁንም ተመሳሳይ ቦታ መያዝ ይችላሉ።

የሚመከር: