Безразсъдният Racer Arduino OLED игра, AdafruitGFX и растерни основи: 6 стъпки
Безразсъдният Racer Arduino OLED игра, AdafruitGFX и растерни основи: 6 стъпки
Anonim
Безразсъдна Racer Arduino OLED игра, AdafruitGFX и растерни основи
Безразсъдна Racer Arduino OLED игра, AdafruitGFX и растерни основи
Безразсъдна Racer Arduino OLED игра, основи на AdafruitGFX и растерни карти
Безразсъдна Racer Arduino OLED игра, основи на AdafruitGFX и растерни карти

В този урок ще разгледаме как да използваме растерни изображения, използвайки библиотеката Adafruit_GFX.c като вид спрайтове в игра. Най -простата игра, за която можем да се сетим, е играта за смяна на лента за странично превъртане, в крайна сметка нашият бета тестер и помощник кодиращият се решиха на „Reckless Racer“като име, тъй като е доста безразсъдно да карате по грешен път по магистралата !!.

Дизайнът на нашата верига е на снимките, включени по -горе и е подробно описан в последния ни проект/урок тук Snake Instructables, който описва как работи схемата.

ще изискваме

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

и моля, разгледайте урока Snake за останалото оборудване.

Консумативи

Игра на змия

Стъпка 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 цвята черно и бяло с помощта на молив инструмент (pic2), когато сте нарисували (или сте поставили) изображението на началния екран, щракнете върху изображението, след което променете размера (image4), в изскачащия прозорец променете размера от 1260x620 на 126x62 (2 пиксела по -малък от вашия дисплей) (pic5) Щракнете върху OK.

След това щракнете върху меню Файл, след което запишете като (pic6).

когато изскачащият прозорец се появи в падащото меню тип файл, изберете BMP (растерна карта). (pic7), въведете името на файла и щракнете върху запис, когато изскачащият прозорец се появи, зададен на 0 и 8 бита, щракнете върху OK (pic8).

Стъпка 3: Конвертиране на BMP в C растерни файлове

Конвертиране на 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, което ни позволява да запишем растерните данни във флаш паметта на arduino, след което преименуваме #define ширина, височина и име на нещо по -лесно за използване, те са маркирани на снимка 6, преименуваме ги от произволно генерираните знаци, преименуваме ги на подчертания пример по -долу

#дефинирайте LOGOWIDTH

#дефинирайте LOGOHEIGHT

const unsigned char LOGOPIC ПРОГМЕТА

следващо щракване върху файл, след което запишете като, запазете файла като logo.c затворете бележника, щракнете с десния бутон върху logo.c и щракнете върху копиране.

Стъпка 4: Показване на ЛОГО с помощта на DrawBitmap

Показване на ЛОГО с помощта на DrawBitmap
Показване на ЛОГО с помощта на DrawBitmap
Показване на ЛОГО с помощта на DrawBitmap
Показване на ЛОГО с помощта на DrawBitmap
Показване на ЛОГО с помощта на DrawBitmap
Показване на ЛОГО с помощта на DrawBitmap

Сега зареждаме arduino IDE и създаваме нова скица и я запазваме с име logoexample.ino, след това като измама в arduino ide щракнете върху менюто на файла, след което запишете като, върнете се в папката на проекта с десния бутон и поставете във.c файла (pic2) след това щракнете върху Cancel, това ви спестява необходимостта да прегледате папката, за да я поставите във файла.

въведете следния код в arduino IDE или изтеглете в ino.

(препоръчваме да пишете, вместо да копирате и поставяте или да използвате файловете под него, това е най -добрият начин да научите)

#include /* това ще варира в зависимост от това къде съхранявате

ino обикновено в папката C: / Users / ~ username / Documents / Arduino / project ~ name

и по този начин се свързваме с нашата растерна карта */

#включва

#включва

uint8_t bmpX, bmpY = 0; /* резервирайте памет за 2 X 8 битови числа, имаме нужда само от 8 битови числа

тъй като стойността никога не е по -висока от 128 (пиксела), така че можем да спестим място, използвайки 8 -битови числа (което има максимална стойност от 255) */

void setup ()

{забавяне (100); // даваме на дисплея и т.н. време за включване на display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // това е за инициализиране на дисплея display.clearDisplay (); // започнете с празен екран}

/* Моля, обърнете внимание, че не е нужно да въвеждате тези коментари, те са за справка …………..

командата, върху която ще се съсредоточим, е display.drawBitmap, това е, което привлича нашия начален екран. (bmpX, е стойността на оста X на екрана, където ще бъде точката на котва X на растерното изображение, а bmpX и bmpY са стойностите, от които се интересуваме, за да създадем движение (bmpY, е стойността на оста Y на екрана, където Y котвата точката на растерната карта ще бъде, че получаваме референтните имена, както ги дефинирахме в logo.c (LOGOPIC, е името на растерната снимка в #included файла logo.c (LOGOWIDTH, е колко пиксела през (X) да нарисуваме растерна картина от точката на закрепване (LOGOHEIGHT, е колко пиксела надолу (Y) за изтегляне на растерното изображение от точката на закрепване пикселите X и Y могат да се въведат ръчно, но е по -лесно да се използват предварително зададените, отколкото да се запомнят всички (1, последната стойност е цветът, тъй като екранът е моно 0 черен 1 бял. добре започнете да пишете от следващия ред: ¬D lol*/ void loop () {display.clearDisplay (); // празен екран // растерно изображение, изтеглено от горе вляво, x, y, name of bitmap, width X, height Y, color display.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // това всъщност привлича буфера към дисплея някога}

качете кода си arduino и потвърдете, че работи (pic3).

Стъпка 5: Преместване на растерна спрайт

Image
Image
Преместване на растерна справка
Преместване на растерна справка
Преместване на растерна справка
Преместване на растерна справка

използвайки по -ранните инструкции използвайте paint.net и направете нов файл с размер 30x15 пиксела (pic1) и нарисувайте груба кола, която нашият млад дизайнер започва първо с предното стъкло (снимки 2 и 3).

отново го запишете като bmp файл на windows (както в стъпка 2), конвертирайте в C растерна карта (стъпка 3) и поставете файла car.c (или каквото и да решите) в същата папка като новосъздадения arduino ino (скица) файл.

(p.s. не забравяйте да добавите реда #include в car.c, който често ни измъчваше)

Първо свържете вашия еквивалент на car.c

#включва

#include #include 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 бита ints (0-255), не се нуждаем от по-големи 128 ще бъде най-голямото количество използвано bool hitSide = 0; bool hitTop = 0;

void setup ()

{забавяне (100); // даваме на дисплея и т.н. време за включване на display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // това е за инициализиране на дисплея display.clearDisplay (); // започваме с празен екран

}

void loop ()

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

случай 1:

bmpX--; прекъсване; } // тези 2 if инструкции задават bool на true или false if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // ширината на екрана минус колата {hitSide = 1; } // същото като по -горе за оста Y ако (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // височина на екрана минус височината на колата {hitTop = 1; } превключвател (hitTop) {случай 0: bmpY ++; прекъсване; случай 1: bmpY--; прекъсване; }

}

можете да видите програмата, работеща във видеото, приложено

Стъпка 6: Създаване на игра за шофиране

Image
Image

Първо започваме с рисуване на няколко различни коли или препятствия, както в по -ранните етапи на урока, като ги правим 30x15 пиксела. След това ги преобразуваме в c растерни карти и ги свързваме в кода.

#include // тези пътища ще трябва да се променят в зависимост

// на мястото, където съхранявате файловете // редактирам: току -що разбрах, ако замените // с "", не се нуждаете от пълния път // със собствените си библиотеки #include

#включва

#включи #включи

#включва

#include // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //

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

дефинирайте променливите и фиксираните стойности

// дефинирайте входни пинове, това са щифтовете на arduino, които никога не променят, така че #define #define INTPIN 3 // само щифтове 2 и 3 могат да бъдат прекъсващи щифтове на UNO #дефинирайте UPPIN 4 // това са щифтове, свързани към съответния превключвател #дефинирайте DWNPIN 5 #дефинирайте LFTPIN 6 #дефинирайте RHTPIN 7 #дефинирайте SND 9 // дефинирайте упътвания

#define DIRUP 1 // тези стойности е това, което "змията" гледа, за да реши-

#define DIRDOWN 2 // посоката, в която ще се движи змията #define DIRLEFT 3 #define DIRRIGHT 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; // това е резултатът:/ хаха дълго сравнение = 0; // това съхранява резултата на последното ниво нагоре, за да се сравни с дълъг highScore = 25; uint8_t metreCnt = 0;

от тук започваме функциите

// това е набор от команди, ако прекъсването е активирано void interruptressed () {забавяне (150); updateDirection (); } // актуализира коя стойност е в посока var, като проверява DIR буловете // -------------------------- 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; }

}

// ------------------------------- ДВИЖЕТЕ КОЛА --------------- -------------------------

// това ще актуализира екрана движещия автомобила спрайт

void 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); прекъсване; калъф DIRDOWN: carPosYCnt ++; тон (SND, 100, 100); if (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 ++; // if (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(" случайно 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]); return (lanePosArr [laneVal]); }// ------------------------------- ЗАДАВАЙТЕ СКОРОСТТА НА ИГРАТА -------------- -------------- void setGameSpeed () // това спира нивото да надвишава 20, което прави играта невъзможна за игра {if (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ------------------------------------ ДЕТЕКТИРАНЕ НА СРЕДСТВА ---------- ----------------------- void detectionCrash () {

ако (враг0PosX = 0 && враг0PosY == carYTmp)

{// Serial.println ("Игра над CRAASSSSHHHHHHEEEEDDD в трафик 0"); играта приключи(); } if (враг1PosX = 0 && враг1PosY == carYTmp) {//Serial.println(" Игра над CRAASSSSHHHHHHEEEDDD в трафик 1 "); играта приключи(); } if (враг2PosX = 0 && враг2PosY == carYTmp) {//Serial.println(" Игра над CRAASSSSHHHHHHEEEDDD в трафик 2 "); играта приключи(); }}

това са рутините, които рисуват дисплея.

// ------------------------------- ЧЕРТЕН ПЪТ --------------- --------------------- void 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, БЯЛ); 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 (); } // ----------------------------------------- ИЗВЪРШЕТЕ врагове ---- --------------------------------------- невалиден врагDraw () {// X, Y, bmp име, ширина, височина, цветен дисплей.drawBitmap (враг0PosX, враг0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); враг0PosX = враг0PosX-drawSpeed; display.drawBitmap (враг1PosX, враг1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); враг1PosX = враг1PosX-drawSpeed; display.drawBitmap (враг2PosX, враг2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); враг2PosX = враг2PosX-drawSpeed; display.display (); ако (враг0PosX> 231 && враг0ПосX231 && враг1ПоСХ <255) {враг1ПосХ = случаенПоСХ (); враг1PosY = randomPosY (); checkDuplicate (); }

if (враг2PosX> 231 && враг2PosX <255) {враг2PosX = randomPosX (); враг2PosY = randomPosY (); }} // ------------------------------------ АКТУАЛИЗИРАНЕ НА ЕКРАНА -------- ---------------------------------------- void 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 (); 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 ("Racer"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r r display display.drawRoundRect (21, 21, 86, 23, 4, БЯЛ); // граничен змийски дисплей.drawRect (19, 20, 90, 33, БЯЛ); // гранично поле - 3 display.setCursor (25, 43); display.setTextSize (0); // шрифт обратно към нормален display.println ("натиснете произволен клавиш"); display.fillRect (0, 0, 127, 8, ЧЕРЕН); display.setCursor (10, 0); display.print ("Най -висок резултат:"); // показва най -високия дисплей display.print (highScore); display.display (); чакане = digitalRead (INTPIN); // проверяваме дали натиснатият клавиш при изчакване ще се промени на 1, завършващ, докато dirPressed = 0; // бутон за нулиране натиснете без посока}} // -------------------------------------- ----- АКТУАЛИЗИРАНА ИГРА ----------------------------------------- невалидна актуализация на играта () {moveCar (); drawRoad (); neprijaysDraw (); // враг1Draw (); // враг2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // добавя точка за всеки 10 цикъла, за да увеличи резултата {metreCnt = 0; оценка ++; } if (score == compare+5) // ускорява играта на всеки 5 точки до максимум 20 speed {compare = score; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ ИГРАТА ПРИКЛЮЧИ---------------- ------------------------------

// тази рутина очертава линиите около мъртвата кола -герой, след което показва играта на екрана

void gameOver ()

{тон (SND, 200, 200); // възпроизвеждане на звук uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // задаваме vars за рисуване на кутии около car linePosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, БЯЛ); display.display (); for (int i = 0; i <= 26; i ++) // това заобикаля автомобила в правоъгълници, симулиращи експлозия {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth+4; pixheight = pixheight+4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, БЯЛ); 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 ("НАД"); display.setTextSize (0); display.display (); забавяне (3000); restartGame (); waitForPress (); }

// ----------------------------------------- ИГРА ЗА РЕСТАРТИРАНЕ ----- -------------------------------------------------- -----

void restartGame () // това копира висок резултат и нулира всички статистики и генерира случайни позиции

{if (score> = highScore) // проверете дали резултатът е по -висок от high score {highScore = score; // единичен, ако статията за актуализиране на висок резултат}

резултат = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; враг0PosX = randomPosX (); враг0PosY = randomPosY (); враг1PosX = randomPosX (); враг1PosY = randomPosY (); враг2PosX = randomPosX (); враг2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ -ПРОВЕРЯВАЙТЕ ДУБЛИКАТА ----------------------------------------------- ------ void checkDuplicate () // те проверяват дали препятствията заемат едно и също пространство на играта {// Serial.println ("дубликат проверен"); if (враг2PosX> 230 && враг2PosX <255) {докато (враг2PosY == враг1PosY || враг2PosY == враг0PosY) {враг2PosY = randomPosY (); }}

ако (враг0PosX> 230 && враг0PosX230 && враг2PosXenemy1PosX && враг2PosX230 && враг0PosXenemy1PosX && враг0PosX

// ------------------------------------------- ЕКРАН ЗА ПРОТИВАНЕ --- --------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); забавяне (2000); } // ----------------------------------------------- НАСТРОЙВАМ ------------------------------------------------- ----------- пусто настройка () {забавяне (100); // оставяме нещата да стартират // Serial.begin (9600); // разкоментирайте този и всички серийни. команди за показване на диагностика на грешки.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (БЯЛ, ЧЕРЕН); display.setTextWrap (false); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), прекъснат, RISING);

// произволно поставяне на препятствия враг0PosX = randomPosX (); враг0PosY = randomPosY (); враг1PosX = randomPosX (); враг1PosY = randomPosY (); враг2PosX = randomPosX (); враг2PosY = randomPosY (); checkDuplicate (); // проверка за дублиращи се местоположения // Serial.println ("настройката е завършена"); splashScreen (); waitForPress (); } // ----------------------------------------------- ----- LOOP -------------------------------------------- ----------

void loop ()

{updateGame (); }

и това е почти всичко, всички модификации и обратна връзка ще бъдат добре дошли. Проблемите, които трябва да разрешим трептенето на екрана, трябва да разгледаме как да го намалим и вражеските коли все още могат да заемат същото пространство.

Препоръчано: