Eduardo Nava / Mbed 2 deprecated MazeRunner_Fall2017-shell

Dependencies:   4DGL-uLCD-SE mbed wave_player

Fork of MazeRunner_Fall2017-shell by ECE 2035 TA

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?

UserRevisionLine numberNew 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 }