ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Fri May 03 09:33:34 2019 +0000
Revision:
26:4253656c0755
Parent:
21:20478f086bc2
Child:
27:c920c5ec31af
Now a dynamic fire at the bottom of the screen that gets higher as the player collects more coins. It will kill the skater if they collide.

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 21:20478f086bc2 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,
lewisgw 21:20478f086bc2 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,
lewisgw 21:20478f086bc2 7 0,0,1 },
lewisgw 21:20478f086bc2 8 { 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 21:20478f086bc2 9 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 21:20478f086bc2 10 1,1,1 },
lewisgw 21:20478f086bc2 11 { 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,
lewisgw 21:20478f086bc2 12 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,
lewisgw 21:20478f086bc2 13 1,1,0 },
lewisgw 21:20478f086bc2 14 { 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,
lewisgw 21:20478f086bc2 15 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,
lewisgw 21:20478f086bc2 16 0,0,0 },
lewisgw 21:20478f086bc2 17 { 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,
lewisgw 21:20478f086bc2 18 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,
lewisgw 21:20478f086bc2 19 0,0,0 },
lewisgw 21:20478f086bc2 20 { 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 21:20478f086bc2 21 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,
lewisgw 21:20478f086bc2 22 0,0,0 },
lewisgw 21:20478f086bc2 23 { 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,
lewisgw 21:20478f086bc2 24 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,
lewisgw 21:20478f086bc2 25 0,0,0 },
lewisgw 21:20478f086bc2 26 { 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,
lewisgw 21:20478f086bc2 27 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,
lewisgw 21:20478f086bc2 28 0,0,0 },
lewisgw 21:20478f086bc2 29 { 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,
lewisgw 21:20478f086bc2 30 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 21:20478f086bc2 31 0,0,0 },
lewisgw 21:20478f086bc2 32 { 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,
lewisgw 21:20478f086bc2 33 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,
lewisgw 21:20478f086bc2 34 0,0,0 },
lewisgw 21:20478f086bc2 35 { 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,
lewisgw 21:20478f086bc2 36 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 21:20478f086bc2 37 0,0,0 },
lewisgw 21:20478f086bc2 38 { 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,
lewisgw 21:20478f086bc2 39 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 21:20478f086bc2 40 0,0,0 },
lewisgw 21:20478f086bc2 41 { 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,
lewisgw 21:20478f086bc2 42 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 21:20478f086bc2 43 0,0,0 },
lewisgw 21:20478f086bc2 44 { 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,
lewisgw 21:20478f086bc2 45 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,
lewisgw 21:20478f086bc2 46 0,0,0 },
lewisgw 21:20478f086bc2 47 { 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,
lewisgw 21:20478f086bc2 48 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,
lewisgw 21:20478f086bc2 49 0,0,0 },
lewisgw 21:20478f086bc2 50 { 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,
lewisgw 21:20478f086bc2 51 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 21:20478f086bc2 52 0,0,0 },
lewisgw 21:20478f086bc2 53 { 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,
lewisgw 21:20478f086bc2 54 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 21:20478f086bc2 55 0,0,0 },
lewisgw 21:20478f086bc2 56 { 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,
lewisgw 21:20478f086bc2 57 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 21:20478f086bc2 58 0,0,0 },
lewisgw 21:20478f086bc2 59 { 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,
lewisgw 21:20478f086bc2 60 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,
lewisgw 21:20478f086bc2 61 0,0,0 },
lewisgw 21:20478f086bc2 62 { 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,
lewisgw 21:20478f086bc2 63 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,
lewisgw 21:20478f086bc2 64 0,0,0 },
lewisgw 21:20478f086bc2 65 { 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,
lewisgw 21:20478f086bc2 66 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,
lewisgw 21:20478f086bc2 67 0,0,0 },
lewisgw 21:20478f086bc2 68 { 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,
lewisgw 21:20478f086bc2 69 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,
lewisgw 21:20478f086bc2 70 0,0,0 },
lewisgw 21:20478f086bc2 71 { 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,
lewisgw 21:20478f086bc2 72 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,
lewisgw 21:20478f086bc2 73 0,0,0 }
lewisgw 18:304700b5d8f8 74 };
lewisgw 18:304700b5d8f8 75
lewisgw 21:20478f086bc2 76 // Define the finite state machine for three different states: running game,
lewisgw 21:20478f086bc2 77 // display
lewisgw 14:9861fe85c803 78 // menu and display controls, {ouput,{a,b,c,d}} where a,b,c,d are inputs.
lewisgw 14:9861fe85c803 79 // The ouputs have been assigned to 0,1,2.
lewisgw 21:20478f086bc2 80 // There are four different relevent input combinations that have been assigned
lewisgw 21:20478f086bc2 81 // to: 0,1,2,3.
lewisgw 12:ebaefda53dd0 82 State _fsm[3] = {
lewisgw 13:bcf6bb69c597 83 {0,{0,1,0,0}},
lewisgw 12:ebaefda53dd0 84 {1,{1,1,0,2}},
lewisgw 13:bcf6bb69c597 85 {2,{2,1,2,0}}
lewisgw 12:ebaefda53dd0 86 };
lewisgw 11:b66170249a26 87
lewisgw 21:20478f086bc2 88 // Constructor and distructor.
lewisgw 9:fff2009f826e 89 Menu::Menu() {}
lewisgw 9:fff2009f826e 90
lewisgw 9:fff2009f826e 91 Menu::~Menu() {}
lewisgw 9:fff2009f826e 92
lewisgw 21:20478f086bc2 93 void Menu::init() {
lewisgw 21:20478f086bc2 94 _state = 1; // Starting state is the menu.
lewisgw 12:ebaefda53dd0 95 _controller.init();
lewisgw 26:4253656c0755 96 // Initialise counters for musical tune.
lewisgw 20:a8cad4e044ea 97 _tone_flag = false;
lewisgw 20:a8cad4e044ea 98 _tone_counter = 0;
lewisgw 21:20478f086bc2 99 _chord_counter = 0;
lewisgw 12:ebaefda53dd0 100 }
lewisgw 12:ebaefda53dd0 101
lewisgw 12:ebaefda53dd0 102 void Menu::run(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 103 set_input(gamepad.check_event(Gamepad::START_PRESSED),
lewisgw 13:bcf6bb69c597 104 gamepad.check_event(Gamepad::BACK_PRESSED),
lewisgw 13:bcf6bb69c597 105 gamepad.check_event(Gamepad::X_PRESSED));
lewisgw 21:20478f086bc2 106 // Select the current output, execute that output via the output function and
lewisgw 21:20478f086bc2 107 // update to the next state depending on the input.
lewisgw 12:ebaefda53dd0 108 _output = _fsm[_state].output;
lewisgw 12:ebaefda53dd0 109 output(lcd, gamepad);
lewisgw 12:ebaefda53dd0 110 _state = _fsm[_state].next_state[_menu_input];
lewisgw 12:ebaefda53dd0 111 }
lewisgw 12:ebaefda53dd0 112
lewisgw 12:ebaefda53dd0 113 void Menu::output(N5110 &lcd, Gamepad &gamepad) {
lewisgw 14:9861fe85c803 114 // 0, 1 and 2 have been assigned to the output of each state respectivley.
lewisgw 12:ebaefda53dd0 115 if (_output == 0) {
lewisgw 12:ebaefda53dd0 116 run_game(lcd, gamepad);
lewisgw 12:ebaefda53dd0 117 } else if (_output == 1) {
lewisgw 12:ebaefda53dd0 118 display_menu(lcd, gamepad);
lewisgw 12:ebaefda53dd0 119 } else {
lewisgw 12:ebaefda53dd0 120 display_controls(lcd, gamepad);
lewisgw 12:ebaefda53dd0 121 }
lewisgw 9:fff2009f826e 122 }
lewisgw 9:fff2009f826e 123
lewisgw 13:bcf6bb69c597 124 void Menu::set_input(bool start, bool back, bool x) {
lewisgw 21:20478f086bc2 125 // 0, 1, 2, 3 have been assigned to each relevent input combination.
lewisgw 26:4253656c0755 126 if (!start && !back && !x) { // Nothing is pressed.
lewisgw 26:4253656c0755 127 _menu_input = 0;
lewisgw 26:4253656c0755 128 } else if (!start && back) { // Only back is pressed.
lewisgw 26:4253656c0755 129 _menu_input = 1;
lewisgw 26:4253656c0755 130 } else if (start && !back) { // Only start is pressed.
lewisgw 26:4253656c0755 131 _menu_input = 2;
lewisgw 26:4253656c0755 132 } else if (x) { // Only X is pressed.
lewisgw 26:4253656c0755 133 _menu_input = 3;
lewisgw 12:ebaefda53dd0 134 }
lewisgw 12:ebaefda53dd0 135 }
lewisgw 12:ebaefda53dd0 136
lewisgw 12:ebaefda53dd0 137 void Menu::run_game(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 138 _controller.run_game_engine(lcd, gamepad);
lewisgw 11:b66170249a26 139 }
lewisgw 11:b66170249a26 140
lewisgw 13:bcf6bb69c597 141 void Menu::display_controls(N5110 &lcd, Gamepad &gamepad) {
lewisgw 19:f35887b14c23 142 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 143 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 26:4253656c0755 144 lcd.drawLine(0,24,84,24,FILL_BLACK);
lewisgw 26:4253656c0755 145 lcd.drawLine(0,30,84,30,FILL_BLACK);
lewisgw 13:bcf6bb69c597 146 lcd.printString("JOYSTICK:",0,0);
lewisgw 26:4253656c0755 147 lcd.printString("-Go Left/Right",0,1);
lewisgw 26:4253656c0755 148 lcd.printString("-Down to Duck",0,2);
lewisgw 26:4253656c0755 149 lcd.printString("Collect Coins!",0,5);
lewisgw 26:4253656c0755 150 lcd.printString("A:",0,3);
lewisgw 26:4253656c0755 151 lcd.printString("-Jump",0,4);
lewisgw 20:a8cad4e044ea 152 play_tone(gamepad);
lewisgw 13:bcf6bb69c597 153 }
lewisgw 12:ebaefda53dd0 154
lewisgw 12:ebaefda53dd0 155 void Menu::display_menu(N5110 &lcd, Gamepad &gamepad) {
lewisgw 19:f35887b14c23 156 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 157 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 19:f35887b14c23 158 lcd.drawLine(0,24,84,24,FILL_BLACK);
lewisgw 18:304700b5d8f8 159 lcd.printString("SKATER",24,0);
lewisgw 13:bcf6bb69c597 160 lcd.printString("START- Play!",0,1);
lewisgw 18:304700b5d8f8 161 lcd.printString("X- Controls",0,2);
lewisgw 18:304700b5d8f8 162 lcd.drawSprite(1,25,23,80,(int*)menu_sprite);
lewisgw 20:a8cad4e044ea 163 play_tone(gamepad);
lewisgw 20:a8cad4e044ea 164 }
lewisgw 20:a8cad4e044ea 165
lewisgw 20:a8cad4e044ea 166 void Menu::play_tone(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 167 // Plays a musical tune in 3/4 based on two chords, A and F in Aminor.
lewisgw 21:20478f086bc2 168 // It switches between each chord every 12 game loops via chord counter.
lewisgw 20:a8cad4e044ea 169 _tone_flag = !_tone_flag;
lewisgw 20:a8cad4e044ea 170 _tone_counter++;
lewisgw 21:20478f086bc2 171 _chord_counter++;
lewisgw 21:20478f086bc2 172 if (_chord_counter < 12) {
lewisgw 21:20478f086bc2 173 play_chord_a(gamepad);
lewisgw 20:a8cad4e044ea 174 } else {
lewisgw 21:20478f086bc2 175 if (_chord_counter == 24) _chord_counter = 0;
lewisgw 21:20478f086bc2 176 play_chord_b(gamepad);
lewisgw 20:a8cad4e044ea 177 }
lewisgw 21:20478f086bc2 178 wait(0.14); // Determines how fast the musical tune is played.
lewisgw 20:a8cad4e044ea 179 }
lewisgw 20:a8cad4e044ea 180
lewisgw 21:20478f086bc2 181 void Menu::play_chord_a(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 182 // For each chord, the first set of two notes is played for 5 game loops and
lewisgw 21:20478f086bc2 183 // the second set for 2 game loops via tone counter.
lewisgw 21:20478f086bc2 184 // Each note is alternated every game loop via tone flag.
lewisgw 21:20478f086bc2 185 if (_tone_counter < 5) {
lewisgw 21:20478f086bc2 186 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 187 gamepad.tone(220, 0.5);
lewisgw 20:a8cad4e044ea 188 } else {
lewisgw 20:a8cad4e044ea 189 gamepad.tone(440, 0.1);
lewisgw 20:a8cad4e044ea 190 }
lewisgw 20:a8cad4e044ea 191 } else {
lewisgw 21:20478f086bc2 192 if (_tone_counter == 6) _tone_counter = 0;
lewisgw 21:20478f086bc2 193 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 194 gamepad.tone(174.61, 0.1);
lewisgw 20:a8cad4e044ea 195 } else {
lewisgw 20:a8cad4e044ea 196 gamepad.tone(246.94, 0.1);
lewisgw 20:a8cad4e044ea 197 }
lewisgw 20:a8cad4e044ea 198 }
lewisgw 20:a8cad4e044ea 199 }
lewisgw 20:a8cad4e044ea 200
lewisgw 21:20478f086bc2 201 void Menu::play_chord_b(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 202 if (_tone_counter < 5) {
lewisgw 21:20478f086bc2 203 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 204 gamepad.tone(174.61, 0.5);
lewisgw 20:a8cad4e044ea 205 } else {
lewisgw 20:a8cad4e044ea 206 gamepad.tone(349.23, 0.1);
lewisgw 20:a8cad4e044ea 207 }
lewisgw 20:a8cad4e044ea 208 } else {
lewisgw 21:20478f086bc2 209 if (_tone_counter == 6) _tone_counter = 0;
lewisgw 21:20478f086bc2 210 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 211 gamepad.tone(659.25, 0.1);
lewisgw 20:a8cad4e044ea 212 } else {
lewisgw 20:a8cad4e044ea 213 gamepad.tone(220, 0.1);
lewisgw 20:a8cad4e044ea 214 }
lewisgw 20:a8cad4e044ea 215 }
lewisgw 20:a8cad4e044ea 216 }