ECE 2036 Project
Dependencies: mbed wave_player 4DGL-uLCD-SE
Diff: game.cpp
- Revision:
- 0:cf4396614a79
- Child:
- 1:c18c231cb299
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/game.cpp Fri Nov 03 18:48:48 2017 +0000 @@ -0,0 +1,158 @@ +#include "game.h" + +#include "globals.h" +#include "physics.h" +#include "wall.h" + + +/** Erases the ball from the screen by drawing over it with the background color. */ +void erase_ball(Ball* ball) +{ + // TODO: Draw background color over curriously drawn ball location +} + +/** Draws the ball on the screen at the updated location (according to the state) */ +void draw_ball(Ball* ball, Physics* state) +{ + // TODO: Save that updated ball position for later erasing + // TODO: Draw ball in its updated location +} + +/** Reads inputs to the game, such as accelerometer and buttons */ +GameInputs read_inputs() +{ + GameInputs inputs = {0}; + + // TODO: Get acceleration vector from accelerometer + // TODO: Read buttons + + return inputs; +} + +int update_game(DLinkedList* arena, Physics* curr, GameInputs inputs, float delta) +{ + /////////////////////////////// + // Prepare for physics update + /////////////////////////////// + // Make a copy of the current state for modification + Physics next = *curr; + // No acceleration unless the ArenaElements apply them. (Newton's 1st law) + next.ax = next.ay = 0.0; + + // Loop over all arena elements + ArenaElement* elem = (ArenaElement*)getHead(arena); + do { + switch(elem->type) { + case WALL: + do_wall(&next, curr, (Wall*) elem, delta); + break; + case BALL: + forward_euler(&next, delta); + break; + default: + break; + } + } while(elem = (ArenaElement*)getNext(arena)); + + // Last thing! Update state, so it will be saved for the next iteration. + *curr = next; + + // Zero means we aren't done yet + return 0; +} + +int run_game(DLinkedList* arena, Physics* state) +{ + // Initialize game loop timers + int tick, phys_tick, draw_tick; + Timer timer; + timer.start(); + tick = timer.read_ms(); + phys_tick = tick; + draw_tick = tick; + + // Initialize debug counters + int count = 0; + int count2 = 0; + + // Initial draw of the game + uLCD.background_color(BLACK); + uLCD.cls(); + + /////////////////// + // Main game loop + /////////////////// + while(1) { + // Read timer to determine how long the last loop took + tick = timer.read_ms(); + + /////////////////// + // Physics Update + /////////////////// + // Rate limit: 1 ms + if (tick - phys_tick < 1) continue; + phys_tick = tick; + + // Compute elapsed time in milliseconds + float delta = (tick-phys_tick)*1e-3; + + // Read inputs + GameInputs inputs = read_inputs(); + + // Update game state + int done = update_game(arena, state, inputs, delta); + if (done) return done; + + // Debug: Count physics updates + count2++; + + ////////////////// + // Render update + ////////////////// + // Rate limit: 40ms + if(tick - draw_tick < 40) continue; + draw_tick = tick; + + // Erase moving stuff + ArenaElement* elem = (ArenaElement*)getHead(arena); + do { + switch(elem->type) { + case BALL: + erase_ball((Ball*) elem); + break; + default: break; + } + } while(elem = (ArenaElement*)getNext(arena)); + + // Draw everything + elem = (ArenaElement*)getHead(arena); + do { + switch(elem->type) { + case WALL: + draw_wall((Wall*) elem); + break; + case BALL: + draw_ball((Ball*) elem, state); + break; + default: + break; + } + } while(elem = (ArenaElement*)getNext(arena)); + + /////////////// + // Debug info + /////////////// + // Displays rate info in the top corner + // First number is total time to update and render this frame + // Second number is how many physics iterations between drawing frames + // Only displayed every 10th render update (roughly 2.5 Hz) + // TODO: Take this out before you turn your code in! + if ((count = (count+1)%10) == 0) { + uLCD.locate(0, 0); + uLCD.printf("%d %d \r\n", timer.read_ms()-tick, count2); + } + + // Reset physics iteration counter after every render update + count2 = 0; + } +} \ No newline at end of file