#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define KEY A0
#define HOR A1
#define VER A2
#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 BALL_W 5
#define BALL_H 4
const PROGMEM byte ball[] = {
B01110000,
B11111000,
B11111000,
B01110000,
};
float ballX=30, ballY, ballSpeedX=2, ballSpeedY=2;
#define PLT_W 24
#define PLT_H 4
const PROGMEM byte platform[] = {
B01111111,B11111111,B11111110,
B11111111,B11111111,B11111111,
B11111111,B11111111,B11111111,
B01111111,B11111111,B11111110,
};
float pltX=30, pltY, pltSpeedX=2, pltSpeedY=0;
int score = 0;
void checkBallCollision(){
if ( ballX > pltX - BALL_W ){
if (ballX < pltX + PLT_W ) {
if ( ballY >= pltY - PLT_H ) {
ballY = pltY - BALL_W;
ballSpeedY = -ballSpeedY;
score++ ;
}
}
}
}
boolean move_ball(){
d.drawBitmap(ballX, ballY, ball, BALL_W, BALL_H, 0);
ballX += ballSpeedX;
ballY += ballSpeedY;
if (ballX < 0) {
ballX = 0;
ballSpeedX = -ballSpeedX;
}
if (ballX > SCREEN_WIDTH - BALL_W ){
ballX = SCREEN_WIDTH - BALL_W;
ballSpeedX = -ballSpeedX;
}
if (ballY < 0) {
ballY = 0;
ballSpeedY = -ballSpeedY;
}
if ( ballY > SCREEN_HEIGHT - BALL_H ) {
//ballY = SCREEN_HEIGHT - BALL_H;
//ballSpeedY = -ballSpeedY;
return ( 0 );
}
checkBallCollision();
d.drawBitmap(ballX, ballY, ball, BALL_W, BALL_H, 1);
return (1);
}
void move_platform(){
d.drawBitmap(pltX, pltY, platform, PLT_W, PLT_H, 0);
int a = analogRead( HOR );
if ( a < 400 ) pltX += pltSpeedX;
if ( a > 600 ) pltX -= pltSpeedX;
if (pltX < 0) pltX = 0;
if (pltX > SCREEN_WIDTH - PLT_W ) pltX = SCREEN_WIDTH - PLT_W;
d.drawBitmap(pltX, pltY, platform, PLT_W, PLT_H, 1);
}
void setup() {
pinMode( KEY, INPUT_PULLUP );
pinMode( HOR, INPUT );
pinMode( VER, INPUT );
d.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
d.clearDisplay();
d.display();
score = 0;
pltX = (SCREEN_WIDTH + PLT_W)/2;
pltY = SCREEN_HEIGHT - PLT_H;
ballX = random(SCREEN_WIDTH - BALL_W);
ballY = 0;
ballSpeedX = random(3)+1;
ballSpeedY = random(2)+1;
d.setTextSize(1);
d.setTextColor(1);
while (true) {
move_platform();
if (! move_ball() ) break;
d.fillRect(2,2,24,8,0);
d.setCursor(2,2);
d.print(score);
d.display();
}
d.setCursor(20,25);
d.setTextSize(2);
d.print("Looser!");
d.display();
delay(500);
}