#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define BLACK 0x000 //define Colors
#define GREY 0x7BEF
#define GREEN 0x05E0
#define YELLOW 0xFFE0
#define RED 0xF800
#define BLUE 0x07FF
#define CYAN 0x07FF
#define WHITE 0xFFFF
#define TFT_DC 9 //define Display
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#define f_SEL 2
#define f_XJOY A0
#define f_YJOY A1
int xplane;
int yplane;
bool f_crash;
int f_speed=200;
int xcloud;
int ycloud;
int xbuilding;
int ybuilding;
void setup() {
Serial.begin(9600);
tft.begin();
pinMode(f_SEL, INPUT_PULLUP);
home_screen();
}
void loop(void) {
if (digitalRead(f_SEL) == LOW){
start(); //Start the Game
}
}
void home_screen(){
tft.fillRect(0,0,240,300,BLUE); //Displaybreite 240 und Höhe des Himmels 300
tft.fillRect(0,300,240,20,GREEN); //Displaybreite 240 und Höhe des Bodens 20 -> Gesamthöhe Display 320
create_cloud(160,20); //Create Cloud (X-Coordinate, Y-Coordinate)
create_cloud(40,40); //Create Cloud (X-Coordinate, Y-Coordinate)
create_building(150,110); //Create Building (X-Coordinate, Y-Coordinate)
create_building(40,140); //Create Building (X-Coordinate, Y-Coordinate)
create_plane(30,105); //Create Plane (X-Coordinate, Y-Coordinate) 105 60-295
tft.setTextColor(GREY); //Create Text: "Flappy Plane"
tft.setTextSize(4);
tft.setCursor(10,10);
tft.println("FLAPPY");
tft.setCursor(60,45);
tft.println("PLANE!");
}
void create_plane(int X_coord,int Y_coord){
tft.fillRect(xplane,yplane-20,90,45,BLUE);
tft.fillRoundRect(X_coord,Y_coord,90,25,11,WHITE); //Create Body
tft.drawRoundRect(X_coord,Y_coord,90,25,11,BLACK); //Create Border for Body
tft.fillTriangle(X_coord+9,Y_coord,X_coord+5,Y_coord-19,X_coord+22,Y_coord,WHITE); //Create Aileron
tft.drawTriangle(X_coord+8,Y_coord,X_coord+4,Y_coord-20,X_coord+22,Y_coord,BLACK); //Create Border for Aileron
tft.drawTriangle(X_coord+30,Y_coord+15,X_coord+55,Y_coord+15,X_coord+55,Y_coord+20,BLACK); //Create Wing
tft.fillTriangle(X_coord+78,Y_coord+3,X_coord+78,Y_coord+10,X_coord+85,Y_coord+10,BLACK); //Create front Window
for(int k=0; k<=5; k++){ //Create rear Windows
tft.fillCircle(X_coord+18+(k*10),Y_coord+8,2,BLACK);
}
xplane=X_coord;
yplane=Y_coord;
}
void create_cloud(int X_coord,int Y_coord){
tft.fillRoundRect(X_coord,Y_coord,55,20,10,WHITE); //Cloud middle
tft.fillCircle(X_coord+38,Y_coord-2,8,WHITE); //Cloud top right
tft.fillCircle(X_coord+22,Y_coord,15,WHITE); //Cloud top left
tft.fillCircle(X_coord+20,Y_coord+20,15,WHITE); //Cloud bottom left
tft.fillCircle(X_coord+40,Y_coord+20,8,WHITE); //Cloud bottom right
xcloud=X_coord;
ycloud=Y_coord;
}
void create_building(int X_coord,int Y_coord){
tft.fillRect(X_coord,Y_coord,40,350,GREY); //Create left Block
tft.drawRect(X_coord,Y_coord,40,350,BLACK); //Create Border for left Block
tft.fillTriangle(X_coord+40,Y_coord,X_coord+65,Y_coord+13,X_coord+40,Y_coord+13,GREY); //Create right Block
tft.fillRect(X_coord+40,Y_coord+14,26,350,GREY); //Create right Block
tft.drawLine(X_coord+40,Y_coord,X_coord+65,Y_coord+13,BLACK); //Create Borders for right Block
tft.drawLine(X_coord+65,Y_coord+13,X_coord+65,Y_coord+350,BLACK);
//tft.drawLine(X_coord+40,Y_coord+179,X_coord+65,Y_coord+179,BLACK);
for(int i=1; i<=30; i++){ //Create Windows for Building
for(int j=1; j<=3; j++){
tft.fillRect(X_coord+10*j-2,Y_coord+10*i-5,5,5,BLACK);
}
for(int k=1; k<=2; k++){
tft.fillRect(X_coord+10*k+35,Y_coord+(10*i+k*5)-5,5,5,BLACK);
}
}
xbuilding=X_coord;
ybuilding=X_coord;
}
void start(){
tft.fillRect(0,0,240,300,BLUE); //Displaybreite 240 und Höhe des Himmels 150
tft.fillRect(0,300,240,20,GREEN); //Displaybreite 240 und Höhe des Himmels 170 -> Gesamthöhe Display 320
create_cloud(160,20); //Create Cloud (X-Coordinate, Y-Coordinate)
create_cloud(40,40); //Create Cloud (X-Coordinate, Y-Coordinate)
while(f_crash==false){
while (analogRead(f_XJOY)<600&&f_crash==false){
create_plane(xplane,yplane+10);
delay(f_speed);
crashed();
}
while(analogRead(f_XJOY)>600&&f_crash==false){
if(yplane>50){
create_plane(xplane,yplane-10);
delay(f_speed);
}
}
}
}
void crashed(){
if(yplane>270){
f_crash=true;
yplane=105;
game_over();
}
else{
f_crash=false;
}
}
void game_over(){
tft.fillScreen(GREY);
tft.setTextColor(RED);
tft.setTextSize(4);
tft.setCursor(50,45);
tft.println("Game");
tft.setCursor(100,80);
tft.println("Over!");
}