![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Adventure game written for ECE2035 at the Georgia Institute of Technology
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
startmenu.cpp@4:cdc54191ff07, 2018-05-22 (annotated)
- Committer:
- trmontgomery
- Date:
- Tue May 22 19:13:03 2018 +0000
- Revision:
- 4:cdc54191ff07
- Parent:
- 2:0876296d9473
- Child:
- 5:93a4c396c1af
Menu class complete
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trmontgomery | 2:0876296d9473 | 1 | #include "globals.h" |
trmontgomery | 2:0876296d9473 | 2 | #include "hardware.h" |
trmontgomery | 2:0876296d9473 | 3 | #include "map.h" |
trmontgomery | 2:0876296d9473 | 4 | #include "graphics.h" |
trmontgomery | 2:0876296d9473 | 5 | #include "speech.h" |
trmontgomery | 4:cdc54191ff07 | 6 | #include "startmenu.h" |
trmontgomery | 4:cdc54191ff07 | 7 | #include <vector> |
trmontgomery | 2:0876296d9473 | 8 | |
trmontgomery | 4:cdc54191ff07 | 9 | //note when you define stuff up here like this the methods of the class cant see it I think |
trmontgomery | 2:0876296d9473 | 10 | #define NO_ACTION 0 |
trmontgomery | 2:0876296d9473 | 11 | #define BUTTON1 1 |
trmontgomery | 2:0876296d9473 | 12 | #define BUTTON2 2 |
trmontgomery | 2:0876296d9473 | 13 | #define BUTTON3 3 |
trmontgomery | 2:0876296d9473 | 14 | #define MENU_BUTTON 4 |
trmontgomery | 2:0876296d9473 | 15 | #define GO_LEFT 5 |
trmontgomery | 2:0876296d9473 | 16 | #define GO_RIGHT 6 |
trmontgomery | 2:0876296d9473 | 17 | #define GO_UP 7 |
trmontgomery | 2:0876296d9473 | 18 | #define GO_DOWN 8 |
trmontgomery | 4:cdc54191ff07 | 19 | #define NO_RESULT 9 |
trmontgomery | 4:cdc54191ff07 | 20 | #define GAME_OVER 10 |
trmontgomery | 4:cdc54191ff07 | 21 | #define FULL_DRAW 11 |
trmontgomery | 2:0876296d9473 | 22 | |
trmontgomery | 4:cdc54191ff07 | 23 | /*This initializes the menu. i.e. this is the first drawing on the screen.*/ |
trmontgomery | 4:cdc54191ff07 | 24 | Menu::Menu(int num_options){ |
trmontgomery | 2:0876296d9473 | 25 | |
trmontgomery | 4:cdc54191ff07 | 26 | this->num_options = num_options; |
trmontgomery | 4:cdc54191ff07 | 27 | this->start = 0; |
trmontgomery | 4:cdc54191ff07 | 28 | this->quit = 0; |
trmontgomery | 2:0876296d9473 | 29 | uLCD.locate(1,2); |
trmontgomery | 2:0876296d9473 | 30 | //draw pink rectangle on whole screen |
trmontgomery | 2:0876296d9473 | 31 | uLCD.filled_rectangle(0, 127, 127, 0, PINK1); |
trmontgomery | 2:0876296d9473 | 32 | // write title |
trmontgomery | 2:0876296d9473 | 33 | uLCD.textbackground_color(YELLOW); |
trmontgomery | 2:0876296d9473 | 34 | uLCD.color(BLACK); |
trmontgomery | 4:cdc54191ff07 | 35 | uLCD.printf("Issa Quest"); |
trmontgomery | 2:0876296d9473 | 36 | |
trmontgomery | 2:0876296d9473 | 37 | if (current_item%3 == 0){ |
trmontgomery | 2:0876296d9473 | 38 | start_color = GREEN; |
trmontgomery | 2:0876296d9473 | 39 | } else if (current_item%3 == 1){ |
trmontgomery | 2:0876296d9473 | 40 | quit_color = GREEN; |
trmontgomery | 2:0876296d9473 | 41 | } else{ |
trmontgomery | 2:0876296d9473 | 42 | third_color = GREEN; |
trmontgomery | 2:0876296d9473 | 43 | } |
trmontgomery | 2:0876296d9473 | 44 | |
trmontgomery | 2:0876296d9473 | 45 | uLCD.locate(1,4); |
trmontgomery | 2:0876296d9473 | 46 | uLCD.color(start_color); |
trmontgomery | 4:cdc54191ff07 | 47 | uLCD.printf("Start da game"); |
trmontgomery | 2:0876296d9473 | 48 | |
trmontgomery | 2:0876296d9473 | 49 | uLCD.locate(1,6); |
trmontgomery | 2:0876296d9473 | 50 | uLCD.color(quit_color); |
trmontgomery | 4:cdc54191ff07 | 51 | uLCD.printf("Quit?"); |
trmontgomery | 2:0876296d9473 | 52 | |
trmontgomery | 2:0876296d9473 | 53 | uLCD.locate(1,8); |
trmontgomery | 2:0876296d9473 | 54 | uLCD.color(third_color); |
trmontgomery | 4:cdc54191ff07 | 55 | uLCD.printf("Instructions"); |
trmontgomery | 4:cdc54191ff07 | 56 | } |
trmontgomery | 4:cdc54191ff07 | 57 | |
trmontgomery | 4:cdc54191ff07 | 58 | //Option Definition// |
trmontgomery | 4:cdc54191ff07 | 59 | int Menu::o_instructions(){ |
trmontgomery | 4:cdc54191ff07 | 60 | uLCD.filled_rectangle(0, 128, 128, 80, PINK1); |
trmontgomery | 4:cdc54191ff07 | 61 | uLCD.locate(1,4); |
trmontgomery | 4:cdc54191ff07 | 62 | uLCD.textbackground_color(YELLOW); |
trmontgomery | 4:cdc54191ff07 | 63 | uLCD.color(BLACK); |
trmontgomery | 2:0876296d9473 | 64 | |
trmontgomery | 4:cdc54191ff07 | 65 | uLCD.printf("Go into the house and talk to the red man to start your quest. Be careful not to step on the spikes."); |
trmontgomery | 4:cdc54191ff07 | 66 | |
trmontgomery | 4:cdc54191ff07 | 67 | uLCD.locate(10,15); |
trmontgomery | 4:cdc54191ff07 | 68 | uLCD.color(GREEN); |
trmontgomery | 4:cdc54191ff07 | 69 | uLCD.printf("Back"); |
trmontgomery | 2:0876296d9473 | 70 | |
trmontgomery | 4:cdc54191ff07 | 71 | GameInputs inp = read_inputs(); |
trmontgomery | 4:cdc54191ff07 | 72 | while(1){ |
trmontgomery | 4:cdc54191ff07 | 73 | if(!inp.b2){ |
trmontgomery | 4:cdc54191ff07 | 74 | uLCD.filled_rectangle(0, 128, 128, 30, PINK1); //erase option |
trmontgomery | 4:cdc54191ff07 | 75 | wait(1); |
trmontgomery | 4:cdc54191ff07 | 76 | return 0; |
trmontgomery | 4:cdc54191ff07 | 77 | } |
trmontgomery | 4:cdc54191ff07 | 78 | inp = read_inputs(); |
trmontgomery | 4:cdc54191ff07 | 79 | wait(1); |
trmontgomery | 4:cdc54191ff07 | 80 | } |
trmontgomery | 4:cdc54191ff07 | 81 | } |
trmontgomery | 4:cdc54191ff07 | 82 | |
trmontgomery | 4:cdc54191ff07 | 83 | int Menu::get_action(GameInputs inputs){ |
trmontgomery | 4:cdc54191ff07 | 84 | if(!inputs.b1){ |
trmontgomery | 4:cdc54191ff07 | 85 | uLCD.locate(1,2); |
trmontgomery | 4:cdc54191ff07 | 86 | char but[5]; |
trmontgomery | 4:cdc54191ff07 | 87 | sprintf(but, "%d: %d\n", !inputs.b1, inputs.b1); |
trmontgomery | 4:cdc54191ff07 | 88 | uLCD.printf(but); |
trmontgomery | 4:cdc54191ff07 | 89 | return 1; |
trmontgomery | 4:cdc54191ff07 | 90 | } |
trmontgomery | 4:cdc54191ff07 | 91 | if(!inputs.b2){ |
trmontgomery | 4:cdc54191ff07 | 92 | return 2; |
trmontgomery | 4:cdc54191ff07 | 93 | } |
trmontgomery | 4:cdc54191ff07 | 94 | if (!inputs.b3){ |
trmontgomery | 4:cdc54191ff07 | 95 | return BUTTON3; |
trmontgomery | 4:cdc54191ff07 | 96 | } |
trmontgomery | 4:cdc54191ff07 | 97 | return NO_ACTION; |
trmontgomery | 2:0876296d9473 | 98 | } |
trmontgomery | 2:0876296d9473 | 99 | |
trmontgomery | 4:cdc54191ff07 | 100 | int Menu::update(int action){ //this might need to rewritten |
trmontgomery | 4:cdc54191ff07 | 101 | |
trmontgomery | 4:cdc54191ff07 | 102 | switch(action) |
trmontgomery | 4:cdc54191ff07 | 103 | { |
trmontgomery | 4:cdc54191ff07 | 104 | case 1: |
trmontgomery | 4:cdc54191ff07 | 105 | //if button 1 pressed move to next menu item |
trmontgomery | 4:cdc54191ff07 | 106 | current_item = current_item++; |
trmontgomery | 4:cdc54191ff07 | 107 | break; |
trmontgomery | 4:cdc54191ff07 | 108 | case 2: |
trmontgomery | 4:cdc54191ff07 | 109 | //if button 2 pressed select menu item |
trmontgomery | 4:cdc54191ff07 | 110 | //b2presses++; |
trmontgomery | 4:cdc54191ff07 | 111 | if (current_item > 0 && current_item%this->num_options == 0) {//Start game |
trmontgomery | 4:cdc54191ff07 | 112 | start = true; |
trmontgomery | 4:cdc54191ff07 | 113 | } else if (current_item%this->num_options == 1){ //Quit (screen cut to black) |
trmontgomery | 4:cdc54191ff07 | 114 | quit = true; |
trmontgomery | 4:cdc54191ff07 | 115 | } else { //screen go white |
trmontgomery | 4:cdc54191ff07 | 116 | o_instructions(); |
trmontgomery | 4:cdc54191ff07 | 117 | } |
trmontgomery | 4:cdc54191ff07 | 118 | break; |
trmontgomery | 4:cdc54191ff07 | 119 | case MENU_BUTTON: |
trmontgomery | 4:cdc54191ff07 | 120 | break; |
trmontgomery | 4:cdc54191ff07 | 121 | default: break; |
trmontgomery | 4:cdc54191ff07 | 122 | } |
trmontgomery | 4:cdc54191ff07 | 123 | return NO_RESULT; |
trmontgomery | 4:cdc54191ff07 | 124 | } |
trmontgomery | 4:cdc54191ff07 | 125 | |
trmontgomery | 4:cdc54191ff07 | 126 | void Menu::draw(int init){ |
trmontgomery | 4:cdc54191ff07 | 127 | if (current_item%this->num_options == 0){ |
trmontgomery | 4:cdc54191ff07 | 128 | start_color = GREEN; |
trmontgomery | 4:cdc54191ff07 | 129 | } else if (current_item%this->num_options == 1){ |
trmontgomery | 4:cdc54191ff07 | 130 | quit_color = GREEN; |
trmontgomery | 4:cdc54191ff07 | 131 | } else{ |
trmontgomery | 4:cdc54191ff07 | 132 | third_color = GREEN; |
trmontgomery | 4:cdc54191ff07 | 133 | } |
trmontgomery | 4:cdc54191ff07 | 134 | |
trmontgomery | 4:cdc54191ff07 | 135 | uLCD.locate(1,4); |
trmontgomery | 4:cdc54191ff07 | 136 | uLCD.color(start_color); |
trmontgomery | 4:cdc54191ff07 | 137 | uLCD.printf("Start da game"); |
trmontgomery | 4:cdc54191ff07 | 138 | |
trmontgomery | 4:cdc54191ff07 | 139 | uLCD.locate(1,6); |
trmontgomery | 4:cdc54191ff07 | 140 | uLCD.color(quit_color); |
trmontgomery | 4:cdc54191ff07 | 141 | uLCD.printf("Quit?"); |
trmontgomery | 4:cdc54191ff07 | 142 | |
trmontgomery | 4:cdc54191ff07 | 143 | uLCD.locate(1,8); |
trmontgomery | 4:cdc54191ff07 | 144 | uLCD.color(third_color); |
trmontgomery | 4:cdc54191ff07 | 145 | uLCD.printf("Instructions"); |
trmontgomery | 4:cdc54191ff07 | 146 | |
trmontgomery | 4:cdc54191ff07 | 147 | start_color = BLACK; |
trmontgomery | 4:cdc54191ff07 | 148 | quit_color = BLACK; |
trmontgomery | 4:cdc54191ff07 | 149 | third_color = BLACK; |
trmontgomery | 4:cdc54191ff07 | 150 | } |
trmontgomery | 4:cdc54191ff07 | 151 | |
trmontgomery | 4:cdc54191ff07 | 152 | int Menu::display(){ |
trmontgomery | 2:0876296d9473 | 153 | ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!"); |
trmontgomery | 4:cdc54191ff07 | 154 | // Menu loop |
trmontgomery | 2:0876296d9473 | 155 | while(1) |
trmontgomery | 2:0876296d9473 | 156 | { |
trmontgomery | 2:0876296d9473 | 157 | // Timer to measure game update speed |
trmontgomery | 2:0876296d9473 | 158 | Timer t; t.start(); |
trmontgomery | 2:0876296d9473 | 159 | |
trmontgomery | 2:0876296d9473 | 160 | // Actually do the game update: |
trmontgomery | 2:0876296d9473 | 161 | // 1. Read inputs |
trmontgomery | 2:0876296d9473 | 162 | GameInputs in = read_inputs(); |
trmontgomery | 2:0876296d9473 | 163 | // 2. Determine action (get_action) |
trmontgomery | 4:cdc54191ff07 | 164 | int a = this->get_action(in); |
trmontgomery | 4:cdc54191ff07 | 165 | char act[5]; |
trmontgomery | 4:cdc54191ff07 | 166 | sprintf(act, "%d", a); |
trmontgomery | 4:cdc54191ff07 | 167 | uLCD.printf(act); |
trmontgomery | 2:0876296d9473 | 168 | // 3. Update game (update_game) |
trmontgomery | 4:cdc54191ff07 | 169 | int u = this->update(a); |
trmontgomery | 2:0876296d9473 | 170 | |
trmontgomery | 2:0876296d9473 | 171 | // 4. Draw frame (draw_game) |
trmontgomery | 4:cdc54191ff07 | 172 | this->draw(u); |
trmontgomery | 2:0876296d9473 | 173 | |
trmontgomery | 2:0876296d9473 | 174 | //check for start |
trmontgomery | 2:0876296d9473 | 175 | if (start){ |
trmontgomery | 4:cdc54191ff07 | 176 | uLCD.filled_rectangle(0, 127, 127, 0, 0x000000); |
trmontgomery | 2:0876296d9473 | 177 | return start; |
trmontgomery | 2:0876296d9473 | 178 | } |
trmontgomery | 2:0876296d9473 | 179 | |
trmontgomery | 2:0876296d9473 | 180 | // 5. Frame delay |
trmontgomery | 2:0876296d9473 | 181 | t.stop(); |
trmontgomery | 2:0876296d9473 | 182 | int dt = t.read_ms(); |
trmontgomery | 2:0876296d9473 | 183 | if (dt < 500) wait_ms(500 - dt); |
trmontgomery | 2:0876296d9473 | 184 | } |
trmontgomery | 2:0876296d9473 | 185 | } |
trmontgomery | 4:cdc54191ff07 | 186 | |
trmontgomery | 4:cdc54191ff07 | 187 |