#include <U8g2lib.h>
#include <TimerOne.h>
#include <avr/pgmspace.h>
// önişlemci tanımları *********************
#define yukaribtn 8
#define asagibtn 6
#define sagbtn 5
#define solbtn 4
#define selectbtn 2
#define resetbtn 3
#define analogbtn 7
#define abtn 10
#define bbtn 9
#define buzzer 11
#define deneme 13
#define debounceDelay 50
// *****************************************
// notalar
#define do_ 261
#define re 294
#define mi 329
#define fa 349
#define sola 392
#define la 440
#define si 493
#define DO_ 523
#define jumpSound 700
#define blahSound 125
#define speedSound 1000
#define DBOUNCE 180
#define sarki1NotaSayisi 63
#define sarki2NotaSayisi 7
//ekran kütüphanesini ekler
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(U8G2_R0);
//*************************************
// sınıfları oluşturur
class Grafik {
public:
int x;
int y;
uint8_t yukseklik;
uint8_t genislik;
char *grafik;
Grafik(int xa, int ya, uint8_t gen, uint8_t yuk, char *graf) {
x = xa;
y = ya;
yukseklik = yuk;
genislik = gen;
grafik = graf;
}
~Grafik() {
Serial.println("bittim");
}
void grafikCiz(int xb, int yb) {
x = xb;
y = yb;
display.drawXBMP( x, y, genislik, yukseklik, grafik);
}
void grafikCiz() {
display.drawXBMP( x, y, genislik, yukseklik, grafik);
}
void grafikDegistir(char *graf, uint8_t gen, uint8_t yuk) {
grafik = graf;
yukseklik = yuk;
genislik = gen;
}
};
//***************************************************
// Buton değikenlerini oluşturur
bool yukari = false;
bool asagi = false;
bool sag = false;
bool sol = false;
bool resetbuton = false;
bool selectbuton = false;
bool analogbuton = false;
bool kirmizibtn = false;
bool mavibtn = false;
//*************************************
//grafikleri oluşturur
static const unsigned char logo[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xDB, 0xB6, 0x19,
0xDB, 0x37, 0xFB, 0xBE, 0x61, 0xE3, 0xFB, 0xBE, 0xEF, 0xFB, 0x1E, 0x00,
0x60, 0xDB, 0xB6, 0x1B, 0xDB, 0x76, 0xDB, 0xB6, 0x61, 0x63, 0xDB, 0x36,
0x6C, 0xDB, 0x0C, 0x00, 0x60, 0xDB, 0xB6, 0x1F, 0xDB, 0xF6, 0x1B, 0xB6,
0x61, 0x63, 0xDB, 0x36, 0x6C, 0x18, 0x0C, 0x00, 0x60, 0xF3, 0xB6, 0x1D,
0xCF, 0xB6, 0x73, 0xB6, 0x61, 0xE3, 0x79, 0x36, 0xEC, 0x71, 0x0C, 0x00,
0x60, 0x63, 0xB6, 0x19, 0xDB, 0x36, 0xC3, 0xB6, 0x61, 0x63, 0xD8, 0x36,
0x6C, 0xC0, 0x0C, 0x00, 0x60, 0x63, 0xB6, 0x19, 0xDB, 0x36, 0xC3, 0xB6,
0x61, 0x63, 0xD8, 0x36, 0x6C, 0xC0, 0x0C, 0x00, 0x60, 0x63, 0xB6, 0x19,
0xDB, 0x36, 0xDB, 0xB6, 0x61, 0x63, 0xD8, 0xB6, 0x6D, 0xDB, 0x0C, 0x00,
0xE0, 0x63, 0xBE, 0x19, 0xDB, 0x37, 0xFB, 0xBE, 0xEF, 0x63, 0xD8, 0xBE,
0xEF, 0xFB, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x31, 0x06, 0x93, 0xA2, 0xF7, 0x11,
0x3D, 0xF7, 0xA2, 0x23, 0xA5, 0x8B, 0x00, 0x00, 0x00, 0x52, 0x4A, 0x89,
0x94, 0xB6, 0x40, 0x10, 0x85, 0x10, 0x22, 0x21, 0x2D, 0x89, 0x00, 0x00,
0x00, 0x5E, 0x0A, 0x8F, 0xF7, 0xAA, 0x43, 0xE0, 0x1C, 0x73, 0x14, 0x21,
0x35, 0x51, 0x00, 0x00, 0x00, 0x52, 0x4A, 0x89, 0x94, 0xA2, 0x40, 0x40,
0x04, 0x14, 0x14, 0x21, 0x25, 0x51, 0x00, 0x00, 0x00, 0x92, 0x31, 0x89,
0x94, 0xA2, 0x47, 0x40, 0xBC, 0xF3, 0x88, 0xC3, 0xA4, 0x23, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x13, 0x05, 0x20,
0x86, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x88, 0xB4, 0x05, 0x30, 0xC9, 0x40, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x88, 0x53, 0x85, 0x2B, 0xA9, 0x5C, 0x22, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x14, 0x05, 0x78,
0xE9, 0x41, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x88, 0x13, 0x3D, 0x20, 0x86, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x98, 0x74, 0x2E,
0x32, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xA5, 0x25, 0x61, 0x4B, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0xBD, 0x26, 0xA6, 0x7A, 0x0D, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xA5, 0x24, 0x28,
0x4A, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xA4, 0x74, 0x27, 0x4A, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x09, 0x00,
0x09, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x07, 0xE7,
0x40, 0x04, 0x9F, 0x49, 0xEE, 0x12, 0xC9, 0x7D, 0x29, 0x1D, 0x63, 0x00,
0x20, 0xA5, 0x00, 0x29, 0xC1, 0x06, 0x44, 0x4A, 0x41, 0x16, 0x29, 0x10,
0x69, 0xA5, 0x14, 0x00, 0x20, 0xA5, 0x00, 0xE9, 0x40, 0x05, 0xC4, 0x7B,
0x46, 0x1A, 0xC9, 0x10, 0xA9, 0xA5, 0xD7, 0x00, 0x20, 0xA5, 0x00, 0xA9,
0x40, 0x04, 0x44, 0x4A, 0x48, 0x12, 0x09, 0x11, 0x29, 0xA5, 0x94, 0x00,
0xE0, 0x18, 0x27, 0x27, 0x41, 0x24, 0x44, 0x4A, 0xE7, 0x12, 0xE6, 0x10,
0x26, 0x9D, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
static const unsigned char araba [] PROGMEM = {
0x3C, 0xF0, 0x00, 0xFE, 0xFF, 0x01, 0x7F, 0xFD, 0x03, 0xDF, 0xE7, 0x02,
0xDF, 0xC7, 0x03, 0xDF, 0xC7, 0x03, 0xDF, 0xE7, 0x02, 0x7F, 0xFD, 0x03,
0xFE, 0xFF, 0x01, 0x3C, 0xF0, 0x00
};
static const unsigned char oneCactus [] PROGMEM = {
0x1C, 0x70, 0x00, 0xFE, 0xFF, 0x00, 0xF3, 0xFD, 0x01, 0xE3, 0x79, 0x03,
0xC3, 0xF1, 0x03, 0xC3, 0xF1, 0x03, 0xE3, 0x79, 0x03, 0xF3, 0xFD, 0x01,
0xFE, 0xFF, 0x00, 0x1C, 0x70, 0x00
};
static const unsigned char carp [] PROGMEM = {
0x11, 0x02, 0x11, 0x01, 0xFE, 0x00, 0x92, 0x00, 0xFE, 0x00, 0xFF, 0x03,
0xC6, 0x00, 0x54, 0x00, 0x7C, 0x00, 0x13, 0x01
};
//******************************
// müzik notları
const unsigned int sarki[] PROGMEM = {mi, mi, fa, sola, sola, fa, mi, re, do_, do_, re,
mi, mi, re, re, mi, mi, fa, sola, sola, fa, mi, re, do_, do_, re, mi, re, do_, do_, re,
re, mi, do_, re, mi, fa, mi, do_, re, mi, fa, mi, re, do_, re, sola, mi, mi, mi,
fa, sola, sola, fa, mi, re, do_, do_, re, mi, re, do_, do_
};
const unsigned int sarki1[] PROGMEM {do_, re, re, do_, si, la, do_ };
//**************************
//global değikenlerin oluşturulması
unsigned long lastDebounceTime = 0; // dugme surelerini ayarlar
uint8_t oyunDurum = 0;
uint8_t menuDurum = 1;
bool sesDurum = 1;
uint8_t notaNo = 0;
uint8_t notaSayisi = 50;
uint8_t hiz = 0;
int yolPoz = 0;
int kalanHak = 3;
int puan;
//************************
Grafik arabam(10, 40, 18, 10, araba);
Grafik kaktusum(100, 40, 18, 10, oneCactus);
// setup bölümü
void setup() {
pinMode(yukaribtn, INPUT_PULLUP);
pinMode(asagibtn, INPUT_PULLUP);
pinMode(sagbtn, INPUT_PULLUP);
pinMode(solbtn, INPUT_PULLUP);
pinMode(selectbtn, INPUT_PULLUP);
pinMode(resetbtn, INPUT_PULLUP);
pinMode(analogbtn, INPUT_PULLUP);
pinMode(abtn, INPUT_PULLUP);
pinMode(bbtn, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
pinMode(deneme, OUTPUT);
butonReset();
display.begin();
display.setFont(u8g2_font_ncenB12_tr);
Serial.begin(9600);
attachInterrupt(1, menuyeDon, CHANGE);
Timer1.initialize(500000);
Timer1.attachInterrupt(muzikCal);
display.clearBuffer();
display.drawXBMP( 0, 0, 128, 64, logo);
display.sendBuffer();
delay(2000);
}
// loop bölümü
void loop() {
butonKontrol();
if (selectbuton) {
sesKes();
}
display.clearBuffer();
switch (oyunDurum) {
case 0:
menuleriOlustur();
break;
case 1:
oyun1Olustur();
break;
case 2:
oyun2Olustur();
break;
default:
Serial.println("bir sorun var");
}
display.sendBuffer();
butonReset();
}
//butonları kontrol eden fonksiyon
void butonKontrol() {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (!digitalRead(yukaribtn)) yukari = true;
if (!digitalRead(asagibtn)) asagi = true;
if (!digitalRead(sagbtn)) sag = true;
if (!digitalRead(solbtn)) sol = true;
if (!digitalRead(resetbtn)) resetbuton = true;
if (!digitalRead(selectbtn)) selectbuton = true;
if (!digitalRead(analogbtn)) analogbuton = true;
if (!digitalRead(abtn)) kirmizibtn = true;
if (!digitalRead(bbtn)) mavibtn = true;
lastDebounceTime = millis();
}
}
//**************************
//butonları resetleyen fonksiyon
void butonReset() {
yukari = false;
asagi = false;
sag = false;
sol = false;
resetbuton = false;
selectbuton = false;
analogbuton = false;
kirmizibtn = false;
mavibtn = false;
}
//**************************
// çarpışmaları kontrol eden fonksiyon
bool carpismaVarmi(Grafik *birinciObje, Grafik *ikinciObje) {
bool result;
if (birinciObje->x + birinciObje->genislik >= ikinciObje->x &&
birinciObje->x <= ikinciObje->x + ikinciObje->genislik &&
birinciObje->y + birinciObje->yukseklik >= ikinciObje->y &&
birinciObje->y <= ikinciObje->y + ikinciObje->yukseklik
) {
result = true;
return result;
} else {
result = false;
return result;
}
}
//**************************
//menuleri oluşturan fonksiyon
void menuleriOlustur() {
if (yukari) {
if (menuDurum == 2) {
menuDurum = 1;
Serial.println(menuDurum);
sesCal(blahSound, 20);
}
}
if (asagi) {
if (menuDurum == 1) {
menuDurum = 2;
Serial.println(menuDurum);
sesCal(blahSound, 20);
}
}
if (menuDurum == 1) {
notaSayisi = sarki1NotaSayisi;
display.drawStr(0, 10, "oyun seciniz..");
display.drawStr(10, 33, "> Oyun 1");
display.drawStr(10, 53, " Oyun 2");
} else if (menuDurum == 2) {
notaSayisi = sarki2NotaSayisi;
display.drawStr(0, 10, "oyun seciniz..");
display.drawStr(10, 33, " Oyun 1");
display.drawStr(10, 53, "> Oyun 2");
}
if (kirmizibtn) {
sesCal(100, 70);
notaNo = 0;
oyunDurum = menuDurum;
display.setFont(u8g2_font_ncenB08_tr);
kalanHak = 3;
}
}
//**********************
void oyun1Olustur() {
display.drawStr(0, 8, "hak: ");
display.setCursor(25, 8);
display.print(kalanHak);
display.drawStr(75, 8, "puan: ");
display.setCursor(110, 8);
display.print(puan);
if (kalanHak > 0) {
if (yukari) {
if (arabam.y > 13) {
arabam.y -= 2;
sesCal(speedSound, 10);
}
}
if (asagi) {
if (arabam.y < 50) {
arabam.y += 2;
sesCal(speedSound, 10);
}
}
if (kirmizibtn) {
if (hiz <= 8) {
hiz += 2;
}
sesCal(100 + hiz * 3, 25);
}
//yolları çizer
if (yolPoz < -15) {
yolPoz = 5;
} else {
yolPoz -= hiz;
}
yolCiz(yolPoz, 25, 12, 6);
//arabaları çizer
arabam.grafikCiz();
kaktusum.grafikCiz();
if (kaktusum.x >= -15 && hiz > 0) {
kaktusum.x -= ( (hiz - 3) + random(1, 3));
} else if (kaktusum.x > -15 && hiz == 0) {
kaktusum.x += ( random(1, 3));
}
else if (kaktusum.x < -15 ) {
puan++;
kaktusum.x = random(128, 130);
kaktusum.y = random(20, 50);
}
if (carpismaVarmi(&arabam, &kaktusum)) {
kalanHak -= 1;
sesCal(3000, 150);
kaktusum.grafikDegistir(carp, 10, 10);
kaktusum.grafikCiz();
display.updateDisplay();
delay(150);
kaktusum.grafikDegistir(oneCactus, 18, 10);
kaktusum.grafikCiz();
display.updateDisplay();
kaktusum.x = 128 + random(0, 10);
}
if (hiz > 0) {
if (!kirmizibtn) {
sesCal(150 - hiz * 5, 20);
}
hiz--;
}
} else {
// 3 kere çarparsan
display.drawStr(30, 30, "Oyun Bitti");
if (mavibtn) {
kalanHak = 3;
puan = 0;
}
}
}
void oyun2Olustur() {
Serial.println("Oyun2");
display.drawStr(10, 30, "On Prepare");
}
//menuye donme fonksiyonu
void menuyeDon() {
display.setFont(u8g2_font_ncenB12_tr);
oyunDurum = 0;
menuDurum = 1;
}
//***********************
void sesKes() {
sesDurum = !sesDurum;
}
void sesCal(int ritim, int sure) {
if (sesDurum) {
tone(buzzer, ritim, sure);
}
}
void muzikCal() {
if (sesDurum) {
if (oyunDurum == 0) {
tone(buzzer, pgm_read_word(&sarki[notaNo]), 200);
if (notaNo < notaSayisi) {
notaNo++;
}
else {
notaNo = 0;
}
}
if (oyunDurum == 2) {
tone(buzzer, pgm_read_word(&sarki1[notaNo]), 100);
if (notaNo < notaSayisi) {
notaNo++;
}
else {
notaNo = 0;
}
}
}
}
void yolCiz(int xpos, int ypos, int uzunluk, int kactane) {
display.drawHLine(0, 9, 128);
display.drawHLine(0, 63, 128);
for (int i = 0; i < kactane; i++) {
for ( int j = 0; j < 2; j++) {
display.drawHLine(xpos + i * 30, ypos + j * 16, uzunluk);
}
}
}