İçindekiler:

Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri: 6 Adım
Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri: 6 Adım

Video: Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri: 6 Adım

Video: Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri: 6 Adım
Video: ★☭ Harika Bir Aksion Filmi Aksiyon Filmi İzle★☭ Türkçe Düblaj HD 2016 2024, Temmuz
Anonim
Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri
Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri
Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri
Pervasız Yarışçı Arduino OLED Oyunu, AdafruitGFX ve Bitmaps Temelleri

Bu derste Adafruit_GFX.c kütüphanesini bir oyunda sprite olarak kullanarak bitmaplerin nasıl kullanılacağına bakacağız. Aklımıza gelen en basit oyun, yandan kaydırmalı şerit değiştiren bir araba oyunudur, sonunda beta testçimiz ve yardımcı kodlayıcımız, otoyolda yanlış yoldan gitmek için oldukça pervasız olduğu için bir isim olarak "Pervasız Yarışçı" olarak karar verdi!!.

Devremizin tasarımı yukarıdaki resimlerdedir ve devrenin nasıl çalıştığını açıklayan son projemiz/eğitimimizde burada detaylandırılmıştır Snake Instructables.

talep edeceğiz

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

ve lütfen ekipmanın geri kalanı için Snake eğitimine bir göz atın.

Gereçler

Yılan Oyunu

Adım 1: Paint.net'i Yükleme

Paint.net'i yükleme
Paint.net'i yükleme
Paint.net'i yükleme
Paint.net'i yükleme
Paint.net'i yükleme
Paint.net'i yükleme

Yazılım ücretsiz olduğu için paint.net kullanıyoruz, kullanımı tamamen ücretsizdir Paint. Net'i buradan indirebilirsiniz.

Paint.net'i kurmak için indirilen programa çift tıklayın ve ardından, evet, tamam, katılıyorum ve yukarıdaki resimler size bir yol tarifi verecek gibi olumlu yanıt verin.

Adım 2: Basit Bir Açılış Ekranı Çizmek

Basit Bir Açılış Ekranı Çizimi
Basit Bir Açılış Ekranı Çizimi
Basit Bir Açılış Ekranı Çizimi
Basit Bir Açılış Ekranı Çizimi
Basit Bir Açılış Ekranı Çizimi
Basit Bir Açılış Ekranı Çizimi

Paint.net'teyken Dosya'yı ve ardından yeni'yi tıklatarak yeni bir görüntü oluşturun, görüntü boyutunu 1260x620'ye ayarlayın (ilk resme bakın) yeni sayfanız olduğunda tamam'ı tıklayın Kalem kullanarak yalnızca 2 renk siyah beyaz kullanarak bir açılış ekranı çizin araç(resim2), Açılış ekranı resminizi çizdiğinizde (veya yapıştırdığınızda), resme tıklayın, ardından yeniden boyutlandırın(image4), açılır pencerede boyutu 1260x620'den 126x62'ye (ekranınızdan 2 piksel daha küçük) değiştirin (resim5) Tamam'a tıklayın.

sonra Dosya menüsüne tıklayın ve ardından farklı kaydet (pic6).

Dosya türü açılır menüsünde açılır pencere göründüğünde BMP (bitmap) öğesini seçin.(resim7), bir dosya adı yazın ve kaydet'e tıklayın, açılır pencere görüntülendiğinde taklidi 0'a ayarlayın ve 8 bit'e ayarlayın, tamam'a tıklayın (pic8).

Adım 3: BMP'yi C Bitmap Dosyasına Dönüştürme

BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme
BMP'yi C Bitmap Dosyasına Dönüştürme

Şimdi resmimizi arduino'nun anlayabileceği bir formata dönüştürmemiz gerekiyor, bunu yapmak için birçok araç var ama benim "git" yerim marlin webs sitesi bitmap dönüştürücü aracı…

marlinfw.org/tools/u8glib/converter.html

Bu nedenle, pic1'de gösterilen web sitesini açmak için yukarıdaki bağlantıyı kullanarak bu bölüme başlıyoruz.

dosya seç'e tıklayın ve daha önce oluşturduğunuz bitmap'i seçin (pic2)

marlin bitmap dönüştürücü, resminizi otomatik olarak c koduna dönüştürür, kodu vurgulaması gereken koda sol çift tıklayın, ardından sağ tıklayın ve kopyaya tıklayın(pic3)

next Sağ tıklayıp yeni bir metin belgesi oluşturuyoruz (resim4)

yeni belgeye çift tıklayın, açıldığında sağ tıklayın ve kodu yapıştırın(resim5)

daha sonra #include kodunun üst kısmına yakın bir yere satırı eklememiz gerekiyor, bu bitmap verilerini arduinodaki flash belleğe kaydetmemize izin veriyor, ardından #define genişlik, yükseklik ve adı, kullanımı daha kolay bir şeyle yeniden adlandırıyoruz, bunlar vurgulanır resim 6'da, onları rastgele oluşturulan karakterlerden yeniden adlandırıyoruz, onları aşağıdaki altı çizili örneğe göre yeniden adlandırıyoruz

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

sonra dosyaya tıklayın, ardından farklı kaydet, dosyayı logo.c olarak kaydedin, not defterini kapatın, logo.c'ye sağ tıklayın ve kopyala'ya tıklayın.

Adım 4: DrawBitmap Kullanarak LOGO Görüntüleme

DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme
DrawBitmap Kullanarak LOGO Görüntüleme

Şimdi arduino IDE'yi yüklüyoruz ve yeni kroki oluşturup logoexample.ino olarak kaydediyoruz, sonra arduino ide'de hile olarak dosya menüsüne tıklayıp farklı kaydet, proje klasörüne geri dönün sağ tıklayıp.c dosyasına yapıştırın (pic2) ardından iptal'e tıklayın, bu, dosyaya yapıştırmak için klasöre göz atmanızdan kurtarır.

arduino IDE'ye aşağıdaki kodu yazın veya ino'da indirin.

(kopyalayıp yapıştırmak yerine yazmanızı veya aşağıdaki dosyaları öğrenmenin en iyi yolu olarak kullanmanızı öneririz)

#include /* bu, depoladığınız yere göre değişir

ino genellikle C:\Users\~username\Documents\Arduino\project~name klasöründedir

ve bitmap'imize bu şekilde bağlanırız */

#Dahil etmek

#Dahil etmek

uint8_t bmpX, bmpY=0; /* 2 X 8 bit tamsayı için bellek ayır, sadece 8 bit tamsayıya ihtiyacımız var

değer asla 128'den (piksel) daha yüksek olmadığından, 8 bit ints (maksimum değeri 255 olan) kullanarak yerden tasarruf edebiliriz */

geçersiz kurulum()

