Adventure game written for ECE2035 at the Georgia Institute of Technology
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
ingamemenu.cpp
- Committer:
- trmontgomery
- Date:
- 2018-05-22
- Revision:
- 4:cdc54191ff07
File content as of revision 4:cdc54191ff07:
// Project includes #include "globals.h" #include "hardware.h" #include "map.h" #include "graphics.h" #include "speech.h" // Functions in this file int get_ingamemenu_action (GameInputs inputs); int update_ingamemenu (int action); void draw_ingamemenu (int init); void init_ingame_menu (); int ingamemenu (int quest); void status(); //global variables int view_status; int inventory; int view_status_color; int inventory_color; int config_color; int quit_color1; int current_item1 = 0; int quit1 = 0; int quest_complete; static int switch_ax = 0; Player* p; int status(int quest_complete){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); uLCD.locate(1,12); uLCD.textbackground_color(YELLOW); uLCD.color(BLACK); if (quest_complete){ uLCD.printf("Congrats! You have completed your quest!"); } else{ uLCD.printf("Quest is not completed"); } uLCD.locate(10,15); uLCD.color(GREEN); uLCD.printf("Back"); GameInputs inp = read_inputs(); while(1){ if(!inp.b3){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); //erase option wait(1); return 0; } inp = read_inputs(); wait(1); } } int invent(int gems){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); uLCD.locate(1,12); uLCD.textbackground_color(YELLOW); uLCD.color(BLACK); char str[30]; sprintf(str, "You have %d gems.", gems); uLCD.printf(str); uLCD.locate(10,15); uLCD.color(GREEN); uLCD.printf("Back"); GameInputs inp = read_inputs(); while(1){ if(!inp.b3){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); //erase option wait(1); return 0; } inp = read_inputs(); wait(1); } } int config(){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); uLCD.locate(1,12); uLCD.textbackground_color(YELLOW); uLCD.color(BLACK); uLCD.printf("Press Button 2 to Switch Axis."); uLCD.locate(10,15); uLCD.color(GREEN); uLCD.printf("Back"); int switch1; GameInputs inp = read_inputs(); while(1){ if(!inp.b2){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); uLCD.locate(1,12); uLCD.printf("Axis switched."); uLCD.color(BLACK); uLCD.locate(10,15); uLCD.color(GREEN); uLCD.printf("Back"); int switch1 = !switch_ax; } if(!inp.b3){ uLCD.filled_rectangle(0, 128, 128, 80, PINK1); //erase option wait(1); return switch1; } inp = read_inputs(); wait(1); } } /** * Given the game inputs, determine what kind of update needs to happen. * Possbile return values are defined below. */ #define NO_ACTION 0 #define CHANGE_OPTION 1 #define SELECT 2 int get_ingamemenu_action(GameInputs inputs) { if (!inputs.b2){ return CHANGE_OPTION; } if (!inputs.b3){ return SELECT; } return NO_ACTION; } #define NO_RESULT 0 #define FULL_DRAW 2 int update_ingamemenu(int action) { switch(action) { case CHANGE_OPTION: //if button 1 pressed move to next menu item current_item1 = current_item1++; break; case SELECT: if (current_item1%4 == 0) {//Start game view_status = true; status(quest_complete); } else if (current_item1%4 == 1){ //Quit (screen cut to black) inventory = true; invent(p->gems); }else if (current_item1%4 == 2){ //Quit (screen cut to black) //inventory = true; switch_ax = config(); } else { //screen go white quit1 = true; } break; } 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_ingamemenu(int init) { if (current_item1%4 == 0){ view_status_color = GREEN; } else if (current_item1%4 == 1){ inventory_color = GREEN; }else if (current_item1%4 == 2){ config_color = GREEN; } else{ quit_color1 = GREEN; } uLCD.locate(1,11); uLCD.textbackground_color(YELLOW); uLCD.color(BLACK); uLCD.printf("Game Paused"); uLCD.locate(1,12); uLCD.color(view_status_color); uLCD.printf("View Status"); uLCD.locate(1,13); uLCD.color(inventory_color); uLCD.printf("Inventory"); uLCD.locate(1,14); uLCD.color(config_color); uLCD.printf("Config"); uLCD.locate(1,15); uLCD.color(quit_color1); uLCD.printf("Exit"); view_status_color = BLACK; inventory_color = BLACK; config_color = BLACK; quit_color1 = BLACK; } /** * Initialize the main world map. Add walls around the edges, interior chambers, * and plants in the background so you can see motion. */ void init_ingame_menu() { uLCD.locate(1,11); //draw pink rectangle on whole screen uLCD.filled_rectangle(0, 128, 128, 70, PINK1); // write title uLCD.textbackground_color(YELLOW); uLCD.color(BLACK); uLCD.printf("Game Paused"); if (current_item1%4 == 0){ view_status_color = GREEN; } else if (current_item1%4 == 1){ inventory_color = GREEN; } else if (current_item1%4 == 2){ config_color = GREEN; } else{ quit_color1 = GREEN; } uLCD.locate(1,12); uLCD.color(view_status_color); uLCD.printf("View Status"); uLCD.locate(1,13); uLCD.color(inventory_color); uLCD.printf("Inventory"); uLCD.locate(1,14); uLCD.color(inventory_color); uLCD.printf("Config"); uLCD.locate(1,15); uLCD.color(quit_color1); uLCD.printf("Exit"); } /** * 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 ingamemenu(Player* player) { p = player; quest_complete = p->quest_complete; // Initialize the maps init_ingame_menu(); // Initial drawing draw_ingamemenu(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 in = read_inputs(); // 2. Determine action (get_action) int a = get_ingamemenu_action(in); // 3. Update game (update_game) int u = update_ingamemenu(a); // 4. Draw frame (draw_game) draw_ingamemenu(u); //check for start if (quit1){ //erase menu uLCD.filled_rectangle(0, 128, 128, 80, 0x000000); current_item1 = 0; quit1 = false; return switch_ax; } // 5. Frame delay t.stop(); int dt = t.read_ms(); if (dt < 500) wait_ms(500 - dt); } }