#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
//Дисплей
#define TFT_DC 9
#define TFT_CS 10
//tone
#define PIN_TONE 4
//Джостик
#define VERT_PIN A5 //Вертикальный (Вверх/вниз)
#define HORZ_PIN A4 //Горизантальный (Влево/вправо)
#define SEL_PIN 2 //Нажатие на джостик
double ModelVert = 160.0; //Начальные координаты игрока
double ModelHorz = 120.0; //
double NewVert = ModelVert; //Новые координаты при передвижении игрока
double NewHorz = ModelHorz;//
double MaxHorz = 220; //Максимальные кординаты для передвижения игрока
double MaxVert = 300; //
int score = 0; //Количество очков
double speed = 0.1; // Скорость игрока
int live = 3; //Жизнь игрока
long Rand_X; //Координаты появления новых объектов
long Rand_Y; //
boolean liveBlock = false; // Если ли новый объект на карте или нет
int TimeLiveBlock = 0; //Cчетчик времени жизни блока
boolean game = false;
int maxScore = 0;
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//Первоначальные настройки
void setup() {
Serial.begin(9600);
tft.begin();
startGame();
//Записываем наш джостик
pinMode(VERT_PIN, INPUT);
pinMode(HORZ_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
//Считываем шумы с A0, для радномизации значений
randomSeed(analogRead(0));
}
void loop() {
checkMoveUser();
}
void startGame(){
tft.fillRect(0,0,240,320,ILI9341_BLACK);
score = 0;
ModelVert = 160.0; //Начальные координаты игрока
ModelHorz = 120.0; //
NewVert = ModelVert; //Новые координаты при передвижении игрока
NewHorz = ModelHorz;//
live = 3;
maxScore = 0;
paintScore(); //Выводит на экран количество очков
paintBorders(); //Выводит на экран границы
paintLive(); //Вывод на экран значение жизней
tft.fillRect(NewHorz,NewVert,10,10,ILI9341_RED ); //Выводит на экран нашего игрока
game = true;
}
void checkMoveUser(){
if(game == true){
//Если джостик вверх, передвигаем игрока
if(analogRead(VERT_PIN) > 512 and NewVert > 35){
NewVert = NewVert - 1 * speed; //присваевыем ему новые координаты
paintUser(); //Рисуем новый объект
}
//Если джостик вниз, передвигаем игрока
if(analogRead(VERT_PIN)< 512 and NewVert < MaxVert){
NewVert = NewVert + 1 * speed; //присваевыем ему новые координаты
paintUser(); //Рисуем новый объект
}
//Если джостик влево, передвигаем игрока
if(analogRead(HORZ_PIN) > 512 and NewHorz > 10){
NewHorz = NewHorz - 1 * speed; //присваевыем ему новые координаты
paintUser(); //Рисуем новый объект
}
//Если джостик вправо, передвигаем игрока
if(analogRead(HORZ_PIN)< 512 and NewHorz < MaxHorz){
NewHorz = NewHorz + 1 * speed; //присваевыем ему новые координаты
paintUser(); //Рисуем новый объект
}
//Если нет блока для набора очков
if (liveBlock == false){
liveBlock = true;
spawnBlock(); //создаем новый блок
}else{
TimeLiveBlock ++;
}
touchObject();
if(TimeLiveBlock == 4000){
live --;
paintLive();
TimeLiveBlock = 0;
tft.fillRect(Rand_X,Rand_Y,10,10,ILI9341_BLACK);
liveBlock = false;
}
if ((maxScore - score > 10)){
if (live < 3){
live ++;
}
maxScore = score;
}
}
if (game == false){
if (digitalRead(SEL_PIN) != 1){
startGame();
}
}
}
//Функция для передвижения нашего игрока
void paintUser(){
tft.fillRect(ModelHorz,ModelVert,10,10,ILI9341_BLACK); // Закрашиваем старые координаты
ModelHorz = NewHorz; //присваеваем новые координаты
ModelVert = NewVert;
tft.fillRect(NewHorz,NewVert,10,10,ILI9341_RED ); //рисуем объект
}
//Функция для рисования контура нашей игры
void paintBorders(){
tft.fillRect(0,25,240,5,ILI9341_RED);
tft.fillRect(0,25,5,320,ILI9341_RED);
tft.fillRect(0,315,240,320,ILI9341_RED);
tft.fillRect(235,25,240,320,ILI9341_RED);
}
void paintLive(){
if (live != 0) {
tft.fillRect(110,0,130,25,ILI9341_BLACK);
tft.setCursor(150, 5);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("LIVES:" + String(live));
}else{
gameOver();
}
}
//Создания объектов для сбора
void spawnBlock(){
Rand_X = random(10, MaxHorz - 5); //Присваеваем рандомные координаты
Rand_Y = random(50, MaxVert - 5);//
tft.fillRect(Rand_X,Rand_Y,10,10,ILI9341_BLUE); //Рисуем данный объект
TimeLiveBlock = 0;
}
// Вывод очков информации
void paintScore(){
tft.fillRect(0,0,100,25,ILI9341_BLACK);
tft.setCursor(0, 5);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("SCORE:" + String(score));
}
void touchObject(){
if ((Rand_X < ModelHorz and ModelHorz < Rand_X + 10) or (Rand_X < ModelHorz + 10 and ModelHorz + 10 < Rand_X + 10)) {
if((Rand_Y < ModelVert and ModelVert < Rand_Y + 10) or (Rand_Y < ModelVert + 10 and ModelVert + 10 < Rand_Y + 10)) {
score ++;
paintScore();
tft.fillRect(Rand_X,Rand_Y,10,10,ILI9341_BLACK);
paintUser();
liveBlock = false;
tone(PIN_TONE, 272, 100);
}
}
}
void gameOver(){
tft.fillRect(0,0,240,320,ILI9341_BLACK);
tft.setCursor(30, 120);
tft.setTextColor(ILI9341_RED);
tft.setTextSize(3);
tft.println("GAME OVER!");
tft.setCursor(50, 150);
tft.println("SCORE:" + String(score));
delay(3000);
game = false;
tft.setCursor(40, 220);
tft.setTextSize(2.5);
tft.println("Push button...");
}