Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed
hockey/hockey.cpp@16:6cf744b2623a, 2022-11-30 (annotated)
- Committer:
- jstephens78
- Date:
- Wed Nov 30 21:43:44 2022 +0000
- Revision:
- 16:6cf744b2623a
- Parent:
- 12:5d913b57da7c
- Child:
- 17:3517251daf96
Add NavSwitch input for player 2 in hockey
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jstephens78 | 9:4e6fae5f9b23 | 1 | #include "hockey.h" |
jstephens78 | 12:5d913b57da7c | 2 | #include "globals.h" |
jstephens78 | 9:4e6fae5f9b23 | 3 | |
jstephens78 | 9:4e6fae5f9b23 | 4 | #define PHYSAC_NO_THREADS |
jstephens78 | 9:4e6fae5f9b23 | 5 | #define PHYSAC_STANDALONE |
jstephens78 | 9:4e6fae5f9b23 | 6 | #define PHYSAC_IMPLEMENTATION |
jstephens78 | 9:4e6fae5f9b23 | 7 | #define _STDBOOL_H |
jstephens78 | 9:4e6fae5f9b23 | 8 | #include "physac.h" |
jstephens78 | 9:4e6fae5f9b23 | 9 | |
jstephens78 | 12:5d913b57da7c | 10 | #define SCREEN_WIDTH 128 |
jstephens78 | 12:5d913b57da7c | 11 | #define SCREEN_HEIGHT 128 |
jstephens78 | 12:5d913b57da7c | 12 | |
jstephens78 | 12:5d913b57da7c | 13 | // Controls size of gamepieces in the hockey arena. This influences both |
jstephens78 | 12:5d913b57da7c | 14 | // rendering and collision, so be careful adjusting dimensions too small |
jstephens78 | 12:5d913b57da7c | 15 | #define HOCKEY_PUCK_RADIUS 4 |
jstephens78 | 12:5d913b57da7c | 16 | #define HOCKEY_PADDLE_W 8 |
jstephens78 | 12:5d913b57da7c | 17 | #define HOCKEY_PADDLE_H 24 |
jstephens78 | 9:4e6fae5f9b23 | 18 | |
jstephens78 | 12:5d913b57da7c | 19 | // Controls the dimensions of the arena. You can adjust the screen margin above |
jstephens78 | 12:5d913b57da7c | 20 | // and below the court, and the width of the goal. |
jstephens78 | 12:5d913b57da7c | 21 | #define HOCKEY_ARENA_TOP 16 |
jstephens78 | 12:5d913b57da7c | 22 | #define HOCKEY_ARENA_BOT 127 |
jstephens78 | 12:5d913b57da7c | 23 | #define HOCKEY_GOAL_HEIGHT 32 |
jstephens78 | 12:5d913b57da7c | 24 | |
jstephens78 | 12:5d913b57da7c | 25 | // Properties derived from other macros |
jstephens78 | 12:5d913b57da7c | 26 | #define _HOCKEY_ARENA_H (HOCKEY_ARENA_BOT - HOCKEY_ARENA_TOP) |
jstephens78 | 12:5d913b57da7c | 27 | #define _HOCKEY_GOAL_TOP ((_HOCKEY_ARENA_H - HOCKEY_GOAL_HEIGHT)/2 + HOCKEY_ARENA_TOP) |
jstephens78 | 12:5d913b57da7c | 28 | #define _HOCKEY_GOAL_BOT (_HOCKEY_GOAL_TOP + HOCKEY_GOAL_HEIGHT) |
jstephens78 | 9:4e6fae5f9b23 | 29 | |
jstephens78 | 12:5d913b57da7c | 30 | int blue_score = 0; |
jstephens78 | 12:5d913b57da7c | 31 | int red_score = 0; |
jstephens78 | 12:5d913b57da7c | 32 | |
jstephens78 | 12:5d913b57da7c | 33 | PhysicsBody puck; |
jstephens78 | 12:5d913b57da7c | 34 | PhysicsBody paddle_a; |
jstephens78 | 12:5d913b57da7c | 35 | PhysicsBody paddle_b; |
jstephens78 | 12:5d913b57da7c | 36 | |
jstephens78 | 12:5d913b57da7c | 37 | float input_sensitivity = 0.01f; |
jstephens78 | 9:4e6fae5f9b23 | 38 | |
jstephens78 | 12:5d913b57da7c | 39 | int maxOf(int a, int b) |
jstephens78 | 12:5d913b57da7c | 40 | { |
jstephens78 | 12:5d913b57da7c | 41 | return (a > b) ? a : b; |
jstephens78 | 12:5d913b57da7c | 42 | } |
jstephens78 | 12:5d913b57da7c | 43 | |
jstephens78 | 12:5d913b57da7c | 44 | int minOf(int a, int b) |
jstephens78 | 12:5d913b57da7c | 45 | { |
jstephens78 | 12:5d913b57da7c | 46 | return (a < b) ? a : b; |
jstephens78 | 12:5d913b57da7c | 47 | } |
jstephens78 | 12:5d913b57da7c | 48 | |
jstephens78 | 12:5d913b57da7c | 49 | void initPhysicsObjects() |
jstephens78 | 12:5d913b57da7c | 50 | { |
jstephens78 | 12:5d913b57da7c | 51 | puck = CreatePhysicsBodyCircle((Vector2) { |
jstephens78 | 12:5d913b57da7c | 52 | SCREEN_WIDTH/2, SCREEN_HEIGHT/2 |
jstephens78 | 12:5d913b57da7c | 53 | }, HOCKEY_PUCK_RADIUS, 1); |
jstephens78 | 9:4e6fae5f9b23 | 54 | puck->enabled = true; |
jstephens78 | 9:4e6fae5f9b23 | 55 | puck->useGravity = false; |
jstephens78 | 9:4e6fae5f9b23 | 56 | puck->restitution = 1.0; |
jstephens78 | 12:5d913b57da7c | 57 | puck->dynamicFriction = 0.0; |
jstephens78 | 9:4e6fae5f9b23 | 58 | puck->velocity = (Vector2) { |
jstephens78 | 9:4e6fae5f9b23 | 59 | 5, 0 |
jstephens78 | 9:4e6fae5f9b23 | 60 | }; |
jstephens78 | 9:4e6fae5f9b23 | 61 | |
jstephens78 | 12:5d913b57da7c | 62 | paddle_a = CreatePhysicsBodyRectangle((Vector2) { |
jstephens78 | 9:4e6fae5f9b23 | 63 | 32, 64 |
jstephens78 | 12:5d913b57da7c | 64 | }, HOCKEY_PADDLE_W, HOCKEY_PADDLE_H, 100); |
jstephens78 | 9:4e6fae5f9b23 | 65 | paddle_a->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) |
jstephens78 | 9:4e6fae5f9b23 | 66 | paddle_a->useGravity = false; |
jstephens78 | 9:4e6fae5f9b23 | 67 | paddle_a->restitution = 1.0; |
jstephens78 | 9:4e6fae5f9b23 | 68 | SetPhysicsBodyRotation(paddle_a, 3.14159 / 6); |
jstephens78 | 9:4e6fae5f9b23 | 69 | |
jstephens78 | 12:5d913b57da7c | 70 | paddle_b = CreatePhysicsBodyRectangle((Vector2) { |
jstephens78 | 9:4e6fae5f9b23 | 71 | 96, 64 |
jstephens78 | 12:5d913b57da7c | 72 | }, HOCKEY_PADDLE_W, HOCKEY_PADDLE_H, 100); |
jstephens78 | 9:4e6fae5f9b23 | 73 | paddle_b->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) |
jstephens78 | 9:4e6fae5f9b23 | 74 | paddle_b->useGravity = false; |
jstephens78 | 9:4e6fae5f9b23 | 75 | paddle_b->restitution = 1.0; |
jstephens78 | 9:4e6fae5f9b23 | 76 | SetPhysicsBodyRotation(paddle_b, 3.14159 / 6); |
jstephens78 | 12:5d913b57da7c | 77 | } |
jstephens78 | 9:4e6fae5f9b23 | 78 | |
jstephens78 | 12:5d913b57da7c | 79 | /** |
jstephens78 | 12:5d913b57da7c | 80 | * Draws the fixed graphics of the game. This is the border of the arena |
jstephens78 | 12:5d913b57da7c | 81 | */ |
jstephens78 | 12:5d913b57da7c | 82 | void drawStaticEnvironment() |
jstephens78 | 12:5d913b57da7c | 83 | { |
jstephens78 | 12:5d913b57da7c | 84 | uLCD.line(0, _HOCKEY_GOAL_TOP, 0, HOCKEY_ARENA_TOP, BLUE); |
jstephens78 | 12:5d913b57da7c | 85 | uLCD.line(0, _HOCKEY_GOAL_BOT, 0, HOCKEY_ARENA_BOT, BLUE); |
jstephens78 | 12:5d913b57da7c | 86 | uLCD.line(0, HOCKEY_ARENA_TOP, 63, HOCKEY_ARENA_TOP, BLUE); |
jstephens78 | 12:5d913b57da7c | 87 | uLCD.line(0, HOCKEY_ARENA_BOT, 63, HOCKEY_ARENA_BOT, BLUE); |
jstephens78 | 9:4e6fae5f9b23 | 88 | |
jstephens78 | 12:5d913b57da7c | 89 | uLCD.line(127, _HOCKEY_GOAL_TOP, 127, HOCKEY_ARENA_TOP, RED); |
jstephens78 | 12:5d913b57da7c | 90 | uLCD.line(127, _HOCKEY_GOAL_BOT, 127, HOCKEY_ARENA_BOT, RED); |
jstephens78 | 12:5d913b57da7c | 91 | uLCD.line(64, HOCKEY_ARENA_TOP, 127, HOCKEY_ARENA_TOP, RED); |
jstephens78 | 12:5d913b57da7c | 92 | uLCD.line(64, HOCKEY_ARENA_BOT, 127, HOCKEY_ARENA_BOT, RED); |
jstephens78 | 12:5d913b57da7c | 93 | } |
jstephens78 | 12:5d913b57da7c | 94 | |
jstephens78 | 12:5d913b57da7c | 95 | /** |
jstephens78 | 12:5d913b57da7c | 96 | * Redraws the puck and paddles |
jstephens78 | 12:5d913b57da7c | 97 | * Each elements is erased, updated, and redrawn in as short of a window as |
jstephens78 | 12:5d913b57da7c | 98 | * possible. |
jstephens78 | 12:5d913b57da7c | 99 | */ |
jstephens78 | 12:5d913b57da7c | 100 | void drawDynamicObjects() |
jstephens78 | 12:5d913b57da7c | 101 | { |
jstephens78 | 12:5d913b57da7c | 102 | static int puck_x = SCREEN_WIDTH / 2, |
jstephens78 | 12:5d913b57da7c | 103 | puck_y = SCREEN_WIDTH / 2; |
jstephens78 | 12:5d913b57da7c | 104 | |
jstephens78 | 12:5d913b57da7c | 105 | // Redraw puck if moved |
jstephens78 | 12:5d913b57da7c | 106 | if (puck_x != puck->position.x || puck_y != puck->position.y) { |
jstephens78 | 12:5d913b57da7c | 107 | // erase |
jstephens78 | 12:5d913b57da7c | 108 | uLCD.filled_circle(puck_x, puck_y, HOCKEY_PUCK_RADIUS, BLACK); |
jstephens78 | 9:4e6fae5f9b23 | 109 | |
jstephens78 | 12:5d913b57da7c | 110 | // update |
jstephens78 | 12:5d913b57da7c | 111 | puck_x = puck->position.x; |
jstephens78 | 12:5d913b57da7c | 112 | puck_y = puck->position.y; |
jstephens78 | 12:5d913b57da7c | 113 | |
jstephens78 | 12:5d913b57da7c | 114 | // redraw |
jstephens78 | 12:5d913b57da7c | 115 | uLCD.filled_circle(puck_x, puck_y, HOCKEY_PUCK_RADIUS, GREEN); |
jstephens78 | 12:5d913b57da7c | 116 | } |
jstephens78 | 12:5d913b57da7c | 117 | |
jstephens78 | 12:5d913b57da7c | 118 | // Redraw blue paddle |
jstephens78 | 12:5d913b57da7c | 119 | static int pa_x1 = 64, |
jstephens78 | 12:5d913b57da7c | 120 | pa_x2 = 64, |
jstephens78 | 12:5d913b57da7c | 121 | pa_y1 = 64, |
jstephens78 | 12:5d913b57da7c | 122 | pa_y2 = 64; |
jstephens78 | 9:4e6fae5f9b23 | 123 | |
jstephens78 | 12:5d913b57da7c | 124 | float sinA = sin(-paddle_a->orient) / 2; |
jstephens78 | 12:5d913b57da7c | 125 | float cosA = cos(-paddle_a->orient) / 2; |
jstephens78 | 12:5d913b57da7c | 126 | uLCD.line(pa_x1, pa_y1, pa_x2, pa_y2, BLACK); |
jstephens78 | 12:5d913b57da7c | 127 | pa_x1 = paddle_a->position.x + HOCKEY_PADDLE_H * sinA; |
jstephens78 | 12:5d913b57da7c | 128 | pa_x2 = paddle_a->position.x - HOCKEY_PADDLE_H * sinA; |
jstephens78 | 12:5d913b57da7c | 129 | pa_y1 = paddle_a->position.y + HOCKEY_PADDLE_H * cosA; |
jstephens78 | 12:5d913b57da7c | 130 | pa_y2 = paddle_a->position.y - HOCKEY_PADDLE_H * cosA; |
jstephens78 | 12:5d913b57da7c | 131 | uLCD.line(pa_x1, pa_y1, pa_x2, pa_y2, BLUE); |
jstephens78 | 12:5d913b57da7c | 132 | |
jstephens78 | 12:5d913b57da7c | 133 | // Redraw red paddle |
jstephens78 | 12:5d913b57da7c | 134 | static int pb_x1 = 64, |
jstephens78 | 12:5d913b57da7c | 135 | pb_x2 = 64, |
jstephens78 | 12:5d913b57da7c | 136 | pb_y1 = 64, |
jstephens78 | 12:5d913b57da7c | 137 | pb_y2 = 64; |
jstephens78 | 12:5d913b57da7c | 138 | float sinB = sin(-paddle_b->orient) / 2; |
jstephens78 | 12:5d913b57da7c | 139 | float cosB = cos(-paddle_b->orient) / 2; |
jstephens78 | 12:5d913b57da7c | 140 | uLCD.line(pb_x1, pb_y1, pb_x2, pb_y2, BLACK); |
jstephens78 | 12:5d913b57da7c | 141 | pb_x1 = paddle_b->position.x + HOCKEY_PADDLE_H * sinB; |
jstephens78 | 12:5d913b57da7c | 142 | pb_x2 = paddle_b->position.x - HOCKEY_PADDLE_H * sinB; |
jstephens78 | 12:5d913b57da7c | 143 | pb_y1 = paddle_b->position.y + HOCKEY_PADDLE_H * cosB; |
jstephens78 | 12:5d913b57da7c | 144 | pb_y2 = paddle_b->position.y - HOCKEY_PADDLE_H * cosB; |
jstephens78 | 12:5d913b57da7c | 145 | uLCD.line(pb_x1, pb_y1, pb_x2, pb_y2, RED); |
jstephens78 | 12:5d913b57da7c | 146 | } |
jstephens78 | 9:4e6fae5f9b23 | 147 | |
jstephens78 | 9:4e6fae5f9b23 | 148 | |
jstephens78 | 12:5d913b57da7c | 149 | void resetGame() |
jstephens78 | 12:5d913b57da7c | 150 | { |
jstephens78 | 12:5d913b57da7c | 151 | if (red_score >= 5 || blue_score >= 5) { |
jstephens78 | 12:5d913b57da7c | 152 | uLCD.cls(); |
jstephens78 | 12:5d913b57da7c | 153 | uLCD.printf("Game Over"); |
jstephens78 | 12:5d913b57da7c | 154 | |
jstephens78 | 12:5d913b57da7c | 155 | if (red_score > blue_score) { |
jstephens78 | 12:5d913b57da7c | 156 | uLCD.printf("Red Wins"); |
jstephens78 | 12:5d913b57da7c | 157 | } else { |
jstephens78 | 12:5d913b57da7c | 158 | uLCD.printf("Blue Wins"); |
jstephens78 | 9:4e6fae5f9b23 | 159 | } |
jstephens78 | 9:4e6fae5f9b23 | 160 | |
jstephens78 | 12:5d913b57da7c | 161 | Thread::wait(2000); |
jstephens78 | 12:5d913b57da7c | 162 | |
jstephens78 | 12:5d913b57da7c | 163 | game2 = false; |
jstephens78 | 12:5d913b57da7c | 164 | } else { |
jstephens78 | 12:5d913b57da7c | 165 | uLCD.cls(); |
jstephens78 | 12:5d913b57da7c | 166 | drawStaticEnvironment(); |
jstephens78 | 9:4e6fae5f9b23 | 167 | |
jstephens78 | 12:5d913b57da7c | 168 | puck->position.x = SCREEN_WIDTH/2; |
jstephens78 | 12:5d913b57da7c | 169 | puck->position.y = SCREEN_HEIGHT/2; |
jstephens78 | 12:5d913b57da7c | 170 | paddle_a->position.x = 32; |
jstephens78 | 12:5d913b57da7c | 171 | paddle_a->position.y = 64; |
jstephens78 | 12:5d913b57da7c | 172 | SetPhysicsBodyRotation(paddle_a, 0); |
jstephens78 | 12:5d913b57da7c | 173 | |
jstephens78 | 12:5d913b57da7c | 174 | paddle_b->position.x = 96; |
jstephens78 | 12:5d913b57da7c | 175 | paddle_b->position.y = 64; |
jstephens78 | 12:5d913b57da7c | 176 | SetPhysicsBodyRotation(paddle_b, 0); |
jstephens78 | 12:5d913b57da7c | 177 | } |
jstephens78 | 12:5d913b57da7c | 178 | } |
jstephens78 | 12:5d913b57da7c | 179 | |
jstephens78 | 9:4e6fae5f9b23 | 180 | |
jstephens78 | 9:4e6fae5f9b23 | 181 | |
jstephens78 | 12:5d913b57da7c | 182 | /** |
jstephens78 | 12:5d913b57da7c | 183 | * |
jstephens78 | 12:5d913b57da7c | 184 | */ |
jstephens78 | 12:5d913b57da7c | 185 | void runGameLogic() |
jstephens78 | 12:5d913b57da7c | 186 | { |
jstephens78 | 12:5d913b57da7c | 187 | // If puck hits the ceiling or floor, reflect across the y component of |
jstephens78 | 12:5d913b57da7c | 188 | // the velocity |
jstephens78 | 12:5d913b57da7c | 189 | if (puck->position.y < HOCKEY_ARENA_TOP + HOCKEY_PUCK_RADIUS + 1) { |
jstephens78 | 12:5d913b57da7c | 190 | puck->velocity.y *= -1; |
jstephens78 | 12:5d913b57da7c | 191 | puck->position.y = maxOf( |
jstephens78 | 12:5d913b57da7c | 192 | puck->position.y, |
jstephens78 | 12:5d913b57da7c | 193 | HOCKEY_ARENA_TOP + HOCKEY_PUCK_RADIUS + 1); |
jstephens78 | 12:5d913b57da7c | 194 | } else if (puck->position.y > HOCKEY_ARENA_BOT - HOCKEY_PUCK_RADIUS - 1) { |
jstephens78 | 12:5d913b57da7c | 195 | puck->velocity.y *= -1; |
jstephens78 | 12:5d913b57da7c | 196 | puck->position.y = minOf( |
jstephens78 | 12:5d913b57da7c | 197 | puck->position.y, |
jstephens78 | 12:5d913b57da7c | 198 | HOCKEY_ARENA_BOT - HOCKEY_PUCK_RADIUS - 1); |
jstephens78 | 12:5d913b57da7c | 199 | } |
jstephens78 | 12:5d913b57da7c | 200 | |
jstephens78 | 12:5d913b57da7c | 201 | // true if the puck is in the y range corresponding to the goal |
jstephens78 | 12:5d913b57da7c | 202 | bool puckInGoalRange = |
jstephens78 | 12:5d913b57da7c | 203 | puck->position.y > _HOCKEY_GOAL_TOP && |
jstephens78 | 12:5d913b57da7c | 204 | puck->position.y < _HOCKEY_GOAL_BOT; |
jstephens78 | 12:5d913b57da7c | 205 | |
jstephens78 | 12:5d913b57da7c | 206 | // Puck collides with left or right walls |
jstephens78 | 12:5d913b57da7c | 207 | if (puckInGoalRange == false) { |
jstephens78 | 12:5d913b57da7c | 208 | if (puck->position.x < HOCKEY_PUCK_RADIUS + 1) { |
jstephens78 | 12:5d913b57da7c | 209 | puck->velocity.x *= -1; |
jstephens78 | 12:5d913b57da7c | 210 | puck->position.x = maxOf( |
jstephens78 | 12:5d913b57da7c | 211 | puck->position.x, |
jstephens78 | 12:5d913b57da7c | 212 | HOCKEY_PUCK_RADIUS + 1); |
jstephens78 | 12:5d913b57da7c | 213 | } else if (puck->position.x > SCREEN_WIDTH - HOCKEY_PUCK_RADIUS - 1) { |
jstephens78 | 12:5d913b57da7c | 214 | puck->velocity.x *= -1; |
jstephens78 | 12:5d913b57da7c | 215 | puck->position.x = minOf( |
jstephens78 | 12:5d913b57da7c | 216 | puck->position.x, |
jstephens78 | 12:5d913b57da7c | 217 | SCREEN_WIDTH - HOCKEY_PUCK_RADIUS - 2); |
jstephens78 | 9:4e6fae5f9b23 | 218 | } |
jstephens78 | 12:5d913b57da7c | 219 | } |
jstephens78 | 12:5d913b57da7c | 220 | |
jstephens78 | 12:5d913b57da7c | 221 | // Puck in goals |
jstephens78 | 12:5d913b57da7c | 222 | else { |
jstephens78 | 12:5d913b57da7c | 223 | // SCORE RED |
jstephens78 | 12:5d913b57da7c | 224 | if (puck->position.x < -HOCKEY_PUCK_RADIUS * 2) { |
jstephens78 | 12:5d913b57da7c | 225 | red_score += 1; |
jstephens78 | 12:5d913b57da7c | 226 | uLCD.printf("Red Scores"); |
jstephens78 | 12:5d913b57da7c | 227 | uLCD.printf(" %i - %i", blue_score, red_score); |
jstephens78 | 12:5d913b57da7c | 228 | Thread::wait(2000); |
jstephens78 | 12:5d913b57da7c | 229 | resetGame(); |
jstephens78 | 12:5d913b57da7c | 230 | } |
jstephens78 | 12:5d913b57da7c | 231 | |
jstephens78 | 12:5d913b57da7c | 232 | // SCORE BLUE |
jstephens78 | 12:5d913b57da7c | 233 | else if (puck->position.x > SCREEN_WIDTH + HOCKEY_PUCK_RADIUS*2) { |
jstephens78 | 12:5d913b57da7c | 234 | blue_score += 1; |
jstephens78 | 12:5d913b57da7c | 235 | uLCD.printf("Blue Scores"); |
jstephens78 | 12:5d913b57da7c | 236 | uLCD.printf(" %i - %i", blue_score, red_score); |
jstephens78 | 12:5d913b57da7c | 237 | Thread::wait(2000); |
jstephens78 | 12:5d913b57da7c | 238 | resetGame(); |
jstephens78 | 12:5d913b57da7c | 239 | } |
jstephens78 | 12:5d913b57da7c | 240 | } |
jstephens78 | 12:5d913b57da7c | 241 | } |
jstephens78 | 12:5d913b57da7c | 242 | |
jstephens78 | 12:5d913b57da7c | 243 | void hockeyGame(void) |
jstephens78 | 12:5d913b57da7c | 244 | { |
jstephens78 | 12:5d913b57da7c | 245 | printf("Entering thread 2\r\n"); |
jstephens78 | 12:5d913b57da7c | 246 | while (true) { |
jstephens78 | 12:5d913b57da7c | 247 | |
jstephens78 | 12:5d913b57da7c | 248 | while (game2 == false) { |
jstephens78 | 12:5d913b57da7c | 249 | printf("Waiting thread 2\r\n"); |
jstephens78 | 12:5d913b57da7c | 250 | Thread::wait(500); |
jstephens78 | 9:4e6fae5f9b23 | 251 | } |
jstephens78 | 9:4e6fae5f9b23 | 252 | |
jstephens78 | 12:5d913b57da7c | 253 | printf("Starting Game 2 - Air Hockey\r\n"); |
jstephens78 | 12:5d913b57da7c | 254 | |
jstephens78 | 12:5d913b57da7c | 255 | // Reset game variables |
jstephens78 | 12:5d913b57da7c | 256 | red_score = 0; |
jstephens78 | 12:5d913b57da7c | 257 | blue_score = 0; |
jstephens78 | 9:4e6fae5f9b23 | 258 | |
jstephens78 | 12:5d913b57da7c | 259 | // Reset screen, draw arena |
jstephens78 | 12:5d913b57da7c | 260 | uLCD.baudrate(BAUD_3000000); |
jstephens78 | 12:5d913b57da7c | 261 | uLCD.cls(); |
jstephens78 | 12:5d913b57da7c | 262 | drawStaticEnvironment(); |
jstephens78 | 12:5d913b57da7c | 263 | |
jstephens78 | 12:5d913b57da7c | 264 | // Set up Physac objects & simulation |
jstephens78 | 12:5d913b57da7c | 265 | initPhysicsObjects(); |
jstephens78 | 9:4e6fae5f9b23 | 266 | |
jstephens78 | 12:5d913b57da7c | 267 | Timer timer; |
jstephens78 | 12:5d913b57da7c | 268 | timer.start(); |
jstephens78 | 12:5d913b57da7c | 269 | |
jstephens78 | 12:5d913b57da7c | 270 | deltaTime = 1.66; |
jstephens78 | 12:5d913b57da7c | 271 | |
jstephens78 | 12:5d913b57da7c | 272 | while (game2) { |
jstephens78 | 12:5d913b57da7c | 273 | float dt = timer.read() * 1000; |
jstephens78 | 12:5d913b57da7c | 274 | timer.reset(); |
jstephens78 | 9:4e6fae5f9b23 | 275 | |
jstephens78 | 12:5d913b57da7c | 276 | // Update the physics of the game |
jstephens78 | 12:5d913b57da7c | 277 | accumulator += dt; |
jstephens78 | 12:5d913b57da7c | 278 | if (accumulator >= deltaTime) { |
jstephens78 | 12:5d913b57da7c | 279 | PhysicsStep(); |
jstephens78 | 12:5d913b57da7c | 280 | accumulator -= deltaTime; |
jstephens78 | 12:5d913b57da7c | 281 | |
jstephens78 | 12:5d913b57da7c | 282 | runGameLogic(); |
jstephens78 | 12:5d913b57da7c | 283 | } |
jstephens78 | 9:4e6fae5f9b23 | 284 | |
jstephens78 | 12:5d913b57da7c | 285 | // Render the game |
jstephens78 | 12:5d913b57da7c | 286 | drawDynamicObjects(); |
jstephens78 | 16:6cf744b2623a | 287 | |
jstephens78 | 12:5d913b57da7c | 288 | // Process input from the game |
jstephens78 | 12:5d913b57da7c | 289 | blue.parseMessage(); |
jstephens78 | 12:5d913b57da7c | 290 | if (blue.button[BUTTON_UP]) { |
jstephens78 | 12:5d913b57da7c | 291 | paddle_a->position.y -= dt * input_sensitivity; |
jstephens78 | 12:5d913b57da7c | 292 | printf("UP\r\n"); |
jstephens78 | 12:5d913b57da7c | 293 | } |
jstephens78 | 12:5d913b57da7c | 294 | if (blue.button[BUTTON_DOWN]) { |
jstephens78 | 12:5d913b57da7c | 295 | paddle_a->position.y += dt * input_sensitivity; |
jstephens78 | 12:5d913b57da7c | 296 | printf("DOWN\r\n"); |
jstephens78 | 12:5d913b57da7c | 297 | } |
jstephens78 | 12:5d913b57da7c | 298 | if (blue.button[BUTTON_LEFT]) { |
jstephens78 | 12:5d913b57da7c | 299 | paddle_a->position.x -= dt * input_sensitivity; |
jstephens78 | 12:5d913b57da7c | 300 | printf("LEFT\r\n"); |
jstephens78 | 12:5d913b57da7c | 301 | } |
jstephens78 | 12:5d913b57da7c | 302 | if (blue.button[BUTTON_RIGHT]) { |
jstephens78 | 12:5d913b57da7c | 303 | paddle_a->position.x += dt * input_sensitivity; |
jstephens78 | 12:5d913b57da7c | 304 | printf("RIGHT\r\n"); |
jstephens78 | 12:5d913b57da7c | 305 | } |
jstephens78 | 12:5d913b57da7c | 306 | if (blue.button[BUTTON_A]) { |
jstephens78 | 12:5d913b57da7c | 307 | SetPhysicsBodyRotation(paddle_a, paddle_a->orient - dt * input_sensitivity * 0.05); |
jstephens78 | 12:5d913b57da7c | 308 | printf("CW\r\n"); |
jstephens78 | 12:5d913b57da7c | 309 | } |
jstephens78 | 12:5d913b57da7c | 310 | if (blue.button[BUTTON_B]) { |
jstephens78 | 12:5d913b57da7c | 311 | SetPhysicsBodyRotation(paddle_a, paddle_a->orient + dt * input_sensitivity * 0.05); |
jstephens78 | 12:5d913b57da7c | 312 | printf("CCW\r\n"); |
jstephens78 | 12:5d913b57da7c | 313 | } |
jstephens78 | 16:6cf744b2623a | 314 | |
jstephens78 | 16:6cf744b2623a | 315 | // Player 2 Input |
jstephens78 | 16:6cf744b2623a | 316 | if (!(navSwitch & 0b00001)) { // Up |
jstephens78 | 16:6cf744b2623a | 317 | paddle_b->position.y -= dt * input_sensitivity; |
jstephens78 | 16:6cf744b2623a | 318 | } |
jstephens78 | 16:6cf744b2623a | 319 | if (!(navSwitch & 0b01000)) { // down |
jstephens78 | 16:6cf744b2623a | 320 | paddle_b->position.y += dt * input_sensitivity; |
jstephens78 | 16:6cf744b2623a | 321 | } |
jstephens78 | 16:6cf744b2623a | 322 | if (!(navSwitch & 0b00100)) { // left |
jstephens78 | 16:6cf744b2623a | 323 | paddle_b->position.x -= dt * input_sensitivity; |
jstephens78 | 16:6cf744b2623a | 324 | } |
jstephens78 | 16:6cf744b2623a | 325 | if (!(navSwitch & 0b10000)) { // right |
jstephens78 | 16:6cf744b2623a | 326 | paddle_b->position.x += dt * input_sensitivity; |
jstephens78 | 16:6cf744b2623a | 327 | } |
jstephens78 | 16:6cf744b2623a | 328 | if (!(navSwitch & 0b00010)) { // rotate |
jstephens78 | 16:6cf744b2623a | 329 | SetPhysicsBodyRotation(paddle_b, paddle_b->orient + 3.14159 / 4); |
jstephens78 | 16:6cf744b2623a | 330 | } |
jstephens78 | 16:6cf744b2623a | 331 | |
jstephens78 | 16:6cf744b2623a | 332 | Thread::yield(); |
jstephens78 | 12:5d913b57da7c | 333 | } |
jstephens78 | 12:5d913b57da7c | 334 | |
jstephens78 | 12:5d913b57da7c | 335 | ClosePhysics(); // Unitialize physics |
jstephens78 | 9:4e6fae5f9b23 | 336 | } |
jstephens78 | 9:4e6fae5f9b23 | 337 | } |