Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері: 6 қадам
Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері: 6 қадам
Anonim
Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері
Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері
Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері
Абайсыз Racer Arduino OLED ойыны, AdafruitGFX және Bitmaps негіздері

Бұл оқулықта біз Adafruit_GFX.c кітапханасының көмегімен нүктелік кескіндерді ойынның спрайт түрі ретінде қалай қолдану керектігін қарастырамыз. Біз ойлаған ең қарапайым ойын - бұл айналмалы жолақты ауыстыратын автокөлік ойыны, ақырында біздің бета -тестер мен кодердің көмекшісі «абайсыз жарысушы» атауын қабылдады, өйткені ол автокөлік жолымен дұрыс емес жолмен жүруге өте ұқыпсыз !!

Біздің схеманың дизайны жоғарыда келтірілген суреттерде берілген және біздің соңғы жобада/оқулықта схеманың қалай жұмыс істейтінін сипаттайтын 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 етіп орнатыңыз (бірінші суретті қараңыз), егер сізде жаңа бет болса, қарындашпен қара және ақ түстің тек 2 түсі бар экрандағы экранды салыңыз. құрал (сурет2), экрандағы суретті салған кезде (немесе жапсырғанда) суретті нұқыңыз, содан кейін оның өлшемін өзгертіңіз (сурет4), қалқымалы терезеде өлшемді 1260x620 -дан 126x62 -ге дейін өзгертіңіз (pic5) OK түймесін басыңыз.

содан кейін Файл мәзірін нұқыңыз, содан кейін сақтау (pic6).

ашылмалы мәзірде қалқымалы файлдар пайда болған кезде BMP (нүктелік кескін) таңдаңыз. (pic7), файл атауын теріңіз және сақтау түймесін басыңыз, қалқымалы терезе 0 -ге және 8 -биттікке орнатылған кезде, OK түймесін басыңыз (pic8)).

3 -қадам: BMP файлын C нүктелік картасына түрлендіру

BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру
BMP файлын C нүктелік картасына түрлендіру

Енді біз өз суретімізді arduino түсінетін форматқа айналдыруымыз керек, бұл үшін көптеген құралдар бар, бірақ менің «баруым» marlin веб -торабының нүктелік кескінді түрлендіру құралы …

marlinfw.org/tools/u8glib/converter.html

Сондықтан біз бұл бөлімді 1 -суретте көрсетілген веб -сайтты ашу үшін жоғарыдағы сілтеме арқылы бастаймыз

файлды таңдау түймесін басып, бұрын жасаған нүктелік кескінді таңдаңыз (pic2)

marlin нүктелік кескін түрлендіргіші сіздің суретті автоматты түрде c кодына түрлендіреді, сол кезде кодты ерекшелейтін кодты екі рет шертіңіз, содан кейін тінтуірдің оң жақ түймешігімен нұқыңыз және көшіруді басыңыз (pic3)

келесі Біз тінтуірдің оң жақ батырмасын шертеміз және жаңа мәтіндік құжатты жасаймыз (pic4)

жаңа құжатты екі рет нұқыңыз, ашылғанда тінтуірдің оң жақ түймешігімен басып, кодты қойыңыз (pic5)

Келесіде біз #include кодының жоғарғы жағына жолды қосуымыз керек, бұл нүктелік кескін деректерін arduino флэш -жадына сақтауға мүмкіндік береді, содан кейін біз ені, биіктігі мен атауын анықтаймыз, оларды қолдануды жеңілдетеміз. 6 суретте, біз оларды кездейсоқ генерациялайтын кейіпкерлердің атауынан төмендегі асты сызылған мысалға өзгертеміз

#LOGOWIDTH анықтаңыз

#LOGOHEIGHT анықтаңыз

const unsigned char LOGOPIC PROGMEM

келесі файлды нұқыңыз, содан кейін сақтаңыз, файлды logo.c ретінде сақтаңыз, блокнотты жабыңыз, logo.c түймесін тінтуірдің оң жақ түймесімен басып, көшіру түймесін басыңыз.

4 -қадам: 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 максималды мәні бар) арқылы орынды үнемдей аламыз */

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

