Мазмуну:

Reckless Racer Arduino OLED оюну, AdafruitGFX жана Bitmaps негиздери: 6 кадам
Reckless Racer Arduino OLED оюну, AdafruitGFX жана Bitmaps негиздери: 6 кадам

Video: Reckless Racer Arduino OLED оюну, AdafruitGFX жана Bitmaps негиздери: 6 кадам

Video: Reckless Racer Arduino OLED оюну, AdafruitGFX жана Bitmaps негиздери: 6 кадам
Video: OLED дисплей с контроллером SH1106 подключение к Arduino и тесты 2024, Ноябрь
Anonim
Reckless Racer Arduino OLED Оюну, AdafruitGFX жана Bitmaps негиздери
Reckless Racer Arduino OLED Оюну, AdafruitGFX жана Bitmaps негиздери
Reckless Racer Arduino OLED Оюну, AdafruitGFX жана Bitmaps негиздери
Reckless Racer Arduino OLED Оюну, AdafruitGFX жана Bitmaps негиздери

Бул үйрөткүчтө биз Adafruit_GFX.c китепканасын колдонуп, битмаптарды оюндун спрайт түрү катары кантип колдонууну карап чыгабыз. Биз ойлогон эң жөнөкөй оюн - бул капталдын жылдыруучу тилкесин алмаштыруучу унаа оюну, акырында биздин бета -тестерибиз жана кодерибиздин жардамчысы "Reckless Racer" деген ат менен чечим чыгарды, анткени ал автожолдун туура эмес жолуна түшүп кетүү үчүн өтө этиятсыз !!

Биздин схеманын дизайны жогоруда көрсөтүлгөн сүрөттөрдө жана биздин акыркы долбоорубузда/окуу куралыбызда схеманын кантип иштээрин сүрөттөгөн Snake Instructables деталдуу түрдө көрсөтүлгөн.

талап кылабыз

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

жана калган жабдыктар үчүн Жыландын окуу куралын карап көрүңүз.

Жабдуулар

Жылан оюну

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 кылып коюңуз (биринчи сүрөттү караңыз) Жаңы баракчаңыз бар болгондо карандашты колдонуп ак жана кара түстөрдү колдонуп экрандын экранын чийиңиз. курал (pic2), Сиз экрандын сүрөтүн тартканда (же чаптаганда), сүрөттү чыкылдатыңыз, анан өлчөмүн өзгөртүңүз (image4), калкыма терезеде өлчөмүн 1260x620дан 126x62ге (дисплейиңизден 2 пиксел кичине) өзгөртүңүз (pic5) ОК басыңыз.

Кийинки Файл менюсун чыкылдатып, анан сактаңыз (pic6).

менюда ачылуучу менюда BMP (bitmap) тандап чыккандан кийин. (pic7), файлдын атын териңиз жана Save дегенди чыкылдатыңыз, калкып чыкчу терезе 0го жана 8 битке коюлганда, чыкылдатыңыз ok (pic8)).

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 Файлына айландыруу

Эми биз өзүбүздүн сүрөтүбүздү arduino түшүнө ала турган форматка айландырышыбыз керек, бирок муну аткара турган көптөгөн куралдар бар, бирок менин "баруум" marlin желелер сайтынын битмап конвертеринин куралы …

marlinfw.org/tools/u8glib/converter.html

Ошентип, биз бул бөлүмдү pic1де көрсөтүлгөн веб -сайтты ачуу үчүн жогорудагы шилтеме аркылуу баштайбыз

файлды тандоо баскычын чыкылдатыңыз жана мурда түзүлгөн битмапты тандаңыз (pic2)

marlin bitmap converter сиздин сүрөттү автоматтык түрдө c кодуна айландырат, кодду баса турган кодду эки жолу чыкылдатыңыз, андан кийин оң баскыч менен чыкылдатыңыз көчүрүү (pic3)

Кийинки Биз оң баскычты басып, жаңы текст документин түзөбүз (pic4)

жаңы документти эки жолу чыкылдатыңыз, ачылганда оң баскычын басыңыз жана кодду чаптаңыз (pic5)

Кийинкиде биз коддун чокусуна жакын линияны кошушубуз керек #include бул бизге bitmap маалыматын arduinoдогу флеш -эске сактоого мүмкүндүк берет, андан кийин биз #define туурасын, бийиктигин жана атын өзгөртүп, аларды колдонууга оңой кылып бөлүп көрсөтөбүз 6 -сүрөттө, биз аларды кокусунан пайда болгон символдордон өзгөртүп, аларды астын сызылган мисалга алмаштырабыз

