Სარჩევი:

Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები: 6 ნაბიჯი
Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები: 6 ნაბიჯი

ვიდეო: Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები: 6 ნაბიჯი

ვიდეო: Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები: 6 ნაბიჯი
ვიდეო: OLED дисплей с контроллером SH1106 подключение к Arduino и тесты 2024, ივლისი
Anonim
Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები
Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები
Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები
Reckless Racer Arduino OLED თამაში, AdafruitGFX და Bitmaps საფუძვლები

ამ გაკვეთილში ჩვენ შევხედავთ, თუ როგორ გამოვიყენოთ 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: მარტივი Splash ეკრანის დახატვა

მარტივი Splash ეკრანის დახატვა
მარტივი Splash ეკრანის დახატვა
მარტივი Splash ეკრანის დახატვა
მარტივი Splash ეკრანის დახატვა
მარტივი Splash ეკრანის დახატვა
მარტივი Splash ეკრანის დახატვა

როდესაც თქვენ ხართ paint.net– ში შექმენით ახალი სურათი ფაილზე დაჭერით, შემდეგ ახალი, დააყენეთ გამოსახულების ზომა 1260x620 (იხილეთ პირველი სურათი) დააწკაპუნეთ ok როდესაც თქვენ გაქვთ ახალი გვერდი დახაზეთ splash ეკრანი მხოლოდ 2 ფერის გამოყენებით შავი და თეთრი ფანქრის გამოყენებით ინსტრუმენტი (სურათი 2), როდესაც თქვენ დახაზავთ (ან ჩასვით) თქვენი splash ეკრანის სურათი, დააწკაპუნეთ სურათზე, შემდეგ შეცვალეთ ზომა (image4), pop -up ფანჯარაში შეცვალეთ ზომა 1260x620– დან 126x62– მდე (2 პიქსელი უფრო მცირე ვიდრე თქვენს ეკრანზე) (pic5) დააწკაპუნეთ OK.

შემდეგ დააჭირეთ ფაილის მენიუს, შემდეგ შეინახეთ როგორც (სურათი 6).

როდესაც ფაილის ტიპი ჩამოსაშლელი მენიუდან გამოჩნდება აირჩიეთ BMP (bitmap). (pic7), ჩაწერეთ ფაილის სახელი და დააწკაპუნეთ შენახვაზე, როდესაც pop -up გამოჩნდება დაყენებულია 0 -ზე და დაყენებულია 8 ბიტზე, დააწკაპუნეთ ok (pic8).

ნაბიჯი 3: BMP კონვერტაცია C Bitmap ფაილში

BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში
BMP კონვერტაცია C Bitmap ფაილში

ახლა ჩვენ უნდა გადავიყვანოთ ჩვენი სურათი იმ ფორმატში, რომელსაც arduino- ს ესმის, ამის გასაკეთებლად უამრავი ინსტრუმენტი არსებობს, მაგრამ ჩემი "წასვლა" არის marlin webs site bitmap კონვერტორი ინსტრუმენტი …

marlinfw.org/tools/u8glib/converter.html

ამრიგად, ჩვენ ვიწყებთ ამ განყოფილებას ზემოაღნიშნული ბმულის გამოყენებით ვებსაიტის გასახსნელად, რომელიც ნაჩვენებია სურათზე 1

დააწკაპუნეთ ფაილის არჩევაზე და შეარჩიეთ ადრე შექმნილი ბიტმაპი (სურათი 2)

marlin bitmap კონვერტორი ავტომატურად გადააქცევს თქვენს სურათს c კოდში მარცხნივ ორმაგად დააწკაპუნეთ კოდზე, რომელიც უნდა მიუთითებდეს კოდს, შემდეგ მარჯვენა ღილაკით და დააწკაპუნეთ ასლზე (pic3)

შემდეგი ჩვენ ვქმნით მარჯვენა ღილაკს და ვქმნით ახალ ტექსტურ დოკუმენტს (სურათი 4)

ორჯერ დააწკაპუნეთ ახალ დოკუმენტზე, როდესაც გაიხსნება მარჯვენა ღილაკით და ჩასვით კოდი (სურათი 5)

შემდეგ ჩვენ უნდა დავამატოთ სტრიქონი კოდის ზედა ნაწილში 6 სურათზე, ჩვენ ვასახელებთ მათ შემთხვევით წარმოქმნილი სიმბოლოებიდან, ჩვენ ვასახელებთ მათ ქვემოთ მოცემულ მაგალითზე

#განსაზღვრეთ LOGOWIDTH

#განსაზღვრეთ LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

შემდეგ დააწკაპუნეთ ფაილზე, შემდეგ შეინახეთ როგორც, შეინახეთ ფაილი როგორც logo.c დახურეთ ბლოკნოტი, დააწკაპუნეთ მარჯვენა ღილაკით logo.c და დააწკაპუნეთ ასლზე.

ნაბიჯი 4: ლოგოს ჩვენება DrawBitmap– ის გამოყენებით

ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით
ლოგოს ჩვენება DrawBitmap– ის გამოყენებით

ახლა ჩვენ ჩავტვირთავთ arduino IDE- ს და ვქმნით ახალ ჩანახატს და ვინახავთ მას logexample.ino, შემდეგ როგორც arduino ide- ში მოტყუება დააწკაპუნეთ ფაილის მენიუზე შემდეგ შეინახეთ როგორც, დაბრუნდით პროექტის საქაღალდეში მარჯვენა ღილაკით და ჩასვით.c ფაილში (სურათი 2) შემდეგ დააწკაპუნეთ გაუქმებაზე, ეს დაზოგავს თქვენ საჭიროდ დაათვალიეროთ საქაღალდე ფაილში ჩასასმელად.

ჩაწერეთ შემდეგი კოდი arduino IDE– ში ან გადმოწერეთ ino– ში.

(ჩვენ გირჩევთ აკრიფოთ, ვიდრე დააკოპიროთ და ჩასვათ ან გამოიყენოთ ქვემოთ მოცემული ფაილები, ეს არის სწავლის საუკეთესო საშუალება)

#მოიცავს /* ეს იცვლება იმის მიხედვით, თუ სად ინახავთ

ino ჩვეულებრივ საქაღალდეში C: / მომხმარებელი / ~ მომხმარებლის სახელი / დოკუმენტები / Arduino / პროექტი ~ სახელი

და ეს არის ის, თუ როგორ ვუკავშირდებით ჩვენს ბიტმაპს */

#ჩართეთ

#ჩართეთ

uint8_t bmpX, bmpY = 0; /* მეხსიერების რეზერვი 2 X 8 ბიტიანი მთელი რიცხვისთვის, ჩვენ გვჭირდება მხოლოდ 8 ბიტიანი ინტი

რადგან ღირებულება არასოდეს აღემატება 128 -ს (პიქსელი), ასე რომ ჩვენ შეგვიძლია დაზოგოთ სივრცე 8 ბიტიანი ინტის გამოყენებით (რომელსაც აქვს მაქსიმალური მნიშვნელობა 255) */

ბათილად დაყენება ()

