Falldown completed game
Dependencies: mbed
main.cpp@8:8d9c5a7e57d3, 2019-05-09 (annotated)
- Committer:
- el17cr
- Date:
- Thu May 09 15:17:36 2019 +0000
- Revision:
- 8:8d9c5a7e57d3
- Parent:
- 7:cf469c3505a2
Finalised publish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el17cr | 0:adb2f501dd61 | 1 | /* |
el17cr | 0:adb2f501dd61 | 2 | ELEC2645 Embedded Systems Project |
el17cr | 0:adb2f501dd61 | 3 | School of Electronic & Electrical Engineering |
el17cr | 0:adb2f501dd61 | 4 | University of Leeds |
el17cr | 7:cf469c3505a2 | 5 | Name: Connor Rainey |
el17cr | 7:cf469c3505a2 | 6 | Username: el17cr |
el17cr | 7:cf469c3505a2 | 7 | Student ID Number: 201125971 |
el17cr | 7:cf469c3505a2 | 8 | Date: 09/05/2019 |
el17cr | 0:adb2f501dd61 | 9 | */ |
el17cr | 2:7f91a86b4dc0 | 10 | |
el17cr | 2:7f91a86b4dc0 | 11 | #include "mbed.h" |
el17cr | 2:7f91a86b4dc0 | 12 | #include "Gamepad.h" |
el17cr | 2:7f91a86b4dc0 | 13 | #include "N5110.h" |
el17cr | 2:7f91a86b4dc0 | 14 | #include "Falldown.h" |
el17cr | 2:7f91a86b4dc0 | 15 | |
el17cr | 7:cf469c3505a2 | 16 | // These values cannot be changed |
el17cr | 2:7f91a86b4dc0 | 17 | #define GROUND_HEIGHT 2 |
el17cr | 3:5edefa83f8f0 | 18 | #define BALL_SIZE 3 |
el17cr | 3:5edefa83f8f0 | 19 | |
el17cr | 2:7f91a86b4dc0 | 20 | |
el17cr | 7:cf469c3505a2 | 21 | // define initial ground width, ground speed and level |
el17cr | 6:85314a3d69cd | 22 | int ground_width = 40; |
el17cr | 7:cf469c3505a2 | 23 | double ground_speed = 0.3; |
el17cr | 6:85314a3d69cd | 24 | int level = 1; |
el17cr | 2:7f91a86b4dc0 | 25 | |
el17cr | 7:cf469c3505a2 | 26 | // struct holds data for reading joystick |
el17cr | 2:7f91a86b4dc0 | 27 | struct UserInput { |
el17cr | 2:7f91a86b4dc0 | 28 | Direction d; |
el17cr | 2:7f91a86b4dc0 | 29 | float mag; |
el17cr | 2:7f91a86b4dc0 | 30 | }; |
el17cr | 2:7f91a86b4dc0 | 31 | |
el17cr | 2:7f91a86b4dc0 | 32 | N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3 |
el17cr | 7:cf469c3505a2 | 33 | Gamepad pad; //gamepad library |
el17cr | 7:cf469c3505a2 | 34 | Falldown falldown; // falldown class |
el17cr | 2:7f91a86b4dc0 | 35 | |
el17cr | 2:7f91a86b4dc0 | 36 | void init(); |
el17cr | 2:7f91a86b4dc0 | 37 | void update_game(UserInput input); |
el17cr | 2:7f91a86b4dc0 | 38 | void render(); |
el17cr | 6:85314a3d69cd | 39 | void welcome(); |
el17cr | 7:cf469c3505a2 | 40 | void game_over(); |
el17cr | 7:cf469c3505a2 | 41 | void game_complete(); |
el17cr | 2:7f91a86b4dc0 | 42 | |
el17cr | 5:1a9d84df7207 | 43 | |
el17cr | 2:7f91a86b4dc0 | 44 | int main() |
el17cr | 2:7f91a86b4dc0 | 45 | { |
el17cr | 2:7f91a86b4dc0 | 46 | init(); |
el17cr | 6:85314a3d69cd | 47 | welcome(); |
el17cr | 2:7f91a86b4dc0 | 48 | render(); |
el17cr | 7:cf469c3505a2 | 49 | wait(0.1); //delay required before clearing the display and constructing the next frame |
el17cr | 7:cf469c3505a2 | 50 | |
el17cr | 7:cf469c3505a2 | 51 | // start game loop |
el17cr | 7:cf469c3505a2 | 52 | while(1) { |
el17cr | 2:7f91a86b4dc0 | 53 | falldown.read_input(pad); |
el17cr | 2:7f91a86b4dc0 | 54 | falldown.update(pad); |
el17cr | 2:7f91a86b4dc0 | 55 | render(); |
el17cr | 2:7f91a86b4dc0 | 56 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 57 | // check goal funtion returns a 1 if ball reaches the bottom of the screen |
el17cr | 5:1a9d84df7207 | 58 | if (falldown.check_goal() == 1) { |
el17cr | 7:cf469c3505a2 | 59 | level = level++; // increment level if goal reached |
el17cr | 7:cf469c3505a2 | 60 | ground_width = ground_width + 1; // increases ground width |
el17cr | 7:cf469c3505a2 | 61 | ground_speed = ground_speed + 0.1; // increase ground speed |
el17cr | 7:cf469c3505a2 | 62 | falldown.init(GROUND_HEIGHT,ground_width,BALL_SIZE,ground_speed); // re-initialise game with new values |
el17cr | 5:1a9d84df7207 | 63 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 64 | |
el17cr | 7:cf469c3505a2 | 65 | // if on final level, and goal reached |
el17cr | 7:cf469c3505a2 | 66 | } else if ((level == 5) && (falldown.check_complete() == 1)) { |
el17cr | 7:cf469c3505a2 | 67 | game_complete(); // call game complete function |
el17cr | 7:cf469c3505a2 | 68 | wait(0.5); |
el17cr | 7:cf469c3505a2 | 69 | level = 1; // if game complete function is broken and player chooses to play again, re-set values for level, ground width and ground speed |
el17cr | 7:cf469c3505a2 | 70 | ground_width = 40; |
el17cr | 7:cf469c3505a2 | 71 | ground_speed = 0.5; |
el17cr | 7:cf469c3505a2 | 72 | falldown.init(GROUND_HEIGHT,ground_width,BALL_SIZE,ground_speed); // re-initialise game with new values |
el17cr | 7:cf469c3505a2 | 73 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 74 | |
el17cr | 7:cf469c3505a2 | 75 | // |
el17cr | 7:cf469c3505a2 | 76 | } else if (falldown.check_end() == 1) { |
el17cr | 7:cf469c3505a2 | 77 | game_over(); // call game over function |
el17cr | 7:cf469c3505a2 | 78 | level = 1; // if game over function is broken and player chooses to play again, re-set values for level, ground width and ground speed |
el17cr | 7:cf469c3505a2 | 79 | ground_width = 40; |
el17cr | 7:cf469c3505a2 | 80 | ground_speed = 0.5; |
el17cr | 7:cf469c3505a2 | 81 | falldown.init(GROUND_HEIGHT,ground_width,BALL_SIZE,ground_speed); // re-initialise game with new values |
el17cr | 7:cf469c3505a2 | 82 | wait(0.1); |
el17cr | 5:1a9d84df7207 | 83 | } |
el17cr | 2:7f91a86b4dc0 | 84 | } |
el17cr | 7:cf469c3505a2 | 85 | } |
el17cr | 5:1a9d84df7207 | 86 | |
el17cr | 7:cf469c3505a2 | 87 | void init() // initialise lcd, gamepad and game |
el17cr | 2:7f91a86b4dc0 | 88 | { |
el17cr | 2:7f91a86b4dc0 | 89 | lcd.init(); |
el17cr | 2:7f91a86b4dc0 | 90 | pad.init(); |
el17cr | 7:cf469c3505a2 | 91 | |
el17cr | 6:85314a3d69cd | 92 | falldown.init(GROUND_HEIGHT,ground_width,BALL_SIZE,ground_speed); |
el17cr | 2:7f91a86b4dc0 | 93 | } |
el17cr | 2:7f91a86b4dc0 | 94 | |
el17cr | 7:cf469c3505a2 | 95 | void render() // render game |
el17cr | 2:7f91a86b4dc0 | 96 | { |
el17cr | 7:cf469c3505a2 | 97 | lcd.clear(); //clear lcd |
el17cr | 7:cf469c3505a2 | 98 | falldown.draw(lcd); //draws game |
el17cr | 7:cf469c3505a2 | 99 | char buffer[1]; //displays level |
el17cr | 7:cf469c3505a2 | 100 | sprintf(buffer,"%2d",level); |
el17cr | 7:cf469c3505a2 | 101 | lcd.printString(buffer,0,1); |
el17cr | 7:cf469c3505a2 | 102 | lcd.refresh(); |
el17cr | 7:cf469c3505a2 | 103 | } |
el17cr | 5:1a9d84df7207 | 104 | |
el17cr | 7:cf469c3505a2 | 105 | void welcome() //Displays welcome screen |
el17cr | 7:cf469c3505a2 | 106 | { |
el17cr | 7:cf469c3505a2 | 107 | lcd.printString("*Falldown*",12,0); |
el17cr | 7:cf469c3505a2 | 108 | lcd.printString("Get to",24,2); |
el17cr | 7:cf469c3505a2 | 109 | lcd.printString("the bottom!",11,3); |
el17cr | 7:cf469c3505a2 | 110 | lcd.printString("Press Start",11,5); |
el17cr | 7:cf469c3505a2 | 111 | |
el17cr | 2:7f91a86b4dc0 | 112 | lcd.refresh(); |
el17cr | 5:1a9d84df7207 | 113 | |
el17cr | 7:cf469c3505a2 | 114 | // leds flash until start pressed |
el17cr | 6:85314a3d69cd | 115 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
el17cr | 6:85314a3d69cd | 116 | pad.leds_on(); |
el17cr | 6:85314a3d69cd | 117 | wait(0.1); |
el17cr | 6:85314a3d69cd | 118 | pad.leds_off(); |
el17cr | 6:85314a3d69cd | 119 | wait(0.1); |
el17cr | 6:85314a3d69cd | 120 | } |
el17cr | 6:85314a3d69cd | 121 | } |
el17cr | 7:cf469c3505a2 | 122 | |
el17cr | 7:cf469c3505a2 | 123 | void game_over() |
el17cr | 7:cf469c3505a2 | 124 | { |
el17cr | 7:cf469c3505a2 | 125 | lcd.init(); //re initialise lcd |
el17cr | 7:cf469c3505a2 | 126 | lcd.printString("Game Over! :-(",0,0); |
el17cr | 7:cf469c3505a2 | 127 | lcd.printString("centre",25,2); |
el17cr | 7:cf469c3505a2 | 128 | lcd.printString("joystick",20,3); |
el17cr | 7:cf469c3505a2 | 129 | lcd.printString("Play again? A",0,5); |
el17cr | 7:cf469c3505a2 | 130 | lcd.refresh(); |
el17cr | 7:cf469c3505a2 | 131 | while (pad.check_event(Gamepad::A_PRESSED) == false) { |
el17cr | 7:cf469c3505a2 | 132 | pad.leds_on(); |
el17cr | 7:cf469c3505a2 | 133 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 134 | pad.leds_off(); |
el17cr | 7:cf469c3505a2 | 135 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 136 | if (pad.check_event(Gamepad::A_PRESSED) == true) { |
el17cr | 7:cf469c3505a2 | 137 | break; // break while loop when button is pressed and continue main game loop |
el17cr | 7:cf469c3505a2 | 138 | } |
el17cr | 7:cf469c3505a2 | 139 | } |
el17cr | 7:cf469c3505a2 | 140 | wait(0.5); |
el17cr | 7:cf469c3505a2 | 141 | pad.init(); //bug fix, initialise pad ensures button does remain true from last time it was pressed |
el17cr | 7:cf469c3505a2 | 142 | } |
el17cr | 7:cf469c3505a2 | 143 | |
el17cr | 7:cf469c3505a2 | 144 | // Function adjusted for completion of the game |
el17cr | 7:cf469c3505a2 | 145 | void game_complete() |
el17cr | 7:cf469c3505a2 | 146 | { |
el17cr | 7:cf469c3505a2 | 147 | lcd.init(); |
el17cr | 7:cf469c3505a2 | 148 | lcd.printString("Game Complete!",0,0); |
el17cr | 7:cf469c3505a2 | 149 | lcd.printString(":-)",33,2); |
el17cr | 7:cf469c3505a2 | 150 | lcd.printString("Play again? A",0,4); |
el17cr | 7:cf469c3505a2 | 151 | lcd.refresh(); |
el17cr | 7:cf469c3505a2 | 152 | while (pad.check_event(Gamepad::A_PRESSED) == false) { |
el17cr | 7:cf469c3505a2 | 153 | pad.leds_on(); |
el17cr | 7:cf469c3505a2 | 154 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 155 | pad.leds_off(); |
el17cr | 7:cf469c3505a2 | 156 | wait(0.1); |
el17cr | 7:cf469c3505a2 | 157 | if (pad.check_event(Gamepad::A_PRESSED) == true) { |
el17cr | 7:cf469c3505a2 | 158 | break; |
el17cr | 7:cf469c3505a2 | 159 | } |
el17cr | 7:cf469c3505a2 | 160 | } |
el17cr | 7:cf469c3505a2 | 161 | wait(0.5); |
el17cr | 7:cf469c3505a2 | 162 | pad.init(); |
el17cr | 7:cf469c3505a2 | 163 | } |