Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Menu/Menu.cpp@20:a8cad4e044ea, 2019-04-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |