Kaif Kutchwala 201267448 ELEC2645 Project

Dependencies:   mbed

Committer:
KaifK
Date:
Tue May 26 15:50:46 2020 +0000
Revision:
31:e1f80d181779
Parent:
30:abe30c123470
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KaifK 0:e47aa16004e6 1 /*
KaifK 28:215e8327d4e6 2 ELEC2645 Embedded Systems Project
KaifK 28:215e8327d4e6 3 School of Electronic & Electrical Engineering
KaifK 28:215e8327d4e6 4 University of Leeds
KaifK 28:215e8327d4e6 5 Name: Kaif Kutchwala
KaifK 28:215e8327d4e6 6 Username: el18kk
KaifK 28:215e8327d4e6 7 Student ID Number: 201267448
KaifK 28:215e8327d4e6 8 Date: May 2020
KaifK 28:215e8327d4e6 9 Game: Shoot!
KaifK 0:e47aa16004e6 10 */
KaifK 0:e47aa16004e6 11
KaifK 0:e47aa16004e6 12 #include "mbed.h"
KaifK 0:e47aa16004e6 13 #include "Gamepad.h"
KaifK 0:e47aa16004e6 14 #include "N5110.h"
KaifK 3:f86c1cf90d0d 15 #include "Ball.h"
KaifK 3:f86c1cf90d0d 16 #include "Splash.h"
KaifK 4:08a0ff6668df 17 #include "Game.h"
KaifK 21:d5b1160f349f 18 #include "test.h"
KaifK 18:100e7d3509b5 19 #include "Instructions.h"
KaifK 18:100e7d3509b5 20 #include "Sprites.h"
KaifK 0:e47aa16004e6 21
KaifK 4:08a0ff6668df 22 //objects
KaifK 0:e47aa16004e6 23 Gamepad pad;
KaifK 0:e47aa16004e6 24 N5110 lcd;
KaifK 9:e6566d09f087 25 Ball ball(lcd);
KaifK 9:e6566d09f087 26 Splash splash(lcd, ball);
KaifK 9:e6566d09f087 27 Game game(lcd, pad, ball);
KaifK 18:100e7d3509b5 28 Instructions instruction(lcd, pad, ball, game);
KaifK 25:467d8fd0fec4 29
KaifK 5:ed71996c0534 30 //functions
KaifK 16:1f196a0e12be 31 void init();
KaifK 5:ed71996c0534 32 void display_menu();
KaifK 17:2fbe40177b9c 33 void game_loop();
KaifK 16:1f196a0e12be 34 void how_to();
KaifK 16:1f196a0e12be 35 void display_settings();
KaifK 25:467d8fd0fec4 36
KaifK 4:08a0ff6668df 37 //variables
KaifK 18:100e7d3509b5 38 int page = 1;
KaifK 2:21973e665a32 39
KaifK 18:100e7d3509b5 40 int main() {
KaifK 16:1f196a0e12be 41 init();
KaifK 18:100e7d3509b5 42 while (1) {
KaifK 11:59119247dd68 43 //ball.level_loop();
KaifK 4:08a0ff6668df 44 display_menu();
KaifK 28:215e8327d4e6 45 page = 1; //reset instructions page
KaifK 4:08a0ff6668df 46 if (pad.A_pressed()) {
KaifK 28:215e8327d4e6 47 game_loop(); //if A is pressed, play game
KaifK 18:100e7d3509b5 48 } else if (pad.B_pressed()) {
KaifK 25:467d8fd0fec4 49 wait(0.3); //debounce
KaifK 28:215e8327d4e6 50 while (!pad.B_pressed()) { how_to(); } //if B, show instructions
KaifK 25:467d8fd0fec4 51 wait(0.3);
KaifK 18:100e7d3509b5 52 pad.reset_buttons();
KaifK 28:215e8327d4e6 53 pad.leds(0.0);
KaifK 18:100e7d3509b5 54 } else if (pad.X_pressed()) {
KaifK 28:215e8327d4e6 55 while (!pad.B_pressed()) { display_settings(); } // if C, settings
KaifK 25:467d8fd0fec4 56 wait(0.3);
KaifK 21:d5b1160f349f 57 pad.reset_buttons();
KaifK 28:215e8327d4e6 58 } else if (pad.Y_pressed()) { // if Y, turn off lcd and leds
KaifK 6:09a555c0d997 59 lcd.turnOff();
KaifK 6:09a555c0d997 60 pad.leds(0.0);
KaifK 6:09a555c0d997 61 }
KaifK 4:08a0ff6668df 62 }
KaifK 4:08a0ff6668df 63 }
KaifK 28:215e8327d4e6 64 void init() { //initialise all objects, display splash screen and intro
KaifK 21:d5b1160f349f 65 run_all_tests();
KaifK 16:1f196a0e12be 66 lcd.init();
KaifK 22:76bb0f52be8b 67 pad.init();
KaifK 16:1f196a0e12be 68 lcd.setContrast(0.5);
KaifK 16:1f196a0e12be 69 lcd.backLightOn();
KaifK 18:100e7d3509b5 70 splash.displayInfo();
KaifK 18:100e7d3509b5 71 splash.playIntro();
KaifK 22:76bb0f52be8b 72 game.init();
KaifK 25:467d8fd0fec4 73 }
KaifK 18:100e7d3509b5 74 void display_menu() {
KaifK 9:e6566d09f087 75 splash.drawLogo(13, 0);
KaifK 4:08a0ff6668df 76 lcd.printString("Play", 2, 2);
KaifK 4:08a0ff6668df 77 lcd.printString("How-To?", 2, 3);
KaifK 4:08a0ff6668df 78 lcd.printString("Settings", 2, 4);
KaifK 4:08a0ff6668df 79 lcd.printString("Exit", 2, 5);
KaifK 25:467d8fd0fec4 80 lcd.drawSprite(28, 15, 9, 9, (int * ) a_button);
KaifK 25:467d8fd0fec4 81 lcd.drawSprite(45, 23, 9, 9, (int * ) b_button);
KaifK 25:467d8fd0fec4 82 lcd.drawSprite(52, 31, 9, 9, (int * ) x_button);
KaifK 25:467d8fd0fec4 83 lcd.drawSprite(28, 39, 9, 9, (int * ) y_button);
KaifK 28:215e8327d4e6 84 // displaying highscore
KaifK 25:467d8fd0fec4 85 lcd.drawSprite(65, 21, 9, 15, (int * ) highscore_icon);
KaifK 16:1f196a0e12be 86 lcd.drawRect(65, 30, 15, 12, FILL_TRANSPARENT);
KaifK 16:1f196a0e12be 87 int highscore = game.get_highscore();
KaifK 16:1f196a0e12be 88 char buffer[12];
KaifK 25:467d8fd0fec4 89 sprintf(buffer, "%d", highscore);
KaifK 25:467d8fd0fec4 90 lcd.printString(buffer, 67, 4);
KaifK 15:5bf3f951d337 91 lcd.refresh();
KaifK 15:5bf3f951d337 92 wait(0.1);
KaifK 16:1f196a0e12be 93 lcd.clear();
KaifK 16:1f196a0e12be 94 }
KaifK 17:2fbe40177b9c 95 void game_loop() {
KaifK 29:532e5c371be4 96 char buffer_score[14];
KaifK 29:532e5c371be4 97 char buffer_high_score[14];
KaifK 28:215e8327d4e6 98 game.init(); //initialise
KaifK 17:2fbe40177b9c 99 wait(0.2); //debounce
KaifK 28:215e8327d4e6 100 game.play(); //play game
KaifK 31:e1f80d181779 101 //////////////////// game has now ended //////////////////////////////////////
KaifK 28:215e8327d4e6 102 lcd.clear(); //clear screen once game is over and display apt message
KaifK 29:532e5c371be4 103 // store player score and top score in buffer
KaifK 29:532e5c371be4 104 sprintf(buffer_score, "Your Score: %d", game.get_score());
KaifK 29:532e5c371be4 105 sprintf(buffer_high_score, "Top Score: %d", game.get_highscore());
KaifK 30:abe30c123470 106 lcd.printString("GAME OVER", 15, 1);
KaifK 29:532e5c371be4 107 lcd.printString(buffer_score,0,3);
KaifK 29:532e5c371be4 108 lcd.printString(buffer_high_score,0,4);
KaifK 17:2fbe40177b9c 109 lcd.refresh();
KaifK 28:215e8327d4e6 110 game.playGoalSound(3); // game over sound effect
KaifK 29:532e5c371be4 111 wait(3);
KaifK 17:2fbe40177b9c 112 pad.reset_buttons(); //to ensure no accidental selection on menu
KaifK 17:2fbe40177b9c 113 }
KaifK 16:1f196a0e12be 114 void how_to() {
KaifK 20:c697902b844f 115 pad.leds(0.0);
KaifK 25:467d8fd0fec4 116 if (pad.get_direction() == N) {
KaifK 25:467d8fd0fec4 117 page--;
KaifK 25:467d8fd0fec4 118 } else if (pad.get_direction() == S || page == 3 || page == 4) {
KaifK 28:215e8327d4e6 119 page++; //pages 3 and 4 don't need scrolling so increase page number
KaifK 25:467d8fd0fec4 120 }
KaifK 25:467d8fd0fec4 121 if (page > 7) {
KaifK 28:215e8327d4e6 122 page = 7; //only 7 pages
KaifK 25:467d8fd0fec4 123 }
KaifK 25:467d8fd0fec4 124 if (page < 1) {
KaifK 25:467d8fd0fec4 125 page = 1;
KaifK 25:467d8fd0fec4 126 }
KaifK 18:100e7d3509b5 127 instruction.set_page(page);
KaifK 28:215e8327d4e6 128 instruction.display(); //display page
KaifK 18:100e7d3509b5 129 wait(0.2);
KaifK 16:1f196a0e12be 130 }
KaifK 16:1f196a0e12be 131 void display_settings() {
KaifK 25:467d8fd0fec4 132 lcd.printString("Settings", 20, 0);
KaifK 25:467d8fd0fec4 133 lcd.printString("Set Contrast", 0, 1);
KaifK 25:467d8fd0fec4 134 lcd.printString("using Pot 1", 0, 2);
KaifK 25:467d8fd0fec4 135 lcd.printString("Hit B to Exit", 0, 5);
KaifK 16:1f196a0e12be 136 lcd.drawRect(0, 24, 84, 8, FILL_TRANSPARENT);
KaifK 28:215e8327d4e6 137 float pot_1_val = pad.read_pot1(); // read pot 1 value
KaifK 28:215e8327d4e6 138 //printf("POT 1 = %.2f \n", pot_1_val);
KaifK 28:215e8327d4e6 139 //fill bar proportionally to pot 1 value
KaifK 28:215e8327d4e6 140 lcd.drawRect(0, 24, (int)(84 * pot_1_val), 8, FILL_BLACK);
KaifK 28:215e8327d4e6 141 lcd.setContrast(pot_1_val); //set contrast using pot 1 value
KaifK 16:1f196a0e12be 142 lcd.refresh();
KaifK 16:1f196a0e12be 143 wait_ms(100);
KaifK 16:1f196a0e12be 144 lcd.clear();
KaifK 25:467d8fd0fec4 145 }