ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Tue Apr 16 19:19:43 2019 +0000
Revision:
20:a8cad4e044ea
Parent:
19:f35887b14c23
Child:
21:20478f086bc2
Added sounds throughout the game for jumping, falling, collisions and dying sequence and added a musical tune that plays over the menus.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisgw 9:fff2009f826e 1 #include "Menu.h"
lewisgw 9:fff2009f826e 2
lewisgw 18:304700b5d8f8 3 // Define sprite arrays.
lewisgw 18:304700b5d8f8 4 int menu_sprite[23][80] = {
lewisgw 18:304700b5d8f8 5 { 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
lewisgw 18:304700b5d8f8 6 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 },
lewisgw 18:304700b5d8f8 7 { 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0 },
lewisgw 18:304700b5d8f8 8 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0 },
lewisgw 18:304700b5d8f8 9 { 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 10 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 11 { 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 12 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 13 { 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 14 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 15 { 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 16 { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 17 { 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 18 { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 19 { 0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 20 { 0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 21 { 0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 22 { 0,0,1,0,0,0,1,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 23 { 0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 24 { 0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 25 { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 26 { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
lewisgw 18:304700b5d8f8 27 { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
lewisgw 18:304700b5d8f8 28 };
lewisgw 18:304700b5d8f8 29
lewisgw 14:9861fe85c803 30 // Define the finite state machine for three different states: running game, display
lewisgw 14:9861fe85c803 31 // menu and display controls, {ouput,{a,b,c,d}} where a,b,c,d are inputs.
lewisgw 14:9861fe85c803 32 // The ouputs have been assigned to 0,1,2.
lewisgw 14:9861fe85c803 33 // There are four different relevent input combinations that have been assigned to
lewisgw 14:9861fe85c803 34 // 0,1,2,3.
lewisgw 12:ebaefda53dd0 35 State _fsm[3] = {
lewisgw 13:bcf6bb69c597 36 {0,{0,1,0,0}},
lewisgw 12:ebaefda53dd0 37 {1,{1,1,0,2}},
lewisgw 13:bcf6bb69c597 38 {2,{2,1,2,0}}
lewisgw 12:ebaefda53dd0 39 };
lewisgw 11:b66170249a26 40
lewisgw 14:9861fe85c803 41 // Constructor and distructor
lewisgw 9:fff2009f826e 42 Menu::Menu() {}
lewisgw 9:fff2009f826e 43
lewisgw 9:fff2009f826e 44 Menu::~Menu() {}
lewisgw 9:fff2009f826e 45
lewisgw 9:fff2009f826e 46 void Menu::init() {
lewisgw 14:9861fe85c803 47 // Initialise at the highest level, starting state is the menu.
lewisgw 12:ebaefda53dd0 48 _state = 1;
lewisgw 12:ebaefda53dd0 49 _controller.init();
lewisgw 20:a8cad4e044ea 50 _tone_flag = false;
lewisgw 20:a8cad4e044ea 51 _tone_counter = 0;
lewisgw 20:a8cad4e044ea 52 _tune_counter = 0;
lewisgw 12:ebaefda53dd0 53 }
lewisgw 12:ebaefda53dd0 54
lewisgw 12:ebaefda53dd0 55 void Menu::run(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 56 set_input(gamepad.check_event(Gamepad::START_PRESSED),
lewisgw 13:bcf6bb69c597 57 gamepad.check_event(Gamepad::BACK_PRESSED),
lewisgw 13:bcf6bb69c597 58 gamepad.check_event(Gamepad::X_PRESSED));
lewisgw 14:9861fe85c803 59 // Select the current output, execute that output via the output function
lewisgw 14:9861fe85c803 60 // and update to the next state depending on the input.
lewisgw 12:ebaefda53dd0 61 _output = _fsm[_state].output;
lewisgw 12:ebaefda53dd0 62 output(lcd, gamepad);
lewisgw 12:ebaefda53dd0 63 _state = _fsm[_state].next_state[_menu_input];
lewisgw 12:ebaefda53dd0 64 }
lewisgw 12:ebaefda53dd0 65
lewisgw 12:ebaefda53dd0 66 void Menu::output(N5110 &lcd, Gamepad &gamepad) {
lewisgw 14:9861fe85c803 67 // 0, 1 and 2 have been assigned to the output of each state respectivley.
lewisgw 12:ebaefda53dd0 68 if (_output == 0) {
lewisgw 12:ebaefda53dd0 69 run_game(lcd, gamepad);
lewisgw 12:ebaefda53dd0 70 } else if (_output == 1) {
lewisgw 12:ebaefda53dd0 71 display_menu(lcd, gamepad);
lewisgw 12:ebaefda53dd0 72 } else {
lewisgw 12:ebaefda53dd0 73 display_controls(lcd, gamepad);
lewisgw 12:ebaefda53dd0 74 }
lewisgw 9:fff2009f826e 75 }
lewisgw 9:fff2009f826e 76
lewisgw 13:bcf6bb69c597 77 void Menu::set_input(bool start, bool back, bool x) {
lewisgw 14:9861fe85c803 78 // 0, 1, 2, 3 have been assigned to each relevent input combination:
lewisgw 14:9861fe85c803 79 // if nothing is pressed, input = 0.
lewisgw 14:9861fe85c803 80 // if only back is pressed, input = 1.
lewisgw 14:9861fe85c803 81 // if only start is pressed, input = 2.
lewisgw 14:9861fe85c803 82 // if only X is pressed, input = 3.
lewisgw 13:bcf6bb69c597 83 if (!start && !back && !x) {
lewisgw 12:ebaefda53dd0 84 _menu_input = 0;
lewisgw 12:ebaefda53dd0 85 } else if (!start && back) {
lewisgw 12:ebaefda53dd0 86 _menu_input = 1;
lewisgw 12:ebaefda53dd0 87 } else if (start && !back) {
lewisgw 12:ebaefda53dd0 88 _menu_input = 2;
lewisgw 13:bcf6bb69c597 89 } else if (x) {
lewisgw 12:ebaefda53dd0 90 _menu_input = 3;
lewisgw 12:ebaefda53dd0 91 }
lewisgw 12:ebaefda53dd0 92 }
lewisgw 12:ebaefda53dd0 93
lewisgw 12:ebaefda53dd0 94 void Menu::run_game(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 95 _controller.run_game_engine(lcd, gamepad);
lewisgw 11:b66170249a26 96 }
lewisgw 11:b66170249a26 97
lewisgw 13:bcf6bb69c597 98 void Menu::display_controls(N5110 &lcd, Gamepad &gamepad) {
lewisgw 19:f35887b14c23 99 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 100 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 19:f35887b14c23 101 lcd.drawLine(0,32,84,32,FILL_BLACK);
lewisgw 19:f35887b14c23 102 lcd.drawLine(0,38,84,38,FILL_BLACK);
lewisgw 13:bcf6bb69c597 103 lcd.printString("JOYSTICK:",0,0);
lewisgw 13:bcf6bb69c597 104 lcd.printString("-Move left",0,1);
lewisgw 13:bcf6bb69c597 105 lcd.printString("-Move right",0,2);
lewisgw 19:f35887b14c23 106 lcd.printString("-Move down",0,3);
lewisgw 13:bcf6bb69c597 107 lcd.printString("A:",0,4);
lewisgw 13:bcf6bb69c597 108 lcd.printString("-Jump (back)",0,5);
lewisgw 20:a8cad4e044ea 109 play_tone(gamepad);
lewisgw 13:bcf6bb69c597 110 }
lewisgw 12:ebaefda53dd0 111
lewisgw 12:ebaefda53dd0 112 void Menu::display_menu(N5110 &lcd, Gamepad &gamepad) {
lewisgw 14:9861fe85c803 113 // Displays the menu and resets the controller to ensure a new game is
lewisgw 14:9861fe85c803 114 // ready to start when the state is switched to run game.
lewisgw 19:f35887b14c23 115 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 116 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 19:f35887b14c23 117 lcd.drawLine(0,24,84,24,FILL_BLACK);
lewisgw 18:304700b5d8f8 118 lcd.printString("SKATER",24,0);
lewisgw 13:bcf6bb69c597 119 lcd.printString("START- Play!",0,1);
lewisgw 18:304700b5d8f8 120 lcd.printString("X- Controls",0,2);
lewisgw 18:304700b5d8f8 121 lcd.drawSprite(1,25,23,80,(int*)menu_sprite);
lewisgw 20:a8cad4e044ea 122 play_tone(gamepad);
lewisgw 20:a8cad4e044ea 123 }
lewisgw 20:a8cad4e044ea 124
lewisgw 20:a8cad4e044ea 125 void Menu::play_tone(Gamepad &gamepad) {
lewisgw 20:a8cad4e044ea 126 _tone_flag = !_tone_flag;
lewisgw 20:a8cad4e044ea 127 _tone_counter++;
lewisgw 20:a8cad4e044ea 128 _tune_counter++;
lewisgw 20:a8cad4e044ea 129 if(_tune_counter < 12) {
lewisgw 20:a8cad4e044ea 130 play_tune_a(gamepad);
lewisgw 20:a8cad4e044ea 131 } else {
lewisgw 20:a8cad4e044ea 132 if(_tune_counter == 24) _tune_counter = 0;
lewisgw 20:a8cad4e044ea 133 play_tune_b(gamepad);
lewisgw 20:a8cad4e044ea 134 }
lewisgw 20:a8cad4e044ea 135 wait(0.14);
lewisgw 20:a8cad4e044ea 136 }
lewisgw 20:a8cad4e044ea 137
lewisgw 20:a8cad4e044ea 138 void Menu::play_tune_a(Gamepad &gamepad) {
lewisgw 20:a8cad4e044ea 139 if(_tone_counter < 5) {
lewisgw 20:a8cad4e044ea 140 if(_tone_flag) {
lewisgw 20:a8cad4e044ea 141 gamepad.tone(220, 0.5);
lewisgw 20:a8cad4e044ea 142 } else {
lewisgw 20:a8cad4e044ea 143 gamepad.tone(440, 0.1);
lewisgw 20:a8cad4e044ea 144 }
lewisgw 20:a8cad4e044ea 145 } else {
lewisgw 20:a8cad4e044ea 146 if(_tone_counter == 6) _tone_counter = 0;
lewisgw 20:a8cad4e044ea 147 if(_tone_flag) {
lewisgw 20:a8cad4e044ea 148 gamepad.tone(174.61, 0.1);
lewisgw 20:a8cad4e044ea 149 } else {
lewisgw 20:a8cad4e044ea 150 gamepad.tone(246.94, 0.1);
lewisgw 20:a8cad4e044ea 151 }
lewisgw 20:a8cad4e044ea 152 }
lewisgw 20:a8cad4e044ea 153 }
lewisgw 20:a8cad4e044ea 154
lewisgw 20:a8cad4e044ea 155 void Menu::play_tune_b(Gamepad &gamepad) {
lewisgw 20:a8cad4e044ea 156 if(_tone_counter < 5) {
lewisgw 20:a8cad4e044ea 157 if(_tone_flag) {
lewisgw 20:a8cad4e044ea 158 gamepad.tone(174.61, 0.5);
lewisgw 20:a8cad4e044ea 159 } else {
lewisgw 20:a8cad4e044ea 160 gamepad.tone(349.23, 0.1);
lewisgw 20:a8cad4e044ea 161 }
lewisgw 20:a8cad4e044ea 162 } else {
lewisgw 20:a8cad4e044ea 163 if(_tone_counter == 6) _tone_counter = 0;
lewisgw 20:a8cad4e044ea 164 if(_tone_flag) {
lewisgw 20:a8cad4e044ea 165 gamepad.tone(659.25, 0.1);
lewisgw 20:a8cad4e044ea 166 } else {
lewisgw 20:a8cad4e044ea 167 gamepad.tone(220, 0.1);
lewisgw 20:a8cad4e044ea 168 }
lewisgw 20:a8cad4e044ea 169 }
lewisgw 20:a8cad4e044ea 170 }