//Base on: https://www.youtube.com/watch?v=Oh9vgomyuOI
//Souce code: bytesnbits.co.uk/arduino-breakout-spi-lcd-touchscreen/#google_vignette
//TEMPLATE ???? for DOC
//### Pin Connections
//| Arduino Pin | Device |
//| ----------- | ------------- |
//| 12 | Red LED |
//| 11 | Green LED |
//| 10 | Blue LED |
//| 9 | Yellow LED |
//| 8 | Buzzer |
//| 5 | Red Button |
//| 4 | Green Button |
//| 3 | Blue Button |
//| 2 | Yellow Button |
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Keypad.h>
// function declarations
boolean checkCollision(int x1, int y1, int width1, int height1, int x2, int y2, int width2, int height2);
// For the Adafruit shield, these are the default.
#define TFT_CS 10
#define TFT_DC 9
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12
#define TS_CS 7
#define ROTATION 1
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC/RST
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
float xCalM = 0.0, yCalM = 0.0;
float xCalC = 0.0, yCalC = 0.0;
float xPos = 0.0, yPos = 0.0;
float xPosLast = 0.0, yPosLast = 0.0;
float xVel = 0.0, yVel = 0.0;
int8_t topBorder = 20;
int8_t batWidth = 35;
int8_t batHeight = 4;
int16_t batX = 0, batY = 0;
int16_t newBatX;
int8_t ballSize = 10;
int playerLives = 3;
int playerScore = 0;
int level = 1;
int gameState = 1; // 1=start 2=playing 3=gameover
float xPosNBA = 0.0, yPosNBA = 0.0, xStart = 0.0;
boolean dyPosNBA; // true = to down, false = to up
float timeNBA = 0, stepNBA = 0.1;
int xVelNBA = 1, yVelNBA = 1;
float vXNBA, vYNBA;
float angleNBA, FNBA;
String welcome = "Czaro NBA";
boolean hit;
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'.', '0', '=', '/'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
//const unsigned char PROGMEM bmp0[] =
const uint16_t ball_black[] PROGMEM={
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
};
const uint16_t basket[] PROGMEM={
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
const uint16_t ball3[] PROGMEM={
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
};
int16_t tftWidth = 0, tftHeight = 0;
class ScreenPoint {
public:
int16_t x;
int16_t y;
ScreenPoint(){
// default contructor
}
ScreenPoint(int16_t xIn, int16_t yIn){
x = xIn;
y = yIn;
}
};
class Block {
public:
int x;
int y;
int width;
int height;
int colour;
int score;
boolean isActive;
// default constructor
Block(){}
Block(int xpos, int ypos, int bwidth, int bheight, int bcol, int bscore){
x = xpos;
y = ypos;
width = bwidth;
height = bheight;
colour = bcol;
score = bscore;
isActive = true;
drawBlock();
}
void drawBlock(){
tft.fillRect(x,y,width,height,colour);
}
void removeBlock(){
tft.fillRect(x,y,width,height,ILI9341_BLACK);
isActive = false;
}
boolean isHit(float x1,float y1, int w1,int h1){
if (checkCollision((int)round(x1),(int)round(y1),w1,h1,x,y,width,height)){
return true;
}
else {
return false;
}
}
};
Block blocks[5][16];
ScreenPoint getScreenCoords(int16_t x, int16_t y){
int16_t xCoord = round((x * xCalM) + xCalC);
int16_t yCoord = round((y * yCalM) + yCalC);
if(xCoord < 0) xCoord = 0;
if(xCoord >= tftWidth) xCoord = tftWidth - 1;
if(yCoord < 0) yCoord = 0;
if(yCoord >= tftHeight) yCoord = tftHeight - 1;
return(ScreenPoint(xCoord, yCoord));
}
void setup() {
Serial.begin(115200);
// avoid chip select contention
pinMode(TS_CS, OUTPUT);
digitalWrite(TS_CS, HIGH);
pinMode(TFT_CS, OUTPUT);
digitalWrite(TFT_CS, HIGH);
tft.begin();
tft.setRotation(ROTATION);
tft.fillScreen(ILI9341_BLACK);
tftWidth = tft.width();
tftHeight = tft.height();
batY = tftHeight - batHeight -30;
Serial.print("szerokosc = ");
Serial.print( tftWidth );
Serial.print("Wysokosc = ");
Serial.println( tftHeight );
//initialize random generator
unsigned long noise = 0;
for( int i = A0; i <= A7; i++) { // select the analog pins that your board supports
noise += analogRead( i);
noise <<= 2; // for a little more random
}
randomSeed( noise);
}
void initGameNBA() {
timeNBA = 0;
stepNBA = 0.01;
FNBA = 920.0;
angleNBA = 45.0;
tft.fillScreen(ILI9341_BLACK);
tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
drawScore();
drawLevel();
drawLives();
xPos = xPosNBA = xStart = ballSize + random() % 200;
//debug
Serial.println(xStart);
yPos = yPosNBA = -20+tftHeight - ballSize;
batX = 265;
batY = 115;
tft.drawRGBBitmap(batX-5, batY-17, basket, 45, 48);
tft.fillRect(batX, batY, batWidth, batHeight,ILI9341_RED);
tft.fillCircle(round(xStart), round(yPosNBA), ballSize, ILI9341_ORANGE);
}
void initDemo(){
Serial.println( "initDemo" );
batY = tftHeight - batHeight -30;
xPosLast = xPos = 10;
yPosLast = yPos = 230;
xVel = 2;
yVel = 2;
playerLives = 3;
playerScore = 0;
level = 1;
//draw Basket Ball
int x = 40, y = 40;
tft.fillCircle(x, y, 30, ILI9341_ORANGE);
tft.drawCircle(x+36, y+18, 30, ILI9341_BLACK);
tft.drawCircle(x+36, y+19, 30, ILI9341_BLACK);
tft.drawCircle(x-36, y-18, 30, ILI9341_BLACK);
tft.drawCircle(x-36, y-19, 30, ILI9341_BLACK);
tft.drawLine(x-36, y-18, x+36,y+18 ,ILI9341_BLACK);
tft.drawLine(x-36, y-19, x+36,y+17 ,ILI9341_BLACK);
tft.drawLine(x+18, y-36, x-18,y+36 ,ILI9341_BLACK);
tft.drawLine(x+18, y-37, x-18,y+35 ,ILI9341_BLACK);
//tft.drawLine(x, y, x-36,y-18 ,ILI9341_BLACK);
//tft.drawLine(x, y, x+36,y+18 ,ILI9341_BLACK);
//tft.drawLine(x, y, x+18,y-36 ,ILI9341_BLACK);
//tft.drawLine(x, y, x-18,y+36 ,ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.setCursor(x+45,y-20);
tft.print(welcome);
x = (tftWidth/2)-155;
y = (tftHeight/2)-40;
//tft.fillRect((tftWidth/2)-170,(tftHeight/2)-20,300,40,ILI9341_GREEN);
blocks[0][0] = Block(x, y, 310, 40, ILI9341_GREEN, 0);
tft.setCursor(x+30,y+12);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.print("PRESS ANY KEY TO PLAY");
}
void clearOldBallPos(){
//tft.fillCircle(round(xPos), round(yPos), ballSize, ILI9341_BLACK);
tft.fillRect(round(xPos)-ballSize,round(yPos)-ballSize,ballSize*2+1,ballSize*2+1,ILI9341_BLACK);
}
void moveBall_demo(){
//Serial.print("demo -> ");
//Serial.print(xVel);
//Serial.println(yVel);
float newX, newY;
newX = xPos + xVel;
newY = yPos + yVel;
if (newX < (float)ballSize){
newX = (float)ballSize;
xVel = -xVel;
}
if (newX > (float)(tftWidth - ballSize - 1)){
newX = (float)(tftWidth - ballSize - 1);
xVel = -xVel;
}
if (newY < topBorder + (float)ballSize){
newY = topBorder + (float)ballSize;
yVel = -yVel;
}
if (newY > tftHeight - (float)ballSize){
yVel = -yVel;
}
if ((round(newX) != round(xPosLast)) || (round(newY) != round(yPosLast))){
// draw ball
clearOldBallPos();
tft.fillCircle(round(newX), round(newY), ballSize, ILI9341_ORANGE);
xPosLast = newX;
yPosLast = newY;
}
xPos = newX;
yPos = newY;
}
void moveBall(){
tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_BLACK);
//tft.drawRGBBitmap(round(xPosNBA), round(yPosNBA), ball_black, 21, 20);
float tmpY = yPosNBA;
timeNBA += stepNBA;
xPosNBA = xStart + ballSize + timeNBA*FNBA*cos(angleNBA*3.14/180)/3.0;
yPosNBA = -20+tftHeight - ballSize - ((timeNBA*FNBA*sin(angleNBA*3.14/180.0) - 981.0*timeNBA*timeNBA/2.0));
if(tmpY < yPosNBA) dyPosNBA = true;
else dyPosNBA = false;
//debug
//Serial.print("y=");
//Serial.print((timeNBA*FNBA*sin(angleNBA*3.14/180.0) - 981.0*timeNBA*timeNBA/2.0));
//Serial.print(", y1=");
//Serial.print((timeNBA*FNBA*sin(angleNBA*3.14/180.0)));
//Serial.print(", y2=");
//Serial.println((981*timeNBA*timeNBA/2));
if(xPosNBA + ballSize > tftWidth) gameState = 13;
if(xPosNBA - ballSize < 0 ) gameState = 13;
if(yPosNBA + ballSize > tftHeight) gameState = 13;
// ballSize y ^
// : |
// tftHeight - ballSize |
// ballSize x ------> tftWidth - ballSize
//tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_ORANGE);
tft.drawRGBBitmap(round(xPosNBA)-ballSize, round(yPosNBA)-ballSize, ball3, 21, 20);
}
void drawScore(){
// clear old score
tft.fillRect(50,5,25,10,ILI9341_BLACK);
// print new score
tft.setCursor(50,5);
tft.setTextSize(1);
tft.setTextColor(ILI9341_WHITE);
tft.print(playerScore);
tft.setCursor(0,5);
tft.print("SCORE :");
}
void drawLives(){
// clear old lives
tft.fillRect((tftWidth/2)+50,5,25,10,ILI9341_BLACK);
// print new score
tft.setCursor((tftWidth/2)+50,5);
tft.setTextSize(1);
tft.setTextColor(ILI9341_WHITE);
tft.print(playerLives);
tft.setCursor((tftWidth/2), 5);
tft.print("LIVES :");
}
void drawLevel(){
// clear old level
tft.fillRect(tftWidth-25,5,25,10,ILI9341_BLACK);
// print new score
tft.setCursor(tftWidth-25,5);
tft.setTextSize(1);
tft.setTextColor(ILI9341_WHITE);
tft.print(level);
tft.setCursor(tftWidth - 75, 5);
tft.print("LEVEL :");
}
// bounding box collision detection
boolean checkCollision(int x1, int y1, int width1, int height1, int x2, int y2, int width2, int height2){
boolean hit = false;
if (
(((x2 + width2) >= x1) && (x2 <= (x1 + width1))) &&
(((y2 + height2) >= y1) && (y2 <= (y1 + height1)))
) {
hit = true;
}
return hit;
}
void checkHitBat(){
// check bat and bottom half of ball
hit = checkCollision(batX, batY, batWidth, batHeight, (int)round(xPosNBA)-ballSize, (int)round(yPosNBA)-ballSize, ballSize*2, ballSize*2);
if (hit)
if(!dyPosNBA) { //^ UP
gameState = 13;
} else { // \/ DOWN
if((batX + ballSize/2< (int)round(xPosNBA)) && ((batX + batWidth - ballSize/2) > (int)round(xPosNBA)) ) {gameState = 14;}
else {gameState = 13;}
}
}
void checkHitBlock(){
int row, col;
for (row=0; row<1; row++){
for (col=0; col<1; col++){
// if (blocks[row][col].isActive && blocks[row][col].isHit(xPos, yPos, ballSize*2, ballSize*2)){
if (blocks[row][col].isActive && blocks[row][col].isHit(xPos, yPos-ballSize, ballSize*2, ballSize*2)){
//blocks[row][col].removeBlock();
yVel = -yVel;
return;
}
}
}
}
void processInput(char key) {
switch (key) {
case '+':
case '-':
case '*':
case '/':
break;
case '=':
break;
}
Serial.println(key);
return;
}
unsigned long lastFrame = millis();
void loop(void) {
static int i = 0;
// limit frame rate
while((millis() - lastFrame) < 20);
lastFrame = millis();
char key;
switch(gameState){
case 1: // start
gameState = 11;
//Serial.println("state: 1 -> 11");
break;
case 11: // click to play
//tft.fillRect((tftWidth/2)-170,(tftHeight/2)-20,300,40,ILI9341_GREEN);
//tft.setCursor((tftWidth/2)-170+30,(tftHeight/2)-20+12);
//tft.setTextSize(2);
//tft.setTextColor(ILI9341_WHITE);
//tft.print("PRESS ANY KEY TO PLAY");
gameState = 12;
initDemo();
//Serial.println("state: 11 -> 12");
break;
case 12: // wait for click to play
moveBall_demo();
checkHitBlock();
key = keypad.getKey();
if (key != NO_KEY) {
//processInput(key);
initGameNBA();
gameState = 20;
//Serial.println("state: 12 -> 20");
};
break;
case 20: // wait for click to play
key = keypad.getKey();
if (key != NO_KEY) {
//processInput(key);
gameState = 2;
//Serial.println("state: 20 -> 2");
};
break;
case 13: // ring - wait for click to play again
yPosNBA = max(ballSize+20, yPosNBA);
tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_RED);
playerLives --;
tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
drawScore();
drawLevel();
drawLives();
gameState = 15;
//Serial.println("state: 13 -> 15");
if (playerLives == 0) {
int x = 0, y = 60;
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor(x,y-20);
tft.print("Czaro to nie Twoja liga \nNBA!");
}
break;
case 14: // OK - wait for click to play on next level
tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_GREEN);
playerScore += level*10;
level++;
tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
drawScore();
drawLevel();
drawLives();
gameState = 15;
//Serial.println("state: 14 -> 15");
break;
case 15: // OK - wait for click to play on next level
key = keypad.getKey();
if (key != NO_KEY) {
if (playerLives > 0){
initGameNBA();
gameState = 2; // new game
//Serial.println("state: 15 -> 2");
}
else {
gameState = 3; // end game
//Serial.println("state: 15 -> 3");
}
}
break;
case 2: // play
moveBall();
checkHitBat();
break;
case 3: // end
tft.fillScreen(ILI9341_BLACK);
gameState = 11; // click to play
break;
}
}