#аныктоо LOGOWIDTH

#аныктоо LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

Кийинки чыкылдатуу файлын андан кийин сактоо, файлды logo.c дептерине сактоо, log.cти оң басуу жана көчүрүү баскычын басыңыз.

4 -кадам: DrawBitmap аркылуу логотипти көрсөтүү

DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү
DrawBitmap аркылуу логотипти көрсөтүү

Эми биз arduino IDE жүктөп, жаңы эскиз түзөбүз жана logoexample.ino деп аталышын сактайбыз, андан кийин arduino идедеги алдамчы катары файлдын менюсун чыкылдатып, андан кийин сактаңыз, проект папкасына кайтып келип, оң баскычын чыкылдатып.c файлына чаптаңыз. (pic2) андан кийин жокко чыгаруу баскычын чыкылдатыңыз, бул сизди файлга чаптоо үчүн папканы карап чыгуудан сактайт.

төмөнкү кодду arduino IDEге териңиз же жүктөп алыңыз.

(көчүрүү жана чаптоо эмес, терүүнү сунуштайбыз же ылдыйдагы файлдарды үйрөнүүнүн эң жакшы жолу)

#include /* бул сиз сактай турган жерге жараша өзгөрөт

ino көбүнчө C: / Users / ~ username / Documents / Arduino / project ~ папкасында

жана биз битмапка ушинтип шилтеме кылабыз */

#кошуу

#кошуу

uint8_t bmpX, bmpY = 0; /* 2 X 8 биттик бүтүн сандар үчүн резервдик эс, бизге болгону 8 биттик инт керек

мааниси эч качан 128ден (пикселден) жогору болбогондуктан, биз 8 битти колдонуп мейкиндикти үнөмдөй алабыз (255 максималдуу мааниге ээ) */

жараксыз орнотуу ()