{кешіктіру (100); // дисплейге және т.б. дисплейге қосылуға уақыт беріңіз.begin (SSD1306_SWITCHCAPVCC, 0x3C); // бұл дисплейді инициализациялау үшін.clearDisplay (); // бос экраннан бастаңыз}

/* бұл түсініктемелерді сілтеме ретінде жазудың қажеті жоқ екенін ескеріңіз. …………..

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

Сізге arduino кодын жүктеп, оның жұмыс істейтінін растаңыз (pic3).

5 -қадам: Bitmap Sprite жылжыту

Image
Image
Нүктелік картаның спритін жылжыту
Нүктелік картаның спритін жылжыту
Нүктелік картаның спритін жылжыту
Нүктелік картаның спритін жылжыту

Бұрынғы нұсқауларды қолдана отырып, paint.net пайдаланыңыз және 30x15 пиксельге жаңа файл жасаңыз (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 ең үлкен қолданылған сан bool hitSide = 0 болады; bool hitTop = 0;

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

{кешіктіру (100); // дисплейге және т.б. дисплейге қосылуға уақыт беріңіз.begin (SSD1306_SWITCHCAPVCC, 0x3C); // бұл дисплейді инициализациялау үшін.clearDisplay (); // бос экраннан бастаңыз

}

бос цикл ()

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

1 -жағдай:

bmpX-; үзіліс; } // осы 2 if операторлары болды шын немесе жалған деп орнатса if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // экранның ені минус машинадан {hitSide = 1; } // Y осі үшін жоғарыдағыдай, егер (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // экран биіктігі минус автомобиль биіктігі {hitTop = 1; } switch (hitTop) {0 жағдай: bmpY ++; үзіліс; 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 #LFTPIN 6 анықтау #RHTPIN 7 анықтау #SND 9 анықтау // бағыттарды анықтау

#dIRine DIRUP 1 // бұл мәндерді «жылан» шешеді.

#DIRDOWN 2 -ді анықтаңыз // жылан қай бағытта жүретінін анықтаңыз #DIRLEFT 3 -ті анықтаңыз #DIRRIGHT 4 -ті анықтаңыз

uint8_t dirPressed = 0; // мәні қай түйреуіш жоғары көтерілгенін жылжыту үшін бағытты тіркеу үшін

// логикалық дүкен, қай түйреуіш жоғары көтерілгенін

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // машинаның орнына uars8_t carPosX = 1 үшін vars; 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 dushman1PosY = 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 мәнінде болатын қандай мәнді жаңартыңыз // ----------------------------- ЖАҢАРТУ БАҒЫТЫ (ойнатқыш)- ------------------------- жарамсыз updateDirection () {//Serial.println( updateDirection шақырылды «); 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); егер (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println («carPosY жоғары»); // 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; үзіліс; */ 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 () {

егер (dushman0PosX = 0 && dush0PosY == carYTmp)

{// Serial.println («0 трафикке CRAASSSSHHHHHHEEEDDD арқылы ойын»); ойын аяқталды(); } if (душман1PosX = 0 && dush1PosY == carYTmp) {//Serial.println("Ойын 1 -ші трафикте CRAASSSSHHHHHHEEEEDDD арқылы өтеді «); ойын аяқталды(); } if (душман2PosX = 0 && dush2PosY == carYTmp) {//Serial.println("Game over CRAASSSSHHHHHHEEEEDDD 2 трафикте «); ойын аяқталды(); }}

бұл дисплейді сызатын әдеттер.

// ------------------------------- ТАРТУ ЖОЛЫ --------------- --------------------- drawRoad () // X, Y, ұзындығы, ені {display.fillRect (roadLineX1, 15, 30, 4, WHITE); 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, WHITE); display.fillRect (roadLineX3, 30, 30, 4, WHITE); 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, WHITE); 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 атауы, ені, биіктігі, түсі display.drawBitmap (dushman0PosX, dushman0PosY, ДУШМАН0, ДУШМАН0_WIDTH, ЕНЕМІ0_ЖОҒАРЫ, 1); dushman0PosX = dushman0PosX-drawSpeed; display.drawBitmap (dushman1PosX, dushman1PosY, ЖАУЫМ1, ЖАУЫМДЫҢ_ЖАҒЫНДЫҒЫ, ЖАУЫМДЫҒЫ_БІРІ, 1); dushman1PosX = dushman1PosX-drawSpeed; display.drawBitmap (dushman2PosX, dushman2PosY, ДУШМАН2, ЖАУЫМДЫҚ_2, ЕҢІМ2_БЕЙІН, 1); dushman2PosX = dushman2PosX-drawSpeed; display.display (); егер (душман0PosX> 231 && dush0PosX231 && dushman1PosX <255) {dush1PosX = randomPosX (); dushman1PosY = randomPosY (); checkDuplicate (); }

if (dushman2PosX> 231 && dush2PosX <255) {dush2PosX = randomPosX (); dushman2PosY = randomPosY (); }} // ------------------------------------ ДИСПЛЕЙДІ ЖАҢАРТУ -------- ---------------------------------------- жарамсыз updateDisplay () {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 ();

}

// ------------------------- басу циклін күтіңіз ------------------- ------

// бұл бастапқы экрандағы код void waitForPress () {splashScreen (); bool күту = 0; // цикл бұл шындық болғанда аяқталады display.clearDisplay (); уақыт (күту == 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); // border Snake display.drawRect (19, 20, 90, 33, WHITE); // жиек терезесі - 3 display.setCursor (25, 43); display.setTextSize (0); // қаріп қалыпты display.println -ге оралады («кез келген пернені басыңыз»); display.fillRect (0, 0, 127, 8, ҚАРА); display.setCursor (10, 0); display.print («Жоғары балл:»); // жоғары баллды көрсетуді көрсету.print (highScore); display.display (); күту = digitalRead (INTPIN); // dirPressed = 0 кезінде перне басылған күту 1 аяқталуға ауысатынын тексеріңіз. // қалпына келтіру батырмасын бағытсыз басыңыз}} // -------------------------------------- ----- ОЙЫНДЫ ЖАҢАРТУ ----------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // dushman1Draw (); // dushman2Draw (); 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; ені = 30; пиксель = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); for (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); restartGame (); waitForPress (); }

// ---------------------------------------- Ойынды қайта бастау ----- -------------------------------------------------- -----

void restartGame () // бұл жоғары баллды көшіреді және барлық статистиканы қалпына келтіреді және кездейсоқ позицияларды жасайды

{if (score> = highScore) // баллдың жоғарыдан жоғары екенін тексеріңіз {highScore = балл; // жоғары баллды жаңартуға арналған жалғыз статистика}

балл = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; dushman0PosX = randomPosX (); dushman0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = randomPosY (); dushman2PosX = randomPosX (); dushman2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -ТЕКСЕРУДІ ТЕКСЕРУ ----------------------------------------------- ------ void checkDuplicate () // бұл кедергілер бір ойын кеңістігін алатынын тексереді {// Serial.println («қайталануы тексерілген»); if (dushman2PosX> 230 && dush2PosX <255) {while (dushman2PosY == dushman1PosY || dush2PosY == dushman0PosY) {dush2PosY = randomPosY (); }}

if (душман0PosX> 230 && dush0PosX230 && dushman2PosXenemy1PosX && dushman2PosX230 && dushman0PosXenemy1PosX && dushman0PosX

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

void 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), үзіліссіз, RISING);

// кездесулерді кездейсоқ орналастыру dushman0PosX = randomPosX (); dushman0PosY = randomPosY (); dushman1PosX = randomPosX (); dushman1PosY = randomPosY (); dushman2PosX = randomPosX (); dushman2PosY = randomPosY (); checkDuplicate (); // қайталанатын орындарды тексеру // Serial.println («Орнату аяқталды»); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- Цикл -------------------------------------------- ----------

бос цикл ()

{updateGame (); }

және бұл өте маңызды, кез келген өзгертулер мен пікірлер құпталады. Экранның жыпылықтауын шешу үшін біз оны қалай азайту керектігін қарастыруымыз керек және жау машиналары әлі де сол кеңістікті алады.

Ұсынылған: