ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

Committer:
rconnorlawson
Date:
Fri Nov 03 18:48:48 2017 +0000
Revision:
0:cf4396614a79
Child:
1:c18c231cb299
Emptied shell code (including doubly linked list) and added comments for all the functionality.;

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 0:cf4396614a79 93 if (tick - phys_tick < 1) continue;
rconnorlawson 0:cf4396614a79 94 phys_tick = tick;
rconnorlawson 0:cf4396614a79 95
rconnorlawson 0:cf4396614a79 96 // Compute elapsed time in milliseconds
rconnorlawson 0:cf4396614a79 97 float delta = (tick-phys_tick)*1e-3;
rconnorlawson 0:cf4396614a79 98
rconnorlawson 0:cf4396614a79 99 // Read inputs
rconnorlawson 0:cf4396614a79 100 GameInputs inputs = read_inputs();
rconnorlawson 0:cf4396614a79 101
rconnorlawson 0:cf4396614a79 102 // Update game state
rconnorlawson 0:cf4396614a79 103 int done = update_game(arena, state, inputs, delta);
rconnorlawson 0:cf4396614a79 104 if (done) return done;
rconnorlawson 0:cf4396614a79 105
rconnorlawson 0:cf4396614a79 106 // Debug: Count physics updates
rconnorlawson 0:cf4396614a79 107 count2++;
rconnorlawson 0:cf4396614a79 108
rconnorlawson 0:cf4396614a79 109 //////////////////
rconnorlawson 0:cf4396614a79 110 // Render update
rconnorlawson 0:cf4396614a79 111 //////////////////
rconnorlawson 0:cf4396614a79 112 // Rate limit: 40ms
rconnorlawson 0:cf4396614a79 113 if(tick - draw_tick < 40) continue;
rconnorlawson 0:cf4396614a79 114 draw_tick = tick;
rconnorlawson 0:cf4396614a79 115
rconnorlawson 0:cf4396614a79 116 // Erase moving stuff
rconnorlawson 0:cf4396614a79 117 ArenaElement* elem = (ArenaElement*)getHead(arena);
rconnorlawson 0:cf4396614a79 118 do {
rconnorlawson 0:cf4396614a79 119 switch(elem->type) {
rconnorlawson 0:cf4396614a79 120 case BALL:
rconnorlawson 0:cf4396614a79 121 erase_ball((Ball*) elem);
rconnorlawson 0:cf4396614a79 122 break;
rconnorlawson 0:cf4396614a79 123 default: break;
rconnorlawson 0:cf4396614a79 124 }
rconnorlawson 0:cf4396614a79 125 } while(elem = (ArenaElement*)getNext(arena));
rconnorlawson 0:cf4396614a79 126
rconnorlawson 0:cf4396614a79 127 // Draw everything
rconnorlawson 0:cf4396614a79 128 elem = (ArenaElement*)getHead(arena);
rconnorlawson 0:cf4396614a79 129 do {
rconnorlawson 0:cf4396614a79 130 switch(elem->type) {
rconnorlawson 0:cf4396614a79 131 case WALL:
rconnorlawson 0:cf4396614a79 132 draw_wall((Wall*) elem);
rconnorlawson 0:cf4396614a79 133 break;
rconnorlawson 0:cf4396614a79 134 case BALL:
rconnorlawson 0:cf4396614a79 135 draw_ball((Ball*) elem, state);
rconnorlawson 0:cf4396614a79 136 break;
rconnorlawson 0:cf4396614a79 137 default:
rconnorlawson 0:cf4396614a79 138 break;
rconnorlawson 0:cf4396614a79 139 }
rconnorlawson 0:cf4396614a79 140 } while(elem = (ArenaElement*)getNext(arena));
rconnorlawson 0:cf4396614a79 141
rconnorlawson 0:cf4396614a79 142 ///////////////
rconnorlawson 0:cf4396614a79 143 // Debug info
rconnorlawson 0:cf4396614a79 144 ///////////////
rconnorlawson 0:cf4396614a79 145 // Displays rate info in the top corner
rconnorlawson 0:cf4396614a79 146 // First number is total time to update and render this frame
rconnorlawson 0:cf4396614a79 147 // Second number is how many physics iterations between drawing frames
rconnorlawson 0:cf4396614a79 148 // Only displayed every 10th render update (roughly 2.5 Hz)
rconnorlawson 0:cf4396614a79 149 // TODO: Take this out before you turn your code in!
rconnorlawson 0:cf4396614a79 150 if ((count = (count+1)%10) == 0) {
rconnorlawson 0:cf4396614a79 151 uLCD.locate(0, 0);
rconnorlawson 0:cf4396614a79 152 uLCD.printf("%d %d \r\n", timer.read_ms()-tick, count2);
rconnorlawson 0:cf4396614a79 153 }
rconnorlawson 0:cf4396614a79 154
rconnorlawson 0:cf4396614a79 155 // Reset physics iteration counter after every render update
rconnorlawson 0:cf4396614a79 156 count2 = 0;
rconnorlawson 0:cf4396614a79 157 }
rconnorlawson 0:cf4396614a79 158 }