{დაგვიანება (100); // მისცეს ჩვენება და ა.შ. // ეს არის ჩვენების ინიციალიზება display.clearDisplay (); // დაიწყეთ ცარიელი ეკრანით}

/* გთხოვთ გაითვალისწინოთ, რომ თქვენ არ გჭირდებათ ამ კომენტარების ჩაწერა, რადგან ისინი მითითებულია …………..

ბრძანება, რომელზეც ჩვენ ყურადღებას გავამახვილებთ არის display.drawBitmap, ეს არის ის, რაც ხატავს ჩვენს splash ეკრანს. (bmpX, არის X ღერძის მნიშვნელობა ეკრანზე, სადაც იქნება bitmap- ის X წამყვანი წერტილი და bmpX და bmpY არის ღირებულებები, რომლებიც ჩვენ გვაინტერესებს მოძრაობის შესაქმნელად (bmpY, არის Y ღერძის მნიშვნელობა ეკრანზე, სადაც Y წამყვანია ვიკიპედიის წერტილი იქნება ჩვენ ვიღებთ მითითებულ სახელებს, როგორც ისინი ლოგოში განვსაზღვრეთ. c (LOGOPIC, არის bitmap- ის სახელი #ჩართულ ფაილში logo.c (LOGOWIDTH, არის რამდენი პიქსელი მთელს (X) ბიტმაპი წამყვანის წერტილიდან (LOGOHEIGHT, არის რამდენი პიქსელი ქვემოთ (Y) ბიტმაპის მიმაგრება წამყვანი წერტილიდან X და Y პიქსელების გადაკვეთა შესაძლებელია ხელით, მაგრამ უფრო ადვილია წინასწარ განსაზღვრულთა გამოყენება, ვიდრე ყველა მათგანის გახსენება (1, ბოლო მნიშვნელობა არის ფერი, რადგან ეკრანი არის მონო 0 შავი 1 თეთრი. კარგად დაიწყეთ აკრეფა შემდეგი სტრიქონიდან: ¬D lol*/ void loop () {display.clearDisplay (); // ცარიელი ეკრანი // bitmap ზედა მარცხენა, x, y, სახელი bitmap, სიგანე X, სიმაღლე Y, ფერადი ჩვენება. drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); ჩვენება. ჩვენება (); // ეს რეალურად იზიდავს ბუფერს ეკრანზე ოდესმე}

ატვირთეთ თქვენი კოდი arduino და დაადასტურეთ რომ მუშაობს (სურათი 3).

ნაბიჯი 5: გადატანა Bitmap Sprite

Image
Image
Bitmap Sprite– ის გადატანა
Bitmap Sprite– ის გადატანა
Bitmap Sprite– ის გადატანა
Bitmap Sprite– ის გადატანა

ადრეული ინსტრუქციების გამოყენებით გამოიყენეთ paint.net და შექმენით ახალი ფაილი, გახადეთ 30x15 პიქსელი (სურათი 1) და დახაზეთ უხეში მანქანა, ჩვენი ახალგაზრდა დიზაინერი იწყებს საქარე მინით (სურათები 2 და 3).

კვლავ შეინახეთ იგი Windows bmp ფაილის სახით (როგორც ნაბიჯი 2), გადააკეთეთ C ბიტმაპზე (ნაბიჯი 3) და განათავსეთ car.c ფაილი (ან რასაც თქვენ გადაწყვეტთ) იმავე საქაღალდეში, როგორც ახლად შექმნილი arduino ino (ესკიზი) ფაილი

(p.s. დაიმახსოვრე დაამატე #ჩართე ხაზი მანქანაში. ეს ხშირად გვხვდებოდა)

პირველი დააკავშირეთ თქვენი მანქანის ექვივალენტი. C

#ჩართეთ

#მოიცავს #მოიცავს Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //

Adafruit_SSD1306 ჩვენება (128, 64); // დააყენეთ ეკრანის გარჩევადობა

/* bmpX/bmpY ჩვენ გვჭირდება, რომ ეს იყოს ცვლადი ამ მნიშვნელობების შეცვლისა და გადაკეთების მიზნით

ეკრანი არის ის, თუ როგორ ვქმნით მოძრაობის ანიმაციის ეფექტს. hitSide და hitTop არის ის, თუ როგორ ვინახავთ Sprite ეკრანზე */ uint8_t bmpX, bmpY = 0; // მეხსიერების რეზერვი 2 8 ბიტიანი ინტერისთვის (0-255) ჩვენ არ გვჭირდება უფრო დიდი 128 იქნება ყველაზე დიდი რიცხვი გამოყენებული bool hitSide = 0; bool hitTop = 0;

ბათილად დაყენება ()

{დაგვიანება (100); // მისცეს ჩვენება და ა.შ. // ეს არის ჩვენების ინიციალიზება display.clearDisplay (); // დაიწყეთ ცარიელი ეკრანით

}

ბათილი მარყუჟი ()

{display.clearDisplay (); // ცარიელი ეკრანი // ზედა მარცხნიდან დახატული bitmap, x, y, bitmap- ის სახელი, სიგანე X, სიმაღლე Y, ფერადი ჩვენება. drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // ჩვენება. ჩვენება (); // ეს რეალურად მიაპყრობს ბუფერს ეკრანზე ოდესმე/ * ეს არის ის, თუ როგორ ვადევნებთ თვალს ეკრანის კიდეებს და ვწყვეტთ, დავამატოთ პიქსელი გადაადგილება ზემოდან ქვემოდან) თუ ამოვიღოთ პიქსელი (გადაადგილება ქვემოდან ზემოთ) */ გადართვა (hitSide) // ეს ირჩევს მანქანის მიმართულებას ლოგიკის საფუძველზე {case 0: bmpX ++; შესვენება;

შემთხვევა 1:

bmpX--; შესვენება; } // ეს 2 if განცხადებები ადგენს bool- ს ჭეშმარიტ ან მცდარ 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 bitmaps და კავშირს კოდი.

#მოიცავს // ეს გზები უნდა შეიცვალოს დამოკიდებული

// სადაც ფაილებს ინახავთ // რედაქტირება: მე ახლახან აღმოვაჩინე თუ თქვენ შეცვლით // - ით თქვენ არ გჭირდებათ სრული გზა // საკუთარი ბიბლიოთეკებით #ჩართეთ

#ჩართეთ

#ჩართეთ #ჩართეთ

#ჩართეთ

#მოიცავს // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //

Adafruit_SSD1306 ჩვენება (128, 64); // ჩვენების პარამეტრების განსაზღვრა

ცვლადების და ფიქსირებული მნიშვნელობების განსაზღვრა

// განსაზღვრეთ შეყვანის ქინძისთავები ეს არის ქინძისთავები არდუინოზე ისინი არასოდეს იცვლება ასე რომ #განსაზღვრეთ #განსაზღვრეთ INTPIN 3 // მხოლოდ ქინძისთავები 2 და 3 შეიძლება იყოს გათიშული UNO #define UPPIN 4 // ეს არის ქინძისთავები დაკავშირებული tp შესაბამისი გადამრთველი #განსაზღვრეთ DWNPIN 5 #განსაზღვრეთ LFTPIN 6 #განსაზღვრეთ RHTPIN 7 #განსაზღვრეთ SND 9 // განსაზღვრეთ მიმართულებები

#განსაზღვრეთ DIRUP 1 // ეს ღირებულებები არის ის, რასაც "გველი" უყურებს გადაწყვეტილების მისაღებად-

#განსაზღვრეთ DIRDOWN 2 // მიმართულება, სადაც გველი იმოძრავებს #განსაზღვრეთ DIRLEFT 3 #განსაზღვრეთ DIRRIGHT 4

uint8_t dirPressed = 0; // მნიშვნელობა, რათა დაარეგისტრიროს მიმართულება, რომელზედაც გადავიდა პინი

// ლოგიკური მაღაზია, რომლის ქინძისთავიც მაღლა ავიდა

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; ბოლი BUTRHT = 0; // ვარდები მანქანის პოზიციისთვის uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // საჭიროებს მასის მასივის დაცვას

uint8_t შესახვევიPosArr = {0, 16, 32, 48}; // მასივი შესანახად სადაც თითოეული შესახვევია

uint8_t carPosYCnt = 0; uint8_t მანქანაYTmp = 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 მტერი0 პოზიტიური = 0; uint8_t მტერი 1PosX = 255; uint8_t მტერი 1 დადებითი = 0; uint8_t მტერი 2PosX = 255; uint8_t მტერი 2PosY = 0;

// ცვალებადია შემთხვევით მინიჭება შესახვევის ნომერი დაბრკოლებებზე

uint8_t შესახვევი Gen = 0;

uint8_t შესახვევი Gen0 = 0; uint8_t შესახვევი Gen1 = 0; uint8_t შესახვევი Gen2 = 0;

// ქულის მრიცხველი

გრძელი ქულა = 0; // ეს არის ანგარიში:/ lol long შეადარეთ = 0; // ეს ინახავს ქულებს ბოლო დონეზე, რათა შევადაროთ ხანგრძლივ მაღალ ქულას = 25; uint8_t metreCnt = 0;

ეს არის ის, სადაც ჩვენ ვიწყებთ ფუნქციებს

// ეს არის ბრძანებების ნაკრები, თუ შეფერხება გააქტიურებულია void interruptressed () {დაგვიანებით (150); updateDirection (); } // განაახლეთ რომელი მნიშვნელობა არის var მიმართულებით DIR ჩამორთმევის შემოწმებით // -------------------------- განახლების მიმართულება (მოთამაშე)- ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); თუ (BUTUP == ჭეშმარიტი) {dirPressed = DIRUP; } if (BUTDWN == ჭეშმარიტი) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == ჭეშმარიტი) {dirPressed = DIRRIGHT; }

}

// ------------------------------- გადაადგილება მანქანა --------------- -------------------------

// ეს განაახლებს ეკრანს ავტომობილის მოძრავი სპრაით

void moveCar ()

{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; ტონი (SND, 100, 100); თუ (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // 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 (); }

// -------------------------- შემთხვევითი POS X ------------------- -----------

uint8_t randomPosX () // ეს 2 რუტინა უბრალოდ ქმნის შემთხვევით პოზიციას დაბრკოლებებისთვის

{uint8_t posValTmp = 0; posValTmp = შემთხვევითი (129, 230); // სერიული.პრინტლნ ("შემთხვევითი x"); //Serial.println(posValTmp); დაბრუნება (posValTmp); }

// ---------------------------- შემთხვევითი პოზიციები Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = შემთხვევითი (0, 4); // დაამატეთ დამატებითი ზოლი შემთხვევითობისთვის, ანუ ეკრანზე რაიმე ობიექტი ამ ზოლში ყოფნისას //Serial.println("RandomY "); //Serial.println(lanePosArr [laneVal]); დაბრუნება (lanePosArr [laneVal]); }// --------------------------------- თამაშის სიჩქარის დაყენება -------------- -------------- void setGameSpeed () // ეს აჩერებს დონეს 20-ზე მაღლა, რაც თამაშს დაუკრავს {თუ (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ---------------------------------------- გამოავლინე ავარია ---------- ----------------------- void deteCrash () {

თუ (მტერი0PosX = 0 && მტერი0PosY == carYTmp)

{// Serial.println ("Game Over CRAASSSSHHHHHHEEEDDD Traffic 0"); gameOver (); } if (dijmin1PosX = 0 && dijmin1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD ტრაფიკში 1 "); gameOver (); } if (dijmin2PosX = 0 && dijmin2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD მოძრაობაში 2 "); gameOver (); }}

ეს არის რუტინები, რომლებიც ხატავს ეკრანს.

// ----------------------------------- DRAW ROAD --------------- --------------------- void drawRoad () // X, Y, სიგრძე, სიგანე {display.fillRect (roadLineX1, 15, 30, 4, WHITE); display.fillRect (roadLineX1, 30, 30, 4, WHITE); display.fillRect (roadLineX1, 45, 30, 4, WHITE); display.fillRect (roadLineX2, 15, 30, 4, WHITE); display.fillRect (roadLineX2, 30, 30, 4, WHITE); display.fillRect (roadLineX2, 45, 30, 4, WHITE); display.fillRect (roadLineX3, 15, 30, 4, WHITE); display.fillRect (roadLineX3, 30, 30, 4, WHITE); display.fillRect (roadLineX3, 45, 30, 4, WHITE); display.fillRect (roadLineX4, 15, 30, 4, WHITE); display.fillRect (roadLineX4, 30, 30, 4, WHITE); display.fillRect (roadLineX4, 45, 30, 4, WHITE); display.fillRect (roadLineX5, 15, 30, 4, WHITE); display.fillRect (roadLineX5, 30, 30, 4, WHITE); display.fillRect (roadLineX5, 45, 30, 4, WHITE);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; ჩვენება. ჩვენება (); } // --------------------------------------------- დახაზეთ მტრები ---- ------------------------------------------- void enemysDraw () {// X, Y, bmp სახელი, სიგანე, სიმაღლე, ფერადი ჩვენება.drawBitmap (dijmin0PosX, მტერი0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); dijmin0PosX = მტერი0PosX-drawSpeed; display.drawBitmap (dijmin1PosX, მტერი1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); dijmin1PosX = მტერი1PosX-drawSpeed; display.drawBitmap (dijmin2PosX, dijmin2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); dijmin2PosX = მტერი2PosX-drawSpeed; ჩვენება. ჩვენება (); if (dijmin0PosX> 231 && მტერი0PosX231 && dijmin1PosX <255) {მტერი1PosX = randomPosX (); მტერი1PosY = randomPosY (); checkDuplicate (); }

if (dijmin2PosX> 231 && dijmin2PosX <255) {მტერი2PosX = randomPosX (); dijmin2PosY = randomPosY (); }} // ------------------------------------- განახლების ჩვენება -------- -------------------------------------------- ბათილად ცდება განახლება () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, შავი); display.setCursor (100, 0); display.setTextColor (თეთრი, შავი); ჩვენება. ბეჭდვა (ანგარიში); ჩვენება. ჩვენება ();

}

// ------------------------- დაელოდეთ პრესის მარყუჟს ------------------- ------

// ეს არის საწყისი ეკრანის კოდი void waitForPress () {splashScreen (); ბოლი ელოდება = 0; // მარყუჟი მთავრდება, როდესაც ეს არის ჭეშმარიტი ჩვენება. ClearDisplay (); სანამ (ლოდინი == 0) {

display.fillRect (19, 20, 90, 32, შავი); // ცარიელი ფონი ტექსტისთვის

display.setTextColor (WHITE); 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 ჩვენება. setCursor (25, 43); display.setTextSize (0); // შრიფტი ნორმალურ ჩვენებაზე. println ("დააჭირეთ ნებისმიერ ღილაკს"); display.fillRect (0, 0, 127, 8, შავი); display.setCursor (10, 0); display.print ("მაღალი ქულა:"); // მაღალი ქულის ჩვენება. ბეჭდვა (მაღალი ქულა); ჩვენება. ჩვენება (); ლოდინი = digitalRead (INTPIN); // შეამოწმეთ თუ არა გასაღების დაჭერით ლოდინი შეიცვლება 1 დამთავრებამდე dirPressed = 0; // ღილაკის გადაყენება დააჭირეთ მიმართულებისკენ}} // ------------------------------------------ ----- თამაშის განახლება --------------------------------------------- void updateGame () {moveCar (); drawRoad (); enemysDraw (); // dijmin 1 დახაზეთ (); // dijmin2 დახატე (); metreCnt ++; deteCrash (); თუ (metreCnt == 5) // დასძენს ქულა ყოველ 10 ციკლზე ქულის ასამაღლებლად {metreCnt = 0; ანგარიში ++; } if (ანგარიში == შედარება+5) // აჩქარებს თამაშს ყოველ 5 ქულაზე მაქსიმუმ 20 სიჩქარემდე {შედარება = ანგარიში; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ თამაში დასრულდა ---------------- ----------------------------------

// ეს რუტინა ხატავს ხაზებს გარდაცვლილი გმირის მანქანის გარშემო, შემდეგ აჩვენებს თამაშს ეკრანზე

void gameOver ()

{ტონი (SND, 200, 200); // ხმის დაკვრა uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // დააყენეთ ვარდები მანქანის ხაზის გარშემო ყუთების დახატვისათვისPosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); ჩვენება. ჩვენება (); 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, WHITE); ჩვენება. ჩვენება (); ტონი (SND, i*20, 50); დაგვიანება (10); } display.setTextSize (2); display.setTextColor (თეთრი, შავი); display.setCursor (10, 23); ტონი (SND, 50, 500); display.print ("GAME"); ჩვენება. ჩვენება (); დაგვიანება (500); ტონი (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); ჩვენება. ჩვენება (); დაგვიანება (3000); გადატვირთვა (); waitForPress (); }

// --------------------------------------------- თამაშის გადატვირთვა ----- ------------------------------------------------------ -----

void restartGame () // ეს აკოპირებს მაღალ ქულას და აღადგენს ყველა სტატისტიკას და ქმნის შემთხვევით პოზიციებს

{თუ (ქულა> = მაღალი ქულა) // შეამოწმეთ თუ მაღალი ქულა უფრო მაღალია თუ არა {მაღალი ქულა = ქულა; // ერთი თუ სტატუსი მაღალი ქულის განახლებისთვის}

ანგარიში = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; dijmin0PosX = randomPosX (); dijmin0PosY = randomPosY (); მტერი1PosX = randomPosX (); მტერი1PosY = randomPosY (); dijmin2PosX = randomPosX (); dijmin2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ---------------------------------------------------- -შეამოწმეთ დუბლიკატი -------------------------------------------------- ------ void checkDuplicate () // ეს შეამოწმეთ თუ არა დაბრკოლებები იკავებს ერთსა და იმავე თამაშის ადგილს {// Serial.println ("დუბლიკატი შემოწმებულია"); if (dijmin2PosX> 230 && dijmin2PosX <255) {ხოლო (მტერი2PosY == მტერი1PosY || მტერი2PosY == მტერი0PosY) {dijmin2PosY = randomPosY (); }}

თუ (მტერი0PosX> 230 && მტერი0PosX230 && მტერი2PosXenemy1PosX && მტერი2PosX230 && მტერი0PosXenemy1PosX && მტერი0PosX

// ----------------------------------------------- გაფრქვევის ეკრანი --- ------------------------------------

void splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); ჩვენება. ჩვენება (); დაგვიანება (2000); } // -------------------------------------------------- ᲐᲬᲧᲝᲑᲐ ------------------------------------------------- ----------- void setup () {დაგვიანებით (100); // დაე ყველაფერი დაიწყოს // Serial.begin (9600); // გაუკეთე კომენტარი ამ და ყველა სერიალს. შეცდომები დიაგრამის ჩვენებისთვის. დაწყება (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (თეთრი, შავი); display.setTextWrap (ყალბი); ჩვენება.დიმი (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);

attachInterrupt (digitalPinToInterrupt (INTPIN), შეწყვეტილი, RISING);

// შემთხვევით მოათავსეთ დაბრკოლებები მტერი0PosX = randomPosX (); dijmin0PosY = randomPosY (); მტერი1PosX = randomPosX (); მტერი1PosY = randomPosY (); dijmin2PosX = randomPosX (); dijmin2PosY = randomPosY (); checkDuplicate (); // შეამოწმეთ დუბლიკატი ადგილები // Serial.println ("setup Complete"); splashScreen (); waitForPress (); } // -------------------------------------------------- ----- გადახედეთ ------------------------------------------------ ----------

ბათილი მარყუჟი ()

{updateGame (); }

და ეს საკმაოდ ბევრია, ნებისმიერი ცვლილება და გამოხმაურება მისასალმებელია. საკითხები, რომლებიც ჩვენ გვჭირდება ეკრანის ციმციმის გადასაჭრელად, ჩვენ უნდა ვიზრუნოთ იმაზე, თუ როგორ უნდა შემცირდეს იგი და მტრის მანქანებს ჯერ კიდევ ძალუძთ ერთი და იგივე სივრცის დაკავება.

გირჩევთ: