ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Sat Apr 20 14:46:50 2019 +0000
Revision:
21:20478f086bc2
Parent:
20:a8cad4e044ea
Child:
26:4253656c0755
Fully documented and commented all classes and functions

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