ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

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?

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"
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 }