{delay (100); // display.begin күйгүзүү үчүн дисплейге ж.б убакыт бер (SSD1306_SWITCHCAPVCC, 0x3C); // бул дисплейди баштоо үчүн.clearDisplay (); // бош экран менен баштоо}

/* бул комментарийлерди жазуунун кажети жок экенин эске алыңыз, алар шилтеме үчүн …………..

биз көңүл бура турган команда - display.drawBitmap, бул биздин экраныбызды тартат. (bmpX, бул экранда X огунун мааниси, анда битмаптын X казык чекити болот, bmpX жана bmpY - бул биз кыймылды түзүү үчүн кызыккан баалуулуктар (bmpY, Y огу экранда Y огу мааниси битмаптын чекити биз logo.c (LOGOPIC, #киргизилген файлдын ичиндеги разряддын аталышы. Бекитүүчү чекиттен келген битмап (LOGOHEIGHT), X жана Y пикселдерин туташтыруу чекитинен чекитти түшүрүү үчүн канча пикселдин төмөн (Y) түшүрүлүшү кол менен киргизилиши мүмкүн, бирок алардын бардыгын эстөөдөн көрө, алдын ала аныкталгандарды колдонуу оңой (1, акыркы мааниси түс, анткени экран моно 0 кара 1 ак. макул, кийинки саптан терүүнү баштаңыз: ¬D lol*/ void loop () {display.clearDisplay (); // экранды бошотуу // bitmap жогорку сол, x, y, bitmap аты, туурасы X, бийиктиги Y, түстүү display.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // бул чындыгында буферди дисплейге тартат}

кодуңузду жүктөп бериңиз arduino жана анын иштеп жатканын ырастаңыз (pic3).

5 -кадам: Bitmap Spriteди жылдыруу

Image
Image
Bitmap Sprite жылдыруу
Bitmap Sprite жылдыруу
Bitmap Sprite жылдыруу
Bitmap Sprite жылдыруу

мурунку көрсөтмөлөрдү колдонуп, paint.netти колдонуңуз жана 30х15 пикселдик жаңы файл жасаңыз (pic1) жана биздин жаш дизайнердин алдыңкы айнек менен башталган орой машинасын тартыңыз (2 жана 3 -сүрөттөр).

дагы бир жолу Windows bmp файлы катары сактаңыз (2 -кадамдагыдай), C разрядынын конверсиясына (3 -кадам) жана car.c файлын (же сиз чечкен нерсени) жаңы түзүлгөн arduino ino (эскиз) менен бир папкага салыңыз. файл.

(p.s. унаага #include линиясын кошууну унутпаңыз, бул бизди көп учурда кармап турчу)

Биринчиден, эквивалентиңизди car.c менен байланыштырыңыз

#кошуу

#кошуу #кошуу Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //

Adafruit_SSD1306 дисплейи (128, 64); // дисплейдин чечимин коюңуз

/* bmpX/bmpY бизге бул маанилерди өзгөртүү жана кайра тартуу сыяктуу өзгөрмөлөр керек

экран - биз кыймылдын анимация эффектин кантип жаратабыз. hitSide жана hitTop экранда спрайтты кантип сактайбыз */ uint8_t bmpX, bmpY = 0; // 2 8 биттик инт (0-255) үчүн резервдик эс тутум, бизге чоңураак кереги жок 128 эң чоң колдонулган болс hitSide = 0; bool hitTop = 0;

жараксыз орнотуу ()

{delay (100); // display.begin күйгүзүү үчүн дисплейге ж.б убакыт бер (SSD1306_SWITCHCAPVCC, 0x3C); // бул дисплейди баштоо үчүн.clearDisplay (); // бош экран менен баштоо

}

боштук цикл ()

{display.clearDisplay (); // экрандын боштугу // жогорку сол жактан тартылган битмап, x, y, разряддын аталышы, туурасы X, бийиктиги Y, түстүү display.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // бул иш жүзүндө буферди дисплейге тартат/ * мына ушинтип экрандын четин көзөмөлдөп, пикселди өйдө карай жылдыруу керекпи же жок кылабызбы (төмөндөн өйдө жылдыруу) */ switch (hitSide) // бул булонун негизинде машинанын багытын тандайт {мисал 0: bmpX ++; тыныгуу;

иши 1:

bmpX--; тыныгуу; } // бул 2 if операторлору болдун чын же жалган болсо, (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // экрандын туурасы минус машина {hitSide = 1; } // Y огу үчүн жогорудагыдай болсо, (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // экрандын бийиктиги минус машинанын бийиктиги {hitTop = 1; } switch (hitTop) {case 0: bmpY ++; тыныгуу; case 1: bmpY--; тыныгуу; }

}

тиркелген видеодо программанын иштеп жатканын көрө аласыз

6 -кадам: Айдоо оюнун жасоо

Image
Image

Биринчиден, биз үйрөткүчтүн мурунку баскычтарындагыдай 30x15 пикселди түзгөн ар кандай машиналарды же тоскоолдуктарды тартып баштайбыз. Андан кийин биз аларды c битмаптарына айландырабыз жана кодго шилтеме кылабыз.

#include // бул жолдор көз каранды болуп өзгөрүшү керек

// файлдарды сактай турган жериңиз боюнча // түзөтүү: мен // "" менен алмаштырсаңыз, толук жолду // өз китепканаларыңыз менен талап кылбай турганыңызды билдим #include

#кошуу

#кошуу #кошуу

#кошуу

#кошуу // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //

Adafruit_SSD1306 дисплейи (128, 64); // дисплейдин параметрлерин аныктоо

өзгөрмөлөрдү жана туруктуу баалуулуктарды аныктоо

// кирүү казыктарын аныктаңыз, бул алар эч качан өзгөрбөйт ардуинодогу казыктар #аныктоо #INTPIN 3тү аныктоо // 2 жана 3 -казыктар UNOдо интерпупт казыктары болушу мүмкүн #UPPIN 4ти аныктоо // бул түйүндөр тиешелүү туташтыргыч менен байланышкан #аныктоо DWNPIN 5 #define LFTPIN 6 #RHTPIN 7ди аныктоо #SND 9ду аныктоо // багыттарды аныктоо

#define DIRUP 1 // бул баалуулуктарды "жылан" чечүү үчүн карайт-

#DIRDOWN 2ди аныктоо // жылан кайсы багытта бара тургандыгын аныктоо #DIRLEFT 3 #аныктоо DIRRIGHT 4

uint8_t dirPressed = 0; // мааниси кайсы пин жогору көтөрүлүү үчүн багытты каттоого

// логикалык дүкөн кайсы пин жогору кетти

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // машинанын абалы үчүн vars 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;

// душман үчүн vars0

uint8_t душман0PosX = 255; uint8_t душман0PosY = 0; uint8_t душман1PosX = 255; uint8_t душман1PosY = 0; uint8_t душман2PosX = 255; uint8_t душман2PosY = 0;

// varialble туш келди тоскоолдуктарга тилкенин санын дайындоо

uint8_t laneGen = 0;

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

// балл эсептегич

узун упай = 0; // бул упай:/ lol long салыштыруу = 0; // бул баллды акыркы деңгээлде сактайт, аны кайра жогорку highScore = 25 менен салыштырууга болот; uint8_t metreCnt = 0;

бул жерде биз функцияларды баштайбыз

// бул буйруктардын жыйындысы, эгерде үзгүлтүк иштетилсе void interruptressed () {delay (150); updateDirection (); } // DIR болорун текшерүү менен var маанисиндеги кайсы маанини жаңыртуу // ----------------------------- UPDATE DIRECTION (оюнчу)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); if (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- МАШИНА КӨЧҮРҮҮ --------------- -------------------------

// бул унаа спрайтынын кыймылдаткычын экранды жаңыртат

жараксыз moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; тон (SND, 100, 100); if (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY өйдө"); // Serial.println (carPosYCnt); тыныгуу; case DIRDOWN: carPosYCnt ++; тон (SND, 100, 100); if (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; тыныгуу; // комментарий берген унаа солго жана оңго сүзүлө алат, бирок анча жакшы эмес /* учурда DIRLEFT: carPosX--; if (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; тыныгуу; */ case DIRRIGHT: // жөн гана көңүл ачуу үчүн, эгер сиз оң бассаңыз, оюн ызы -чуу чыгарат (SND, 100, 50); // carPosX ++; // эгер (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; тыныгуу; } updateDisplay (); }

// -------------------------- 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[laneVal]); кайтуу (lanePosArr [laneVal]); }// ------------------------------- ОЮН ЫКЧАМДЫГЫН ЖӨНДӨТҮҮ -------------- -------------- жараксыз setGameSpeed () // бул 20дан жогору деңгээлди токтотуп, оюнду ойнотулбайт {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ CRASH ---------- ----------------------- void detectCrash () {

эгерде (душман0PosX = 0 && dush0PosY == carYTmp)

{// Serial.println ("Оюн үстүнөн CRAASSSSHHHHHHEEEDDD трафикке 0"); оюн бүттү(); } if (dushman1PosX = 0 && dush1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD into Traffic 1 "); оюн бүттү(); } if (душман2PosX = 0 && dushman2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD into Traffic 2 "); оюн бүттү(); }}

бул дисплейди тарткан тартиптер.

// ------------------------------- ТАРТУУ ЖОЛУ --------------- --------------------- жараксыз drawRoad () // X, Y, узундугу, туурасы {display.fillRect (roadLineX1, 15, 30, 4, АК); display.fillRect (roadLineX1, 30, 30, 4, АК); display.fillRect (roadLineX1, 45, 30, 4, АК); display.fillRect (roadLineX2, 15, 30, 4, АК); display.fillRect (roadLineX2, 30, 30, 4, АК); display.fillRect (roadLineX2, 45, 30, 4, АК); display.fillRect (roadLineX3, 15, 30, 4, АК); display.fillRect (roadLineX3, 30, 30, 4, АК); display.fillRect (roadLineX3, 45, 30, 4, АК); display.fillRect (roadLineX4, 15, 30, 4, АК); display.fillRect (roadLineX4, 30, 30, 4, АК); display.fillRect (roadLineX4, 45, 30, 4, АК); display.fillRect (roadLineX5, 15, 30, 4, АК); display.fillRect (roadLineX5, 30, 30, 4, АК); display.fillRect (roadLineX5, 45, 30, 4, АК);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- ЧЫККЫН КЛИЗМДЕР ---- --------------------------------------- боштондук enemysDraw () {// X, Y, bmp аты, туурасы, бийиктиги, түс дисплейи.drawBitmap (душман0PosX, dushman0PosY, ДУШМАН0, ДУШМАНДЫК_КЕНДИГИ, ДУШМАНЫ_ЖОГОРУ, 1); душман0PosX = душман0PosX-drawSpeed; display.drawBitmap (dushman1PosX, dushman1PosY, ДУШМАН1, ДУШМАН1_ВЕНТИ, ДУШМАНЫ1_ЖОГОРУЛУГУ, 1); dushman1PosX = dushman1PosX-drawSpeed; display.drawBitmap (душман2PosX, душман2Посы, ДУШМАН2, ДУШМАН2_ВИДИ, ДУШМАН2_ЖОГОРУ, 1); dushman2PosX = dushman2PosX-drawSpeed; display.display (); эгер (душман0PosX> 231 && душман0PosX231 && душман1ПосХ <255) {dush1PosX = randomPosX (); dushman1PosY = randomPosY (); checkDuplicate (); }

эгер (dushman2PosX> 231 && dush2PosX <255) {dush2PosX = randomPosX (); душман2PosY = randomPosY (); }} // ------------------------------------ КӨРСӨТҮҮ ДИПЛЕЙСИ -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, BLACK); display.setCursor (100, 0); display.setTextColor (АК, КАРА); display.println (балл); display.display ();

}

// ------------------------- пресс циклин күт ------------------- ------

// бул үй экранынын жараксыз күтүү күтүүчүForPress () {splashScreen (); bool күтүү = 0; // цикл бул чыныгы display.clearDisplay () болгондо бүтөт. while (күтүү == 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, АК); // чек Snake display.drawRect (19, 20, 90, 33, АК); // чек куту - 3 display.setCursor (25, 43); display.setTextSize (0); // кадимки дисплейге кайтып шрифт.println ("каалаган баскычты басыңыз"); display.fillRect (0, 0, 127, 8, КАРА); display.setCursor (10, 0); display.print ("Жогорку упай:"); // жогорку баллды көрсөтүү display.print (highScore); display.display (); күтүү = digitalRead (INTPIN); // баскыч басылганда күтүү 1 аягына чейин өзгөрөөрүн текшерүү dirPressed = 0; // баштапкы абалга келтирүү баскычы эч жакка баспайт}} // -------------------------------------- ----- ОЮНДУ UPDATE ----------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // dushman1Draw (); // душман2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // ар бир 10 циклге упай кошуу үчүн упай кошот {metreCnt = 0; балл ++; } эгер (упай == салыштыруу+5) // оюнду ар бир 5 упайдан 20 ылдамдыкка чейин тездетет {салыштыруу = упай; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ ОЮН БҮТТҮ---------------- ------------------------------

// бул көнүмүш өлгөн баатыр машинанын тегерегин сызып, оюнду экранда көрсөтөт

void gameOver ()

{тон (SND, 200, 200); // үндү ойнот uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // машинаны тегерете кутучаларды тартуу үчүн vars коюңуз linePosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 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 ("ОЮН"); display.display (); кечигүү (500); тон (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); кечигүү (3000); restartGame (); waitForPress (); }

// ----------------------------------------- Оюнду кайра баштоо ----- -------------------------------------------------- -----

void restartGame () // бул жогорку баллды көчүрөт жана бардык статистиканы баштапкы абалга келтирет жана туш келди позицияларды түзөт

{if (score> = highScore) // жогорку упайдан жогору болгонун текшериңиз {highScore = score; // жогорку баллды жаңыртуу үчүн эгер жалгыз болсо}

балл = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; душман0PosX = randomPosX (); душман0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = randomPosY (); душман2PosX = randomPosX (); душман2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -Текшерүү кайталанат ----------------------------------------------- ------ void checkDuplicate () // булар тоскоолдуктар бир эле оюн мейкиндигин ээлеп турганын текшерет {// Serial.println ("дубликат текшерилет"); if (dushman2PosX> 230 && dush2PosX <255) {while (dushman2PosY == dushman1PosY || dush2PosY == dushman0PosY) {dush2PosY = randomPosY (); }}

эгер (душман0PosX> 230 && душман0PosX230 && душман2PosXenemy1PosX && душман2PosX230 && душман0PosXenemy1PosX && душман0PosX

// ------------------------------------------- SPLASH ЭКРАНЫ --- --------------------------------

бош splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHIGHT, 1); display.display (); кечигүү (2000); } // ----------------------------------------------- ЖАЙГАШУУ ------------------------------------------------- ----------- void setup () {delay (100); // нерселер башталсын // Serial.begin (9600); // бул жана бардык Сериалга комментарий бербеңиз. ката диаграммасы үчүн буйруктар display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (АК, КАРА); display.setTextWrap (жалган); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), interruptressed, RISING);

// туш келди тоскоолдуктарды жайгаштыруу dushman0PosX = randomPosX (); душман0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = randomPosY (); душман2PosX = randomPosX (); душман2PosY = randomPosY (); checkDuplicate (); // кайталанган жерлерди текшерүү // Serial.println ("орнотуу аяктады"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- Цикл -------------------------------------------- ----------

боштук цикл ()

{updateGame (); }

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

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