ECE 2035 Homework

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
zkang0729
Date:
Thu Nov 14 17:14:37 2019 +0000
Revision:
4:e3fbc74a3783
Parent:
3:e4690ad5a4d2
Initial Commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rconnorlawson 0:35660d7952f7 1 // Project includes
rconnorlawson 0:35660d7952f7 2 #include "globals.h"
rconnorlawson 0:35660d7952f7 3 #include "hardware.h"
rconnorlawson 0:35660d7952f7 4 #include "map.h"
rconnorlawson 0:35660d7952f7 5 #include "graphics.h"
rconnorlawson 0:35660d7952f7 6 #include "speech.h"
rconnorlawson 0:35660d7952f7 7
rconnorlawson 0:35660d7952f7 8 // Functions in this file
zkang0729 4:e3fbc74a3783 9 int get_action(GameInputs inputs);
zkang0729 4:e3fbc74a3783 10 int update_game(int action);
zkang0729 4:e3fbc74a3783 11 void draw_game(int init);
zkang0729 4:e3fbc74a3783 12 void init_main_map();
zkang0729 4:e3fbc74a3783 13 int main();
rconnorlawson 0:35660d7952f7 14
rconnorlawson 0:35660d7952f7 15 /**
rconnorlawson 0:35660d7952f7 16 * The main game state. Must include Player locations and previous locations for
rconnorlawson 0:35660d7952f7 17 * drawing to work properly. Other items can be added as needed.
rconnorlawson 0:35660d7952f7 18 */
zkang0729 4:e3fbc74a3783 19 struct
zkang0729 4:e3fbc74a3783 20 {
zkang0729 4:e3fbc74a3783 21 int x, y; // Current locations
zkang0729 4:e3fbc74a3783 22 int px, py; // Previous locations
zkang0729 4:e3fbc74a3783 23 int has_key;
zkang0729 4:e3fbc74a3783 24 // You can add other properties for the player here
rconnorlawson 0:35660d7952f7 25 } Player;
rconnorlawson 0:35660d7952f7 26
rconnorlawson 0:35660d7952f7 27 /**
rconnorlawson 0:35660d7952f7 28 * Given the game inputs, determine what kind of update needs to happen.
rconnorlawson 0:35660d7952f7 29 * Possbile return values are defined below.
rconnorlawson 0:35660d7952f7 30 */
rconnorlawson 0:35660d7952f7 31 #define NO_ACTION 0
rconnorlawson 0:35660d7952f7 32 #define ACTION_BUTTON 1
rconnorlawson 0:35660d7952f7 33 #define MENU_BUTTON 2
rconnorlawson 0:35660d7952f7 34 #define GO_LEFT 3
rconnorlawson 0:35660d7952f7 35 #define GO_RIGHT 4
rconnorlawson 0:35660d7952f7 36 #define GO_UP 5
rconnorlawson 0:35660d7952f7 37 #define GO_DOWN 6
rconnorlawson 0:35660d7952f7 38 int get_action(GameInputs inputs)
rconnorlawson 0:35660d7952f7 39 {
zkang0729 4:e3fbc74a3783 40 return NO_ACTION;
rconnorlawson 0:35660d7952f7 41 }
rconnorlawson 0:35660d7952f7 42
rconnorlawson 0:35660d7952f7 43 /**
rconnorlawson 0:35660d7952f7 44 * Update the game state based on the user action. For example, if the user
rconnorlawson 0:35660d7952f7 45 * requests GO_UP, then this function should determine if that is possible by
rconnorlawson 0:35660d7952f7 46 * consulting the map, and update the Player position accordingly.
rconnorlawson 0:35660d7952f7 47 *
rconnorlawson 0:35660d7952f7 48 * Return values are defined below. FULL_DRAW indicates that for this frame,
rconnorlawson 0:35660d7952f7 49 * draw_game should not optimize drawing and should draw every tile, even if
rconnorlawson 0:35660d7952f7 50 * the player has not moved.
rconnorlawson 0:35660d7952f7 51 */
rconnorlawson 0:35660d7952f7 52 #define NO_RESULT 0
rconnorlawson 0:35660d7952f7 53 #define GAME_OVER 1
rconnorlawson 0:35660d7952f7 54 #define FULL_DRAW 2
rconnorlawson 0:35660d7952f7 55 int update_game(int action)
rconnorlawson 0:35660d7952f7 56 {
zkang0729 4:e3fbc74a3783 57 // Save player previous location before updating
zkang0729 4:e3fbc74a3783 58 Player.px = Player.x;
zkang0729 4:e3fbc74a3783 59 Player.py = Player.y;
zkang0729 4:e3fbc74a3783 60
zkang0729 4:e3fbc74a3783 61 // Do different things based on the each action.
zkang0729 4:e3fbc74a3783 62 // You can define functions like "go_up()" that get called for each case.
zkang0729 4:e3fbc74a3783 63 switch (action)
zkang0729 4:e3fbc74a3783 64 {
zkang0729 4:e3fbc74a3783 65 case GO_UP:
zkang0729 4:e3fbc74a3783 66 Player.y != 0 && Player.y - 1;
zkang0729 4:e3fbc74a3783 67 break;
zkang0729 4:e3fbc74a3783 68 case GO_LEFT:
zkang0729 4:e3fbc74a3783 69 Player.x != 0 && Player.x - 1;
zkang0729 4:e3fbc74a3783 70 break;
zkang0729 4:e3fbc74a3783 71 case GO_DOWN:
zkang0729 4:e3fbc74a3783 72 Player.y != map_height() && Player.y + 1;
zkang0729 4:e3fbc74a3783 73 break;
zkang0729 4:e3fbc74a3783 74 case GO_RIGHT:
zkang0729 4:e3fbc74a3783 75 Player.x != map_width() && Player.x + 1;
zkang0729 4:e3fbc74a3783 76 break;
zkang0729 4:e3fbc74a3783 77 case ACTION_BUTTON:
zkang0729 4:e3fbc74a3783 78 break;
zkang0729 4:e3fbc74a3783 79 case MENU_BUTTON:
zkang0729 4:e3fbc74a3783 80 break;
zkang0729 4:e3fbc74a3783 81 default:
zkang0729 4:e3fbc74a3783 82 break;
zkang0729 4:e3fbc74a3783 83 }
zkang0729 4:e3fbc74a3783 84 return NO_RESULT;
rconnorlawson 0:35660d7952f7 85 }
rconnorlawson 0:35660d7952f7 86
rconnorlawson 0:35660d7952f7 87 /**
rconnorlawson 0:35660d7952f7 88 * Entry point for frame drawing. This should be called once per iteration of
rconnorlawson 0:35660d7952f7 89 * the game loop. This draws all tiles on the screen, followed by the status
rconnorlawson 0:35660d7952f7 90 * bars. Unless init is nonzero, this function will optimize drawing by only
rconnorlawson 0:35660d7952f7 91 * drawing tiles that have changed from the previous frame.
rconnorlawson 0:35660d7952f7 92 */
rconnorlawson 0:35660d7952f7 93 void draw_game(int init)
rconnorlawson 0:35660d7952f7 94 {
zkang0729 4:e3fbc74a3783 95 // Draw game border first
zkang0729 4:e3fbc74a3783 96 if (init)
zkang0729 4:e3fbc74a3783 97 draw_border();
zkang0729 4:e3fbc74a3783 98
zkang0729 4:e3fbc74a3783 99 // Iterate over all visible map tiles
zkang0729 4:e3fbc74a3783 100 for (int i = -5; i <= 5; i++) // Iterate over columns of tiles
zkang0729 4:e3fbc74a3783 101 {
zkang0729 4:e3fbc74a3783 102 for (int j = -4; j <= 4; j++) // Iterate over one column of tiles
rconnorlawson 0:35660d7952f7 103 {
zkang0729 4:e3fbc74a3783 104 // Here, we have a given (i,j)
zkang0729 4:e3fbc74a3783 105
zkang0729 4:e3fbc74a3783 106 // Compute the current map (x,y) of this tile
zkang0729 4:e3fbc74a3783 107 int x = i + Player.x;
zkang0729 4:e3fbc74a3783 108 int y = j + Player.y;
zkang0729 4:e3fbc74a3783 109
zkang0729 4:e3fbc74a3783 110 // Compute the previous map (px, py) of this tile
zkang0729 4:e3fbc74a3783 111 int px = i + Player.px;
zkang0729 4:e3fbc74a3783 112 int py = j + Player.py;
zkang0729 4:e3fbc74a3783 113
zkang0729 4:e3fbc74a3783 114 // Compute u,v coordinates for drawing
zkang0729 4:e3fbc74a3783 115 int u = (i + 5) * 11 + 3;
zkang0729 4:e3fbc74a3783 116 int v = (j + 4) * 11 + 15;
zkang0729 4:e3fbc74a3783 117
zkang0729 4:e3fbc74a3783 118 // Figure out what to draw
zkang0729 4:e3fbc74a3783 119 DrawFunc draw = NULL;
zkang0729 4:e3fbc74a3783 120 if (init && i == 0 && j == 0) // Only draw the player on init
zkang0729 4:e3fbc74a3783 121 {
zkang0729 4:e3fbc74a3783 122 draw_player(u, v, Player.has_key);
zkang0729 4:e3fbc74a3783 123 continue;
zkang0729 4:e3fbc74a3783 124 }
zkang0729 4:e3fbc74a3783 125 else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) // Current (i,j) in the map
zkang0729 4:e3fbc74a3783 126 {
zkang0729 4:e3fbc74a3783 127 MapItem *curr_item = get_here(x, y);
zkang0729 4:e3fbc74a3783 128 MapItem *prev_item = get_here(px, py);
zkang0729 4:e3fbc74a3783 129 if (init || curr_item != prev_item) // Only draw if they're different
rconnorlawson 0:35660d7952f7 130 {
zkang0729 4:e3fbc74a3783 131 if (curr_item) // There's something here! Draw it
zkang0729 4:e3fbc74a3783 132 {
zkang0729 4:e3fbc74a3783 133 draw = curr_item->draw;
zkang0729 4:e3fbc74a3783 134 }
zkang0729 4:e3fbc74a3783 135 else // There used to be something, but now there isn't
zkang0729 4:e3fbc74a3783 136 {
zkang0729 4:e3fbc74a3783 137 draw = draw_nothing;
zkang0729 4:e3fbc74a3783 138 }
zkang0729 4:e3fbc74a3783 139 }
zkang0729 4:e3fbc74a3783 140 }
zkang0729 4:e3fbc74a3783 141 else if (init) // If doing a full draw, but we're out of bounds, draw the walls.
zkang0729 4:e3fbc74a3783 142 {
zkang0729 4:e3fbc74a3783 143 draw = draw_wall;
zkang0729 4:e3fbc74a3783 144 }
rconnorlawson 0:35660d7952f7 145
zkang0729 4:e3fbc74a3783 146 // Actually draw the tile
zkang0729 4:e3fbc74a3783 147 if (draw)
zkang0729 4:e3fbc74a3783 148 draw(u, v);
rconnorlawson 0:35660d7952f7 149 }
zkang0729 4:e3fbc74a3783 150 }
rconnorlawson 0:35660d7952f7 151
zkang0729 4:e3fbc74a3783 152 // Draw status bars
zkang0729 4:e3fbc74a3783 153 draw_upper_status();
zkang0729 4:e3fbc74a3783 154 draw_lower_status();
rconnorlawson 0:35660d7952f7 155 }
rconnorlawson 0:35660d7952f7 156
rconnorlawson 0:35660d7952f7 157 /**
rconnorlawson 0:35660d7952f7 158 * Initialize the main world map. Add walls around the edges, interior chambers,
rashidi1saeed 2:1ca97843a334 159 * and plants in the background so you can see motion. Note: using the similar
rashidi1saeed 3:e4690ad5a4d2 160 * procedure you can init the secondary map(s).
rconnorlawson 0:35660d7952f7 161 */
rconnorlawson 0:35660d7952f7 162 void init_main_map()
rconnorlawson 0:35660d7952f7 163 {
zkang0729 4:e3fbc74a3783 164 // "Random" plants
zkang0729 4:e3fbc74a3783 165 Map *map = set_active_map(0);
zkang0729 4:e3fbc74a3783 166 for (int i = map_width() + 3; i < map_area(); i += 39)
zkang0729 4:e3fbc74a3783 167 {
zkang0729 4:e3fbc74a3783 168 add_plant(i % map_width(), i / map_width());
zkang0729 4:e3fbc74a3783 169 }
zkang0729 4:e3fbc74a3783 170 pc.printf("plants\r\n");
rconnorlawson 0:35660d7952f7 171
zkang0729 4:e3fbc74a3783 172 pc.printf("Adding walls!\r\n");
zkang0729 4:e3fbc74a3783 173 add_wall(0, 0, HORIZONTAL, map_width());
zkang0729 4:e3fbc74a3783 174 add_wall(0, map_height() - 1, HORIZONTAL, map_width());
zkang0729 4:e3fbc74a3783 175 add_wall(0, 0, VERTICAL, map_height());
zkang0729 4:e3fbc74a3783 176 add_wall(map_width() - 1, 0, VERTICAL, map_height());
zkang0729 4:e3fbc74a3783 177 pc.printf("Walls done!\r\n");
zkang0729 4:e3fbc74a3783 178
zkang0729 4:e3fbc74a3783 179 print_map();
rconnorlawson 0:35660d7952f7 180 }
rconnorlawson 0:35660d7952f7 181
rconnorlawson 0:35660d7952f7 182 /**
rconnorlawson 0:35660d7952f7 183 * Program entry point! This is where it all begins.
rconnorlawson 0:35660d7952f7 184 * This function orchestrates all the parts of the game. Most of your
rconnorlawson 0:35660d7952f7 185 * implementation should be elsewhere - this holds the game loop, and should
rconnorlawson 0:35660d7952f7 186 * read like a road map for the rest of the code.
rconnorlawson 0:35660d7952f7 187 */
rconnorlawson 0:35660d7952f7 188 int main()
rconnorlawson 0:35660d7952f7 189 {
zkang0729 4:e3fbc74a3783 190 //Game Over Indication
zkang0729 4:e3fbc74a3783 191 unsigned int GameOver = 0;
zkang0729 4:e3fbc74a3783 192
zkang0729 4:e3fbc74a3783 193 // First things first: initialize hardware
zkang0729 4:e3fbc74a3783 194 ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
rconnorlawson 0:35660d7952f7 195
zkang0729 4:e3fbc74a3783 196 // Initialize the maps
zkang0729 4:e3fbc74a3783 197 maps_init();
zkang0729 4:e3fbc74a3783 198 init_main_map();
rconnorlawson 0:35660d7952f7 199
zkang0729 4:e3fbc74a3783 200 // Initialize game state
zkang0729 4:e3fbc74a3783 201 set_active_map(0);
zkang0729 4:e3fbc74a3783 202 Player.x = Player.y = 5;
zkang0729 4:e3fbc74a3783 203
zkang0729 4:e3fbc74a3783 204 // Initial drawing
zkang0729 4:e3fbc74a3783 205 draw_game(true);
rconnorlawson 0:35660d7952f7 206
zkang0729 4:e3fbc74a3783 207 // Main game loop
zkang0729 4:e3fbc74a3783 208 while (!GameOver)
zkang0729 4:e3fbc74a3783 209 {
zkang0729 4:e3fbc74a3783 210 // Timer to measure game update speed
zkang0729 4:e3fbc74a3783 211 Timer t;
zkang0729 4:e3fbc74a3783 212 t.start();
zkang0729 4:e3fbc74a3783 213
zkang0729 4:e3fbc74a3783 214 // Actuall do the game update:
zkang0729 4:e3fbc74a3783 215 // 1. Read inputs
zkang0729 4:e3fbc74a3783 216 //inputs = read_inputs();
zkang0729 4:e3fbc74a3783 217
zkang0729 4:e3fbc74a3783 218 // 2. Determine action (get_action)
zkang0729 4:e3fbc74a3783 219 //action = get_action(input);
zkang0729 4:e3fbc74a3783 220
zkang0729 4:e3fbc74a3783 221 // 3. Update game (update_game)
zkang0729 4:e3fbc74a3783 222 //next_state = update_game(action);
zkang0729 4:e3fbc74a3783 223
zkang0729 4:e3fbc74a3783 224 // 3b. Check for game over
zkang0729 4:e3fbc74a3783 225
zkang0729 4:e3fbc74a3783 226
zkang0729 4:e3fbc74a3783 227 // 4. Draw frame (draw_game)
zkang0729 4:e3fbc74a3783 228
zkang0729 4:e3fbc74a3783 229 // 5. Frame delay
zkang0729 4:e3fbc74a3783 230 t.stop();
zkang0729 4:e3fbc74a3783 231 int dt = t.read_ms();
zkang0729 4:e3fbc74a3783 232 if (dt < 100)
zkang0729 4:e3fbc74a3783 233 wait_ms(100 - dt);
zkang0729 4:e3fbc74a3783 234 }
rconnorlawson 0:35660d7952f7 235 }