ECE 2036 Project
Dependencies: mbed wave_player 4DGL-uLCD-SE
game.cpp@1:c18c231cb299, 2017-11-08 (annotated)
- Committer:
- rconnorlawson
- Date:
- Wed Nov 08 21:01:43 2017 +0000
- Revision:
- 1:c18c231cb299
- Parent:
- 0:cf4396614a79
- Child:
- 2:2042f29de6b7
Fix delta computation in physics update.
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" |
rconnorlawson | 0:cf4396614a79 | 6 | |
rconnorlawson | 0:cf4396614a79 | 7 | |
rconnorlawson | 0:cf4396614a79 | 8 | /** Erases the ball from the screen by drawing over it with the background color. */ |
rconnorlawson | 0:cf4396614a79 | 9 | void erase_ball(Ball* ball) |
rconnorlawson | 0:cf4396614a79 | 10 | { |
rconnorlawson | 0:cf4396614a79 | 11 | // TODO: Draw background color over curriously drawn ball location |
rconnorlawson | 0:cf4396614a79 | 12 | } |
rconnorlawson | 0:cf4396614a79 | 13 | |
rconnorlawson | 0:cf4396614a79 | 14 | /** Draws the ball on the screen at the updated location (according to the state) */ |
rconnorlawson | 0:cf4396614a79 | 15 | void draw_ball(Ball* ball, Physics* state) |
rconnorlawson | 0:cf4396614a79 | 16 | { |
rconnorlawson | 0:cf4396614a79 | 17 | // TODO: Save that updated ball position for later erasing |
rconnorlawson | 0:cf4396614a79 | 18 | // TODO: Draw ball in its updated location |
rconnorlawson | 0:cf4396614a79 | 19 | } |
rconnorlawson | 0:cf4396614a79 | 20 | |
rconnorlawson | 0:cf4396614a79 | 21 | /** Reads inputs to the game, such as accelerometer and buttons */ |
rconnorlawson | 0:cf4396614a79 | 22 | GameInputs read_inputs() |
rconnorlawson | 0:cf4396614a79 | 23 | { |
rconnorlawson | 0:cf4396614a79 | 24 | GameInputs inputs = {0}; |
rconnorlawson | 0:cf4396614a79 | 25 | |
rconnorlawson | 0:cf4396614a79 | 26 | // TODO: Get acceleration vector from accelerometer |
rconnorlawson | 0:cf4396614a79 | 27 | // TODO: Read buttons |
rconnorlawson | 0:cf4396614a79 | 28 | |
rconnorlawson | 0:cf4396614a79 | 29 | return inputs; |
rconnorlawson | 0:cf4396614a79 | 30 | } |
rconnorlawson | 0:cf4396614a79 | 31 | |
rconnorlawson | 0:cf4396614a79 | 32 | int update_game(DLinkedList* arena, Physics* curr, GameInputs inputs, float delta) |
rconnorlawson | 0:cf4396614a79 | 33 | { |
rconnorlawson | 0:cf4396614a79 | 34 | /////////////////////////////// |
rconnorlawson | 0:cf4396614a79 | 35 | // Prepare for physics update |
rconnorlawson | 0:cf4396614a79 | 36 | /////////////////////////////// |
rconnorlawson | 0:cf4396614a79 | 37 | // Make a copy of the current state for modification |
rconnorlawson | 0:cf4396614a79 | 38 | Physics next = *curr; |
rconnorlawson | 0:cf4396614a79 | 39 | // No acceleration unless the ArenaElements apply them. (Newton's 1st law) |
rconnorlawson | 0:cf4396614a79 | 40 | next.ax = next.ay = 0.0; |
rconnorlawson | 0:cf4396614a79 | 41 | |
rconnorlawson | 0:cf4396614a79 | 42 | // Loop over all arena elements |
rconnorlawson | 0:cf4396614a79 | 43 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
rconnorlawson | 0:cf4396614a79 | 44 | do { |
rconnorlawson | 0:cf4396614a79 | 45 | switch(elem->type) { |
rconnorlawson | 0:cf4396614a79 | 46 | case WALL: |
rconnorlawson | 0:cf4396614a79 | 47 | do_wall(&next, curr, (Wall*) elem, delta); |
rconnorlawson | 0:cf4396614a79 | 48 | break; |
rconnorlawson | 0:cf4396614a79 | 49 | case BALL: |
rconnorlawson | 0:cf4396614a79 | 50 | forward_euler(&next, delta); |
rconnorlawson | 0:cf4396614a79 | 51 | break; |
rconnorlawson | 0:cf4396614a79 | 52 | default: |
rconnorlawson | 0:cf4396614a79 | 53 | break; |
rconnorlawson | 0:cf4396614a79 | 54 | } |
rconnorlawson | 0:cf4396614a79 | 55 | } while(elem = (ArenaElement*)getNext(arena)); |
rconnorlawson | 0:cf4396614a79 | 56 | |
rconnorlawson | 0:cf4396614a79 | 57 | // Last thing! Update state, so it will be saved for the next iteration. |
rconnorlawson | 0:cf4396614a79 | 58 | *curr = next; |
rconnorlawson | 0:cf4396614a79 | 59 | |
rconnorlawson | 0:cf4396614a79 | 60 | // Zero means we aren't done yet |
rconnorlawson | 0:cf4396614a79 | 61 | return 0; |
rconnorlawson | 0:cf4396614a79 | 62 | } |
rconnorlawson | 0:cf4396614a79 | 63 | |
rconnorlawson | 0:cf4396614a79 | 64 | int run_game(DLinkedList* arena, Physics* state) |
rconnorlawson | 0:cf4396614a79 | 65 | { |
rconnorlawson | 0:cf4396614a79 | 66 | // Initialize game loop timers |
rconnorlawson | 0:cf4396614a79 | 67 | int tick, phys_tick, draw_tick; |
rconnorlawson | 0:cf4396614a79 | 68 | Timer timer; |
rconnorlawson | 0:cf4396614a79 | 69 | timer.start(); |
rconnorlawson | 0:cf4396614a79 | 70 | tick = timer.read_ms(); |
rconnorlawson | 0:cf4396614a79 | 71 | phys_tick = tick; |
rconnorlawson | 0:cf4396614a79 | 72 | draw_tick = tick; |
rconnorlawson | 0:cf4396614a79 | 73 | |
rconnorlawson | 0:cf4396614a79 | 74 | // Initialize debug counters |
rconnorlawson | 0:cf4396614a79 | 75 | int count = 0; |
rconnorlawson | 0:cf4396614a79 | 76 | int count2 = 0; |
rconnorlawson | 0:cf4396614a79 | 77 | |
rconnorlawson | 0:cf4396614a79 | 78 | // Initial draw of the game |
rconnorlawson | 0:cf4396614a79 | 79 | uLCD.background_color(BLACK); |
rconnorlawson | 0:cf4396614a79 | 80 | uLCD.cls(); |
rconnorlawson | 0:cf4396614a79 | 81 | |
rconnorlawson | 0:cf4396614a79 | 82 | /////////////////// |
rconnorlawson | 0:cf4396614a79 | 83 | // Main game loop |
rconnorlawson | 0:cf4396614a79 | 84 | /////////////////// |
rconnorlawson | 0:cf4396614a79 | 85 | while(1) { |
rconnorlawson | 0:cf4396614a79 | 86 | // Read timer to determine how long the last loop took |
rconnorlawson | 0:cf4396614a79 | 87 | tick = timer.read_ms(); |
rconnorlawson | 0:cf4396614a79 | 88 | |
rconnorlawson | 0:cf4396614a79 | 89 | /////////////////// |
rconnorlawson | 0:cf4396614a79 | 90 | // Physics Update |
rconnorlawson | 0:cf4396614a79 | 91 | /////////////////// |
rconnorlawson | 0:cf4396614a79 | 92 | // Rate limit: 1 ms |
rconnorlawson | 1:c18c231cb299 | 93 | int diff = tick - phys_tick; |
rconnorlawson | 1:c18c231cb299 | 94 | if (diff < 1) continue; |
rconnorlawson | 0:cf4396614a79 | 95 | phys_tick = tick; |
rconnorlawson | 0:cf4396614a79 | 96 | |
rconnorlawson | 0:cf4396614a79 | 97 | // Compute elapsed time in milliseconds |
rconnorlawson | 1:c18c231cb299 | 98 | float delta = diff*1e-3; |
rconnorlawson | 0:cf4396614a79 | 99 | |
rconnorlawson | 0:cf4396614a79 | 100 | // Read inputs |
rconnorlawson | 0:cf4396614a79 | 101 | GameInputs inputs = read_inputs(); |
rconnorlawson | 0:cf4396614a79 | 102 | |
rconnorlawson | 0:cf4396614a79 | 103 | // Update game state |
rconnorlawson | 0:cf4396614a79 | 104 | int done = update_game(arena, state, inputs, delta); |
rconnorlawson | 0:cf4396614a79 | 105 | if (done) return done; |
rconnorlawson | 0:cf4396614a79 | 106 | |
rconnorlawson | 0:cf4396614a79 | 107 | // Debug: Count physics updates |
rconnorlawson | 0:cf4396614a79 | 108 | count2++; |
rconnorlawson | 0:cf4396614a79 | 109 | |
rconnorlawson | 0:cf4396614a79 | 110 | ////////////////// |
rconnorlawson | 0:cf4396614a79 | 111 | // Render update |
rconnorlawson | 0:cf4396614a79 | 112 | ////////////////// |
rconnorlawson | 0:cf4396614a79 | 113 | // Rate limit: 40ms |
rconnorlawson | 0:cf4396614a79 | 114 | if(tick - draw_tick < 40) continue; |
rconnorlawson | 0:cf4396614a79 | 115 | draw_tick = tick; |
rconnorlawson | 0:cf4396614a79 | 116 | |
rconnorlawson | 0:cf4396614a79 | 117 | // Erase moving stuff |
rconnorlawson | 0:cf4396614a79 | 118 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
rconnorlawson | 0:cf4396614a79 | 119 | do { |
rconnorlawson | 0:cf4396614a79 | 120 | switch(elem->type) { |
rconnorlawson | 0:cf4396614a79 | 121 | case BALL: |
rconnorlawson | 0:cf4396614a79 | 122 | erase_ball((Ball*) elem); |
rconnorlawson | 0:cf4396614a79 | 123 | break; |
rconnorlawson | 0:cf4396614a79 | 124 | default: break; |
rconnorlawson | 0:cf4396614a79 | 125 | } |
rconnorlawson | 0:cf4396614a79 | 126 | } while(elem = (ArenaElement*)getNext(arena)); |
rconnorlawson | 0:cf4396614a79 | 127 | |
rconnorlawson | 0:cf4396614a79 | 128 | // Draw everything |
rconnorlawson | 0:cf4396614a79 | 129 | elem = (ArenaElement*)getHead(arena); |
rconnorlawson | 0:cf4396614a79 | 130 | do { |
rconnorlawson | 0:cf4396614a79 | 131 | switch(elem->type) { |
rconnorlawson | 0:cf4396614a79 | 132 | case WALL: |
rconnorlawson | 0:cf4396614a79 | 133 | draw_wall((Wall*) elem); |
rconnorlawson | 0:cf4396614a79 | 134 | break; |
rconnorlawson | 0:cf4396614a79 | 135 | case BALL: |
rconnorlawson | 0:cf4396614a79 | 136 | draw_ball((Ball*) elem, state); |
rconnorlawson | 0:cf4396614a79 | 137 | break; |
rconnorlawson | 0:cf4396614a79 | 138 | default: |
rconnorlawson | 0:cf4396614a79 | 139 | break; |
rconnorlawson | 0:cf4396614a79 | 140 | } |
rconnorlawson | 0:cf4396614a79 | 141 | } while(elem = (ArenaElement*)getNext(arena)); |
rconnorlawson | 0:cf4396614a79 | 142 | |
rconnorlawson | 0:cf4396614a79 | 143 | /////////////// |
rconnorlawson | 0:cf4396614a79 | 144 | // Debug info |
rconnorlawson | 0:cf4396614a79 | 145 | /////////////// |
rconnorlawson | 0:cf4396614a79 | 146 | // Displays rate info in the top corner |
rconnorlawson | 0:cf4396614a79 | 147 | // First number is total time to update and render this frame |
rconnorlawson | 0:cf4396614a79 | 148 | // Second number is how many physics iterations between drawing frames |
rconnorlawson | 0:cf4396614a79 | 149 | // Only displayed every 10th render update (roughly 2.5 Hz) |
rconnorlawson | 0:cf4396614a79 | 150 | // TODO: Take this out before you turn your code in! |
rconnorlawson | 0:cf4396614a79 | 151 | if ((count = (count+1)%10) == 0) { |
rconnorlawson | 0:cf4396614a79 | 152 | uLCD.locate(0, 0); |
rconnorlawson | 0:cf4396614a79 | 153 | uLCD.printf("%d %d \r\n", timer.read_ms()-tick, count2); |
rconnorlawson | 0:cf4396614a79 | 154 | } |
rconnorlawson | 0:cf4396614a79 | 155 | |
rconnorlawson | 0:cf4396614a79 | 156 | // Reset physics iteration counter after every render update |
rconnorlawson | 0:cf4396614a79 | 157 | count2 = 0; |
rconnorlawson | 0:cf4396614a79 | 158 | } |
rconnorlawson | 0:cf4396614a79 | 159 | } |