Мазмуну:
- Жабдуулар
- 1 -кадам: Paint.netти орнотуу
- 2 -кадам: Жөнөкөй экранды тартуу
- 3 -кадам: BMPди C Bitmap Файлына айландыруу
- 4 -кадам: DrawBitmap аркылуу логотипти көрсөтүү
- 5 -кадам: Bitmap Spriteди жылдыруу
- 6 -кадам: Айдоо оюнун жасоо
Video: Reckless Racer Arduino OLED оюну, AdafruitGFX жана Bitmaps негиздери: 6 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:38
Бул үйрөткүчтө биз Adafruit_GFX.c китепканасын колдонуп, битмаптарды оюндун спрайт түрү катары кантип колдонууну карап чыгабыз. Биз ойлогон эң жөнөкөй оюн - бул капталдын жылдыруучу тилкесин алмаштыруучу унаа оюну, акырында биздин бета -тестерибиз жана кодерибиздин жардамчысы "Reckless Racer" деген ат менен чечим чыгарды, анткени ал автожолдун туура эмес жолуна түшүп кетүү үчүн өтө этиятсыз !!
Биздин схеманын дизайны жогоруда көрсөтүлгөн сүрөттөрдө жана биздин акыркы долбоорубузда/окуу куралыбызда схеманын кантип иштээрин сүрөттөгөн Snake Instructables деталдуу түрдө көрсөтүлгөн.
талап кылабыз
Adafruit_GFX
Paint.net
Arduino IDE windowslinux
жана калган жабдыктар үчүн Жыландын окуу куралын карап көрүңүз.
Жабдуулар
Жылан оюну
1 -кадам: 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 Файлына айландыруу
Эми биз өзүбүздүн сүрөтүбүздү 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 аркылуу логотипти көрсөтүү
Эми биз 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ди жылдыруу
мурунку көрсөтмөлөрдү колдонуп, 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 -кадам: Айдоо оюнун жасоо
Биринчиден, биз үйрөткүчтүн мурунку баскычтарындагыдай 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 (); }
жана бул дээрлик баары, ар кандай өзгөртүүлөр жана пикирлер кабыл алынат. Биз экрандын жылтылдатуусун чечүүбүз керек болгон маселелерди кантип азайтуу керектигин карап чыгышыбыз керек жана душмандын машиналары дагы эле ошол боштукту ээлей алат.
Сунушталууда:
BBC Micro: бит жана Scratch - Интерактивдүү руль жана Айдоо оюну: 5 кадам (Сүрөттөр менен)
BBC Micro: бит жана Scratch - Интерактивдүү руль жана Айдоо оюну: Менин бул жумадагы тапшырмаларымдын бири - бул биз жазган Scratch программасы менен иштөө үчүн BBC Micro: bitти колдонуу. Мен бул ThreadBoardди камтылган системаны түзүү үчүн эң сонун мүмкүнчүлүк деп ойлодум! Чийүү үчүн менин илхамым
Python киришүүсү - Катсухико Матсуда жана Эдвин Цижо - Негиздери: 7 кадам
Python Introduction - Katsuhiko Matsuda & Edwin Cijo - Негиздери: Саламатсызбы, биз MYP 2де окуйбуз. Биз сизге Pythonду коддоонун негиздерин үйрөткүбүз келет. Ал 1980 -жылдардын аягында Нидерландияда Гидо ван Россум тарабынан түзүлгөн. Бул ABC тилинин мураскери катары жасалган. Анын аты " Python " анткени качан
VBScript негиздери - Скрипттерди баштоо, кечигүүлөр жана башкалар!: 5 кадам
VBScript негиздери - Скрипттерди баштоо, кечигүүлөр жана башкалар!: VBScriptsти блокнот менен кантип жасоо боюнча менин биринчи үйрөткүчүмө кош келиңиз. With.vbs файлдары менен сиз күлкүлүү тамашаларды же өлүмгө алып келүүчү вирустарды түзө аласыз. Бул үйрөткүчтө мен сизге сценарийди баштоо, файлдарды ачуу жана башка көптөгөн негизги буйруктарды көрсөтөм. Т
Raspberry Pi жана реленин жардамы менен түзмөктү кантип башкарса болот - НЕГИЗДЕРИ: 6 кадам
Raspberry Pi жана реленин жардамы менен түзмөктү кантип башкарса болот - НЕГИЗДЕРИ: Бул IOT долбоорлорун жасоо үчүн пайдалуу болгон Raspberry Pi жана реленин жардамы менен түзмөктү башкаруу боюнча негизги жана түз үйрөткүч Бул окуу куралы жаңы баштагандар үчүн, бул достук Малинаны колдонуу боюнча эч кандай билимиңиз жок болсо да ээрчиңиз
RC522 жана PN532 RFID негиздери: 10 кадам
RC522 жана PN532 RFID негиздери: ЭСКЕРТҮҮ: Менде азыр RC522 жана PN532 үчүн Arduino кодун сунуштаган көрсөтмөлөр бар, мен эксперимент үчүн үч башка RFID модулун сатып алдым. Мурунку долбоордо мен негизги коопсуздук функциясын аткаруу үчүн 125 кГц жөнөкөй модулду кантип колдонуу керектигин айтып бердим