#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 araba [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
0x80, 0x9B, 0x03, 0x00, 0xE0, 0x18, 0x0E, 0x00, 0x30, 0x18, 0x18, 0x00,
0x10, 0x18, 0x10, 0x00, 0x08, 0x18, 0x20, 0x00, 0x08, 0x18, 0x20, 0x00,
0x08, 0x18, 0x20, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x02, 0x10, 0x00, 0x0C,
0x02, 0xD0, 0x00, 0x18, 0x02, 0x10, 0x00, 0x18, 0x07, 0x10, 0x00, 0x08,
0xFF, 0xFF, 0xFF, 0x0F, 0xC0, 0x1A, 0x58, 0x03, 0xC0, 0x18, 0x18, 0x03,
0x80, 0x0F, 0xF0, 0x01, 0x00, 0x07, 0xE0, 0x00
};
static const unsigned char oneCactus [] PROGMEM = {
0x30, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x01, 0xFB, 0x03,
0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x01,
0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00,
0x78, 0x00, 0x00, 0x00,
};
//******************************
// 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;
//************************
Grafik arabam(10, 40, 30, 20, araba);
Grafik kaktusum(100, 40, 10, 20, 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_ncenB14_tr);
Serial.begin(9600);
attachInterrupt(1, menuyeDon, CHANGE);
attachInterrupt(0, sesKes, CHANGE);
Timer1.initialize(500000);
Timer1.attachInterrupt(muzikCal);
}
// loop bölümü
void loop() {
butonKontrol();
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.setCursor(0, 10);
display.print("oyun seciniz..");
display.setCursor(10, 33);
display.print("> Oyun 1");
display.setCursor(10, 53);
display.print(" Oyun 2");
} else if (menuDurum == 2) {
notaSayisi = sarki2NotaSayisi;
display.setCursor(0, 10);
display.print("oyun seciniz..");
display.setCursor(10, 33);
display.print(" Oyun 1");
display.setCursor(10, 53);
display.print("> Oyun 2");
}
if (kirmizibtn) {
sesCal(100, 70);
notaNo = 0;
oyunDurum = menuDurum;
}
}
//**********************
void oyun1Olustur() {
static int puan;
display.setCursor(100, 20);
display.print(puan);
if(yukari){
if(arabam.y > 0){
arabam.y -= 5;
sesCal(speedSound,10);
}
}
if(asagi){
if(arabam.y < 50){
arabam.y += 5;
sesCal(speedSound,10);
}
}
if(kirmizibtn){
if(hiz <=10){
hiz++;
}
}
arabam.grafikCiz();
kaktusum.grafikCiz();
if(kaktusum.x > 0){
kaktusum.x -= ( hiz + random(1,3));
}else{
puan++;
kaktusum.x = random(128,130);
kaktusum.y = random(20,50);
}
if(carpismaVarmi(&arabam,&kaktusum)){
kaktusum.x = 128;
puan -= 1;
sesCal(1200,100);
}
if(hiz >0){
hiz--;
}
}
void oyun2Olustur() {
Serial.println("Oyun2");
}
//menuye donme fonksiyonu
void menuyeDon() {
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 == 1) {
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;
}
}
}
}