ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon May 07 00:10:25 2018 +0000
Revision:
11:b25874e7efe4
Parent:
10:279d3775d52c
Child:
12:d3eef5ea3f43
Difficulty is now selectable, uses FPS to speed up game. Adaptive difficulty changes speed depending on score

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Andrew_M 0:66e5b37c127e 1 /*
Andrew_M 0:66e5b37c127e 2 ELEC2645 Embedded Systems Project
Andrew_M 0:66e5b37c127e 3 School of Electronic & Electrical Engineering
Andrew_M 0:66e5b37c127e 4 University of Leeds
Andrew_M 2:9ca5e1c221c3 5 Name: Andrew Moore
Andrew_M 2:9ca5e1c221c3 6 Username: el16ajm
Andrew_M 2:9ca5e1c221c3 7 Student ID Number: 201042893
Andrew_M 8:9d01fd4a63ad 8 Date:
Andrew_M 0:66e5b37c127e 9 */
Andrew_M 0:66e5b37c127e 10
Andrew_M 0:66e5b37c127e 11 #include "mbed.h"
Andrew_M 1:a14415de3ad5 12 #include "Gamepad.h"
Andrew_M 1:a14415de3ad5 13 #include "N5110.h"
Andrew_M 1:a14415de3ad5 14 #include "Engine.h"
Andrew_M 9:fe86ddbf7799 15 #include "Menu.h"
Andrew_M 0:66e5b37c127e 16
Andrew_M 1:a14415de3ad5 17 /////////////// structs /////////////////
Andrew_M 1:a14415de3ad5 18 struct UserInput {
Andrew_M 1:a14415de3ad5 19 Direction d;
Andrew_M 1:a14415de3ad5 20 };
Andrew_M 1:a14415de3ad5 21
Andrew_M 1:a14415de3ad5 22 /////////////// objects ///////////////
Andrew_M 1:a14415de3ad5 23 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Andrew_M 1:a14415de3ad5 24 Gamepad pad;
Andrew_M 1:a14415de3ad5 25 Engine gameEngine;
Andrew_M 9:fe86ddbf7799 26 Menu mainMenu;
Andrew_M 0:66e5b37c127e 27
Andrew_M 1:a14415de3ad5 28 ///////////// prototypes ///////////////
Andrew_M 1:a14415de3ad5 29 void init();
Andrew_M 1:a14415de3ad5 30 void update_game(UserInput input);
Andrew_M 9:fe86ddbf7799 31 void renderGame();
Andrew_M 9:fe86ddbf7799 32 void renderMenu();
Andrew_M 1:a14415de3ad5 33 void welcome();
Andrew_M 10:279d3775d52c 34 void transition();
Andrew_M 11:b25874e7efe4 35 float setDif();
Andrew_M 1:a14415de3ad5 36
Andrew_M 1:a14415de3ad5 37 ///////////// functions ////////////////
Andrew_M 1:a14415de3ad5 38 int main()
Andrew_M 10:279d3775d52c 39 {
Andrew_M 1:a14415de3ad5 40 init();
Andrew_M 1:a14415de3ad5 41 welcome();
Andrew_M 8:9d01fd4a63ad 42
Andrew_M 10:279d3775d52c 43 transition();
Andrew_M 11:b25874e7efe4 44
Andrew_M 2:9ca5e1c221c3 45 // game loop - read input, update the game state and render the display
Andrew_M 2:9ca5e1c221c3 46 while (1) {
Andrew_M 10:279d3775d52c 47 if (!mainMenu.started()) { //menu logic and rendering
Andrew_M 10:279d3775d52c 48 mainMenu.read_input(pad);
Andrew_M 10:279d3775d52c 49 mainMenu.update();
Andrew_M 10:279d3775d52c 50 renderMenu();
Andrew_M 10:279d3775d52c 51 } else { //game logic and rendering
Andrew_M 9:fe86ddbf7799 52 gameEngine.read_input(pad);
Andrew_M 9:fe86ddbf7799 53 gameEngine.update(pad);
Andrew_M 9:fe86ddbf7799 54 renderGame();
Andrew_M 9:fe86ddbf7799 55 }
Andrew_M 2:9ca5e1c221c3 56 }
Andrew_M 1:a14415de3ad5 57 }
Andrew_M 1:a14415de3ad5 58
Andrew_M 1:a14415de3ad5 59 void welcome()
Andrew_M 1:a14415de3ad5 60 {
Andrew_M 8:9d01fd4a63ad 61 lcd.printString(" Snake! ",0,1);
Andrew_M 1:a14415de3ad5 62 lcd.printString(" Press Start ",0,4);
Andrew_M 1:a14415de3ad5 63 lcd.refresh();
Andrew_M 8:9d01fd4a63ad 64
Andrew_M 8:9d01fd4a63ad 65 // wait flashing LEDs until start button is pressed
Andrew_M 1:a14415de3ad5 66 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
Andrew_M 1:a14415de3ad5 67 pad.leds_on();
Andrew_M 1:a14415de3ad5 68 wait(0.1);
Andrew_M 1:a14415de3ad5 69 pad.leds_off();
Andrew_M 1:a14415de3ad5 70 wait(0.1);
Andrew_M 0:66e5b37c127e 71 }
Andrew_M 9:fe86ddbf7799 72
Andrew_M 0:66e5b37c127e 73 }
Andrew_M 0:66e5b37c127e 74
Andrew_M 1:a14415de3ad5 75 void init()
Andrew_M 1:a14415de3ad5 76 {
Andrew_M 8:9d01fd4a63ad 77 // need to initialise LCD and Gamepad
Andrew_M 3:6253a2d374fa 78 gameEngine.init();
Andrew_M 1:a14415de3ad5 79 lcd.init();
Andrew_M 8:9d01fd4a63ad 80 pad.init();
Andrew_M 9:fe86ddbf7799 81 mainMenu.init();
Andrew_M 1:a14415de3ad5 82
Andrew_M 1:a14415de3ad5 83 }
Andrew_M 2:9ca5e1c221c3 84
Andrew_M 9:fe86ddbf7799 85 void renderGame()
Andrew_M 2:9ca5e1c221c3 86 {
Andrew_M 2:9ca5e1c221c3 87 // clear screen, re-draw and refresh
Andrew_M 8:9d01fd4a63ad 88 lcd.clear();
Andrew_M 2:9ca5e1c221c3 89 gameEngine.draw(lcd);
Andrew_M 2:9ca5e1c221c3 90 lcd.refresh();
Andrew_M 11:b25874e7efe4 91 wait(setDif());
Andrew_M 2:9ca5e1c221c3 92 }
Andrew_M 8:9d01fd4a63ad 93
Andrew_M 9:fe86ddbf7799 94 void renderMenu()
Andrew_M 9:fe86ddbf7799 95 {
Andrew_M 9:fe86ddbf7799 96 // clear screen, re-draw and refresh
Andrew_M 9:fe86ddbf7799 97 lcd.clear();
Andrew_M 9:fe86ddbf7799 98 mainMenu.draw(lcd);
Andrew_M 9:fe86ddbf7799 99 lcd.refresh();
Andrew_M 9:fe86ddbf7799 100 wait(1.0f/8);
Andrew_M 9:fe86ddbf7799 101 }
Andrew_M 9:fe86ddbf7799 102
Andrew_M 10:279d3775d52c 103 void transition()
Andrew_M 11:b25874e7efe4 104 {
Andrew_M 11:b25874e7efe4 105 //transition animation between modes to stop 'ghosting' of inputs
Andrew_M 10:279d3775d52c 106 for (int i = 0; i <= 11; i++) {
Andrew_M 10:279d3775d52c 107 for (int j = 0; j <= 21; j++) {
Andrew_M 10:279d3775d52c 108 lcd.drawRect(j*4,i*4,4,4,FILL_BLACK);
Andrew_M 10:279d3775d52c 109 wait(0.005);
Andrew_M 10:279d3775d52c 110 lcd.refresh();
Andrew_M 10:279d3775d52c 111 }
Andrew_M 10:279d3775d52c 112 }
Andrew_M 10:279d3775d52c 113
Andrew_M 10:279d3775d52c 114 }
Andrew_M 10:279d3775d52c 115
Andrew_M 11:b25874e7efe4 116 float setDif()
Andrew_M 11:b25874e7efe4 117 {
Andrew_M 11:b25874e7efe4 118 int _dif = mainMenu.getDif();
Andrew_M 11:b25874e7efe4 119
Andrew_M 11:b25874e7efe4 120 if (_dif == 1) {
Andrew_M 11:b25874e7efe4 121 return 1.0f/4;
Andrew_M 11:b25874e7efe4 122 } else if (_dif == 2) {
Andrew_M 11:b25874e7efe4 123 return 1.0f/8;
Andrew_M 11:b25874e7efe4 124 } else if (_dif == 3) {
Andrew_M 11:b25874e7efe4 125 return 1.0f/12;
Andrew_M 11:b25874e7efe4 126 } else if (_dif == 1) {
Andrew_M 11:b25874e7efe4 127 int _delta = gameEngine.getScore();
Andrew_M 11:b25874e7efe4 128 if (_delta < 38) {
Andrew_M 11:b25874e7efe4 129 return ((1.0f/(_delta/2)) + 6);
Andrew_M 11:b25874e7efe4 130 } else {
Andrew_M 11:b25874e7efe4 131 return (1.0f/25);
Andrew_M 11:b25874e7efe4 132 }
Andrew_M 11:b25874e7efe4 133 }
Andrew_M 11:b25874e7efe4 134 return 1.0f;
Andrew_M 11:b25874e7efe4 135 }