
Мазмұны:
2025 Автор: John Day | [email protected]. Соңғы өзгертілген: 2025-01-23 14:51


Бұл оқулықта біз Adafruit_GFX.c кітапханасының көмегімен нүктелік кескіндерді ойынның спрайт түрі ретінде қалай қолдану керектігін қарастырамыз. Біз ойлаған ең қарапайым ойын - бұл айналмалы жолақты ауыстыратын автокөлік ойыны, ақырында біздің бета -тестер мен кодердің көмекшісі «абайсыз жарысушы» атауын қабылдады, өйткені ол автокөлік жолымен дұрыс емес жолмен жүруге өте ұқыпсыз !!
Біздің схеманың дизайны жоғарыда келтірілген суреттерде берілген және біздің соңғы жобада/оқулықта схеманың қалай жұмыс істейтінін сипаттайтын Snake Instructables егжей -тегжейлі көрсетілген.
талап етеміз
Adafruit_GFX
Paint.net
Arduino IDE windowslinux
және қалған жабдықтарға арналған Жылан оқулығын қараңыз.
Жабдықтар
Жылан ойыны
1 -қадам: 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 нүктелік картасына түрлендіру




Енді біз өз суретімізді 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 көмегімен логотипті көрсету



Енді біз 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 жылжыту




Бұрынғы нұсқауларды қолдана отырып, 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 -қадам: Көлік жүргізу ойынын жасау


Алдымен біз бірнеше түрлі машиналарды немесе кедергілерді 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 (); }
және бұл өте маңызды, кез келген өзгертулер мен пікірлер құпталады. Экранның жыпылықтауын шешу үшін біз оны қалай азайту керектігін қарастыруымыз керек және жау машиналары әлі де сол кеңістікті алады.
Ұсынылған:
BBC Micro: бит және Scratch - интерактивті руль және жүргізуші ойыны: 5 қадам (суреттермен)

BBC Micro: бит және Scratch - интерактивті руль және көлік жүргізу ойыны: Менің осы аптадағы тапсырмаларымның бірі - біз жазған Scratch бағдарламасымен интерфейс жасау үшін BBC Micro: bit пайдалану. Мен бұл ThreadBoard тақтасын ендірілген жүйені құрудың тамаша мүмкіндігі деп ойладым! Менің сызатқа шабытым
VBScript негіздері - сценарийлерді бастау, кідірістер және тағы басқалар !: 5 қадам

VBScript негіздері - сценарийлерді бастау, кідірістер және тағы басқалар!: Блокнотпен VBScript жасау бойынша менің бірінші оқулығыма қош келдіңіз. With.vbs файлдарының көмегімен сіз күлкілі ойындар немесе өлімге әкелетін вирустар жасай аласыз. Бұл оқулықта мен сізге сценарийді бастау, файлдарды ашу және тағы басқалар сияқты негізгі командаларды көрсетемін. Т
Arduino және YX5300 MP3 модульімен дауысты дыбыстар ойыны Catalex: 13 қадам

Arduino және YX5300 MP3 модульімен дауысты дыбыстар ойыны Catalex: Сіз бұл сұрақты оқи аласыз ба? Бұл бір түрлі! Мен бұл сұрақты әдейі қойдым. Егер сіз бұл мәтінді оқи алсаңыз, бұл сіздің барлық алфавитті білетіндіктен және, әрине, барлық дауысты дыбыстарды білгендіктен. Дауысты дыбыстар барлық сөздерде бар. Бұл мүмкін емес
RC522 және PN532 RFID негіздері: 10 қадам

RC522 және PN532 RFID негіздері: ЕСКЕРТПЕ: Менде RC522 және PN532 үшін Arduino кодын ұсынатын нұсқаулықтар бар, біраз уақыт бұрын мен эксперимент үшін үш түрлі RFID модулін сатып алдым. Алдыңғы жобада мен қарапайым 125 кГц модулін негізгі қауіпсіздік функциясын орындау үшін қалай қолдану керектігін түсіндірдім
Үйде демонстрацияны жазу және меңгеру: негіздері: 7 қадам

Үйде демонстрацияны жазу және меңгеру: негіздері: Бұл музыканы қалай жазатынымды және меңгеретінім туралы қарапайым идея. Әнде екі гитаралық бөлік және барабан трегі ғана бар, бірақ мен бас пен вокалмен не істеу керектігін және әр түрлі музыкалық стильде не істейтінімді айтамын