#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define KEY A0
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 d(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define TANK_W 18 // ширина
#define TANK_H 7 // висота
const PROGMEM byte spriteTankPr[] = {
B00000011, B11000000, B00000000,
B00000011, B11111111, B11000000,
B00001111, B11110000, B00000000,
B01111111, B11111110, B00000000,
B11111111, B11111111, B00000000,
B11111111, B11111111, B00000000,
B01111111, B11111110, B00000000,
};
const PROGMEM byte spriteTankLf[] = {
B00000000,B11110000,B00000000,
B11111111,B11110000,B00000000,
B00000011,B11111100,B00000000,
B00011111,B11111111,B10000000,
B00111111,B11111111,B11000000,
B00111111,B11111111,B11000000,
B00011111,B11111111,B10000000,
};
float tankX, tankY, tankSpeed;
#define LITAK_W 18
#define LITAK_H 7
const PROGMEM byte LitakR[] = {
B11000000, B00000000, B00000000,
B01100000, B00000000, B00000000,
B01111111, B11111111, B00000000,
B01111111, B11111111, B11000000,
B00000000, B11111000, B00000000,
B00000000, B11100000, B00000000,
B00000000, B10000000, B00000000,
};
const PROGMEM byte LitakL[] = {
B00000000,B00000000,B11000000,
B00000000,B00000001,B10000000,
B00111111,B11111111,B10000000,
B11111111,B11111111,B10000000,
B00000111,B11000000,B00000000,
B00000001,B11000000,B00000000,
B00000000,B01000000,B00000000,
};
float litakX, litakY, litakSpeed, litakSpeedY;
#define BOMB_W 5
#define BOMB_H 4
const PROGMEM byte bomb[] = {
B01110000,
B11111000,
B11111000,
B01110000,
};
float bombX=-50, bombY, bombSpeedX=2, bombSpeedY=2;
int score = 0;
void setup() {
pinMode( KEY, INPUT_PULLUP );
tankX = SCREEN_WIDTH + 40;
tankY = SCREEN_HEIGHT - TANK_H;
tankSpeed = 3.3 ;
litakX = SCREEN_WIDTH + 40 ;
litakY = 0;
litakSpeed = 6;
d.begin(SSD1306_SWITCHCAPVCC, 0x3C);
d.clearDisplay();
d.drawBitmap(litakX,litakY, LitakR, LITAK_W,LITAK_H, 1);
d.display();
d.setTextColor(1);
d.setTextSize(1);
}
void move_litak(){
if ( litakSpeed > 0 )
d.drawBitmap(litakX,litakY, LitakR, LITAK_W,LITAK_H, 0);
else
d.drawBitmap(litakX,litakY, LitakL, LITAK_W,LITAK_H, 0);
litakX = litakX + litakSpeed;
litakY = litakY + litakSpeedY;
if ( litakY < 0 ) litakY = 0;
if ((litakX > SCREEN_WIDTH) || (litakX < -LITAK_W )) {
litakX = -LITAK_W;
litakY = random( 30 );
litakSpeed = (float) random( 30, 60 ) / 10.0;
if ( random(2) == 1 ) {
litakSpeed = -litakSpeed ;
litakX = SCREEN_WIDTH;
}
litakSpeedY = (float) random( 0, 5 ) / 10.0;
if ( random(2) == 1 ) {
litakSpeedY = -litakSpeedY;
}
}
if ( litakSpeed > 0 )
d.drawBitmap(litakX,litakY, LitakR, LITAK_W,LITAK_H, 1);
else
d.drawBitmap(litakX,litakY, LitakL, LITAK_W,LITAK_H, 1);
}
void move_tank(){
if (tankSpeed > 0)
d.drawBitmap(tankX,tankY, spriteTankPr, TANK_W,TANK_H, 0);
else
d.drawBitmap(tankX,tankY, spriteTankLf, TANK_W,TANK_H, 0);
tankX = tankX + tankSpeed;
if ( (tankX > SCREEN_WIDTH) || (tankX < -TANK_W) ) {
tankX = -TANK_W;
tankSpeed = (float) random( 10, 20 ) / 10.0;
if ( random(2) == 1 ) {
tankSpeed = -tankSpeed;
tankX = SCREEN_WIDTH;
}
}
if (tankSpeed > 0)
d.drawBitmap(tankX,tankY, spriteTankPr, TANK_W,TANK_H, 1);
else
d.drawBitmap(tankX,tankY, spriteTankLf, TANK_W,TANK_H, 1);
}
void move_bomb(){
if ( ( bombX < -BOMB_W ) || ( bombX > SCREEN_WIDTH ) || (bombY>SCREEN_HEIGHT) ) {
return; // вийти з функції
}
d.drawBitmap(bombX,bombY, bomb, BOMB_W,BOMB_H, 0);
bombX = bombX + bombSpeedX;
bombY = bombY + bombSpeedY;
// прискорення падіння бомби
bombSpeedY = bombSpeedY + 0.5;
if ( bombSpeedY > TANK_H ) bombSpeedY = TANK_H;
d.drawBitmap(bombX,bombY, bomb, BOMB_W,BOMB_H, 1);
}
void new_bomb(){
if ( ( bombX < -BOMB_W ) || ( bombX > SCREEN_WIDTH ) || (bombY>SCREEN_HEIGHT) ) {
if ( litakSpeed > 0 ) {
bombX = litakX;
bombY = litakY + 4;
bombSpeedX = litakSpeed/2;
bombSpeedY = 0;
}
if ( litakSpeed < 0 ) {
bombY = litakY + 4;
bombX = litakX + LITAK_W - BOMB_W;
bombSpeedX = litakSpeed/2;
bombSpeedY = 0;
}
}
}
// контроль зіштовхування бомби і танка
void test_collision(){
if ( bombX + BOMB_W > tankX ) {
if ( bombX < tankX + TANK_W ) {
if ( bombY + BOMB_H > tankY ) {
// бомба попала в танк
score++;
d.drawBitmap(bombX,bombY, bomb, BOMB_W,BOMB_H, 0);
bombX = -50;
}
}
}
}
void loop() {
// друк набраних балів
d.fillRect(0,0,20,8, 0);
d.setCursor(0,0);
d.print( score );
move_litak();
move_tank();
move_bomb();
if ( digitalRead(KEY) == 0 ) {
new_bomb();
}
test_collision();
d.display();
}