project for 2035
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
main.cpp@22:33f1a0dff46c, 2020-11-25 (annotated)
- Committer:
- kblake9
- Date:
- Wed Nov 25 04:48:22 2020 +0000
- Revision:
- 22:33f1a0dff46c
- Parent:
- 21:fe15f6311822
final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DCchico | 2:4947d6a82971 | 1 | //================================================================= |
DCchico | 2:4947d6a82971 | 2 | // The main program file. |
DCchico | 2:4947d6a82971 | 3 | // |
DCchico | 2:4947d6a82971 | 4 | // Copyright 2020 Georgia Tech. All rights reserved. |
DCchico | 2:4947d6a82971 | 5 | // The materials provided by the instructor in this course are for |
DCchico | 2:4947d6a82971 | 6 | // the use of the students currently enrolled in the course. |
DCchico | 2:4947d6a82971 | 7 | // Copyrighted course materials may not be further disseminated. |
DCchico | 2:4947d6a82971 | 8 | // This file must not be made publicly available anywhere. |
DCchico | 2:4947d6a82971 | 9 | //================================================================== |
DCchico | 2:4947d6a82971 | 10 | |
DCchico | 2:4947d6a82971 | 11 | // Project includes |
DCchico | 1:10330bce85cb | 12 | #include "globals.h" |
DCchico | 1:10330bce85cb | 13 | #include "hardware.h" |
DCchico | 1:10330bce85cb | 14 | #include "map.h" |
DCchico | 1:10330bce85cb | 15 | #include "graphics.h" |
DCchico | 1:10330bce85cb | 16 | #include "snake.h" |
kblake9 | 22:33f1a0dff46c | 17 | #include <string> |
DCchico | 1:10330bce85cb | 18 | #include <math.h> |
DCchico | 1:10330bce85cb | 19 | #include<stdio.h> |
DCchico | 1:10330bce85cb | 20 | |
DCchico | 1:10330bce85cb | 21 | #define CITY_HIT_MARGIN 1 |
DCchico | 1:10330bce85cb | 22 | #define CITY_UPPER_BOUND (SIZE_Y-(LANDSCAPE_HEIGHT+MAX_BUILDING_HEIGHT)) |
DCchico | 2:4947d6a82971 | 23 | |
DCchico | 1:10330bce85cb | 24 | // Helper function declarations |
DCchico | 1:10330bce85cb | 25 | void playSound(char* wav); |
DCchico | 1:10330bce85cb | 26 | |
DCchico | 1:10330bce85cb | 27 | /** |
DCchico | 1:10330bce85cb | 28 | * The main game state. Must include snake locations and previous locations for |
DCchico | 1:10330bce85cb | 29 | * drawing to work properly. Other items can be added as needed. |
DCchico | 1:10330bce85cb | 30 | */ |
DCchico | 1:10330bce85cb | 31 | |
DCchico | 1:10330bce85cb | 32 | /** |
DCchico | 1:10330bce85cb | 33 | * Given the game inputs, determine what kind of update needs to happen. |
DCchico | 1:10330bce85cb | 34 | * Possbile return values are defined below. |
DCchico | 1:10330bce85cb | 35 | */ |
DCchico | 1:10330bce85cb | 36 | Snake snake; |
DCchico | 1:10330bce85cb | 37 | |
DCchico | 1:10330bce85cb | 38 | // Function prototypes |
DCchico | 2:4947d6a82971 | 39 | |
DCchico | 2:4947d6a82971 | 40 | /** |
DCchico | 2:4947d6a82971 | 41 | * Given the game inputs, determine what kind of update needs to happen. |
DCchico | 2:4947d6a82971 | 42 | * Possible return values are defined below. |
DCchico | 2:4947d6a82971 | 43 | */ |
DCchico | 2:4947d6a82971 | 44 | #define NO_RESULT 0 |
DCchico | 2:4947d6a82971 | 45 | #define NO_ACTION 0 |
DCchico | 2:4947d6a82971 | 46 | #define ACTION_BUTTON 1 |
DCchico | 2:4947d6a82971 | 47 | #define MENU_BUTTON 2 |
DCchico | 2:4947d6a82971 | 48 | #define GO_LEFT 3 |
DCchico | 2:4947d6a82971 | 49 | #define GO_RIGHT 4 |
DCchico | 2:4947d6a82971 | 50 | #define GO_UP 5 |
DCchico | 2:4947d6a82971 | 51 | #define GO_DOWN 6 |
DCchico | 2:4947d6a82971 | 52 | #define GAME_OVER 7 |
DCchico | 2:4947d6a82971 | 53 | #define FULL_DRAW 8 |
DCchico | 1:10330bce85cb | 54 | // Get Actions from User (push buttons & accelerometer) |
DCchico | 2:4947d6a82971 | 55 | // Based on push button and accelerometer inputs, determine which action |
DCchico | 2:4947d6a82971 | 56 | // needs to be performed (may be no action). |
DCchico | 1:10330bce85cb | 57 | int get_action(GameInputs inputs) |
DCchico | 1:10330bce85cb | 58 | { |
kblake9 | 22:33f1a0dff46c | 59 | if (inputs.b1 == 1) { |
kblake9 | 22:33f1a0dff46c | 60 | return ACTION_BUTTON; |
kblake9 | 22:33f1a0dff46c | 61 | } else if (inputs.b2 == 1) { |
kblake9 | 22:33f1a0dff46c | 62 | return MENU_BUTTON; |
kblake9 | 22:33f1a0dff46c | 63 | } |
kblake9 | 22:33f1a0dff46c | 64 | if(abs(inputs.ax) > abs(inputs.ay)) { |
kblake9 | 22:33f1a0dff46c | 65 | if (inputs.ax > 0) { |
kblake9 | 22:33f1a0dff46c | 66 | pc.printf("going right\r\n"); |
kblake9 | 22:33f1a0dff46c | 67 | return GO_RIGHT; |
kblake9 | 22:33f1a0dff46c | 68 | } else { |
kblake9 | 22:33f1a0dff46c | 69 | pc.printf("going left\r\n"); |
kblake9 | 22:33f1a0dff46c | 70 | return GO_LEFT; |
kblake9 | 22:33f1a0dff46c | 71 | } |
kblake9 | 22:33f1a0dff46c | 72 | } else { |
kblake9 | 22:33f1a0dff46c | 73 | if (inputs.ay > 0) { |
kblake9 | 22:33f1a0dff46c | 74 | pc.printf("going up\r\n"); |
kblake9 | 22:33f1a0dff46c | 75 | return GO_UP; |
kblake9 | 22:33f1a0dff46c | 76 | } else { |
kblake9 | 22:33f1a0dff46c | 77 | pc.printf("going down\r\n"); |
kblake9 | 22:33f1a0dff46c | 78 | return GO_DOWN; |
kblake9 | 22:33f1a0dff46c | 79 | } |
kblake9 | 22:33f1a0dff46c | 80 | } |
DCchico | 1:10330bce85cb | 81 | } |
DCchico | 1:10330bce85cb | 82 | /** |
DCchico | 1:10330bce85cb | 83 | * Update the game state based on the user action. For example, if the user |
DCchico | 1:10330bce85cb | 84 | * requests GO_UP, then this function should determine if that is possible by |
DCchico | 1:10330bce85cb | 85 | * consulting the map, and update the snake position accordingly. |
DCchico | 1:10330bce85cb | 86 | * |
DCchico | 1:10330bce85cb | 87 | * Return values are defined below. FULL_DRAW indicates that for this frame, |
DCchico | 1:10330bce85cb | 88 | * draw_game should not optimize drawing and should draw every tile, even if |
DCchico | 1:10330bce85cb | 89 | * the snake has not moved. |
DCchico | 1:10330bce85cb | 90 | */ |
DCchico | 1:10330bce85cb | 91 | int update_game(int action) |
DCchico | 1:10330bce85cb | 92 | { |
kblake9 | 22:33f1a0dff46c | 93 | switch(action) { |
kblake9 | 22:33f1a0dff46c | 94 | case GO_LEFT: |
kblake9 | 22:33f1a0dff46c | 95 | MapItem* collideLeft = get_west(snake.head_x, snake.head_y); |
kblake9 | 22:33f1a0dff46c | 96 | if (collideLeft != NULL) { |
kblake9 | 22:33f1a0dff46c | 97 | } else { |
kblake9 | 22:33f1a0dff46c | 98 | snake.head_px = snake.head_x; |
kblake9 | 22:33f1a0dff46c | 99 | snake.head_x -=1; |
kblake9 | 22:33f1a0dff46c | 100 | for (int i = 0; i < snake.score + 2; i++) { |
kblake9 | 22:33f1a0dff46c | 101 | if (i == 0) { |
kblake9 | 22:33f1a0dff46c | 102 | snake.locations[i].x -= 1; |
kblake9 | 22:33f1a0dff46c | 103 | } else { |
kblake9 | 22:33f1a0dff46c | 104 | snake.locations[i] = snake.locations[i-1]; |
kblake9 | 22:33f1a0dff46c | 105 | } |
kblake9 | 22:33f1a0dff46c | 106 | } |
kblake9 | 22:33f1a0dff46c | 107 | } |
kblake9 | 22:33f1a0dff46c | 108 | break; |
kblake9 | 22:33f1a0dff46c | 109 | case GO_RIGHT: |
kblake9 | 22:33f1a0dff46c | 110 | MapItem* collideRight = get_east(snake.head_x, snake.head_y); |
kblake9 | 22:33f1a0dff46c | 111 | if (collideRight != NULL) { |
kblake9 | 22:33f1a0dff46c | 112 | } else { |
kblake9 | 22:33f1a0dff46c | 113 | snake.head_px = snake.head_x; |
kblake9 | 22:33f1a0dff46c | 114 | snake.head_x +=1; |
kblake9 | 22:33f1a0dff46c | 115 | for (int i = 0; i < snake.score + 2; i++) { |
kblake9 | 22:33f1a0dff46c | 116 | if (i == 0) { |
kblake9 | 22:33f1a0dff46c | 117 | snake.locations[i].x += 1; |
kblake9 | 22:33f1a0dff46c | 118 | } else { |
kblake9 | 22:33f1a0dff46c | 119 | snake.locations[i] = snake.locations[i-1]; |
kblake9 | 22:33f1a0dff46c | 120 | } |
kblake9 | 22:33f1a0dff46c | 121 | } |
kblake9 | 22:33f1a0dff46c | 122 | } |
kblake9 | 22:33f1a0dff46c | 123 | break; |
kblake9 | 22:33f1a0dff46c | 124 | case GO_UP: |
kblake9 | 22:33f1a0dff46c | 125 | MapItem* collideUp = get_north(snake.head_x, snake.head_y); |
kblake9 | 22:33f1a0dff46c | 126 | if (collideUp != NULL) { |
kblake9 | 22:33f1a0dff46c | 127 | } else { |
kblake9 | 22:33f1a0dff46c | 128 | snake.head_py = snake.head_y; |
kblake9 | 22:33f1a0dff46c | 129 | snake.head_y +=1; |
kblake9 | 22:33f1a0dff46c | 130 | for (int i = 0; i < snake.score + 2; i++) { |
kblake9 | 22:33f1a0dff46c | 131 | if (i == 0) { |
kblake9 | 22:33f1a0dff46c | 132 | snake.locations[i].y += 1; |
kblake9 | 22:33f1a0dff46c | 133 | } else { |
kblake9 | 22:33f1a0dff46c | 134 | snake.locations[i] = snake.locations[i-1]; |
kblake9 | 22:33f1a0dff46c | 135 | } |
kblake9 | 22:33f1a0dff46c | 136 | } |
kblake9 | 22:33f1a0dff46c | 137 | } |
kblake9 | 22:33f1a0dff46c | 138 | break; |
kblake9 | 22:33f1a0dff46c | 139 | case GO_DOWN: |
kblake9 | 22:33f1a0dff46c | 140 | MapItem* collideDown = get_south(snake.head_x, snake.head_y); |
kblake9 | 22:33f1a0dff46c | 141 | if (collideDown != NULL) { |
kblake9 | 22:33f1a0dff46c | 142 | } else { |
kblake9 | 22:33f1a0dff46c | 143 | snake.head_py = snake.head_y; |
kblake9 | 22:33f1a0dff46c | 144 | snake.head_y -= 1; |
kblake9 | 22:33f1a0dff46c | 145 | for (int i = 0; i < snake.score + 2; i++) { |
kblake9 | 22:33f1a0dff46c | 146 | if (i == 0) { |
kblake9 | 22:33f1a0dff46c | 147 | snake.locations[i].y -= 1; |
kblake9 | 22:33f1a0dff46c | 148 | } else { |
kblake9 | 22:33f1a0dff46c | 149 | snake.locations[i] = snake.locations[i-1]; |
kblake9 | 22:33f1a0dff46c | 150 | } |
kblake9 | 22:33f1a0dff46c | 151 | } |
kblake9 | 22:33f1a0dff46c | 152 | } |
kblake9 | 22:33f1a0dff46c | 153 | break; |
kblake9 | 22:33f1a0dff46c | 154 | case ACTION_BUTTON: |
kblake9 | 22:33f1a0dff46c | 155 | break; |
kblake9 | 22:33f1a0dff46c | 156 | case MENU_BUTTON: |
kblake9 | 22:33f1a0dff46c | 157 | break; |
kblake9 | 22:33f1a0dff46c | 158 | default: |
kblake9 | 22:33f1a0dff46c | 159 | return 0; |
kblake9 | 22:33f1a0dff46c | 160 | } |
kblake9 | 22:33f1a0dff46c | 161 | return 8; |
DCchico | 1:10330bce85cb | 162 | } |
DCchico | 1:10330bce85cb | 163 | |
DCchico | 1:10330bce85cb | 164 | /** |
DCchico | 1:10330bce85cb | 165 | * Draw the upper status bar. |
DCchico | 1:10330bce85cb | 166 | */ |
kblake9 | 22:33f1a0dff46c | 167 | void draw_upper_status(){ |
kblake9 | 22:33f1a0dff46c | 168 | uLCD.locate(0, 0); |
kblake9 | 22:33f1a0dff46c | 169 | uLCD.printf("X: %d, Y: %1d", snake.head_x, snake.head_y); |
kblake9 | 22:33f1a0dff46c | 170 | } |
DCchico | 1:10330bce85cb | 171 | |
DCchico | 1:10330bce85cb | 172 | /** |
DCchico | 1:10330bce85cb | 173 | * Draw the lower status bar. |
DCchico | 1:10330bce85cb | 174 | */ |
DCchico | 1:10330bce85cb | 175 | void draw_lower_status() |
DCchico | 1:10330bce85cb | 176 | { |
kblake9 | 22:33f1a0dff46c | 177 | uLCD.locate(0, 15); |
kblake9 | 22:33f1a0dff46c | 178 | uLCD.printf("score: %d", snake.score); |
DCchico | 1:10330bce85cb | 179 | } |
DCchico | 1:10330bce85cb | 180 | |
DCchico | 1:10330bce85cb | 181 | /** |
DCchico | 1:10330bce85cb | 182 | * Draw the border for the map. |
DCchico | 1:10330bce85cb | 183 | */ |
DCchico | 1:10330bce85cb | 184 | void draw_border() |
DCchico | 1:10330bce85cb | 185 | { |
DCchico | 1:10330bce85cb | 186 | uLCD.filled_rectangle(0, 9, 127, 14, WHITE); // Top |
DCchico | 1:10330bce85cb | 187 | uLCD.filled_rectangle(0, 13, 2, 114, WHITE); // Left |
DCchico | 1:10330bce85cb | 188 | uLCD.filled_rectangle(0, 114, 127, 117, WHITE); // Bottom |
DCchico | 1:10330bce85cb | 189 | uLCD.filled_rectangle(124, 14, 127, 117, WHITE); // Right |
DCchico | 1:10330bce85cb | 190 | } |
DCchico | 1:10330bce85cb | 191 | |
DCchico | 1:10330bce85cb | 192 | /** |
DCchico | 1:10330bce85cb | 193 | * Entry point for frame drawing. This should be called once per iteration of |
DCchico | 1:10330bce85cb | 194 | * the game loop. This draws all tiles on the screen, followed by the status |
DCchico | 1:10330bce85cb | 195 | * bars. Unless init is nonzero, this function will optimize drawing by only |
DCchico | 1:10330bce85cb | 196 | * drawing tiles that have changed from the previous frame. |
DCchico | 1:10330bce85cb | 197 | */ |
DCchico | 1:10330bce85cb | 198 | void draw_game(int draw_option) |
DCchico | 1:10330bce85cb | 199 | { |
DCchico | 1:10330bce85cb | 200 | // Draw game border first |
DCchico | 1:10330bce85cb | 201 | if(draw_option == FULL_DRAW) |
DCchico | 1:10330bce85cb | 202 | { |
DCchico | 1:10330bce85cb | 203 | draw_border(); |
kblake9 | 22:33f1a0dff46c | 204 | int length = snake.score + 2; |
kblake9 | 22:33f1a0dff46c | 205 | for (int i = 0; i < length; i++){ |
kblake9 | 22:33f1a0dff46c | 206 | if (i == 0) { |
kblake9 | 22:33f1a0dff46c | 207 | draw_snake_head(snake.locations[0].x, snake.locations[0].y); |
kblake9 | 22:33f1a0dff46c | 208 | } else if (i == length - 1) { |
kblake9 | 22:33f1a0dff46c | 209 | draw_snake_tail(snake.locations[i].x, snake.locations[i].y); |
kblake9 | 22:33f1a0dff46c | 210 | } else { |
kblake9 | 22:33f1a0dff46c | 211 | draw_snake_body(snake.locations[i].x, snake.locations[i].y); |
kblake9 | 22:33f1a0dff46c | 212 | } |
kblake9 | 22:33f1a0dff46c | 213 | } |
DCchico | 1:10330bce85cb | 214 | } |
DCchico | 1:10330bce85cb | 215 | // Iterate over all visible map tiles |
DCchico | 1:10330bce85cb | 216 | for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles |
DCchico | 1:10330bce85cb | 217 | for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles |
DCchico | 1:10330bce85cb | 218 | // Here, we have a given (i,j) |
DCchico | 1:10330bce85cb | 219 | |
DCchico | 1:10330bce85cb | 220 | // Compute the current map (x,y) of this tile |
DCchico | 1:10330bce85cb | 221 | int x = i + snake.head_x; |
DCchico | 1:10330bce85cb | 222 | int y = j + snake.head_y; |
DCchico | 1:10330bce85cb | 223 | |
DCchico | 1:10330bce85cb | 224 | // Compute the previous map (px, py) of this tile |
DCchico | 1:10330bce85cb | 225 | int px = i + snake.head_px; |
DCchico | 1:10330bce85cb | 226 | int py = j + snake.head_py; |
DCchico | 1:10330bce85cb | 227 | |
DCchico | 1:10330bce85cb | 228 | // Compute u,v coordinates for drawing |
DCchico | 1:10330bce85cb | 229 | int u = (i+5)*11 + 3; |
DCchico | 1:10330bce85cb | 230 | int v = (j+4)*11 + 15; |
DCchico | 1:10330bce85cb | 231 | |
DCchico | 1:10330bce85cb | 232 | // Figure out what to draw |
DCchico | 1:10330bce85cb | 233 | DrawFunc draw = NULL; |
DCchico | 1:10330bce85cb | 234 | if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map |
DCchico | 1:10330bce85cb | 235 | MapItem* curr_item = get_here(x, y); |
DCchico | 1:10330bce85cb | 236 | MapItem* prev_item = get_here(px, py); |
DCchico | 1:10330bce85cb | 237 | if (draw_option || curr_item != prev_item) { // Only draw if they're different |
DCchico | 1:10330bce85cb | 238 | if (curr_item) { // There's something here! Draw it |
DCchico | 1:10330bce85cb | 239 | draw = curr_item->draw; |
DCchico | 1:10330bce85cb | 240 | } else { // There used to be something, but now there isn't |
DCchico | 1:10330bce85cb | 241 | draw = draw_nothing; |
DCchico | 1:10330bce85cb | 242 | } |
DCchico | 1:10330bce85cb | 243 | } else if (curr_item && curr_item->type == CLEAR) { |
DCchico | 1:10330bce85cb | 244 | // This is a special case for erasing things like doors. |
DCchico | 1:10330bce85cb | 245 | draw = curr_item->draw; // i.e. draw_nothing |
DCchico | 1:10330bce85cb | 246 | } |
DCchico | 1:10330bce85cb | 247 | } else if (draw_option) { // If doing a full draw, but we're out of bounds, draw the walls. |
DCchico | 1:10330bce85cb | 248 | draw = draw_wall; |
DCchico | 1:10330bce85cb | 249 | } |
DCchico | 1:10330bce85cb | 250 | |
DCchico | 1:10330bce85cb | 251 | // Actually draw the tile |
DCchico | 1:10330bce85cb | 252 | if (draw) draw(u, v); |
DCchico | 1:10330bce85cb | 253 | } |
DCchico | 1:10330bce85cb | 254 | } |
DCchico | 1:10330bce85cb | 255 | |
DCchico | 1:10330bce85cb | 256 | // Draw status bars |
DCchico | 1:10330bce85cb | 257 | draw_upper_status(); |
DCchico | 1:10330bce85cb | 258 | draw_lower_status(); |
DCchico | 1:10330bce85cb | 259 | } |
DCchico | 1:10330bce85cb | 260 | |
DCchico | 1:10330bce85cb | 261 | /** |
DCchico | 1:10330bce85cb | 262 | * Initialize the main world map. Add walls around the edges, interior chambers, |
DCchico | 1:10330bce85cb | 263 | * and plants in the background so you can see motion. |
DCchico | 1:10330bce85cb | 264 | */ |
DCchico | 1:10330bce85cb | 265 | void init_main_map() |
DCchico | 1:10330bce85cb | 266 | { |
DCchico | 1:10330bce85cb | 267 | // "Random" plants |
DCchico | 1:10330bce85cb | 268 | Map* map = set_active_map(0); |
kblake9 | 18:92431a28b46b | 269 | pc.printf("set active map successfully\r\n"); |
DCchico | 1:10330bce85cb | 270 | for(int i = map_width() + 3; i < map_area(); i += 39) { |
DCchico | 1:10330bce85cb | 271 | add_goodie(i % map_width(), i / map_width()); |
DCchico | 1:10330bce85cb | 272 | } |
DCchico | 1:10330bce85cb | 273 | pc.printf("plants\r\n"); |
DCchico | 1:10330bce85cb | 274 | |
DCchico | 1:10330bce85cb | 275 | pc.printf("Adding walls!\r\n"); |
DCchico | 1:10330bce85cb | 276 | add_wall(0, 0, HORIZONTAL, map_width()); |
DCchico | 1:10330bce85cb | 277 | add_wall(0, map_height()-1, HORIZONTAL, map_width()); |
DCchico | 1:10330bce85cb | 278 | add_wall(0, 0, VERTICAL, map_height()); |
DCchico | 1:10330bce85cb | 279 | add_wall(map_width()-1, 0, VERTICAL, map_height()); |
DCchico | 1:10330bce85cb | 280 | pc.printf("Walls done!\r\n"); |
DCchico | 1:10330bce85cb | 281 | |
DCchico | 1:10330bce85cb | 282 | add_snake_head(snake.locations[0].x, snake.locations[0].y); |
kblake9 | 18:92431a28b46b | 283 | add_snake_tail(snake.locations[1].x, snake.locations[1].y); |
DCchico | 1:10330bce85cb | 284 | |
DCchico | 1:10330bce85cb | 285 | pc.printf("Add extra chamber\r\n"); |
DCchico | 1:10330bce85cb | 286 | add_wall(30, 0, VERTICAL, 10); |
DCchico | 1:10330bce85cb | 287 | add_wall(30, 10, HORIZONTAL, 10); |
DCchico | 1:10330bce85cb | 288 | add_wall(39, 0, VERTICAL, 10); |
DCchico | 1:10330bce85cb | 289 | pc.printf("Added!\r\n"); |
DCchico | 1:10330bce85cb | 290 | |
DCchico | 1:10330bce85cb | 291 | |
DCchico | 1:10330bce85cb | 292 | // Add stairs to chamber (map 1) |
DCchico | 1:10330bce85cb | 293 | //add_stairs(15, 5, 1, 5, 5); |
DCchico | 1:10330bce85cb | 294 | |
DCchico | 1:10330bce85cb | 295 | // profile_hashtable(); |
DCchico | 1:10330bce85cb | 296 | print_map(); |
DCchico | 1:10330bce85cb | 297 | } |
DCchico | 1:10330bce85cb | 298 | |
DCchico | 1:10330bce85cb | 299 | /** |
DCchico | 1:10330bce85cb | 300 | * Program entry point! This is where it all begins. |
DCchico | 1:10330bce85cb | 301 | * This function or all the parts of the game. Most of your |
DCchico | 1:10330bce85cb | 302 | * implementation should be elsewhere - this holds the game loop, and should |
DCchico | 1:10330bce85cb | 303 | * read like a road map for the rest of the code. |
DCchico | 1:10330bce85cb | 304 | */ |
DCchico | 1:10330bce85cb | 305 | int main() |
DCchico | 1:10330bce85cb | 306 | { |
DCchico | 1:10330bce85cb | 307 | // First things first: initialize hardware |
DCchico | 1:10330bce85cb | 308 | ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!"); |
kblake9 | 18:92431a28b46b | 309 | pc.printf("Hardware Succeeded\r\n"); |
DCchico | 1:10330bce85cb | 310 | snake_init(&snake); |
kblake9 | 18:92431a28b46b | 311 | pc.printf("snake initialized\r\n"); |
DCchico | 2:4947d6a82971 | 312 | // 0. Initialize the maps -- implement this function: |
DCchico | 1:10330bce85cb | 313 | maps_init(); |
kblake9 | 18:92431a28b46b | 314 | pc.printf("ran map init\r\n"); |
DCchico | 1:10330bce85cb | 315 | init_main_map(); |
kblake9 | 18:92431a28b46b | 316 | pc.printf("If we reach here we good\r\n"); |
DCchico | 1:10330bce85cb | 317 | |
DCchico | 1:10330bce85cb | 318 | // Initialize game state |
DCchico | 1:10330bce85cb | 319 | set_active_map(0); |
DCchico | 1:10330bce85cb | 320 | snake.head_x = snake.head_y = 5; |
DCchico | 1:10330bce85cb | 321 | // Initial drawing |
DCchico | 1:10330bce85cb | 322 | draw_game(FULL_DRAW); |
kblake9 | 22:33f1a0dff46c | 323 | pc.printf("Do we ever draw the whole game?\r\n"); |
DCchico | 1:10330bce85cb | 324 | // Main game loop |
DCchico | 1:10330bce85cb | 325 | while(1) { |
kblake9 | 22:33f1a0dff46c | 326 | pc.printf("in loop now\r\n"); |
DCchico | 1:10330bce85cb | 327 | // Timer to measure game update speed |
DCchico | 1:10330bce85cb | 328 | Timer t; |
DCchico | 1:10330bce85cb | 329 | t.start(); |
DCchico | 1:10330bce85cb | 330 | |
DCchico | 2:4947d6a82971 | 331 | // 1. Read inputs -- implement this function: |
DCchico | 2:4947d6a82971 | 332 | GameInputs inputs = read_inputs(); |
DCchico | 2:4947d6a82971 | 333 | |
DCchico | 2:4947d6a82971 | 334 | // 2. Determine action (move, act, menu, etc.) -- implement this function: |
DCchico | 2:4947d6a82971 | 335 | int action = get_action(inputs); |
DCchico | 2:4947d6a82971 | 336 | // 3. Update game -- implement this function: |
DCchico | 2:4947d6a82971 | 337 | int result = update_game(action); |
DCchico | 2:4947d6a82971 | 338 | // 3b. Check for game over based on result |
DCchico | 2:4947d6a82971 | 339 | // and if so, handle game over -- implement this. |
DCchico | 2:4947d6a82971 | 340 | |
DCchico | 2:4947d6a82971 | 341 | // 4. Draw screen -- provided: |
DCchico | 2:4947d6a82971 | 342 | draw_game(result); |
DCchico | 2:4947d6a82971 | 343 | |
DCchico | 1:10330bce85cb | 344 | // Compute update time |
DCchico | 1:10330bce85cb | 345 | t.stop(); |
DCchico | 1:10330bce85cb | 346 | int dt = t.read_ms(); |
DCchico | 1:10330bce85cb | 347 | |
DCchico | 1:10330bce85cb | 348 | // Display and wait |
DCchico | 1:10330bce85cb | 349 | // NOTE: Text is 8 pixels tall |
DCchico | 1:10330bce85cb | 350 | if (dt < 100) wait_ms(100 - dt); |
DCchico | 1:10330bce85cb | 351 | } |
DCchico | 1:10330bce85cb | 352 | } |
DCchico | 1:10330bce85cb | 353 | |
DCchico | 1:10330bce85cb | 354 | // Plays a wavfile |
DCchico | 1:10330bce85cb | 355 | void playSound(char* wav) |
DCchico | 1:10330bce85cb | 356 | { |
DCchico | 1:10330bce85cb | 357 | |
DCchico | 1:10330bce85cb | 358 | } |