ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Tue May 07 17:21:00 2019 +0000
Revision:
29:bdc4138b5171
Parent:
27:c920c5ec31af
Final Submission. I have read and agreed with the Statement of Academic Integrity.

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 27:c920c5ec31af 78 // menu and display controls, {output,{a,b,c,d}} where a,b,c,d are inputs.
lewisgw 27:c920c5ec31af 79 // The outputs have been assigned to 0,1,2.
lewisgw 27:c920c5ec31af 80 // There are four different relevant 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 27:c920c5ec31af 88 // Constructor and destructor.
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 29:bdc4138b5171 94 // Starting setup of menu.
lewisgw 21:20478f086bc2 95 _state = 1; // Starting state is the menu.
lewisgw 12:ebaefda53dd0 96 _controller.init();
lewisgw 26:4253656c0755 97 // Initialise counters for musical tune.
lewisgw 20:a8cad4e044ea 98 _tone_flag = false;
lewisgw 20:a8cad4e044ea 99 _tone_counter = 0;
lewisgw 21:20478f086bc2 100 _chord_counter = 0;
lewisgw 12:ebaefda53dd0 101 }
lewisgw 12:ebaefda53dd0 102
lewisgw 12:ebaefda53dd0 103 void Menu::run(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 104 set_input(gamepad.check_event(Gamepad::START_PRESSED),
lewisgw 13:bcf6bb69c597 105 gamepad.check_event(Gamepad::BACK_PRESSED),
lewisgw 13:bcf6bb69c597 106 gamepad.check_event(Gamepad::X_PRESSED));
lewisgw 21:20478f086bc2 107 // Select the current output, execute that output via the output function and
lewisgw 21:20478f086bc2 108 // update to the next state depending on the input.
lewisgw 12:ebaefda53dd0 109 _output = _fsm[_state].output;
lewisgw 12:ebaefda53dd0 110 output(lcd, gamepad);
lewisgw 12:ebaefda53dd0 111 _state = _fsm[_state].next_state[_menu_input];
lewisgw 12:ebaefda53dd0 112 }
lewisgw 12:ebaefda53dd0 113
lewisgw 12:ebaefda53dd0 114 void Menu::output(N5110 &lcd, Gamepad &gamepad) {
lewisgw 27:c920c5ec31af 115 // 0, 1 and 2 have been assigned to the output of each state respectively.
lewisgw 12:ebaefda53dd0 116 if (_output == 0) {
lewisgw 29:bdc4138b5171 117 run_game(lcd, gamepad); // Runs the main game loop.
lewisgw 12:ebaefda53dd0 118 } else if (_output == 1) {
lewisgw 29:bdc4138b5171 119 display_menu(lcd, gamepad); // Displays the main menu.
lewisgw 12:ebaefda53dd0 120 } else {
lewisgw 29:bdc4138b5171 121 display_controls(lcd, gamepad); // Displayes the control page.
lewisgw 12:ebaefda53dd0 122 }
lewisgw 9:fff2009f826e 123 }
lewisgw 9:fff2009f826e 124
lewisgw 13:bcf6bb69c597 125 void Menu::set_input(bool start, bool back, bool x) {
lewisgw 27:c920c5ec31af 126 // 0, 1, 2, 3 have been assigned to each relevant input combination.
lewisgw 26:4253656c0755 127 if (!start && !back && !x) { // Nothing is pressed.
lewisgw 26:4253656c0755 128 _menu_input = 0;
lewisgw 26:4253656c0755 129 } else if (!start && back) { // Only back is pressed.
lewisgw 26:4253656c0755 130 _menu_input = 1;
lewisgw 26:4253656c0755 131 } else if (start && !back) { // Only start is pressed.
lewisgw 26:4253656c0755 132 _menu_input = 2;
lewisgw 26:4253656c0755 133 } else if (x) { // Only X is pressed.
lewisgw 26:4253656c0755 134 _menu_input = 3;
lewisgw 12:ebaefda53dd0 135 }
lewisgw 12:ebaefda53dd0 136 }
lewisgw 12:ebaefda53dd0 137
lewisgw 12:ebaefda53dd0 138 void Menu::run_game(N5110 &lcd, Gamepad &gamepad) {
lewisgw 12:ebaefda53dd0 139 _controller.run_game_engine(lcd, gamepad);
lewisgw 11:b66170249a26 140 }
lewisgw 11:b66170249a26 141
lewisgw 13:bcf6bb69c597 142 void Menu::display_controls(N5110 &lcd, Gamepad &gamepad) {
lewisgw 29:bdc4138b5171 143 // Print lines for aesthetics, and print controls text.
lewisgw 19:f35887b14c23 144 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 145 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 26:4253656c0755 146 lcd.drawLine(0,24,84,24,FILL_BLACK);
lewisgw 26:4253656c0755 147 lcd.drawLine(0,30,84,30,FILL_BLACK);
lewisgw 13:bcf6bb69c597 148 lcd.printString("JOYSTICK:",0,0);
lewisgw 26:4253656c0755 149 lcd.printString("-Go Left/Right",0,1);
lewisgw 26:4253656c0755 150 lcd.printString("-Down to Duck",0,2);
lewisgw 26:4253656c0755 151 lcd.printString("Collect Coins!",0,5);
lewisgw 26:4253656c0755 152 lcd.printString("A:",0,3);
lewisgw 26:4253656c0755 153 lcd.printString("-Jump",0,4);
lewisgw 29:bdc4138b5171 154 play_tone(gamepad); // Play the tune.
lewisgw 13:bcf6bb69c597 155 }
lewisgw 12:ebaefda53dd0 156
lewisgw 12:ebaefda53dd0 157 void Menu::display_menu(N5110 &lcd, Gamepad &gamepad) {
lewisgw 29:bdc4138b5171 158 // Print lines and sprite for aesthetics, and print menu text.
lewisgw 19:f35887b14c23 159 lcd.drawLine(0,0,84,0,FILL_BLACK);
lewisgw 19:f35887b14c23 160 lcd.drawLine(0,6,84,6,FILL_BLACK);
lewisgw 19:f35887b14c23 161 lcd.drawLine(0,24,84,24,FILL_BLACK);
lewisgw 18:304700b5d8f8 162 lcd.printString("SKATER",24,0);
lewisgw 13:bcf6bb69c597 163 lcd.printString("START- Play!",0,1);
lewisgw 18:304700b5d8f8 164 lcd.printString("X- Controls",0,2);
lewisgw 18:304700b5d8f8 165 lcd.drawSprite(1,25,23,80,(int*)menu_sprite);
lewisgw 29:bdc4138b5171 166 play_tone(gamepad); // Play the tune.
lewisgw 20:a8cad4e044ea 167 }
lewisgw 20:a8cad4e044ea 168
lewisgw 20:a8cad4e044ea 169 void Menu::play_tone(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 170 // Plays a musical tune in 3/4 based on two chords, A and F in Aminor.
lewisgw 21:20478f086bc2 171 // It switches between each chord every 12 game loops via chord counter.
lewisgw 20:a8cad4e044ea 172 _tone_flag = !_tone_flag;
lewisgw 20:a8cad4e044ea 173 _tone_counter++;
lewisgw 21:20478f086bc2 174 _chord_counter++;
lewisgw 21:20478f086bc2 175 if (_chord_counter < 12) {
lewisgw 21:20478f086bc2 176 play_chord_a(gamepad);
lewisgw 20:a8cad4e044ea 177 } else {
lewisgw 21:20478f086bc2 178 if (_chord_counter == 24) _chord_counter = 0;
lewisgw 21:20478f086bc2 179 play_chord_b(gamepad);
lewisgw 20:a8cad4e044ea 180 }
lewisgw 21:20478f086bc2 181 wait(0.14); // Determines how fast the musical tune is played.
lewisgw 20:a8cad4e044ea 182 }
lewisgw 20:a8cad4e044ea 183
lewisgw 21:20478f086bc2 184 void Menu::play_chord_a(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 185 // For each chord, the first set of two notes is played for 5 game loops and
lewisgw 21:20478f086bc2 186 // the second set for 2 game loops via tone counter.
lewisgw 21:20478f086bc2 187 // Each note is alternated every game loop via tone flag.
lewisgw 21:20478f086bc2 188 if (_tone_counter < 5) {
lewisgw 21:20478f086bc2 189 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 190 gamepad.tone(220, 0.5);
lewisgw 20:a8cad4e044ea 191 } else {
lewisgw 20:a8cad4e044ea 192 gamepad.tone(440, 0.1);
lewisgw 20:a8cad4e044ea 193 }
lewisgw 20:a8cad4e044ea 194 } else {
lewisgw 21:20478f086bc2 195 if (_tone_counter == 6) _tone_counter = 0;
lewisgw 21:20478f086bc2 196 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 197 gamepad.tone(174.61, 0.1);
lewisgw 20:a8cad4e044ea 198 } else {
lewisgw 20:a8cad4e044ea 199 gamepad.tone(246.94, 0.1);
lewisgw 20:a8cad4e044ea 200 }
lewisgw 20:a8cad4e044ea 201 }
lewisgw 20:a8cad4e044ea 202 }
lewisgw 20:a8cad4e044ea 203
lewisgw 21:20478f086bc2 204 void Menu::play_chord_b(Gamepad &gamepad) {
lewisgw 29:bdc4138b5171 205 // Same as play_chord_a, just different notes.
lewisgw 21:20478f086bc2 206 if (_tone_counter < 5) {
lewisgw 21:20478f086bc2 207 if (_tone_flag) {
lewisgw 29:bdc4138b5171 208 gamepad.tone(174.61, 0.5);
lewisgw 20:a8cad4e044ea 209 } else {
lewisgw 20:a8cad4e044ea 210 gamepad.tone(349.23, 0.1);
lewisgw 20:a8cad4e044ea 211 }
lewisgw 20:a8cad4e044ea 212 } else {
lewisgw 21:20478f086bc2 213 if (_tone_counter == 6) _tone_counter = 0;
lewisgw 21:20478f086bc2 214 if (_tone_flag) {
lewisgw 20:a8cad4e044ea 215 gamepad.tone(659.25, 0.1);
lewisgw 20:a8cad4e044ea 216 } else {
lewisgw 20:a8cad4e044ea 217 gamepad.tone(220, 0.1);
lewisgw 20:a8cad4e044ea 218 }
lewisgw 20:a8cad4e044ea 219 }
lewisgw 20:a8cad4e044ea 220 }