{ gecikme(100); // display'in açılması için ekran vb. zaman verin.begin(SSD1306_SWITCHCAPVCC, 0x3C); // bu, ekranı başlatmak için display.clearDisplay(); // boş bir ekranla başla }

/* lütfen bu yorumları yazmanız gerekmediğini unutmayın, bunlar referans içindir…………..

odaklanacağımız komut display.drawBitmap, açılış ekranımızı çizen şey bu. (bmpX, bitmap'in X bağlantı noktasının olacağı ekrandaki X ekseni değeridir ve bmpX ve bmpY, hareket oluşturmak için ilgilendiğimiz değerlerdir (bmpY, Y bağlantı noktasının bulunduğu ekrandaki Y ekseni değeridir) bitmap'in amacı, logo.c'de tanımladığımız gibi referans adlarını alacağız (LOGOPIC, #included dosyasındaki bitmap'in adıdır logo.c (LOGOWIDTH, kaç pikselin (X) çizileceğidir) bağlantı noktasından bitmap (LOGOHEIGHT, X ve Y piksellerinin çapraz noktasından bitmap'i bağlantı noktasından çekmek için kaç piksel aşağı (Y) olduğunu belirtir, ancak önceden tanımlanmış olanları kullanmak hepsini hatırlamaktan daha kolaydır (1, ekran mono 0 siyah 1 beyaz olduğu için son değer renktir tamam sonraki satırdan yazmaya başlayın:¬D lol*/ void loop() { display.clearDisplay(); // ekranı boş // ekrandan çizilen bitmap sol üst, x, y, bitmap adı, genişlik X, yükseklik Y, renkli display.drawBitmap(bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display(); // bu aslında arabelleği ekrana çeker }

arduino kodunuzu yükleyin ve çalıştığını onaylayın (pic3).

Adım 5: Bir Bitmap Sprite'ı Taşıma

Image
Image
Bitmap Sprite'ı Taşıma
Bitmap Sprite'ı Taşıma
Bitmap Sprite'ı Taşıma
Bitmap Sprite'ı Taşıma

önceki talimatları kullanarak paint.net'i kullanın ve yeni bir dosya oluşturun, onu 30x15 piksel yapın (resim1) ve kaba bir araba çizin genç tasarımcımız önce ön camla başlar (resim 2 ve 3).

tekrar bir windows bmp dosyası olarak kaydedin (2. adımda olduğu gibi), bir C bitmap'e (adım 3) dönüştürün ve car.c dosyasını (veya neye karar verirseniz verin) yeni oluşturulan arduino ino (skeç) ile aynı klasöre yerleştirin dosya.

(not: bizi sık sık yakalamak için kullanılan car.c'ye #include satırını eklemeyi unutmayın)

İlk önce car.c eşdeğerinizi bağlayın

#Dahil etmek

#include #include Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 // https://github.com/adafruit/Adafruit-GFX-Library >

Adafruit_SSD1306 ekranı(128, 64); // ekranın çözünürlüğünü ayarla

/* bmpX/bmpY Bu değerleri değiştirip yeniden çizerken bunların değişken olmasına ihtiyacımız var

ekran, hareket animasyon efektini nasıl oluşturduğumuzdur. hitSide ve hitTop, hareketli grafiği ekranda nasıl tuttuğumuzdur */ uint8_t bmpX, bmpY=0; // hafızayı 2 8 bitlik int (0-255) için rezerve et, daha büyük 128'e ihtiyacımız yok, kullanılan en büyük sayı bool hitSide=0; bool hitTop=0;

geçersiz kurulum()

{ gecikme(100); // display'in açılması için ekran vb. zaman verin.begin(SSD1306_SWITCHCAPVCC, 0x3C); // bu, ekranı başlatmak için display.clearDisplay(); // boş bir ekranla başla

}

boşluk döngüsü()

{ display.clearDisplay(); // ekranı boşalt // sol üstten çizilen bitmap, x, y, bitmap adı, X genişliği, Y yüksekliği, renkli display.drawBitmap(bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display(); // bu aslında arabelleği ekrana çeker /* ekranın kenarını bu şekilde izleriz ve bir piksel eklemeye veya yukarıdan aşağıya kaydırmaya mı yoksa bir pikseli kaldırmaya mı (aşağıdan yukarıya kaydırmaya) karar veririz */ switch (hitSide)) // bu, boole dayalı olarak arabanın yönünü seçer { case 0: bmpX++; kırmak;

dava 1:

bmpX--; kırmak; } // bu 2 if deyimi, bool'u true veya false olarak ayarlar if(bmpX==0) { hitSide=0; } if(bmpX==96) // ekranın genişliği eksi araba { hitSide=1; } // Y ekseni için yukarıdakiyle aynı if(bmpY==0) { hitTop=0; } if(bmpY==49) // ekran yüksekliği eksi kabin yüksekliği { hitTop=1; } geçiş (hitTop) { durum 0: bmpY++; kırmak; durum 1: bmpY--; kırmak; }

}

ekteki videoda programın çalıştığını görebilirsiniz

Adım 6: Araba Sürme Oyununu Yapmak

Image
Image

İlk olarak, öğreticinin önceki aşamalarında olduğu gibi birkaç farklı araba veya engel çizerek onları 30x15 piksel yaparak başlıyoruz. Sonra onları c bitmap'lere dönüştürüyoruz ve kodda bağlantı kuruyoruz.

#include // bu yollar bağımlı olarak değişmek zorunda kalacak

// dosyaları nerede sakladığınızla ilgili //düzenleme: // yerine " " koyarsanız, tam yola gerek duymadığınızı öğrendim //kendi kitaplıklarınızla #include

#Dahil etmek

#include #include

#Dahil etmek

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

Adafruit_SSD1306 ekranı(128, 64); // ekran parametrelerini tanımla

değişkenleri ve sabit değerleri tanımlayın

// giriş pinlerini tanımlayın bunlar arduino üzerindeki pinlerdir ve asla değişmezler yani #define#define INTPIN 3 // sadece pin 2 ve 3 UNO'da interupt olabilir #define UPPIN 4 // pinler bağlı pinlerdir tp ilgili switch #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // yönleri tanımlayın

#define DIRUP 1 // bu değerler "yılan"ın karar vermek için baktığı şeydir-

#define DIRDOWN 2 // yılanın gideceği yön #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed =0; // hangi pinin yükseldiği üzerinde hareket edilecek yönü kaydetmek için değer

// hangi pinin yükseldiğini saklar

bool BUTUP =0; bool BUTDWN=0; bool BUTLFT=0; bool BUTRHT=0; // arabanın konumuna göre değişir uint8_t carPosX=1; uint8_t carPosY ={0, 16, 32, 48}; // diziyi değiştiren değere ihtiyacı var

uint8_t şeritPosArr={0, 16, 32, 48}; // her şeridin nerede olduğunu saklayacak dizi

uint8_t carPosYCnt =0; uint8_t carYTmp=0; // yoldaki satırlar için değişkenler uint8_t roadLineX1=51; // bunlar başlangıçta önceden tanımlanmıştır, ardından çizgiler kesintisiz görünür uint8_t roadLineX2=102; uint8_t roadLineX3=153; uint8_t roadLineX4=254; uint8_t roadLineX5=200;

// bu, oynatma alanının bir seferde kaç piksel hareket ettiğidir

uint8_t çekmeHızı = 4;

// düşman0 için değişir

uint8_t düşman0PosX=255; uint8_t düşman0PosY=0; uint8_t düşman1PosX=255; uint8_t düşman1PosY=0; uint8_t düşman2PosX=255; uint8_t düşman2PosY=0;

// engellere şerit numarası atamak için rastgele değişken

uint8_t şeritGen=0;

uint8_t şeritGen0=0; uint8_t şeritGen1=0; uint8_t şeritGen2=0;

// puan sayacı

uzun puan=0; // puan bu:/ lol uzun karşılaştırma=0; // bu, uzun highScore=25 ile karşılaştırmak için puanı en son seviyede saklar; uint8_t metreCnt=0;

fonksiyonlara başladığımız yer burasıdır.

// bu, kesme etkinleştirilirse komutlar kümesidir void interruptressed() { delay(150); updateDirection(); } // DIR bool'larını kontrol ederek hangi değerin yönde olduğunu güncelleyin //-------------------------- YÖNÜ GÜNCELLE (oyuncu) - ------------------------- void updateDirection() { //Serial.println("updateDirection Çağrılı"); BUTUP= digitalRead(UPPIN); BUTDWN=dijitalOkuma(DWNPIN); BUTLFT=dijitalOkuma(LFTPIN); BUTRHT=dijitalOkuma(RHTPIN); if(BUTUP==true) { dirPressed=DIRUP; } if(BUTDWN==true) { dirPressed=DIRDOWN; } if(BUTLFT==true) { dirPressed=DIRLEFT; } if(BUTRHT==true) { dirPressed=DIRRIGHT; }

}

//-------------------------------------- ARABA TAŞI --------------- -------------------------

// bu, aracı hareket ettiren ekranı günceller

geçersiz moveCar()

{ switch (dirPressed) { case DIRUP: carPosYCnt--; arabaPosY[arabaPosYCnt]; ton(SND, 100, 100); if (carPosYCnt ==255) { carPosYCnt=0; } carYTmp=carPosY[carPosYCnt]; dirPressed=0; // Serial.println("carPosY up"); // Serial.println(carPosYCnt); kırmak; case DIRDOWN: carPosYCnt++; ton(SND, 100, 100); if(carPosYCnt==4) { carPosYCnt=3; } // Serial.println("carPosY"); // Serial.println(carPosYCnt); carYTmp=carPosY[carPosYCnt]; dirPressed=0; kırmak; // sağa ve sola hareket edebilen araba yorumlandı çarpışma tespiti henüz o kadar iyi değil /* durum DIRLEFT: carPosX--; if(carPosX==0) { carPosX=1; } // Serial.println("carPosX"); // Serial.println(carPosX); dirPressed=0; kırmak; */ case DIRRIGHT: // sadece eğlence için sağa basarsanız oyun bir ses tonu yapacaktır(SND, 100, 50); // arabaPosX++; // if (carPosX==128) // { // carPosX=127; // } // Serial.println("carPosX"); // Serial.println(carPosX); // dirPressed=0; kırmak; } updateDisplay(); }

//-------------------------- Rastgele POS X ------------------- -----------

uint8_t randomPosX() // bu 2 rutin sadece engeller için rastgele konum oluşturur

{ uint8_t posValTmp=0; posValTmp= rastgele(129, 230); //Serial.println("rastgele x"); //Serial.println(posValTmp); dönüş(posValTmp); }

//--------------------------- Rastgele POS Y------------------ ------------------

uint8_t randomPosY()

{ uint8_t şeritVal=0; şeritVal= rastgele(0, 4); // rastgelelik için fazladan bir şerit ekleyin, yani o şeritteyken ekranda hiçbir nesne yok //Serial.println("RandomY"); //Serial.println(lanePosArr[laneVal]); dönüş(lanePosArr[laneVal]); }//--------------------------------------OYUN HIZINI AYARLA-------------- -------------- void setGameSpeed() // bu, seviyenin 20'nin üzerine çıkmasını durdurur ve oyunu oynanamaz hale getirir {if(drawSpeed<21) { drawSpeed=drawSpeed+2; } }// ------------------------------------------ KAZA TESPİTİ ---------- -------------------------- geçersiz saptama Crash() {

if(enemy0PosX=0&&enemy0PosY==carYTmp)

{ // Serial.println("Oyun CRAASSSSHHHHHHHEEEEDDD Üzerinden Trafik 0'a Girdi"); oyun bitti(); } if(enemy1PosX=0&&enemy1PosY==carYTmp) { //Serial.println("Oyun CRAASSSSHHHHHHHEEEEDDD'yi trafik 1'e aktardı"); oyun bitti(); } if(enemy2PosX=0&&enemy2PosY==carYTmp) { //Serial.println("Oyun CRAASSSSHHHHHHHEEEEDDD'yi trafik 2'ye aktardı"); oyun bitti(); } }

bunlar ekranı çizen rutinlerdir.

//--------------------------------- ÇEKİLİŞ YOL--------------- --------------------- void drawRoad() // X, Y, uzunluk, genişlik { display.fillRect(roadLineX1, 15, 30, 4, BEYAZ); display.fillRect(roadLineX1, 30, 30, 4, BEYAZ); display.fillRect(roadLineX1, 45, 30, 4, BEYAZ); display.fillRect(roadLineX2, 15, 30, 4, BEYAZ); display.fillRect(roadLineX2, 30, 30, 4, BEYAZ); display.fillRect(roadLineX2, 45, 30, 4, BEYAZ); display.fillRect(roadLineX3, 15, 30, 4, BEYAZ); display.fillRect(roadLineX3, 30, 30, 4, BEYAZ); display.fillRect(roadLineX3, 45, 30, 4, BEYAZ); display.fillRect(roadLineX4, 15, 30, 4, BEYAZ); display.fillRect(roadLineX4, 30, 30, 4, BEYAZ); display.fillRect(roadLineX4, 45, 30, 4, BEYAZ); display.fillRect(roadLineX5, 15, 30, 4, BEYAZ); display.fillRect(roadLineX5, 30, 30, 4, BEYAZ); display.fillRect(roadLineX5, 45, 30, 4, BEYAZ);

roadLineX1=roadLineX1-drawSpeed;

roadLineX2=roadLineX2-drawSpeed; roadLineX3=roadLineX3-drawSpeed; roadLineX4=roadLineX4-drawSpeed; roadLineX5=roadLineX5-drawSpeed; display.display(); } //------------------------------------------Düşmanları ÇEKİN ---- ------------------------------------ void düşmanlarDraw() { // X, Y, bmp adı, genişliği, yüksekliği, renkli ekranı.drawBitmap(düşman0PosX, düşman0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); düşman0PosX=düşman0PosX-drawSpeed; display.drawBitmap(düşman1PosX, düşman1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); düşman1PosX=düşman1PosX-drawSpeed; display.drawBitmap(düşman2PosX, düşman2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); düşman2PosX=düşman2PosX-drawSpeed; display.display(); if(enemy0PosX>231&&enemy0PosX231&&enemy1PosX<255) { düşman1PosX=randomPosX(); düşman1PosY=randomPosY(); kontrolDuplicate(); }

if(enemy2PosX>231&&enemy2PosX<255) { düşman2PosX=randomPosX(); düşman2PosY=randomPosY(); } } //------------------------------------ GÜNCELLEME EKRANI ------- ------------------------------------------- void updateDisplay() { display.clearDisplay(); display.drawBitmap(carPosX, carPosY[carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect(100, 0, 28, 10, SİYAH); display.setCursor(100, 0); display.setTextColor(BEYAZ, SİYAH); display.println(skor); display.display();

}

//---------------------------Baskı döngüsünü bekleyin -------------------- ------

// bu ana ekran kodudur void waitForPress() { splashScreen(); bool bekleme = 0; // döngü bu doğru olduğunda sona erer display.clearDisplay(); while(bekliyor==0) {

display.fillRect(19, 20, 90, 32, SİYAH); // metin için boş arka plan

display.setTextColor(BEYAZ); display.setCursor(23, 24); display.setTextSize(0); display.println("Dikkatsiz"); display.setCursor(36, 34); display.println("Yarışçı"); display.drawBitmap(74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect(21, 21, 86, 23, 4, BEYAZ); // border Snake display.drawRect(19, 20, 90, 33, BEYAZ); // kenarlık kutusu - 3 display.setCursor(25, 43); display.setTextSize(0); // yazı tipi normale dön display.println("herhangi bir tuşa basın"); display.fillRect(0, 0, 127, 8, SİYAH); display.setCursor(10, 0); display.print("Yüksek Puan:"); // yüksek puanı göster display.print(highScore); display.display(); bekliyor = digitalRead(INTPIN); // dirPressed=0; // sıfırlama düğmesi yön yok } } //-------------------------------------- -----OYUNU GÜNCELLE----------------------------------------- void updateGame () { moveCar(); drawRoad(); düşmanDraw(); //düşman1Çizim(); // düşman2Çizim(); metreCnt++; algılamaCrash(); if(metreCnt==5)// skoru hızlandırmak için her 10 döngü için bir puan ekler { metreCnt=0; puan++; } if(score==compare+5) // oyunu her 5 puanlık bir maksimum 20 hıza kadar hızlandırır { karşılaştırma=skor; setGameSpeed(); } tonsuz(SND); updateDisplay();

}

// ------------------------------ OYUN BİTTİ---------------- ------------------------------

// bu rutin, ölü kahraman arabasının etrafındaki çizgileri çizer ve ardından oyunu ekranda görüntüler

geçersiz gameOver()

{ ton(SND, 200, 200); // sesi çal uint8_t linePosX, linePosY, pixwidth, pixheight=0; // değişkenleri arabanın etrafına kutular çizecek şekilde ayarla linePosX=carPosY; linePosY=carYTmp; piksel genişliği=30; piksel yüksekliği=15; display.drawRect(linePosX, linePosY, pixwidth, pixheight, BEYAZ); display.display(); for(int i=0;i<=26;i++) // bu, patlamayı simüle eden dikdörtgenler içinde arabayı çevreler { linePosX=linePosX-2; linePosY=linePosY-2; piksel genişliği= piksel genişliği+4; piksel yüksekliği= piksel yüksekliği+4; display.drawRect(linePosX, linePosY, pixwidth, pixheight, SİYAH); display.drawRect(linePosX, linePosY, pixwidth, pixheight, BEYAZ); display.display(); ton(SND, i*20, 50); gecikme(10); } display.setTextSize(2); display.setTextColor(BEYAZ, SİYAH); display.setCursor(10, 23); ton(SND, 50, 500); display.print("OYUN"); display.display(); gecikme(500); ton(SND, 40, 500); display.print("AŞIRI"); display.setTextSize(0); display.display(); gecikme(3000); oyunu yeniden başlat(); waitForPress(); }

// ----------------------------------------- OYUNU YENİDEN BAŞLAT ----- -------------------------------------------------- -----

void restartGame() // bu, yüksek puanı kopyalar ve tüm istatistikleri sıfırlar ve rastgele konumlar oluşturur

{ if(score>=highScore) //puanın yüksek puandan yüksek olup olmadığını kontrol edin { highScore=score; //yüksek puanı güncellemek için tek if ifadesi }

puan=0;

çekmeHızı=4; metreCnt=0; arabaPosYCnt=0; düşman0PosX=randomPosX(); düşman0PosY=randomPosY(); düşman1PosX=randomPosX(); düşman1PosY=randomPosY(); düşman2PosX=randomPosX(); düşman2PosY=randomPosY(); tonsuz(SND);

kontrolDuplicate();

}

//------------------------------------------------ - ÇOĞALTAYI KONTROL ET -------------------------------------------------- ------ void checkDuplicate() // engellerin aynı oyun alanını işgal edip etmediğini görmek için bu kontroller { // Serial.println("yinelenen kontrol"); if(enemy2PosX>230&&enemy2PosX<255) { while(düşman2PosY==düşman1PosY||düşman2PosY==düşman0PosY) { düşman2PosY=randomPosY(); } }

if(düşman0PosX>230&& düşman0PosX230&& düşman2PosXenemy1PosX&& düşman2PosX230&& düşman0PosXenemy1PosX&& düşman0PosX

//------------------------------------------- BAŞLANGIÇ EKRANI --- --------------------------------

geçersiz sıçrama ekranı()

{ display.clearDisplay(); display.drawBitmap(0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display(); gecikme (2000); } //------------------------------------------------ KURMAK ------------------------------------------------- ----------- geçersiz kurulum() { gecikme(100); // her şeyin başlamasına izin ver // Serial.begin(9600); // bunun ve tüm Serinin yorumunu kaldırın. arıza teşhis gösterimi için komutlar.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(BEYAZ, SİYAH); display.setTextWrap(yanlış); display.dim(0); pinMode(INTPIN, INPUT); pinMode(UPPIN, INPUT); pinMode(DWNPIN, INPUT); pinMode(LFTPIN, INPUT); pinMode(RHTPIN, GİRİŞ);

ataşeKesme(dijitalPinToInterrupt(INTPIN), kesintiye uğradı, YÜKSELEN);

// engelleri rasgele yerleştirmek düşman0PosX=randomPosX(); düşman0PosY=randomPosY(); düşman1PosX=randomPosX(); düşman1PosY=randomPosY(); düşman2PosX=randomPosX(); düşman2PosY=randomPosY(); kontrolDuplicate(); // yinelenen konumları kontrol edin // Serial.println("kurulum Tamamlandı"); başlangıç ekranı(); waitForPress(); } //------------------------------------------------ ----- DÖNGÜ -------------------------------------------- ----------

boşluk döngüsü()

{ güncellemeOyun(); }

ve hemen hemen bu kadar, herhangi bir değişiklik ve geri bildirim memnuniyetle karşılanacaktır. Ekran titremesini çözmemiz gereken sorunları nasıl azaltacağımıza bakmamız gerekiyor ve düşman arabaları hala aynı alanı işgal edebiliyor.

Önerilen: