Game For ECE 2035
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
Diff: main.cpp
- Revision:
- 10:e18685911e84
- Parent:
- 9:cbb9cfb1f6c5
- Child:
- 11:6cd02a8539d1
diff -r cbb9cfb1f6c5 -r e18685911e84 main.cpp --- a/main.cpp Tue Nov 30 00:48:48 2021 +0000 +++ b/main.cpp Wed Dec 01 22:07:24 2021 +0000 @@ -16,8 +16,11 @@ int main (); + FILE *wave_file; + + /** * The main game state. Must include Player locations and previous locations for * drawing to work properly. Other items can be added as needed. @@ -94,17 +97,22 @@ + + #define NO_RESULT 0 #define GAME_OVER 1 #define FULL_DRAW 2 int update_game(int action) { - // Save player previous location before updating + + + + //walk_npc(); + + + // Save player previous location before updating Player.px = Player.x; Player.py = Player.y; - - - // Do different things based on the each action. // You can define functions like "go_up()" that get called for each case. @@ -115,7 +123,7 @@ MapItem* north = get_north(Player.x,Player.y); if (north->walkable && north == NULL || north->type == (PORTAL || PLANT) && Player.y != 0 || Player.god ) { Player.y--; - + } break; } @@ -174,7 +182,7 @@ } if((north->type == PLANT||south->type == PLANT||east->type == PLANT||west->type == PLANT||curr->type == PLANT)&& - (north->data == FRUIT||south->data == FRUIT||east->data == FRUIT||west->data == FRUIT||curr->data == FRUIT)){ + (north->data == FRUIT||south->data == FRUIT||east->data == FRUIT||west->data == FRUIT||curr->data == FRUIT)) { if(Player.HP < 100) { fruit(); Player.HP += 5; @@ -183,194 +191,228 @@ east->data = NULL; west->data = NULL; curr->data = NULL; - } else + } else no_fruit(); - wave_file = fopen("/sd/rzelda-1s.wav","r"); - waver.play(wave_file); - fclose(wave_file); - - - - + wave_file = fopen("/sd/rupee-collect.wav","r"); + waver.play(wave_file); + fclose(wave_file); + + + + } - } - break; - case MENU_BUTTON: { - init_spells(); - Player.spell = spell(); - } + } + break; + case MENU_BUTTON: { + init_spells(); + Player.spell = spell(); + } + break; + case GOD_MODE: { + + Player.god = !Player.god; + if (Player.god) { + god_modeOn(); + } else + god_modeOff(); + + } + break; + + default: + break; - case GOD_MODE: { + } + + + //delete_npc(9,9); + + return NO_RESULT; + + +} + +/** + * Entry point for frame drawing. This should be called once per iteration of + * the game loop. This draws all tiles on the screen, followed by the status + * bars. Unless init is nonzero, this function will optimize drawing by only + * drawing tiles that have changed from the previous frame. + */ +void draw_game(int init) +{ + // Draw game border first + if(init) draw_border(); + + // Iterate over all visible map tiles + for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles + for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles + // Here, we have a given (i,j) + + // Compute the current map (x,y) of this tile + int x = i + Player.x; + int y = j + Player.y; - Player.god = !Player.god; - if (Player.god) { - god_modeOn(); - } else - god_modeOff(); - + // Compute the previous map (px, py) of this tile + int px = i + Player.px; + int py = j + Player.py; + + // Compute u,v coordinates for drawing + int u = (i+5)*11 + 3; + int v = (j+4)*11 + 15; + + // Figure out what to draw + DrawFunc draw = NULL; + if (init && i == 0 && j == 0) { // Only draw the player on init + draw_player(u, v, Player.has_key); + continue; + } else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map + MapItem* curr_item = get_here(x, y); + MapItem* prev_item = get_here(px, py); + if (init || curr_item != prev_item) { // Only draw if they're different + if (curr_item) { // There's something here! Draw it + draw = curr_item->draw; + } else { // There used to be something, but now there isn't + draw = draw_nothing; + } + } + } else if (init) { // If doing a full draw, but we're out of bounds, draw the walls. + draw = draw_wall; } - break; - default: - - break; - } - return NO_RESULT; + // Actually draw the tile + if (draw) draw(u, v); + } } - /** - * Entry point for frame drawing. This should be called once per iteration of - * the game loop. This draws all tiles on the screen, followed by the status - * bars. Unless init is nonzero, this function will optimize drawing by only - * drawing tiles that have changed from the previous frame. - */ - void draw_game(int init) { - // Draw game border first - if(init) draw_border(); + // Draw status bars + draw_upper_status(Player.x,Player.y); + draw_lower_status(Player.HP,Player.MP); +} - // Iterate over all visible map tiles - for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles - for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles - // Here, we have a given (i,j) - - // Compute the current map (x,y) of this tile - int x = i + Player.x; - int y = j + Player.y; - - // Compute the previous map (px, py) of this tile - int px = i + Player.px; - int py = j + Player.py; - - // Compute u,v coordinates for drawing - int u = (i+5)*11 + 3; - int v = (j+4)*11 + 15; - // Figure out what to draw - DrawFunc draw = NULL; - if (init && i == 0 && j == 0) { // Only draw the player on init - draw_player(u, v, Player.has_key); - continue; - } else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map - MapItem* curr_item = get_here(x, y); - MapItem* prev_item = get_here(px, py); - if (init || curr_item != prev_item) { // Only draw if they're different - if (curr_item) { // There's something here! Draw it - draw = curr_item->draw; - } else { // There used to be something, but now there isn't - draw = draw_nothing; - } - } - } else if (init) { // If doing a full draw, but we're out of bounds, draw the walls. - draw = draw_wall; - } +/** + * Initialize the main world map. Add walls around the edges, interior chambers, + * and plants in the background so you can see motion. Note: using the similar + * procedure you can init the secondary map(s). + */ +void init_main_map() +{ + // "Random" plants + Map* map = set_active_map(0); + for(int i = map_width() + 3; i < map_area(); i += 39) { + add_plant(i % map_width(), i / map_width()); + } + pc.printf("plants\r\n"); - // Actually draw the tile - if (draw) draw(u, v); - } + pc.printf("Adding walls!\r\n"); + add_wall(0, 0, HORIZONTAL, map_width()); + add_wall(0, map_height()-1, HORIZONTAL, map_width()); + add_wall(0, 0, VERTICAL, map_height()); + add_wall(map_width()-1, 0, VERTICAL, map_height()); + pc.printf("Walls done!\r\n"); + + + + for(int i = 7; i < 13; i++) { + for (int j = 23; j <31; j++) { + add_kindom(j,i); } - - // Draw status bars - draw_upper_status(Player.x,Player.y); - draw_lower_status(Player.HP,Player.MP); } - /** - * Initialize the main world map. Add walls around the edges, interior chambers, - * and plants in the background so you can see motion. Note: using the similar - * procedure you can init the secondary map(s). - */ - void init_main_map() { - // "Random" plants - Map* map = set_active_map(0); - for(int i = map_width() + 3; i < map_area(); i += 39) { - add_plant(i % map_width(), i / map_width()); - } - pc.printf("plants\r\n"); + + set_npc(9,9); + + //add_chest(10,10); + + add_door(26,12); + + add_portal(20,35); + + print_map(); +} + - pc.printf("Adding walls!\r\n"); - add_wall(0, 0, HORIZONTAL, map_width()); - add_wall(0, map_height()-1, HORIZONTAL, map_width()); - add_wall(0, 0, VERTICAL, map_height()); - add_wall(map_width()-1, 0, VERTICAL, map_height()); - pc.printf("Walls done!\r\n"); +/** + * Program entry point! This is where it all begins. + * This function orchestrates all the parts of the game. Most of your + * implementation should be elsewhere - this holds the game loop, and should + * read like a road map for the rest of the code. + */ +int main() +{ + + Player.HP = 100; + Player.MP = 100; + + // MapItem* north = get_north(Player.x,Player.y); + // First things first: initialize hardware + ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!"); - for(int i = 7; i < 13; i++) { - for (int j = 23; j <31; j++) { - add_kindom(j,i); - } + // Initialize the maps + maps_init(); + init_main_map(); + + // Initialize game state + set_active_map(0); + Player.x = Player.y = 5; + + draw_start(); + + //wave_file = fopen("/sd/godfather.wav","r"); + //waver.play(wave_file); + //fclose(wave_file); + + while(1) { + + Timer t; + t.start(); + GameInputs inp = read_inputs(); + int action = get_action(inp); + + + if( action == ACTION_BUTTON) { + + break; } - - - - set_npc(9,9); + t.stop(); + int dt = t.read_ms(); + if (dt < 100) wait_ms(100-dt); - //add_chest(10,10); - - add_door(26,12); - - add_portal(20,35); - - print_map(); } - /** - * Program entry point! This is where it all begins. - * This function orchestrates all the parts of the game. Most of your - * implementation should be elsewhere - this holds the game loop, and should - * read like a road map for the rest of the code. - */ - int main() { + // Initial drawing + draw_game(true); + // Main game loop + while(1) { + // Timer to measure game update speed + Timer t; + t.start(); - Player.HP = 100; - Player.MP = 100; + // Actually do the game update: + // 1. Read inputs + GameInputs input = read_inputs(); + // 2. Determine action (get_action) + int action = get_action(input); + // 3. Update game (update_game) + update_game(action); + // 3b. Check for game over + if(Player.won == 1) { + draw_gameover(); + break; + } + // 4. Draw frame (draw_game) + draw_game(true); - // MapItem* north = get_north(Player.x,Player.y); + // 5. Frame delay + t.stop(); + int dt = t.read_ms(); + if (dt < 100) wait_ms(100 - dt); + } + // - // First things first: initialize hardware - ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!"); - - // Initialize the maps - maps_init(); - init_main_map(); - - // Initialize game state - set_active_map(0); - Player.x = Player.y = 5; - - // Initial drawing - draw_game(true); - // Main game loop - while(1) { - // Timer to measure game update speed - Timer t; - t.start(); - - // Actually do the game update: - // 1. Read inputs - GameInputs input = read_inputs(); - // 2. Determine action (get_action) - int action = get_action(input); - // 3. Update game (update_game) - update_game(action); - // 3b. Check for game over - if(Player.won == 1) { - draw_gameover(); - break; - } - // 4. Draw frame (draw_game) - draw_game(true); - - // 5. Frame delay - t.stop(); - int dt = t.read_ms(); - if (dt < 100) wait_ms(100 - dt); - } - // - - - } +}