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:
Mon Apr 15 06:02:55 2019 +0000
Revision:
1:971e721f6ef2
Parent:
0:887dd664eca0
Simple pong game updated.

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 1:971e721f6ef2 11 size(s),
hudakz 1:971e721f6ef2 12 velocity(v),
hudakz 1:971e721f6ef2 13 color(clr),
hudakz 1:971e721f6ef2 14 xPos(320 / 2),
hudakz 1:971e721f6ef2 15 yPos(240 / 2),
hudakz 1:971e721f6ef2 16 xPosOld(320 / 2),
hudakz 1:971e721f6ef2 17 yPosOld(240 / 2),
hudakz 1:971e721f6ef2 18 xDir(-1),
hudakz 1:971e721f6ef2 19 yDir(1)
hudakz 1:971e721f6ef2 20 { }
hudakz 1:971e721f6ef2 21
hudakz 1:971e721f6ef2 22 /**
hudakz 1:971e721f6ef2 23 * @brief
hudakz 1:971e721f6ef2 24 * @note
hudakz 1:971e721f6ef2 25 * @param
hudakz 1:971e721f6ef2 26 * @retval
hudakz 1:971e721f6ef2 27 */
hudakz 1:971e721f6ef2 28 void Ball::home()
hudakz 0:887dd664eca0 29 {
hudakz 1:971e721f6ef2 30 xPos = 320 / 2;
hudakz 1:971e721f6ef2 31 yPos = 240 / 2;
hudakz 1:971e721f6ef2 32 xPosOld = xPos;
hudakz 1:971e721f6ef2 33 yPosOld = yPos;
hudakz 1:971e721f6ef2 34 xDir = -1;
hudakz 1:971e721f6ef2 35 yDir = 1;
hudakz 0:887dd664eca0 36 }
hudakz 0:887dd664eca0 37
hudakz 0:887dd664eca0 38 /**
hudakz 0:887dd664eca0 39 * @brief
hudakz 0:887dd664eca0 40 * @note
hudakz 0:887dd664eca0 41 * @param
hudakz 0:887dd664eca0 42 * @retval
hudakz 0:887dd664eca0 43 */
hudakz 0:887dd664eca0 44 bool Ball::move(Racket* rkt)
hudakz 0:887dd664eca0 45 {
hudakz 1:971e721f6ef2 46 xPosOld = xPos;
hudakz 1:971e721f6ef2 47 yPosOld = yPos;
hudakz 0:887dd664eca0 48 xPos += xDir * velocity;
hudakz 0:887dd664eca0 49 yPos += yDir * velocity;
hudakz 0:887dd664eca0 50
hudakz 0:887dd664eca0 51 // hit by racket?
hudakz 0:887dd664eca0 52 if
hudakz 0:887dd664eca0 53 (
hudakz 0:887dd664eca0 54 rkt->xPos - rkt->width / 2 < xPos + size / 2 &&
hudakz 0:887dd664eca0 55 xPos + size / 2 < rkt->xPos &&
hudakz 0:887dd664eca0 56 rkt->yPos - rkt->height / 2 < yPos + size / 2 &&
hudakz 0:887dd664eca0 57 yPos - size / 2 < rkt->yPos + rkt->height / 2
hudakz 0:887dd664eca0 58 ) {
hudakz 0:887dd664eca0 59 xPos = rkt->xPos - rkt->width / 2 - size / 2;
hudakz 0:887dd664eca0 60 xDir = -fabs(xDir); // force it to be negative
hudakz 0:887dd664eca0 61 }
hudakz 0:887dd664eca0 62
hudakz 0:887dd664eca0 63 // missed racket?
hudakz 0:887dd664eca0 64 if (xPos > 320) {
hudakz 0:887dd664eca0 65 xPos = 320 / 2;
hudakz 0:887dd664eca0 66 yPos = 240 / 2;
hudakz 0:887dd664eca0 67 xDir = -1;
hudakz 0:887dd664eca0 68 yDir = 1;
hudakz 1:971e721f6ef2 69 return true;
hudakz 0:887dd664eca0 70 }
hudakz 0:887dd664eca0 71
hudakz 0:887dd664eca0 72 // hit left wall?
hudakz 0:887dd664eca0 73 if (xPos - size / 2 < 0) {
hudakz 0:887dd664eca0 74 xPos = size / 2;
hudakz 0:887dd664eca0 75 xDir = fabs(xDir); // force it to be positive
hudakz 0:887dd664eca0 76 }
hudakz 0:887dd664eca0 77
hudakz 0:887dd664eca0 78 // hit bottom wall?
hudakz 0:887dd664eca0 79 if (yPos + size / 2 > 240) {
hudakz 0:887dd664eca0 80 yPos = 240 - size / 2;
hudakz 0:887dd664eca0 81 yDir = -fabs(yDir); // force it to be negative
hudakz 0:887dd664eca0 82 }
hudakz 0:887dd664eca0 83
hudakz 0:887dd664eca0 84 // hit top wall?
hudakz 0:887dd664eca0 85 if (yPos - size / 2 < 0) {
hudakz 0:887dd664eca0 86 yPos = size / 2;
hudakz 0:887dd664eca0 87 yDir = fabs(yDir); // force it to be positive
hudakz 0:887dd664eca0 88 }
hudakz 0:887dd664eca0 89
hudakz 0:887dd664eca0 90 // make sure that length of dir stays at 1
hudakz 0:887dd664eca0 91 vec2_norm(xDir, yDir);
hudakz 0:887dd664eca0 92
hudakz 1:971e721f6ef2 93 return false;
hudakz 0:887dd664eca0 94 }
hudakz 0:887dd664eca0 95
hudakz 0:887dd664eca0 96 /**
hudakz 0:887dd664eca0 97 * @brief
hudakz 0:887dd664eca0 98 * @note
hudakz 0:887dd664eca0 99 * @param
hudakz 0:887dd664eca0 100 * @retval
hudakz 0:887dd664eca0 101 */
hudakz 1:971e721f6ef2 102 void Ball::paint()
hudakz 0:887dd664eca0 103 {
hudakz 1:971e721f6ef2 104 tft_boxfill(xPosOld - size / 2, yPosOld - size / 2, xPosOld + size / 2, yPosOld + size / 2, TFT_BLACK); // hide ball at old position
hudakz 1:971e721f6ef2 105 tft_boxfill(xPos - size / 2, yPos - size / 2, xPos + size / 2, yPos + size / 2, TFT_WHITE); // draw ball at new position
hudakz 0:887dd664eca0 106 }
hudakz 0:887dd664eca0 107
hudakz 0:887dd664eca0 108 /**
hudakz 0:887dd664eca0 109 * @brief
hudakz 0:887dd664eca0 110 * @note
hudakz 0:887dd664eca0 111 * @param
hudakz 0:887dd664eca0 112 * @retval
hudakz 0:887dd664eca0 113 */
hudakz 0:887dd664eca0 114 void Ball::vec2_norm(float& x, float& y)
hudakz 0:887dd664eca0 115 {
hudakz 1:971e721f6ef2 116 // sets vector's length to 1 (which means that x + y = 1)
hudakz 0:887dd664eca0 117 float length = sqrt((x * x) + (y * y));
hudakz 0:887dd664eca0 118 if (length != 0.0f) {
hudakz 0:887dd664eca0 119 length = 1.0f / length;
hudakz 0:887dd664eca0 120 x *= length;
hudakz 0:887dd664eca0 121 y *= length;
hudakz 0:887dd664eca0 122 }
hudakz 0:887dd664eca0 123 }