![](/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
gameover.cpp@5:93a4c396c1af, 2019-10-26 (annotated)
- Committer:
- trmontgomery
- Date:
- Sat Oct 26 15:44:26 2019 +0000
- Revision:
- 5:93a4c396c1af
- Parent:
- 4:cdc54191ff07
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trmontgomery | 4:cdc54191ff07 | 1 | // Project includes |
trmontgomery | 4:cdc54191ff07 | 2 | #include "globals.h" |
trmontgomery | 4:cdc54191ff07 | 3 | #include "hardware.h" |
trmontgomery | 4:cdc54191ff07 | 4 | #include "map.h" |
trmontgomery | 4:cdc54191ff07 | 5 | #include "graphics.h" |
trmontgomery | 4:cdc54191ff07 | 6 | #include "speech.h" |
trmontgomery | 4:cdc54191ff07 | 7 | |
trmontgomery | 4:cdc54191ff07 | 8 | // Functions in this file |
trmontgomery | 4:cdc54191ff07 | 9 | int get_screen_action (GameInputs inputs); |
trmontgomery | 4:cdc54191ff07 | 10 | int update_screen (int action); |
trmontgomery | 4:cdc54191ff07 | 11 | void draw_screen (int init); |
trmontgomery | 4:cdc54191ff07 | 12 | void init_screen (); |
trmontgomery | 4:cdc54191ff07 | 13 | int gameover(); |
trmontgomery | 4:cdc54191ff07 | 14 | |
trmontgomery | 4:cdc54191ff07 | 15 | //global variables |
trmontgomery | 4:cdc54191ff07 | 16 | int yes; |
trmontgomery | 4:cdc54191ff07 | 17 | int no; |
trmontgomery | 4:cdc54191ff07 | 18 | int yes_color; |
trmontgomery | 4:cdc54191ff07 | 19 | int no_color; |
trmontgomery | 4:cdc54191ff07 | 20 | int current_item2 = 0; |
trmontgomery | 4:cdc54191ff07 | 21 | |
trmontgomery | 4:cdc54191ff07 | 22 | |
trmontgomery | 4:cdc54191ff07 | 23 | /** |
trmontgomery | 4:cdc54191ff07 | 24 | * Given the game inputs, determine what kind of update needs to happen. |
trmontgomery | 4:cdc54191ff07 | 25 | * Possbile return values are defined below. |
trmontgomery | 4:cdc54191ff07 | 26 | */ |
trmontgomery | 4:cdc54191ff07 | 27 | #define NO_ACTION 0 |
trmontgomery | 4:cdc54191ff07 | 28 | #define CHANGE_OPTION 1 |
trmontgomery | 4:cdc54191ff07 | 29 | #define SELECT 2 |
trmontgomery | 4:cdc54191ff07 | 30 | |
trmontgomery | 4:cdc54191ff07 | 31 | int get_screen_action(GameInputs inputs) |
trmontgomery | 4:cdc54191ff07 | 32 | { |
trmontgomery | 4:cdc54191ff07 | 33 | if (!inputs.b1){ |
trmontgomery | 4:cdc54191ff07 | 34 | return CHANGE_OPTION; |
trmontgomery | 4:cdc54191ff07 | 35 | } if (!inputs.b2){ |
trmontgomery | 4:cdc54191ff07 | 36 | return SELECT; |
trmontgomery | 4:cdc54191ff07 | 37 | } |
trmontgomery | 4:cdc54191ff07 | 38 | return NO_ACTION; |
trmontgomery | 4:cdc54191ff07 | 39 | } |
trmontgomery | 4:cdc54191ff07 | 40 | |
trmontgomery | 4:cdc54191ff07 | 41 | |
trmontgomery | 4:cdc54191ff07 | 42 | #define NO_RESULT 0 |
trmontgomery | 4:cdc54191ff07 | 43 | #define FULL_DRAW 2 |
trmontgomery | 4:cdc54191ff07 | 44 | int update_screen(int action) |
trmontgomery | 4:cdc54191ff07 | 45 | { |
trmontgomery | 4:cdc54191ff07 | 46 | switch(action) |
trmontgomery | 4:cdc54191ff07 | 47 | { |
trmontgomery | 4:cdc54191ff07 | 48 | case CHANGE_OPTION: |
trmontgomery | 4:cdc54191ff07 | 49 | //if button 1 pressed move to next menu item |
trmontgomery | 4:cdc54191ff07 | 50 | current_item2 = current_item2++; |
trmontgomery | 4:cdc54191ff07 | 51 | break; |
trmontgomery | 4:cdc54191ff07 | 52 | case SELECT: |
trmontgomery | 4:cdc54191ff07 | 53 | if (current_item2%2 == 0) {//Start game |
trmontgomery | 4:cdc54191ff07 | 54 | yes = true; |
trmontgomery | 4:cdc54191ff07 | 55 | } else if (current_item2%2 == 1){ //Quit (screen cut to black) |
trmontgomery | 4:cdc54191ff07 | 56 | no = true; |
trmontgomery | 4:cdc54191ff07 | 57 | } |
trmontgomery | 4:cdc54191ff07 | 58 | break; |
trmontgomery | 4:cdc54191ff07 | 59 | } |
trmontgomery | 4:cdc54191ff07 | 60 | return NO_RESULT; |
trmontgomery | 4:cdc54191ff07 | 61 | } |
trmontgomery | 4:cdc54191ff07 | 62 | |
trmontgomery | 4:cdc54191ff07 | 63 | /** |
trmontgomery | 4:cdc54191ff07 | 64 | * Entry point for frame drawing. This should be called once per iteration of |
trmontgomery | 4:cdc54191ff07 | 65 | * the game loop. This draws all tiles on the screen, followed by the status |
trmontgomery | 4:cdc54191ff07 | 66 | * bars. Unless init is nonzero, this function will optimize drawing by only |
trmontgomery | 4:cdc54191ff07 | 67 | * drawing tiles that have changed from the previous frame. |
trmontgomery | 4:cdc54191ff07 | 68 | */ |
trmontgomery | 4:cdc54191ff07 | 69 | void draw_screen(int init) |
trmontgomery | 4:cdc54191ff07 | 70 | { |
trmontgomery | 4:cdc54191ff07 | 71 | |
trmontgomery | 4:cdc54191ff07 | 72 | if (current_item2%2 == 0){ |
trmontgomery | 4:cdc54191ff07 | 73 | yes_color = GREEN; |
trmontgomery | 4:cdc54191ff07 | 74 | } else if (current_item2%2 == 1){ |
trmontgomery | 4:cdc54191ff07 | 75 | no_color = GREEN; |
trmontgomery | 4:cdc54191ff07 | 76 | } |
trmontgomery | 4:cdc54191ff07 | 77 | |
trmontgomery | 4:cdc54191ff07 | 78 | uLCD.locate(1,9); |
trmontgomery | 4:cdc54191ff07 | 79 | uLCD.color(yes_color); |
trmontgomery | 4:cdc54191ff07 | 80 | uLCD.printf("YES"); |
trmontgomery | 4:cdc54191ff07 | 81 | |
trmontgomery | 4:cdc54191ff07 | 82 | uLCD.locate(1,10); |
trmontgomery | 4:cdc54191ff07 | 83 | uLCD.color(no_color); |
trmontgomery | 4:cdc54191ff07 | 84 | uLCD.printf("NO"); |
trmontgomery | 4:cdc54191ff07 | 85 | |
trmontgomery | 4:cdc54191ff07 | 86 | yes_color = BLACK; |
trmontgomery | 4:cdc54191ff07 | 87 | no_color = BLACK; |
trmontgomery | 4:cdc54191ff07 | 88 | } |
trmontgomery | 4:cdc54191ff07 | 89 | |
trmontgomery | 4:cdc54191ff07 | 90 | /** |
trmontgomery | 4:cdc54191ff07 | 91 | * Initialize the main world map. Add walls around the edges, interior chambers, |
trmontgomery | 4:cdc54191ff07 | 92 | * and plants in the background so you can see motion. |
trmontgomery | 4:cdc54191ff07 | 93 | */ |
trmontgomery | 4:cdc54191ff07 | 94 | void init_screen(int lives) |
trmontgomery | 4:cdc54191ff07 | 95 | { |
trmontgomery | 4:cdc54191ff07 | 96 | uLCD.locate(1,5); |
trmontgomery | 4:cdc54191ff07 | 97 | //draw pink rectangle on whole screen |
trmontgomery | 4:cdc54191ff07 | 98 | uLCD.filled_rectangle(0, 128, 128, 80, 0xFFFFFF); |
trmontgomery | 4:cdc54191ff07 | 99 | // write title |
trmontgomery | 4:cdc54191ff07 | 100 | uLCD.textbackground_color(0xFFFFFF); |
trmontgomery | 4:cdc54191ff07 | 101 | uLCD.color(BLACK); |
trmontgomery | 4:cdc54191ff07 | 102 | uLCD.printf("GAME OVER!"); |
trmontgomery | 4:cdc54191ff07 | 103 | |
trmontgomery | 4:cdc54191ff07 | 104 | if (current_item2%2 == 0){ |
trmontgomery | 4:cdc54191ff07 | 105 | yes_color = RED; |
trmontgomery | 4:cdc54191ff07 | 106 | } else if (current_item2%2 == 1){ |
trmontgomery | 4:cdc54191ff07 | 107 | no_color = RED; |
trmontgomery | 4:cdc54191ff07 | 108 | } |
trmontgomery | 4:cdc54191ff07 | 109 | |
trmontgomery | 4:cdc54191ff07 | 110 | uLCD.locate(1,7); |
trmontgomery | 4:cdc54191ff07 | 111 | uLCD.printf("Continue Game?"); |
trmontgomery | 4:cdc54191ff07 | 112 | |
trmontgomery | 4:cdc54191ff07 | 113 | uLCD.locate(1,8); |
trmontgomery | 4:cdc54191ff07 | 114 | char str[30]; |
trmontgomery | 4:cdc54191ff07 | 115 | sprintf(str, "%d lives left.", lives); |
trmontgomery | 4:cdc54191ff07 | 116 | uLCD.printf(str); |
trmontgomery | 4:cdc54191ff07 | 117 | |
trmontgomery | 4:cdc54191ff07 | 118 | uLCD.locate(1,9); |
trmontgomery | 4:cdc54191ff07 | 119 | uLCD.color(yes_color); |
trmontgomery | 4:cdc54191ff07 | 120 | uLCD.printf("YES"); |
trmontgomery | 4:cdc54191ff07 | 121 | |
trmontgomery | 4:cdc54191ff07 | 122 | uLCD.locate(1,10); |
trmontgomery | 4:cdc54191ff07 | 123 | uLCD.color(no_color); |
trmontgomery | 4:cdc54191ff07 | 124 | uLCD.printf("NO"); |
trmontgomery | 4:cdc54191ff07 | 125 | |
trmontgomery | 4:cdc54191ff07 | 126 | } |
trmontgomery | 4:cdc54191ff07 | 127 | |
trmontgomery | 4:cdc54191ff07 | 128 | /** |
trmontgomery | 4:cdc54191ff07 | 129 | * Program entry point! This is where it all begins. |
trmontgomery | 4:cdc54191ff07 | 130 | * This function orchestrates all the parts of the game. Most of your |
trmontgomery | 4:cdc54191ff07 | 131 | * implementation should be elsewhere - this holds the game loop, and should |
trmontgomery | 4:cdc54191ff07 | 132 | * read like a road map for the rest of the code. |
trmontgomery | 4:cdc54191ff07 | 133 | */ |
trmontgomery | 4:cdc54191ff07 | 134 | int gameover(int lives) |
trmontgomery | 4:cdc54191ff07 | 135 | { |
trmontgomery | 4:cdc54191ff07 | 136 | // Initialize the maps |
trmontgomery | 4:cdc54191ff07 | 137 | init_screen(lives); |
trmontgomery | 4:cdc54191ff07 | 138 | |
trmontgomery | 4:cdc54191ff07 | 139 | // Initial drawing |
trmontgomery | 4:cdc54191ff07 | 140 | draw_screen(true); |
trmontgomery | 4:cdc54191ff07 | 141 | |
trmontgomery | 4:cdc54191ff07 | 142 | // Main game loop |
trmontgomery | 4:cdc54191ff07 | 143 | while(1) |
trmontgomery | 4:cdc54191ff07 | 144 | { |
trmontgomery | 4:cdc54191ff07 | 145 | // Timer to measure game update speed |
trmontgomery | 4:cdc54191ff07 | 146 | Timer t; t.start(); |
trmontgomery | 4:cdc54191ff07 | 147 | |
trmontgomery | 4:cdc54191ff07 | 148 | // Actually do the game update: |
trmontgomery | 4:cdc54191ff07 | 149 | // 1. Read inputs |
trmontgomery | 4:cdc54191ff07 | 150 | GameInputs in = read_inputs(); |
trmontgomery | 4:cdc54191ff07 | 151 | // 2. Determine action (get_action) |
trmontgomery | 4:cdc54191ff07 | 152 | int a = get_screen_action(in); |
trmontgomery | 4:cdc54191ff07 | 153 | // 3. Update game (update_game) |
trmontgomery | 4:cdc54191ff07 | 154 | int u = update_screen(a); |
trmontgomery | 4:cdc54191ff07 | 155 | // 4. Draw frame (draw_game) |
trmontgomery | 4:cdc54191ff07 | 156 | draw_screen(u); |
trmontgomery | 4:cdc54191ff07 | 157 | |
trmontgomery | 4:cdc54191ff07 | 158 | //check for start |
trmontgomery | 4:cdc54191ff07 | 159 | if (yes){ |
trmontgomery | 4:cdc54191ff07 | 160 | return 1; |
trmontgomery | 4:cdc54191ff07 | 161 | }else if (no){ |
trmontgomery | 4:cdc54191ff07 | 162 | return 0; |
trmontgomery | 4:cdc54191ff07 | 163 | } |
trmontgomery | 4:cdc54191ff07 | 164 | |
trmontgomery | 4:cdc54191ff07 | 165 | |
trmontgomery | 4:cdc54191ff07 | 166 | // 5. Frame delay |
trmontgomery | 4:cdc54191ff07 | 167 | t.stop(); |
trmontgomery | 4:cdc54191ff07 | 168 | int dt = t.read_ms(); |
trmontgomery | 4:cdc54191ff07 | 169 | if (dt < 500) wait_ms(500 - dt); |
trmontgomery | 4:cdc54191ff07 | 170 | } |
trmontgomery | 4:cdc54191ff07 | 171 | } |