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 TFT | SPI interface | STM32F407VET6 |
---|---|---|
VCC | +5V | |
GND | GND | |
CS | PB_7 | |
RESET | PB_8 | |
D/C | PB_6 | |
SDI(MOSI) | PB_5 | |
SCK | PB_3 | |
LED | over a 56 ohm resistor | +5V |
SDO(MISO) | PB_4 |
Ball.cpp@1:971e721f6ef2, 2019-04-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |