#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define KEY A1
Adafruit_SSD1306 d(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
const byte PROGMEM ball[] = {
B00011000,
B01100110,
B01000010,
B11000011,
B01000010,
B01100110,
B00011000,
};
#define LITAK_W 17
#define LITAK_H 12
const byte PROGMEM litak_r[] = {
B11000111, B00000000,B00000000,
B10100100, B10000000,B00000000,
B10010010, B01000000,B00000000,
B01001111, B11111100,B00000000,
B10000000, B00000011,B00000000,
B11100000, B01010100,B10000000,
B00011100, B00000000,B10000000,
B00000100, B01111111,B00000000,
B00001000, B10000000,B00000000,
B00001001, B00000000,B00000000,
B00010010, B00000000,B00000000,
B00011100, B00000000,B00000000,
};
const byte PROGMEM litak_l[] = {
B00000000,B01110001,B10000000,
B00000000,B10010010,B10000000,
B00000001,B00100100,B10000000,
B00011111,B11111001,B00000000,
B01100000,B00000000,B10000000,
B10010101,B00000011,B10000000,
B10000000,B00011100,B00000000,
B01111111,B00010000,B00000000,
B00000000,B10001000,B00000000,
B00000000,B01001000,B00000000,
B00000000,B00100100,B00000000,
B00000000,B00011100,B00000000,
};
#define BOMB_W 5
#define BOMB_H 7
const byte PROGMEM bomb[] = {
B01110000,
B00100000,
B01110000,
B10001000,
B10001000,
B01110000,
B00100000,
};
#define TANK_W 14
#define TANK_H 7
const byte PROGMEM tank_r[] = {
B00011111,B00000000,
B00100000,B11111100,
B00100000,B10000000,
B01000000,B01000000,
B11111111,B11111000,
B10000000,B00010000,
B01111111,B11100000,
};
const byte PROGMEM tank_l[] = {
B00000011,B11100000,
B11111100,B00010000,
B00000100,B00010000,
B00001000,B00001000,
B01111111,B11111100,
B00100000,B00000100,
B00011111,B11111000,
};
#define BABAH_W 14
#define BABAH_H 7
const byte PROGMEM babah[] = {
B01001101,B00100100,
B00011111,B11111000,
B00001111,B11110000,
B00010101,B11100000,
B00001111,B11111000,
B00000111,B10100000,
B00000111,B11010000,
};
int pause=0;
int score=0;
void setup() {
Serial.begin(115200);
pinMode( KEY, INPUT_PULLUP );
d.begin(SSD1306_SWITCHCAPVCC, 0x3C);
d.clearDisplay();
/*
d.drawBitmap( 10,10, litak_r, LITAK_W, LITAK_H, 1);
d.drawBitmap( 40,10, bomb, BOMB_W, BOMB_H, 1);
d.drawBitmap( 40,30, tank_r, TANK_W, TANK_H, 1);
*/
d.display();
randomSeed( analogRead(A0) );
d.setTextColor(1);
}
float litak_x=-127, litak_y=0, litak_sx=-5, litak_sy=0;
float tank_x=-127, tank_sx=1;
float bomb_x=-127, bomb_y=500, bomb_sx=3, bomb_sy=0;
void moveLitak(){
// рух літака
if ( litak_sx > 0 )
d.drawBitmap( litak_x,litak_y, litak_r, LITAK_W, LITAK_H, 0);
else
d.drawBitmap( litak_x,litak_y, litak_l, LITAK_W, LITAK_H, 0);
litak_x += litak_sx;
litak_y += litak_sy;
if ( (litak_x > 127) || (litak_x < -LITAK_W) ) {
litak_sx = (float) random( 30, 60 ) / 10;
if ( random(2) == 0 ) litak_sx = -litak_sx;
if ( litak_sx > 0 ) litak_x = -LITAK_W;
else litak_x = 127;
litak_y = random( 63 - LITAK_H - TANK_H - 20 );
}
if ( litak_sx > 0 )
d.drawBitmap( litak_x,litak_y, litak_r, LITAK_W, LITAK_H, 1);
else
d.drawBitmap( litak_x,litak_y, litak_l, LITAK_W, LITAK_H, 1);
d.setCursor(0,0);
d.print(score);
}
void moveTank(){
// рух танка
if ( tank_sx > 0 )
d.drawBitmap( tank_x, 63-TANK_H , tank_r, TANK_W, TANK_H, 0);
else
d.drawBitmap( tank_x, 63-TANK_H , tank_l, TANK_W, TANK_H, 0);
tank_x += tank_sx;
if ( ( tank_x > 127 ) || ( tank_x < -TANK_W ) ) {
tank_sx = (float) random( 10, 30 ) / 10;
if ( random(2) == 0 ) tank_sx = -tank_sx;
if ( tank_sx > 0 ) tank_x = -TANK_W;
else tank_x = 127;
}
if ( tank_sx > 0 )
d.drawBitmap( tank_x, 63-TANK_H , tank_r, TANK_W, TANK_H, 1);
else
d.drawBitmap( tank_x, 63-TANK_H , tank_l, TANK_W, TANK_H, 1);
}
void moveBomb(){
// рух бомби
if ( bomb_y < SCREEN_HEIGHT ) {
d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 0 );
bomb_sy = bomb_sy + 1;
if ( bomb_sy > TANK_H ) bomb_sy = TANK_H;
bomb_x = bomb_x + bomb_sx;
bomb_y = bomb_y + bomb_sy;
d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 1 );
}
else {
if ( digitalRead(KEY) == 0 ) {
// запускаємо нову бомбу
bomb_x = litak_x;
bomb_y = litak_y;
bomb_sx = litak_sx/2;
bomb_sy = 0;
}
}
}
void checkHit(){
if ( bomb_x + BOMB_W >= tank_x) {
if ( bomb_x < tank_x + TANK_W ) {
if (bomb_y > SCREEN_HEIGHT - TANK_H ) {
if ( bomb_y < SCREEN_HEIGHT ) {
// попала в танк
d.drawBitmap( bomb_x, SCREEN_HEIGHT-TANK_H-BABAH_H, babah, BABAH_W, BABAH_H, 1);
//Serial.println("Hit!");
//Serial.println(bomb_x);
//Serial.println(bomb_y);
if ( tank_sx > 0 ) tank_sx = 0.001;
else tank_sx = -0.001;
d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 0 );
bomb_y = SCREEN_HEIGHT * 2;
d.display();
pause = 20;
}
}
}
}
}
void loop() {
moveLitak();
moveTank();
moveBomb();
checkHit();
if (pause > 0) {
pause--;
if ( pause == 10 ){
d.drawBitmap( bomb_x, SCREEN_HEIGHT-TANK_H-BABAH_H, babah, BABAH_W, BABAH_H, 0);
}
if ( pause == 0 ){
d.clearDisplay();
tank_x = SCREEN_WIDTH * 2;
score++;
d.setCursor(0,0);
d.print(score);
}
}
d.display();
}