A simple Pong game with STM32F407VET6 black board (Seeed Arch Max) and ILI9341 320x240 TFT display.

Dependencies:   mbed ILI9341_STM32F4

A simple Pong game with STM32F407VET6 black board (compatible with Seed Arch Max) and ILI9341 320x240 TFT display.

Connect the SPI interface of an ILI9341 320x240 TFT display to the STM32F407VET6 board (Seeed Arch Max) as follows:

ILI9341 TFTSPI interfaceSTM32F407VET6
VCC+5V
GNDGND
CSPB_7
RESETPB_8
D/CPB_6
SDI(MOSI)PB_5
SCKPB_3
LEDover a 56 ohm resistor+5V
SDO(MISO)PB_4
Committer:
hudakz
Date:
Thu Apr 11 20:18:15 2019 +0000
Revision:
0:887dd664eca0
Child:
1:971e721f6ef2
Initial release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:887dd664eca0 1 #include "Ball.h"
hudakz 0:887dd664eca0 2 #include "Racket.h"
hudakz 0:887dd664eca0 3
hudakz 0:887dd664eca0 4 /**
hudakz 0:887dd664eca0 5 * @brief
hudakz 0:887dd664eca0 6 * @note
hudakz 0:887dd664eca0 7 * @param
hudakz 0:887dd664eca0 8 * @retval
hudakz 0:887dd664eca0 9 */
hudakz 0:887dd664eca0 10 Ball::Ball(int s /*= 8*/, float v /*= 8*/, uint16_t clr /*= TFT_WHITE*/ ) :
hudakz 0:887dd664eca0 11 size(s), velocity(v), gameOver(true), color(clr), xPos(320 / 2), yPos(240 / 2), xDir(-1), yDir(1)
hudakz 0:887dd664eca0 12 {
hudakz 0:887dd664eca0 13 timeout.attach(callback(this, &Ball::newGame), 2);
hudakz 0:887dd664eca0 14 }
hudakz 0:887dd664eca0 15
hudakz 0:887dd664eca0 16 /**
hudakz 0:887dd664eca0 17 * @brief
hudakz 0:887dd664eca0 18 * @note
hudakz 0:887dd664eca0 19 * @param
hudakz 0:887dd664eca0 20 * @retval
hudakz 0:887dd664eca0 21 */
hudakz 0:887dd664eca0 22 bool Ball::move(Racket* rkt)
hudakz 0:887dd664eca0 23 {
hudakz 0:887dd664eca0 24 if (gameOver)
hudakz 0:887dd664eca0 25 return true;
hudakz 0:887dd664eca0 26
hudakz 0:887dd664eca0 27 xPos += xDir * velocity;
hudakz 0:887dd664eca0 28 yPos += yDir * velocity;
hudakz 0:887dd664eca0 29
hudakz 0:887dd664eca0 30 // hit by racket?
hudakz 0:887dd664eca0 31 if
hudakz 0:887dd664eca0 32 (
hudakz 0:887dd664eca0 33 rkt->xPos - rkt->width / 2 < xPos + size / 2 &&
hudakz 0:887dd664eca0 34 xPos + size / 2 < rkt->xPos &&
hudakz 0:887dd664eca0 35 rkt->yPos - rkt->height / 2 < yPos + size / 2 &&
hudakz 0:887dd664eca0 36 yPos - size / 2 < rkt->yPos + rkt->height / 2
hudakz 0:887dd664eca0 37 ) {
hudakz 0:887dd664eca0 38 xPos = rkt->xPos - rkt->width / 2 - size / 2;
hudakz 0:887dd664eca0 39 xDir = -fabs(xDir); // force it to be negative
hudakz 0:887dd664eca0 40 }
hudakz 0:887dd664eca0 41
hudakz 0:887dd664eca0 42 // missed racket?
hudakz 0:887dd664eca0 43 if (xPos > 320) {
hudakz 0:887dd664eca0 44 xPos = 320 / 2;
hudakz 0:887dd664eca0 45 yPos = 240 / 2;
hudakz 0:887dd664eca0 46 xDir = -1;
hudakz 0:887dd664eca0 47 yDir = 1;
hudakz 0:887dd664eca0 48 gameOver = true;
hudakz 0:887dd664eca0 49 tft_text(320/2 - 35, 240 / 2, "GAME OVER", TFT_WHITE, TFT_BLACK);
hudakz 0:887dd664eca0 50 timeout.attach(callback(this, &Ball::newGame), 2);
hudakz 0:887dd664eca0 51 }
hudakz 0:887dd664eca0 52
hudakz 0:887dd664eca0 53 // hit left wall?
hudakz 0:887dd664eca0 54 if (xPos - size / 2 < 0) {
hudakz 0:887dd664eca0 55 xPos = size / 2;
hudakz 0:887dd664eca0 56 xDir = fabs(xDir); // force it to be positive
hudakz 0:887dd664eca0 57 }
hudakz 0:887dd664eca0 58
hudakz 0:887dd664eca0 59 // hit bottom wall?
hudakz 0:887dd664eca0 60 if (yPos + size / 2 > 240) {
hudakz 0:887dd664eca0 61 yPos = 240 - size / 2;
hudakz 0:887dd664eca0 62 yDir = -fabs(yDir); // force it to be negative
hudakz 0:887dd664eca0 63 }
hudakz 0:887dd664eca0 64
hudakz 0:887dd664eca0 65 // hit top wall?
hudakz 0:887dd664eca0 66 if (yPos - size / 2 < 0) {
hudakz 0:887dd664eca0 67 yPos = size / 2;
hudakz 0:887dd664eca0 68 yDir = fabs(yDir); // force it to be positive
hudakz 0:887dd664eca0 69 }
hudakz 0:887dd664eca0 70
hudakz 0:887dd664eca0 71 // make sure that length of dir stays at 1
hudakz 0:887dd664eca0 72 vec2_norm(xDir, yDir);
hudakz 0:887dd664eca0 73
hudakz 0:887dd664eca0 74 // paint
hudakz 0:887dd664eca0 75 //tft_boxfill(xPos - size / 2, yPos - size / 2, xPos - size / 2 + size, yPos - size / 2 + size, TFT_WHITE);
hudakz 0:887dd664eca0 76
hudakz 0:887dd664eca0 77 return gameOver;
hudakz 0:887dd664eca0 78 }
hudakz 0:887dd664eca0 79
hudakz 0:887dd664eca0 80 /**
hudakz 0:887dd664eca0 81 * @brief
hudakz 0:887dd664eca0 82 * @note
hudakz 0:887dd664eca0 83 * @param
hudakz 0:887dd664eca0 84 * @retval
hudakz 0:887dd664eca0 85 */
hudakz 0:887dd664eca0 86 void Ball::newGame()
hudakz 0:887dd664eca0 87 {
hudakz 0:887dd664eca0 88 gameOver = false;
hudakz 0:887dd664eca0 89 tft_text(320/2 - 35, 240 / 2, "GAME OVER", TFT_BLACK, TFT_BLACK); // hide the text
hudakz 0:887dd664eca0 90 }
hudakz 0:887dd664eca0 91
hudakz 0:887dd664eca0 92 /**
hudakz 0:887dd664eca0 93 * @brief
hudakz 0:887dd664eca0 94 * @note
hudakz 0:887dd664eca0 95 * @param
hudakz 0:887dd664eca0 96 * @retval
hudakz 0:887dd664eca0 97 */
hudakz 0:887dd664eca0 98 void Ball::paint(uint16_t clr)
hudakz 0:887dd664eca0 99 {
hudakz 0:887dd664eca0 100 tft_boxfill(xPos - size / 2, yPos - size / 2, xPos + size / 2, yPos + size / 2, clr);
hudakz 0:887dd664eca0 101 }
hudakz 0:887dd664eca0 102
hudakz 0:887dd664eca0 103 /**
hudakz 0:887dd664eca0 104 * @brief
hudakz 0:887dd664eca0 105 * @note
hudakz 0:887dd664eca0 106 * @param
hudakz 0:887dd664eca0 107 * @retval
hudakz 0:887dd664eca0 108 */
hudakz 0:887dd664eca0 109 void Ball::vec2_norm(float& x, float& y)
hudakz 0:887dd664eca0 110 {
hudakz 0:887dd664eca0 111 // sets a vectors length to 1 (which means that x + y == 1)
hudakz 0:887dd664eca0 112 float length = sqrt((x * x) + (y * y));
hudakz 0:887dd664eca0 113 if (length != 0.0f) {
hudakz 0:887dd664eca0 114 length = 1.0f / length;
hudakz 0:887dd664eca0 115 x *= length;
hudakz 0:887dd664eca0 116 y *= length;
hudakz 0:887dd664eca0 117 }
hudakz 0:887dd664eca0 118 }