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 mbed wave_player
Fork of MazeRunner_Fall2017-shell by
game.cpp@1:2c6ae0fe9a2a, 2017-12-29 (annotated)
- Committer:
- navaem
- Date:
- Fri Dec 29 15:32:31 2017 +0000
- Revision:
- 1:2c6ae0fe9a2a
- Parent:
- 0:cf4396614a79
December 29, 2017;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| rconnorlawson | 0:cf4396614a79 | 1 | #include "game.h" |
| rconnorlawson | 0:cf4396614a79 | 2 | |
| rconnorlawson | 0:cf4396614a79 | 3 | #include "globals.h" |
| rconnorlawson | 0:cf4396614a79 | 4 | #include "physics.h" |
| rconnorlawson | 0:cf4396614a79 | 5 | #include "wall.h" |
| navaem | 1:2c6ae0fe9a2a | 6 | #include "pothole.h" |
| navaem | 1:2c6ae0fe9a2a | 7 | #include "goal.h" |
| navaem | 1:2c6ae0fe9a2a | 8 | #include "windmill.h" |
| navaem | 1:2c6ae0fe9a2a | 9 | #include "token.h" |
| navaem | 1:2c6ae0fe9a2a | 10 | #include "sandtrap.h" |
| navaem | 1:2c6ae0fe9a2a | 11 | #include "arena.h" |
| navaem | 1:2c6ae0fe9a2a | 12 | #include "rewind.h" |
| rconnorlawson | 0:cf4396614a79 | 13 | |
| navaem | 1:2c6ae0fe9a2a | 14 | #include "saves.h" |
| navaem | 1:2c6ae0fe9a2a | 15 | |
| navaem | 1:2c6ae0fe9a2a | 16 | |
| navaem | 1:2c6ae0fe9a2a | 17 | int tokenUse = 0; |
| navaem | 1:2c6ae0fe9a2a | 18 | int score = 0; |
| rconnorlawson | 0:cf4396614a79 | 19 | |
| rconnorlawson | 0:cf4396614a79 | 20 | /** Erases the ball from the screen by drawing over it with the background color. */ |
| rconnorlawson | 0:cf4396614a79 | 21 | void erase_ball(Ball* ball) |
| rconnorlawson | 0:cf4396614a79 | 22 | { |
| navaem | 1:2c6ae0fe9a2a | 23 | uLCD.filled_circle(ball->x,ball->y,radius,0x000000); |
| rconnorlawson | 0:cf4396614a79 | 24 | // TODO: Draw background color over curriously drawn ball location |
| rconnorlawson | 0:cf4396614a79 | 25 | } |
| rconnorlawson | 0:cf4396614a79 | 26 | |
| rconnorlawson | 0:cf4396614a79 | 27 | /** Draws the ball on the screen at the updated location (according to the state) */ |
| rconnorlawson | 0:cf4396614a79 | 28 | void draw_ball(Ball* ball, Physics* state) |
| rconnorlawson | 0:cf4396614a79 | 29 | { |
| rconnorlawson | 0:cf4396614a79 | 30 | // TODO: Save that updated ball position for later erasing |
| navaem | 1:2c6ae0fe9a2a | 31 | ball->x = state->px; |
| navaem | 1:2c6ae0fe9a2a | 32 | ball->y = state->py; |
| navaem | 1:2c6ae0fe9a2a | 33 | uLCD.filled_circle(ball->x,ball->y,radius,GREEN); |
| rconnorlawson | 0:cf4396614a79 | 34 | // TODO: Draw ball in its updated location |
| rconnorlawson | 0:cf4396614a79 | 35 | } |
| rconnorlawson | 0:cf4396614a79 | 36 | |
| navaem | 1:2c6ae0fe9a2a | 37 | //sets all should draw in the arena to should draw |
| navaem | 1:2c6ae0fe9a2a | 38 | void set_all_draw(DLinkedList* arena) |
| navaem | 1:2c6ae0fe9a2a | 39 | { |
| navaem | 1:2c6ae0fe9a2a | 40 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
| navaem | 1:2c6ae0fe9a2a | 41 | do { |
| navaem | 1:2c6ae0fe9a2a | 42 | switch(elem->type) { |
| navaem | 1:2c6ae0fe9a2a | 43 | case WALL: |
| navaem | 1:2c6ae0fe9a2a | 44 | ((Wall*)elem)->should_draw = 1; |
| navaem | 1:2c6ae0fe9a2a | 45 | break; |
| navaem | 1:2c6ae0fe9a2a | 46 | case POTHOLE: |
| navaem | 1:2c6ae0fe9a2a | 47 | ((Pothole*)elem)->should_draw = 1; |
| navaem | 1:2c6ae0fe9a2a | 48 | break; |
| navaem | 1:2c6ae0fe9a2a | 49 | case SANDTRAP: |
| navaem | 1:2c6ae0fe9a2a | 50 | ((Sandtrap*)elem)->should_draw = 1; |
| navaem | 1:2c6ae0fe9a2a | 51 | default: |
| navaem | 1:2c6ae0fe9a2a | 52 | break; |
| navaem | 1:2c6ae0fe9a2a | 53 | } |
| navaem | 1:2c6ae0fe9a2a | 54 | } while(elem = (ArenaElement*)getNext(arena)); |
| navaem | 1:2c6ae0fe9a2a | 55 | } |
| navaem | 1:2c6ae0fe9a2a | 56 | |
| navaem | 1:2c6ae0fe9a2a | 57 | |
| rconnorlawson | 0:cf4396614a79 | 58 | /** Reads inputs to the game, such as accelerometer and buttons */ |
| rconnorlawson | 0:cf4396614a79 | 59 | GameInputs read_inputs() |
| rconnorlawson | 0:cf4396614a79 | 60 | { |
| navaem | 1:2c6ae0fe9a2a | 61 | GameInputs inputs; |
| navaem | 1:2c6ae0fe9a2a | 62 | double x, y, z; |
| navaem | 1:2c6ae0fe9a2a | 63 | |
| navaem | 1:2c6ae0fe9a2a | 64 | //pretty sure this is making an infinite loop |
| navaem | 1:2c6ae0fe9a2a | 65 | acc.readXYZGravity(&x, &y, &z); |
| navaem | 1:2c6ae0fe9a2a | 66 | |
| rconnorlawson | 0:cf4396614a79 | 67 | // TODO: Get acceleration vector from accelerometer |
| navaem | 1:2c6ae0fe9a2a | 68 | inputs.ax = -1*x*1e-3/mass; |
| navaem | 1:2c6ae0fe9a2a | 69 | inputs.ay = y*1e-3/mass; |
| navaem | 1:2c6ae0fe9a2a | 70 | inputs.az = z; |
| rconnorlawson | 0:cf4396614a79 | 71 | // TODO: Read buttons |
| navaem | 1:2c6ae0fe9a2a | 72 | left_pb.read(); |
| navaem | 1:2c6ae0fe9a2a | 73 | right_pb.read(); |
| navaem | 1:2c6ae0fe9a2a | 74 | up_pb.read(); |
| navaem | 1:2c6ae0fe9a2a | 75 | down_pb.read(); |
| rconnorlawson | 0:cf4396614a79 | 76 | |
| rconnorlawson | 0:cf4396614a79 | 77 | return inputs; |
| rconnorlawson | 0:cf4396614a79 | 78 | } |
| rconnorlawson | 0:cf4396614a79 | 79 | |
| navaem | 1:2c6ae0fe9a2a | 80 | int update_game(DLinkedList* arena, Physics* curr, int* tokens, GameInputs inputs, float delta) |
| navaem | 1:2c6ae0fe9a2a | 81 | { |
| navaem | 1:2c6ae0fe9a2a | 82 | int done = 0; |
| navaem | 1:2c6ae0fe9a2a | 83 | int hit = 0; |
| rconnorlawson | 0:cf4396614a79 | 84 | /////////////////////////////// |
| rconnorlawson | 0:cf4396614a79 | 85 | // Prepare for physics update |
| rconnorlawson | 0:cf4396614a79 | 86 | /////////////////////////////// |
| rconnorlawson | 0:cf4396614a79 | 87 | // Make a copy of the current state for modification |
| rconnorlawson | 0:cf4396614a79 | 88 | Physics next = *curr; |
| rconnorlawson | 0:cf4396614a79 | 89 | // No acceleration unless the ArenaElements apply them. (Newton's 1st law) |
| navaem | 1:2c6ae0fe9a2a | 90 | next.ax = (float)inputs.ax; |
| navaem | 1:2c6ae0fe9a2a | 91 | next.ay = (float)inputs.ay; |
| navaem | 1:2c6ae0fe9a2a | 92 | |
| navaem | 1:2c6ae0fe9a2a | 93 | |
| rconnorlawson | 0:cf4396614a79 | 94 | |
| rconnorlawson | 0:cf4396614a79 | 95 | // Loop over all arena elements |
| rconnorlawson | 0:cf4396614a79 | 96 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
| rconnorlawson | 0:cf4396614a79 | 97 | do { |
| rconnorlawson | 0:cf4396614a79 | 98 | switch(elem->type) { |
| rconnorlawson | 0:cf4396614a79 | 99 | case WALL: |
| navaem | 1:2c6ae0fe9a2a | 100 | hit = do_wall(&next, curr, (Wall*) elem, delta); |
| navaem | 1:2c6ae0fe9a2a | 101 | if (hit) {// if the wall is hit, do the wall hit animation which flashes |
| navaem | 1:2c6ae0fe9a2a | 102 | //the screen white. |
| navaem | 1:2c6ae0fe9a2a | 103 | uLCD.background_color(WHITE); |
| navaem | 1:2c6ae0fe9a2a | 104 | uLCD.cls(); |
| navaem | 1:2c6ae0fe9a2a | 105 | uLCD.background_color(BLACK); |
| navaem | 1:2c6ae0fe9a2a | 106 | uLCD.cls(); |
| navaem | 1:2c6ae0fe9a2a | 107 | set_all_draw(arena); |
| navaem | 1:2c6ae0fe9a2a | 108 | } |
| navaem | 1:2c6ae0fe9a2a | 109 | break; |
| navaem | 1:2c6ae0fe9a2a | 110 | case POTHOLE: |
| navaem | 1:2c6ae0fe9a2a | 111 | do_pothole(&next, curr, (Pothole*) elem); |
| navaem | 1:2c6ae0fe9a2a | 112 | break; |
| navaem | 1:2c6ae0fe9a2a | 113 | case WINDMILL: |
| navaem | 1:2c6ae0fe9a2a | 114 | do_windmill(&next, curr, (Windmill*) elem, delta); |
| navaem | 1:2c6ae0fe9a2a | 115 | break; |
| navaem | 1:2c6ae0fe9a2a | 116 | case TOKEN: |
| navaem | 1:2c6ae0fe9a2a | 117 | *tokens = *tokens + do_token(&next, curr, (Token*) elem); |
| navaem | 1:2c6ae0fe9a2a | 118 | break; |
| navaem | 1:2c6ae0fe9a2a | 119 | case SANDTRAP: |
| navaem | 1:2c6ae0fe9a2a | 120 | do_sandtrap(&next, curr, (Sandtrap*)elem); |
| navaem | 1:2c6ae0fe9a2a | 121 | break; |
| navaem | 1:2c6ae0fe9a2a | 122 | case GOAL: |
| navaem | 1:2c6ae0fe9a2a | 123 | if (*tokens > 4) |
| navaem | 1:2c6ae0fe9a2a | 124 | done = do_goal(&next, curr, (Goal*) elem); |
| rconnorlawson | 0:cf4396614a79 | 125 | break; |
| rconnorlawson | 0:cf4396614a79 | 126 | case BALL: |
| rconnorlawson | 0:cf4396614a79 | 127 | forward_euler(&next, delta); |
| rconnorlawson | 0:cf4396614a79 | 128 | default: |
| rconnorlawson | 0:cf4396614a79 | 129 | break; |
| rconnorlawson | 0:cf4396614a79 | 130 | } |
| rconnorlawson | 0:cf4396614a79 | 131 | } while(elem = (ArenaElement*)getNext(arena)); |
| rconnorlawson | 0:cf4396614a79 | 132 | |
| rconnorlawson | 0:cf4396614a79 | 133 | // Last thing! Update state, so it will be saved for the next iteration. |
| rconnorlawson | 0:cf4396614a79 | 134 | *curr = next; |
| rconnorlawson | 0:cf4396614a79 | 135 | |
| rconnorlawson | 0:cf4396614a79 | 136 | // Zero means we aren't done yet |
| navaem | 1:2c6ae0fe9a2a | 137 | if(*tokens < 5){ |
| navaem | 1:2c6ae0fe9a2a | 138 | done = 0; |
| navaem | 1:2c6ae0fe9a2a | 139 | } |
| navaem | 1:2c6ae0fe9a2a | 140 | return done; |
| rconnorlawson | 0:cf4396614a79 | 141 | } |
| rconnorlawson | 0:cf4396614a79 | 142 | |
| navaem | 1:2c6ae0fe9a2a | 143 | int run_game(DLinkedList* arena, Physics* state, DLinkedList* saves) |
| rconnorlawson | 0:cf4396614a79 | 144 | { |
| rconnorlawson | 0:cf4396614a79 | 145 | // Initialize game loop timers |
| navaem | 1:2c6ae0fe9a2a | 146 | int tick, phys_tick, draw_tick, rewind_tick; |
| rconnorlawson | 0:cf4396614a79 | 147 | Timer timer; |
| rconnorlawson | 0:cf4396614a79 | 148 | timer.start(); |
| rconnorlawson | 0:cf4396614a79 | 149 | tick = timer.read_ms(); |
| rconnorlawson | 0:cf4396614a79 | 150 | phys_tick = tick; |
| rconnorlawson | 0:cf4396614a79 | 151 | draw_tick = tick; |
| navaem | 1:2c6ae0fe9a2a | 152 | rewind_tick = tick; |
| rconnorlawson | 0:cf4396614a79 | 153 | |
| rconnorlawson | 0:cf4396614a79 | 154 | // Initialize debug counters |
| rconnorlawson | 0:cf4396614a79 | 155 | int count = 0; |
| rconnorlawson | 0:cf4396614a79 | 156 | int count2 = 0; |
| rconnorlawson | 0:cf4396614a79 | 157 | |
| rconnorlawson | 0:cf4396614a79 | 158 | // Initial draw of the game |
| rconnorlawson | 0:cf4396614a79 | 159 | uLCD.background_color(BLACK); |
| rconnorlawson | 0:cf4396614a79 | 160 | uLCD.cls(); |
| rconnorlawson | 0:cf4396614a79 | 161 | |
| navaem | 1:2c6ae0fe9a2a | 162 | int* tokens = (int*)malloc(sizeof(int)); |
| navaem | 1:2c6ae0fe9a2a | 163 | *tokens = 0; |
| navaem | 1:2c6ae0fe9a2a | 164 | |
| navaem | 1:2c6ae0fe9a2a | 165 | state->px = 20.0; // Position in the center of the screen |
| navaem | 1:2c6ae0fe9a2a | 166 | state->py = 20.0; |
| navaem | 1:2c6ae0fe9a2a | 167 | state->vx = 0.0; // Initially unmoving |
| navaem | 1:2c6ae0fe9a2a | 168 | state->vy = 0.0; |
| navaem | 1:2c6ae0fe9a2a | 169 | |
| navaem | 1:2c6ae0fe9a2a | 170 | int rightPress; //button reader values |
| navaem | 1:2c6ae0fe9a2a | 171 | int leftPress; |
| navaem | 1:2c6ae0fe9a2a | 172 | int upPress; |
| navaem | 1:2c6ae0fe9a2a | 173 | int downPress; |
| navaem | 1:2c6ae0fe9a2a | 174 | |
| navaem | 1:2c6ae0fe9a2a | 175 | DLinkedList* oldTail1; |
| navaem | 1:2c6ae0fe9a2a | 176 | |
| navaem | 1:2c6ae0fe9a2a | 177 | |
| navaem | 1:2c6ae0fe9a2a | 178 | DLinkedList* rewoundLoad; |
| navaem | 1:2c6ae0fe9a2a | 179 | |
| navaem | 1:2c6ae0fe9a2a | 180 | |
| navaem | 1:2c6ae0fe9a2a | 181 | DLinkedList* rewindArenas = create_dlinkedlist(); |
| navaem | 1:2c6ae0fe9a2a | 182 | |
| navaem | 1:2c6ae0fe9a2a | 183 | |
| navaem | 1:2c6ae0fe9a2a | 184 | |
| navaem | 1:2c6ae0fe9a2a | 185 | |
| navaem | 1:2c6ae0fe9a2a | 186 | wait(1); |
| rconnorlawson | 0:cf4396614a79 | 187 | /////////////////// |
| rconnorlawson | 0:cf4396614a79 | 188 | // Main game loop |
| rconnorlawson | 0:cf4396614a79 | 189 | /////////////////// |
| rconnorlawson | 0:cf4396614a79 | 190 | while(1) { |
| rconnorlawson | 0:cf4396614a79 | 191 | // Read timer to determine how long the last loop took |
| navaem | 1:2c6ae0fe9a2a | 192 | |
| navaem | 1:2c6ae0fe9a2a | 193 | //////// |
| navaem | 1:2c6ae0fe9a2a | 194 | //check push buttons |
| navaem | 1:2c6ae0fe9a2a | 195 | ////////// |
| navaem | 1:2c6ae0fe9a2a | 196 | |
| navaem | 1:2c6ae0fe9a2a | 197 | rightPress = !right_pb; |
| navaem | 1:2c6ae0fe9a2a | 198 | leftPress = !left_pb; |
| navaem | 1:2c6ae0fe9a2a | 199 | upPress = !up_pb; |
| navaem | 1:2c6ae0fe9a2a | 200 | downPress = !down_pb; |
| navaem | 1:2c6ae0fe9a2a | 201 | //need to check if the skip level feature, rewind, jump back, or |
| navaem | 1:2c6ae0fe9a2a | 202 | //get all tokens has been selected. |
| navaem | 1:2c6ae0fe9a2a | 203 | |
| navaem | 1:2c6ae0fe9a2a | 204 | |
| navaem | 1:2c6ae0fe9a2a | 205 | if (upPress&&downPress){ |
| navaem | 1:2c6ae0fe9a2a | 206 | //skip level |
| navaem | 1:2c6ae0fe9a2a | 207 | return 1; |
| navaem | 1:2c6ae0fe9a2a | 208 | } else if(rightPress) { |
| navaem | 1:2c6ae0fe9a2a | 209 | //get all tokens mode |
| navaem | 1:2c6ae0fe9a2a | 210 | if (tokenUse < 1){ |
| navaem | 1:2c6ae0fe9a2a | 211 | tokenUse++; |
| navaem | 1:2c6ae0fe9a2a | 212 | *tokens = 5; |
| navaem | 1:2c6ae0fe9a2a | 213 | myled = 0; |
| navaem | 1:2c6ae0fe9a2a | 214 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
| navaem | 1:2c6ae0fe9a2a | 215 | do { |
| navaem | 1:2c6ae0fe9a2a | 216 | switch (elem->type) { |
| navaem | 1:2c6ae0fe9a2a | 217 | case TOKEN: |
| navaem | 1:2c6ae0fe9a2a | 218 | ((Token*)elem)->should_erase = 1; |
| navaem | 1:2c6ae0fe9a2a | 219 | draw_token((Token*)elem); |
| navaem | 1:2c6ae0fe9a2a | 220 | break; |
| navaem | 1:2c6ae0fe9a2a | 221 | default: |
| navaem | 1:2c6ae0fe9a2a | 222 | break; |
| navaem | 1:2c6ae0fe9a2a | 223 | } |
| navaem | 1:2c6ae0fe9a2a | 224 | } while(elem = (ArenaElement*)getNext(arena)); |
| navaem | 1:2c6ae0fe9a2a | 225 | } |
| navaem | 1:2c6ae0fe9a2a | 226 | } else if(leftPress){ |
| navaem | 1:2c6ae0fe9a2a | 227 | //Jump back |
| navaem | 1:2c6ae0fe9a2a | 228 | //opens the saves menu |
| navaem | 1:2c6ae0fe9a2a | 229 | DLinkedList* newLoad; |
| navaem | 1:2c6ae0fe9a2a | 230 | newLoad = runLoadSaveMenu(saves); |
| navaem | 1:2c6ae0fe9a2a | 231 | if (newLoad == NULL){ |
| navaem | 1:2c6ae0fe9a2a | 232 | continue; |
| navaem | 1:2c6ae0fe9a2a | 233 | } |
| navaem | 1:2c6ae0fe9a2a | 234 | DLinkedList* newArena = (DLinkedList*)getTail(newLoad); |
| navaem | 1:2c6ae0fe9a2a | 235 | free(arena); |
| navaem | 1:2c6ae0fe9a2a | 236 | arena = copy_arena(newArena); |
| navaem | 1:2c6ae0fe9a2a | 237 | Physics* newState = (Physics*)getHead(newLoad); |
| navaem | 1:2c6ae0fe9a2a | 238 | free(state); |
| navaem | 1:2c6ae0fe9a2a | 239 | state = copy_physics(newState); |
| navaem | 1:2c6ae0fe9a2a | 240 | destroyList(newLoad); |
| navaem | 1:2c6ae0fe9a2a | 241 | tick = timer.read_ms(); |
| navaem | 1:2c6ae0fe9a2a | 242 | phys_tick = tick; |
| navaem | 1:2c6ae0fe9a2a | 243 | } else if (upPress){ |
| navaem | 1:2c6ae0fe9a2a | 244 | //Rewind |
| navaem | 1:2c6ae0fe9a2a | 245 | rewoundLoad = runRewind(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 246 | if (rewoundLoad == NULL) { |
| navaem | 1:2c6ae0fe9a2a | 247 | continue; |
| navaem | 1:2c6ae0fe9a2a | 248 | } |
| navaem | 1:2c6ae0fe9a2a | 249 | free(arena); |
| navaem | 1:2c6ae0fe9a2a | 250 | arena = rewoundLoad; |
| navaem | 1:2c6ae0fe9a2a | 251 | Ball* newBall = (Ball*)getTail(arena); |
| navaem | 1:2c6ae0fe9a2a | 252 | state->px = newBall->x; |
| navaem | 1:2c6ae0fe9a2a | 253 | state->py = newBall->y; |
| navaem | 1:2c6ae0fe9a2a | 254 | tick = timer.read_ms(); |
| navaem | 1:2c6ae0fe9a2a | 255 | phys_tick = tick; |
| navaem | 1:2c6ae0fe9a2a | 256 | } else if (downPress){ |
| navaem | 1:2c6ae0fe9a2a | 257 | //save state |
| navaem | 1:2c6ae0fe9a2a | 258 | //need to open a saves menu |
| navaem | 1:2c6ae0fe9a2a | 259 | runStoreSaveMenu(state, arena, saves); |
| navaem | 1:2c6ae0fe9a2a | 260 | tick = timer.read_ms(); |
| navaem | 1:2c6ae0fe9a2a | 261 | phys_tick = tick; |
| navaem | 1:2c6ae0fe9a2a | 262 | } |
| navaem | 1:2c6ae0fe9a2a | 263 | |
| navaem | 1:2c6ae0fe9a2a | 264 | |
| navaem | 1:2c6ae0fe9a2a | 265 | |
| navaem | 1:2c6ae0fe9a2a | 266 | |
| rconnorlawson | 0:cf4396614a79 | 267 | tick = timer.read_ms(); |
| rconnorlawson | 0:cf4396614a79 | 268 | |
| navaem | 1:2c6ae0fe9a2a | 269 | //score keeping |
| navaem | 1:2c6ae0fe9a2a | 270 | |
| navaem | 1:2c6ae0fe9a2a | 271 | score++; |
| navaem | 1:2c6ae0fe9a2a | 272 | |
| rconnorlawson | 0:cf4396614a79 | 273 | /////////////////// |
| rconnorlawson | 0:cf4396614a79 | 274 | // Physics Update |
| rconnorlawson | 0:cf4396614a79 | 275 | /////////////////// |
| rconnorlawson | 0:cf4396614a79 | 276 | // Rate limit: 1 ms |
| navaem | 1:2c6ae0fe9a2a | 277 | int diff = tick - phys_tick; |
| navaem | 1:2c6ae0fe9a2a | 278 | if (diff < 1) continue; |
| rconnorlawson | 0:cf4396614a79 | 279 | phys_tick = tick; |
| rconnorlawson | 0:cf4396614a79 | 280 | |
| rconnorlawson | 0:cf4396614a79 | 281 | // Compute elapsed time in milliseconds |
| navaem | 1:2c6ae0fe9a2a | 282 | float delta = (diff)*1e-3*(float)gameDiff; |
| navaem | 1:2c6ae0fe9a2a | 283 | |
| rconnorlawson | 0:cf4396614a79 | 284 | |
| rconnorlawson | 0:cf4396614a79 | 285 | // Read inputs |
| rconnorlawson | 0:cf4396614a79 | 286 | GameInputs inputs = read_inputs(); |
| rconnorlawson | 0:cf4396614a79 | 287 | |
| rconnorlawson | 0:cf4396614a79 | 288 | // Update game state |
| navaem | 1:2c6ae0fe9a2a | 289 | int done = update_game(arena, state, tokens, inputs, delta); |
| navaem | 1:2c6ae0fe9a2a | 290 | if (done) { |
| navaem | 1:2c6ae0fe9a2a | 291 | *tokens = 0; |
| navaem | 1:2c6ae0fe9a2a | 292 | int limit = getSize(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 293 | getHead(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 294 | DLinkedList* currArena; |
| navaem | 1:2c6ae0fe9a2a | 295 | for (int i = 0; i < limit; i++) { |
| navaem | 1:2c6ae0fe9a2a | 296 | currArena = (DLinkedList*)getCurrent(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 297 | (rewindArenas->current)->data = NULL; |
| navaem | 1:2c6ae0fe9a2a | 298 | destroyList(currArena); |
| navaem | 1:2c6ae0fe9a2a | 299 | removeForward(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 300 | } |
| navaem | 1:2c6ae0fe9a2a | 301 | return done; |
| navaem | 1:2c6ae0fe9a2a | 302 | } |
| rconnorlawson | 0:cf4396614a79 | 303 | |
| rconnorlawson | 0:cf4396614a79 | 304 | // Debug: Count physics updates |
| rconnorlawson | 0:cf4396614a79 | 305 | count2++; |
| rconnorlawson | 0:cf4396614a79 | 306 | |
| rconnorlawson | 0:cf4396614a79 | 307 | ////////////////// |
| rconnorlawson | 0:cf4396614a79 | 308 | // Render update |
| rconnorlawson | 0:cf4396614a79 | 309 | ////////////////// |
| rconnorlawson | 0:cf4396614a79 | 310 | // Rate limit: 40ms |
| rconnorlawson | 0:cf4396614a79 | 311 | if(tick - draw_tick < 40) continue; |
| rconnorlawson | 0:cf4396614a79 | 312 | draw_tick = tick; |
| rconnorlawson | 0:cf4396614a79 | 313 | |
| navaem | 1:2c6ae0fe9a2a | 314 | |
| navaem | 1:2c6ae0fe9a2a | 315 | |
| navaem | 1:2c6ae0fe9a2a | 316 | ///////////////// |
| navaem | 1:2c6ae0fe9a2a | 317 | // Save States for REwind |
| navaem | 1:2c6ae0fe9a2a | 318 | ////////////////// |
| navaem | 1:2c6ae0fe9a2a | 319 | if (tick - rewind_tick > 350) { |
| navaem | 1:2c6ae0fe9a2a | 320 | rewind_tick = tick; |
| navaem | 1:2c6ae0fe9a2a | 321 | if (getSize(rewindArenas) > 9) {//only store max of 10 arenas |
| navaem | 1:2c6ae0fe9a2a | 322 | //the tail will be deleted from the stack |
| navaem | 1:2c6ae0fe9a2a | 323 | getTail(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 324 | oldTail1 = (DLinkedList*)removeForward(rewindArenas); |
| navaem | 1:2c6ae0fe9a2a | 325 | destroyList(oldTail1); |
| navaem | 1:2c6ae0fe9a2a | 326 | } |
| navaem | 1:2c6ae0fe9a2a | 327 | DLinkedList* arenaCopy = copy_arena(arena); |
| navaem | 1:2c6ae0fe9a2a | 328 | insertHead(rewindArenas,(void*)arenaCopy); |
| navaem | 1:2c6ae0fe9a2a | 329 | } |
| navaem | 1:2c6ae0fe9a2a | 330 | |
| navaem | 1:2c6ae0fe9a2a | 331 | |
| navaem | 1:2c6ae0fe9a2a | 332 | |
| navaem | 1:2c6ae0fe9a2a | 333 | |
| rconnorlawson | 0:cf4396614a79 | 334 | // Erase moving stuff |
| rconnorlawson | 0:cf4396614a79 | 335 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
| rconnorlawson | 0:cf4396614a79 | 336 | do { |
| rconnorlawson | 0:cf4396614a79 | 337 | switch(elem->type) { |
| rconnorlawson | 0:cf4396614a79 | 338 | case BALL: |
| rconnorlawson | 0:cf4396614a79 | 339 | erase_ball((Ball*) elem); |
| rconnorlawson | 0:cf4396614a79 | 340 | break; |
| rconnorlawson | 0:cf4396614a79 | 341 | default: break; |
| rconnorlawson | 0:cf4396614a79 | 342 | } |
| rconnorlawson | 0:cf4396614a79 | 343 | } while(elem = (ArenaElement*)getNext(arena)); |
| rconnorlawson | 0:cf4396614a79 | 344 | |
| rconnorlawson | 0:cf4396614a79 | 345 | // Draw everything |
| rconnorlawson | 0:cf4396614a79 | 346 | elem = (ArenaElement*)getHead(arena); |
| rconnorlawson | 0:cf4396614a79 | 347 | do { |
| rconnorlawson | 0:cf4396614a79 | 348 | switch(elem->type) { |
| rconnorlawson | 0:cf4396614a79 | 349 | case WALL: |
| rconnorlawson | 0:cf4396614a79 | 350 | draw_wall((Wall*) elem); |
| rconnorlawson | 0:cf4396614a79 | 351 | break; |
| navaem | 1:2c6ae0fe9a2a | 352 | case POTHOLE: |
| navaem | 1:2c6ae0fe9a2a | 353 | draw_pothole((Pothole*)elem); |
| navaem | 1:2c6ae0fe9a2a | 354 | break; |
| navaem | 1:2c6ae0fe9a2a | 355 | case WINDMILL: |
| navaem | 1:2c6ae0fe9a2a | 356 | draw_windmill((Windmill*)elem); |
| navaem | 1:2c6ae0fe9a2a | 357 | break; |
| navaem | 1:2c6ae0fe9a2a | 358 | case TOKEN: |
| navaem | 1:2c6ae0fe9a2a | 359 | draw_token((Token*)elem); |
| navaem | 1:2c6ae0fe9a2a | 360 | break; |
| navaem | 1:2c6ae0fe9a2a | 361 | case SANDTRAP: |
| navaem | 1:2c6ae0fe9a2a | 362 | draw_sandtrap((Sandtrap*)elem); |
| navaem | 1:2c6ae0fe9a2a | 363 | break; |
| navaem | 1:2c6ae0fe9a2a | 364 | case GOAL: |
| navaem | 1:2c6ae0fe9a2a | 365 | draw_goal((Goal*)elem); |
| navaem | 1:2c6ae0fe9a2a | 366 | break; |
| rconnorlawson | 0:cf4396614a79 | 367 | case BALL: |
| rconnorlawson | 0:cf4396614a79 | 368 | draw_ball((Ball*) elem, state); |
| rconnorlawson | 0:cf4396614a79 | 369 | break; |
| rconnorlawson | 0:cf4396614a79 | 370 | default: |
| rconnorlawson | 0:cf4396614a79 | 371 | break; |
| rconnorlawson | 0:cf4396614a79 | 372 | } |
| rconnorlawson | 0:cf4396614a79 | 373 | } while(elem = (ArenaElement*)getNext(arena)); |
| rconnorlawson | 0:cf4396614a79 | 374 | |
| rconnorlawson | 0:cf4396614a79 | 375 | /////////////// |
| navaem | 1:2c6ae0fe9a2a | 376 | // Display score |
| rconnorlawson | 0:cf4396614a79 | 377 | /////////////// |
| rconnorlawson | 0:cf4396614a79 | 378 | // Displays rate info in the top corner |
| rconnorlawson | 0:cf4396614a79 | 379 | // First number is total time to update and render this frame |
| rconnorlawson | 0:cf4396614a79 | 380 | // Second number is how many physics iterations between drawing frames |
| rconnorlawson | 0:cf4396614a79 | 381 | // Only displayed every 10th render update (roughly 2.5 Hz) |
| rconnorlawson | 0:cf4396614a79 | 382 | // TODO: Take this out before you turn your code in! |
| rconnorlawson | 0:cf4396614a79 | 383 | if ((count = (count+1)%10) == 0) { |
| rconnorlawson | 0:cf4396614a79 | 384 | uLCD.locate(0, 0); |
| navaem | 1:2c6ae0fe9a2a | 385 | uLCD.printf("%d \r\n", score); |
| rconnorlawson | 0:cf4396614a79 | 386 | } |
| rconnorlawson | 0:cf4396614a79 | 387 | |
| rconnorlawson | 0:cf4396614a79 | 388 | // Reset physics iteration counter after every render update |
| rconnorlawson | 0:cf4396614a79 | 389 | count2 = 0; |
| rconnorlawson | 0:cf4396614a79 | 390 | } |
| navaem | 1:2c6ae0fe9a2a | 391 | } |
| navaem | 1:2c6ae0fe9a2a | 392 | |
| navaem | 1:2c6ae0fe9a2a | 393 | |
| navaem | 1:2c6ae0fe9a2a | 394 | |
| navaem | 1:2c6ae0fe9a2a | 395 | void draw_everything(DLinkedList* arena) { |
| navaem | 1:2c6ae0fe9a2a | 396 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
| navaem | 1:2c6ae0fe9a2a | 397 | do { |
| navaem | 1:2c6ae0fe9a2a | 398 | switch(elem->type) { |
| navaem | 1:2c6ae0fe9a2a | 399 | case BALL: |
| navaem | 1:2c6ae0fe9a2a | 400 | erase_ball((Ball*) elem); |
| navaem | 1:2c6ae0fe9a2a | 401 | break; |
| navaem | 1:2c6ae0fe9a2a | 402 | default: break; |
| navaem | 1:2c6ae0fe9a2a | 403 | } |
| navaem | 1:2c6ae0fe9a2a | 404 | } while(elem = (ArenaElement*)getNext(arena)); |
| navaem | 1:2c6ae0fe9a2a | 405 | |
| navaem | 1:2c6ae0fe9a2a | 406 | // Draw everything |
| navaem | 1:2c6ae0fe9a2a | 407 | elem = (ArenaElement*)getHead(arena); |
| navaem | 1:2c6ae0fe9a2a | 408 | do { |
| navaem | 1:2c6ae0fe9a2a | 409 | switch(elem->type) { |
| navaem | 1:2c6ae0fe9a2a | 410 | case WALL: |
| navaem | 1:2c6ae0fe9a2a | 411 | draw_wall((Wall*) elem); |
| navaem | 1:2c6ae0fe9a2a | 412 | break; |
| navaem | 1:2c6ae0fe9a2a | 413 | case POTHOLE: |
| navaem | 1:2c6ae0fe9a2a | 414 | draw_pothole((Pothole*)elem); |
| navaem | 1:2c6ae0fe9a2a | 415 | break; |
| navaem | 1:2c6ae0fe9a2a | 416 | case WINDMILL: |
| navaem | 1:2c6ae0fe9a2a | 417 | draw_windmill((Windmill*)elem); |
| navaem | 1:2c6ae0fe9a2a | 418 | break; |
| navaem | 1:2c6ae0fe9a2a | 419 | case TOKEN: |
| navaem | 1:2c6ae0fe9a2a | 420 | draw_token((Token*)elem); |
| navaem | 1:2c6ae0fe9a2a | 421 | break; |
| navaem | 1:2c6ae0fe9a2a | 422 | case SANDTRAP: |
| navaem | 1:2c6ae0fe9a2a | 423 | draw_sandtrap((Sandtrap*)elem); |
| navaem | 1:2c6ae0fe9a2a | 424 | break; |
| navaem | 1:2c6ae0fe9a2a | 425 | case GOAL: |
| navaem | 1:2c6ae0fe9a2a | 426 | draw_goal((Goal*)elem); |
| navaem | 1:2c6ae0fe9a2a | 427 | break; |
| navaem | 1:2c6ae0fe9a2a | 428 | case BALL: |
| navaem | 1:2c6ae0fe9a2a | 429 | Ball* ball = (Ball*)elem; |
| navaem | 1:2c6ae0fe9a2a | 430 | uLCD.filled_circle(ball->x,ball->y,radius,GREEN); |
| navaem | 1:2c6ae0fe9a2a | 431 | break; |
| navaem | 1:2c6ae0fe9a2a | 432 | default: |
| navaem | 1:2c6ae0fe9a2a | 433 | break; |
| navaem | 1:2c6ae0fe9a2a | 434 | } |
| navaem | 1:2c6ae0fe9a2a | 435 | } while(elem = (ArenaElement*)getNext(arena)); |
| rconnorlawson | 0:cf4396614a79 | 436 | } |
