Minigame based on Nucleo F103RB STM32F103RBT6 microcontroller with mBed Application shield

Dependencies:   C12832 LM75B MMA7660 mbed

Fork of apps-shield-pots by Chris Styles

- One player - Apple to collect - Monster to avoid - 3 life - 5 ammo - Dynamic difficulty

Playability : Move with accelerometer Shoot with joystick Notifications with RBG LED/Speaker

4 applicatives view - Menu - Ingame - Pause (press fire 2 seconds) - Game over

Have fun

Committer:
Laphaze
Date:
Mon Jul 04 11:20:37 2016 +0000
Revision:
5:f11bddc1baf0
Parent:
4:f0eb984c583d
Final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Laphaze 5:f11bddc1baf0 1 /*
Laphaze 5:f11bddc1baf0 2 _ _ _____ _ _
Laphaze 5:f11bddc1baf0 3 / \ _ __ _ __ | | ___ | ___(_)_ __ __| | ___ _ __
Laphaze 5:f11bddc1baf0 4 / _ \ | '_ \| '_ \| |/ _ \ | |_ | | '_ \ / _` |/ _ \ '__|
Laphaze 5:f11bddc1baf0 5 / ___ \| |_) | |_) | | __/ | _| | | | | | (_| | __/ |
Laphaze 5:f11bddc1baf0 6 /_/ \_\ .__/| .__/|_|\___| |_| |_|_| |_|\__,_|\___|_|
Laphaze 5:f11bddc1baf0 7 |_| |_|
Laphaze 5:f11bddc1baf0 8
Laphaze 5:f11bddc1baf0 9 +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+
Laphaze 5:f11bddc1baf0 10 |Will you be able to get the most apple as possible before the monster hunt you down ?|
Laphaze 5:f11bddc1baf0 11
Laphaze 5:f11bddc1baf0 12 |Tips| -> Shoot the monster with right/left joystick
Laphaze 5:f11bddc1baf0 13 -> Each 5 apple ate you level up and 2 ammo are added to your stock
Laphaze 5:f11bddc1baf0 14 -> Each 10 apple ate you gain 1 life
Laphaze 5:f11bddc1baf0 15 -> Pause the game by pressing Fire joystick 3 seconds
Laphaze 5:f11bddc1baf0 16
Laphaze 5:f11bddc1baf0 17 |Warning| -> The monster is running faster each level
Laphaze 5:f11bddc1baf0 18 +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+
Laphaze 5:f11bddc1baf0 19
Laphaze 5:f11bddc1baf0 20 */
Laphaze 5:f11bddc1baf0 21
chris 0:cca95aa94e09 22 #include "mbed.h"
Laphaze 5:f11bddc1baf0 23 #include "LM75B.h"
chris 2:989f84939300 24 #include "C12832.h"
Laphaze 5:f11bddc1baf0 25 #include <stdio.h>
Laphaze 5:f11bddc1baf0 26 #include <stdlib.h>
Laphaze 5:f11bddc1baf0 27 #include <time.h>
Laphaze 5:f11bddc1baf0 28 #include <string>
Laphaze 5:f11bddc1baf0 29 #include <vector>
chris 0:cca95aa94e09 30
Laphaze 5:f11bddc1baf0 31 class Apple
Laphaze 5:f11bddc1baf0 32 {
Laphaze 5:f11bddc1baf0 33 public:
Laphaze 5:f11bddc1baf0 34 float x;
Laphaze 5:f11bddc1baf0 35 float y;
Laphaze 5:f11bddc1baf0 36 };
Laphaze 5:f11bddc1baf0 37
Laphaze 5:f11bddc1baf0 38 class Player
Laphaze 5:f11bddc1baf0 39 {
Laphaze 5:f11bddc1baf0 40 public:
Laphaze 5:f11bddc1baf0 41 float x;
Laphaze 5:f11bddc1baf0 42 float y;
Laphaze 5:f11bddc1baf0 43 int life;
Laphaze 5:f11bddc1baf0 44 int eatenApple;
Laphaze 5:f11bddc1baf0 45 int mobKilled;
Laphaze 5:f11bddc1baf0 46 int ammo;
Laphaze 5:f11bddc1baf0 47 bool firstSpawn;
Laphaze 5:f11bddc1baf0 48
Laphaze 5:f11bddc1baf0 49 // Default class initialization
Laphaze 5:f11bddc1baf0 50 Player() : life(3), ammo (3), firstSpawn( true ) {}
Laphaze 5:f11bddc1baf0 51 };
Laphaze 5:f11bddc1baf0 52
Laphaze 5:f11bddc1baf0 53 class Monster
Laphaze 5:f11bddc1baf0 54 {
Laphaze 5:f11bddc1baf0 55 public:
Laphaze 5:f11bddc1baf0 56 float x;
Laphaze 5:f11bddc1baf0 57 float y;
Laphaze 5:f11bddc1baf0 58 bool killed;
Laphaze 5:f11bddc1baf0 59
Laphaze 5:f11bddc1baf0 60 Monster() : killed( false ) {}
Laphaze 5:f11bddc1baf0 61 };
Laphaze 5:f11bddc1baf0 62
Laphaze 5:f11bddc1baf0 63 class Game
Laphaze 5:f11bddc1baf0 64 {
Laphaze 5:f11bddc1baf0 65 public:
Laphaze 5:f11bddc1baf0 66 bool started;
Laphaze 5:f11bddc1baf0 67 bool firstStart;
Laphaze 5:f11bddc1baf0 68 bool paused;
Laphaze 5:f11bddc1baf0 69 int level;
Laphaze 5:f11bddc1baf0 70
Laphaze 5:f11bddc1baf0 71 // Default class initialization
Laphaze 5:f11bddc1baf0 72 Game() : started( true ), firstStart( true ), paused( false ), level (1) {}
Laphaze 5:f11bddc1baf0 73
Laphaze 5:f11bddc1baf0 74 void RestartGame (){
Laphaze 5:f11bddc1baf0 75 started = true;
Laphaze 5:f11bddc1baf0 76 level = 1;
Laphaze 5:f11bddc1baf0 77 }
Laphaze 5:f11bddc1baf0 78 };
Laphaze 5:f11bddc1baf0 79
Laphaze 5:f11bddc1baf0 80 // LCD initialization
chris 4:f0eb984c583d 81 C12832 lcd(D11, D13, D12, D7, D10);
chris 1:e50da1f1f653 82
Laphaze 5:f11bddc1baf0 83 // Potentiometer
chris 3:100dbea70564 84 AnalogIn pot1 (A0);
chris 3:100dbea70564 85 AnalogIn pot2 (A1);
chris 0:cca95aa94e09 86
Laphaze 5:f11bddc1baf0 87 // RBG LED
Laphaze 5:f11bddc1baf0 88 DigitalOut red_led(D5);
Laphaze 5:f11bddc1baf0 89 DigitalOut blue_led(D8);
Laphaze 5:f11bddc1baf0 90 DigitalOut green_led(D9);
Laphaze 5:f11bddc1baf0 91
Laphaze 5:f11bddc1baf0 92 // JOYSTICK
Laphaze 5:f11bddc1baf0 93 DigitalIn up(A2);
Laphaze 5:f11bddc1baf0 94 DigitalIn down(A3);
Laphaze 5:f11bddc1baf0 95 DigitalIn left(A4);
Laphaze 5:f11bddc1baf0 96 DigitalIn right(A5);
Laphaze 5:f11bddc1baf0 97 DigitalIn fire(D4);
Laphaze 5:f11bddc1baf0 98
Laphaze 5:f11bddc1baf0 99 // Temperature Sensor
Laphaze 5:f11bddc1baf0 100 LM75B sensor(D14,D15);
Laphaze 5:f11bddc1baf0 101
Laphaze 5:f11bddc1baf0 102 // Speaker
Laphaze 5:f11bddc1baf0 103 PwmOut spkr(D6);
Laphaze 5:f11bddc1baf0 104
Laphaze 5:f11bddc1baf0 105 // Class initialization
Laphaze 5:f11bddc1baf0 106 Apple apple;
Laphaze 5:f11bddc1baf0 107 Player player;
Laphaze 5:f11bddc1baf0 108 Monster monster;
Laphaze 5:f11bddc1baf0 109 Game game;
Laphaze 5:f11bddc1baf0 110 std::vector<Apple> Apples;
Laphaze 5:f11bddc1baf0 111 std::vector<Monster> Monsters;
Laphaze 5:f11bddc1baf0 112
Laphaze 5:f11bddc1baf0 113 /** setLight
Laphaze 5:f11bddc1baf0 114 Util method for switching LED color
Laphaze 5:f11bddc1baf0 115
Laphaze 5:f11bddc1baf0 116 @param string color ColorName
Laphaze 5:f11bddc1baf0 117 */
Laphaze 5:f11bddc1baf0 118 void setLight (string color)
Laphaze 5:f11bddc1baf0 119 {
Laphaze 5:f11bddc1baf0 120 if(color == "blue")
Laphaze 5:f11bddc1baf0 121 {
Laphaze 5:f11bddc1baf0 122 red_led = 1;
Laphaze 5:f11bddc1baf0 123 green_led = 1;
Laphaze 5:f11bddc1baf0 124 blue_led = 0;
Laphaze 5:f11bddc1baf0 125 }
Laphaze 5:f11bddc1baf0 126 else if(color == "red")
Laphaze 5:f11bddc1baf0 127 {
Laphaze 5:f11bddc1baf0 128 red_led = 0;
Laphaze 5:f11bddc1baf0 129 green_led = 1;
Laphaze 5:f11bddc1baf0 130 blue_led = 1;
Laphaze 5:f11bddc1baf0 131 }
Laphaze 5:f11bddc1baf0 132 else if(color == "transparent")
Laphaze 5:f11bddc1baf0 133 {
Laphaze 5:f11bddc1baf0 134 red_led = 1;
Laphaze 5:f11bddc1baf0 135 green_led = 1;
Laphaze 5:f11bddc1baf0 136 blue_led = 1;
Laphaze 5:f11bddc1baf0 137 }
Laphaze 5:f11bddc1baf0 138 else {
Laphaze 5:f11bddc1baf0 139 red_led = 1;
Laphaze 5:f11bddc1baf0 140 green_led = 0;
Laphaze 5:f11bddc1baf0 141 blue_led = 1;
Laphaze 5:f11bddc1baf0 142 }
Laphaze 5:f11bddc1baf0 143 }
Laphaze 5:f11bddc1baf0 144
Laphaze 5:f11bddc1baf0 145 void PlayMusic ()
Laphaze 5:f11bddc1baf0 146 {
Laphaze 5:f11bddc1baf0 147 vector<int> sons;
Laphaze 5:f11bddc1baf0 148 spkr = 0.5;
Laphaze 5:f11bddc1baf0 149 sons.push_back(800);
Laphaze 5:f11bddc1baf0 150 sons.push_back(1100);
Laphaze 5:f11bddc1baf0 151 sons.push_back(400);
Laphaze 5:f11bddc1baf0 152 sons.push_back(1200);
Laphaze 5:f11bddc1baf0 153 sons.push_back(900);
Laphaze 5:f11bddc1baf0 154 int randomSound = rand() % 5;
Laphaze 5:f11bddc1baf0 155 int valueSound = sons.at(randomSound);
Laphaze 5:f11bddc1baf0 156 spkr.period(1.0/valueSound);
Laphaze 5:f11bddc1baf0 157 wait(0.03);
Laphaze 5:f11bddc1baf0 158 spkr = 0.0;
Laphaze 5:f11bddc1baf0 159 }
Laphaze 5:f11bddc1baf0 160 /** Shoot
Laphaze 5:f11bddc1baf0 161 Shooting Lazer, takes right or left parameter
Laphaze 5:f11bddc1baf0 162
Laphaze 5:f11bddc1baf0 163 @param string position
Laphaze 5:f11bddc1baf0 164 */
Laphaze 5:f11bddc1baf0 165 void Shoot (string position)
chris 0:cca95aa94e09 166 {
Laphaze 5:f11bddc1baf0 167 if(player.ammo != 0) // Check if player have enough ammo
Laphaze 5:f11bddc1baf0 168 {
Laphaze 5:f11bddc1baf0 169 if(position == "right") // Right shoot !
Laphaze 5:f11bddc1baf0 170 {
Laphaze 5:f11bddc1baf0 171 lcd.fillrect(player.x, player.y + 4, 127, player.y + 4, 1); // Display the laser !
Laphaze 5:f11bddc1baf0 172
Laphaze 5:f11bddc1baf0 173 int verifShootMonster = Monsters[0].y - player.y;
Laphaze 5:f11bddc1baf0 174
Laphaze 5:f11bddc1baf0 175 if(verifShootMonster < 2 && player.x < Monsters[0].x) // Check if monster got hit
Laphaze 5:f11bddc1baf0 176 {
Laphaze 5:f11bddc1baf0 177 spkr.period(3.0/300); // Moskito crush sound ! :D
Laphaze 5:f11bddc1baf0 178 spkr=0.9;
Laphaze 5:f11bddc1baf0 179 wait(0.05);
Laphaze 5:f11bddc1baf0 180 spkr.period(3.0/500);
Laphaze 5:f11bddc1baf0 181 spkr=0.9;
Laphaze 5:f11bddc1baf0 182 player.mobKilled++;
Laphaze 5:f11bddc1baf0 183 Monsters[0].killed = true; // Monster is now hidden, to allow player to get the Apple safety
Laphaze 5:f11bddc1baf0 184 }
Laphaze 5:f11bddc1baf0 185
Laphaze 5:f11bddc1baf0 186 player.ammo--;
Laphaze 5:f11bddc1baf0 187 }
Laphaze 5:f11bddc1baf0 188 if(position == "left") // Left shoot !
Laphaze 5:f11bddc1baf0 189 {
Laphaze 5:f11bddc1baf0 190 lcd.fillrect(player.x - 5, player.y + 4, 0, player.y + 4, 1); // Display the laser !
Laphaze 5:f11bddc1baf0 191
Laphaze 5:f11bddc1baf0 192 int verifShootMonster = Monsters[0].y - player.y;
Laphaze 5:f11bddc1baf0 193
Laphaze 5:f11bddc1baf0 194 if(verifShootMonster < 2 && player.x > Monsters[0].x) // Check if monster got hit
Laphaze 5:f11bddc1baf0 195 {
Laphaze 5:f11bddc1baf0 196 spkr.period(3.0/300);
Laphaze 5:f11bddc1baf0 197 spkr=0.9;
Laphaze 5:f11bddc1baf0 198 wait(0.05);
Laphaze 5:f11bddc1baf0 199 spkr.period(3.0/500);
Laphaze 5:f11bddc1baf0 200 spkr=0.9;
Laphaze 5:f11bddc1baf0 201 player.mobKilled++;
Laphaze 5:f11bddc1baf0 202 Monsters[0].killed = true; // Monster is now hidden, to allow player to get the Apple safety
Laphaze 5:f11bddc1baf0 203 }
Laphaze 5:f11bddc1baf0 204 player.ammo--;
Laphaze 5:f11bddc1baf0 205 }
Laphaze 5:f11bddc1baf0 206 }
Laphaze 5:f11bddc1baf0 207 else // Sorry, no ammo for the player :/
Laphaze 5:f11bddc1baf0 208 {
Laphaze 5:f11bddc1baf0 209 spkr.period(4.0/500);
Laphaze 5:f11bddc1baf0 210 spkr=0.9;
Laphaze 5:f11bddc1baf0 211 }
Laphaze 5:f11bddc1baf0 212 }
Laphaze 5:f11bddc1baf0 213
Laphaze 5:f11bddc1baf0 214 /** ColisionEffect
Laphaze 5:f11bddc1baf0 215 Action in case of collision with monster/apple
Laphaze 5:f11bddc1baf0 216
Laphaze 5:f11bddc1baf0 217 @param string type
Laphaze 5:f11bddc1baf0 218 */
Laphaze 5:f11bddc1baf0 219 void ColisionEffect(string type)
Laphaze 5:f11bddc1baf0 220 {
Laphaze 5:f11bddc1baf0 221 if(type == "apple")
Laphaze 5:f11bddc1baf0 222 {
Laphaze 5:f11bddc1baf0 223 player.eatenApple++;
Laphaze 5:f11bddc1baf0 224 setLight("green");
Laphaze 5:f11bddc1baf0 225
Laphaze 5:f11bddc1baf0 226 /* Resetting monster/apple to generate randomly the next ground */
Laphaze 5:f11bddc1baf0 227 Apples.clear();
Laphaze 5:f11bddc1baf0 228 Monsters.clear();
Laphaze 5:f11bddc1baf0 229
Laphaze 5:f11bddc1baf0 230 if(player.eatenApple % 10 == 0 && player.eatenApple > 9){ // Add 1 life each time player ate 10 apple
Laphaze 5:f11bddc1baf0 231 player.life++;
Laphaze 5:f11bddc1baf0 232 }
Laphaze 5:f11bddc1baf0 233 if(player.eatenApple % 5 == 0) // LEVEL UP :D
Laphaze 5:f11bddc1baf0 234 {
Laphaze 5:f11bddc1baf0 235 game.level++;
Laphaze 5:f11bddc1baf0 236 player.ammo += 2;
Laphaze 5:f11bddc1baf0 237 }
Laphaze 5:f11bddc1baf0 238
Laphaze 5:f11bddc1baf0 239 }
Laphaze 5:f11bddc1baf0 240 else if (type == "monster")
Laphaze 5:f11bddc1baf0 241 {
Laphaze 5:f11bddc1baf0 242 wait(0.5);
Laphaze 5:f11bddc1baf0 243 setLight("red");
Laphaze 5:f11bddc1baf0 244 spkr.period(1.0/300);
Laphaze 5:f11bddc1baf0 245 spkr = 0.9;
Laphaze 5:f11bddc1baf0 246 player.life--;
Laphaze 5:f11bddc1baf0 247 Monsters.clear();
Laphaze 5:f11bddc1baf0 248 Apples.clear();
Laphaze 5:f11bddc1baf0 249
Laphaze 5:f11bddc1baf0 250 if(player.life <= 0) // End of the game if player's life is equal to 0
Laphaze 5:f11bddc1baf0 251 {
Laphaze 5:f11bddc1baf0 252 game.started = false;
Laphaze 5:f11bddc1baf0 253 }
chris 0:cca95aa94e09 254 }
chris 0:cca95aa94e09 255 }
Laphaze 5:f11bddc1baf0 256
Laphaze 5:f11bddc1baf0 257 // The monster is following horizontally and vertically the player.
Laphaze 5:f11bddc1baf0 258 void MonsterTrackingPlayer()
Laphaze 5:f11bddc1baf0 259 {
Laphaze 5:f11bddc1baf0 260 if(Monsters[0].y > 14) // Teleport the monster at the top of the map
Laphaze 5:f11bddc1baf0 261 {
Laphaze 5:f11bddc1baf0 262 Monsters[0].y = 0;
Laphaze 5:f11bddc1baf0 263 }
Laphaze 5:f11bddc1baf0 264 else if(Monsters[0].y < 0) // Teleport the monster at the bottom of the map
Laphaze 5:f11bddc1baf0 265 {
Laphaze 5:f11bddc1baf0 266 Monsters[0].y = 13;
Laphaze 5:f11bddc1baf0 267 }
Laphaze 5:f11bddc1baf0 268 else if(Monsters[0].y >= 0 && Monsters[0].y < 15) // Following player, from left to right
Laphaze 5:f11bddc1baf0 269 {
Laphaze 5:f11bddc1baf0 270 if(Monsters[0].y > player.y)
Laphaze 5:f11bddc1baf0 271 {
Laphaze 5:f11bddc1baf0 272 Monsters[0].y -= static_cast <float> (rand()) / static_cast <float> (RAND_MAX); // Trying new rand method which is approximatively..Random :)
Laphaze 5:f11bddc1baf0 273 }
Laphaze 5:f11bddc1baf0 274 else
Laphaze 5:f11bddc1baf0 275 {
Laphaze 5:f11bddc1baf0 276 Monsters[0].y += static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
Laphaze 5:f11bddc1baf0 277 }
Laphaze 5:f11bddc1baf0 278 }
Laphaze 5:f11bddc1baf0 279
Laphaze 5:f11bddc1baf0 280 if(Monsters[0].x > 120) // Teleport player at the left of the map
Laphaze 5:f11bddc1baf0 281 {
Laphaze 5:f11bddc1baf0 282 Monsters[0].x = 0;
Laphaze 5:f11bddc1baf0 283 }
Laphaze 5:f11bddc1baf0 284 else if(Monsters[0].x < 0) // Teleport player at the right of the map // Unused in my case because monster's move are from left to right
Laphaze 5:f11bddc1baf0 285 {
Laphaze 5:f11bddc1baf0 286 Monsters[0].x = 120;
Laphaze 5:f11bddc1baf0 287 }
Laphaze 5:f11bddc1baf0 288 else if(Monsters[0].x >= 0 && Monsters[0].x < 121) // "Randomize" a bit the monster's move
Laphaze 5:f11bddc1baf0 289 {
Laphaze 5:f11bddc1baf0 290 Monsters[0].x += static_cast <float> (rand()) / static_cast <float> (RAND_MAX / game.level); // Monster's move is faster each level
Laphaze 5:f11bddc1baf0 291 }
Laphaze 5:f11bddc1baf0 292
Laphaze 5:f11bddc1baf0 293 // Display the monster
Laphaze 5:f11bddc1baf0 294 lcd.locate(Monsters[0].x, Monsters[0].y);
Laphaze 5:f11bddc1baf0 295 lcd.printf("x");
Laphaze 5:f11bddc1baf0 296 }
Laphaze 5:f11bddc1baf0 297
Laphaze 5:f11bddc1baf0 298 // Display the start screen Menu
Laphaze 5:f11bddc1baf0 299 void PrintStartMenu()
Laphaze 5:f11bddc1baf0 300 {
Laphaze 5:f11bddc1baf0 301 setLight("blue");
Laphaze 5:f11bddc1baf0 302 lcd.fillrect(127, 0, 0, 0, 1);
Laphaze 5:f11bddc1baf0 303 lcd.locate(35, 2);
Laphaze 5:f11bddc1baf0 304 lcd.printf("Apple finder :D");
Laphaze 5:f11bddc1baf0 305
Laphaze 5:f11bddc1baf0 306 lcd.fillrect(127, 12, 0, 12, 1);
Laphaze 5:f11bddc1baf0 307
Laphaze 5:f11bddc1baf0 308 lcd.locate(0, 13);
Laphaze 5:f11bddc1baf0 309 lcd.printf("Monster: X");
Laphaze 5:f11bddc1baf0 310
Laphaze 5:f11bddc1baf0 311 lcd.locate(55, 13);
Laphaze 5:f11bddc1baf0 312 lcd.printf("Apple: O");
Laphaze 5:f11bddc1baf0 313
Laphaze 5:f11bddc1baf0 314 lcd.locate(96, 13);
Laphaze 5:f11bddc1baf0 315 lcd.printf("You: +");
Laphaze 5:f11bddc1baf0 316
Laphaze 5:f11bddc1baf0 317 lcd.locate(0, 22);
Laphaze 5:f11bddc1baf0 318 lcd.printf("Presse fire to launch game !");
Laphaze 5:f11bddc1baf0 319 }
Laphaze 5:f11bddc1baf0 320
Laphaze 5:f11bddc1baf0 321 // Display the bottom stats ingame menu
Laphaze 5:f11bddc1baf0 322 void PrintBottomMenu()
Laphaze 5:f11bddc1baf0 323 {
Laphaze 5:f11bddc1baf0 324 lcd.locate(0, 23);
Laphaze 5:f11bddc1baf0 325 lcd.fillrect(0, 30, 0, 30, 1);
Laphaze 5:f11bddc1baf0 326 lcd.printf("Apple: %d", player.eatenApple);
Laphaze 5:f11bddc1baf0 327 // Vertical divider
Laphaze 5:f11bddc1baf0 328 lcd.fillrect(42, 23, 42, 32, 1);
Laphaze 5:f11bddc1baf0 329
Laphaze 5:f11bddc1baf0 330 lcd.locate(45, 23);
Laphaze 5:f11bddc1baf0 331 lcd.printf("LVL %d", game.level);
Laphaze 5:f11bddc1baf0 332
Laphaze 5:f11bddc1baf0 333 // Vertical divider
Laphaze 5:f11bddc1baf0 334 lcd.fillrect(73, 23, 73, 32, 1);
Laphaze 5:f11bddc1baf0 335
Laphaze 5:f11bddc1baf0 336 lcd.locate(79, 23);
Laphaze 5:f11bddc1baf0 337 lcd.printf("~%d", player.ammo);
Laphaze 5:f11bddc1baf0 338
Laphaze 5:f11bddc1baf0 339 // Vertical divider
Laphaze 5:f11bddc1baf0 340 lcd.fillrect(92, 23, 92, 32, 1);
Laphaze 5:f11bddc1baf0 341
Laphaze 5:f11bddc1baf0 342 lcd.locate(95, 23);
Laphaze 5:f11bddc1baf0 343 lcd.printf("Life: %d", player.life);
Laphaze 5:f11bddc1baf0 344 }
Laphaze 5:f11bddc1baf0 345
Laphaze 5:f11bddc1baf0 346 // Display the Game Over screen Menu
Laphaze 5:f11bddc1baf0 347 void PrintGameOverMenu()
Laphaze 5:f11bddc1baf0 348 {
Laphaze 5:f11bddc1baf0 349 lcd.fillrect(127, 0, 0, 0, 1);
Laphaze 5:f11bddc1baf0 350 lcd.locate(15, 2);
Laphaze 5:f11bddc1baf0 351 lcd.printf("Game OVER :/ LVL %d", game.level);
Laphaze 5:f11bddc1baf0 352 lcd.fillrect(127, 12, 0, 12, 1);
Laphaze 5:f11bddc1baf0 353
Laphaze 5:f11bddc1baf0 354 lcd.locate(0, 13);
Laphaze 5:f11bddc1baf0 355 lcd.printf("Apple ate: %d", player.eatenApple);
Laphaze 5:f11bddc1baf0 356
Laphaze 5:f11bddc1baf0 357 lcd.locate(70, 13);
Laphaze 5:f11bddc1baf0 358 lcd.printf("Mob killed: %d", player.mobKilled);
Laphaze 5:f11bddc1baf0 359
Laphaze 5:f11bddc1baf0 360 lcd.locate(10, 22);
Laphaze 5:f11bddc1baf0 361 lcd.printf("Presse fire to restart");
Laphaze 5:f11bddc1baf0 362 }
Laphaze 5:f11bddc1baf0 363
Laphaze 5:f11bddc1baf0 364
Laphaze 5:f11bddc1baf0 365 // Default thread
Laphaze 5:f11bddc1baf0 366 int main()
Laphaze 5:f11bddc1baf0 367 {
Laphaze 5:f11bddc1baf0 368
Laphaze 5:f11bddc1baf0 369 float verifXApple, verifYApple, verifXMonster, verifYMonster = 0.0;
Laphaze 5:f11bddc1baf0 370 int scrollPosition = 0;
Laphaze 5:f11bddc1baf0 371 int breakTimer = 0;
Laphaze 5:f11bddc1baf0 372 bool blinkEnd = true;
Laphaze 5:f11bddc1baf0 373 bool blinkScreenPause = true;
Laphaze 5:f11bddc1baf0 374
Laphaze 5:f11bddc1baf0 375 // Sound off
Laphaze 5:f11bddc1baf0 376 spkr = 0.0;
Laphaze 5:f11bddc1baf0 377
Laphaze 5:f11bddc1baf0 378 /* I'm using the temp sensor to generate random number that i'll pass as parameter for the srand fonction with time clock, it allows a different generation (and not random) number each appStart time */
Laphaze 5:f11bddc1baf0 379 int randHack = int(sensor.temp() + 0.5);
Laphaze 5:f11bddc1baf0 380 srand(randHack);
Laphaze 5:f11bddc1baf0 381
Laphaze 5:f11bddc1baf0 382 while(true) // Main thread
Laphaze 5:f11bddc1baf0 383 {
Laphaze 5:f11bddc1baf0 384 /* ------ */
Laphaze 5:f11bddc1baf0 385
Laphaze 5:f11bddc1baf0 386 PrintStartMenu();
Laphaze 5:f11bddc1baf0 387
Laphaze 5:f11bddc1baf0 388 /* ------ */
Laphaze 5:f11bddc1baf0 389
Laphaze 5:f11bddc1baf0 390 while(game.firstStart) // First Menu -- Explications
Laphaze 5:f11bddc1baf0 391 {
Laphaze 5:f11bddc1baf0 392 if(fire) // If user press fire, start the game !
Laphaze 5:f11bddc1baf0 393 {
Laphaze 5:f11bddc1baf0 394 game.firstStart = false;
Laphaze 5:f11bddc1baf0 395 }
Laphaze 5:f11bddc1baf0 396 }
Laphaze 5:f11bddc1baf0 397
Laphaze 5:f11bddc1baf0 398 // Play while player's alive
Laphaze 5:f11bddc1baf0 399 while(game.started == true) {
Laphaze 5:f11bddc1baf0 400
Laphaze 5:f11bddc1baf0 401 spkr = 0.0;
Laphaze 5:f11bddc1baf0 402 lcd.cls(); // Initial screen clear
Laphaze 5:f11bddc1baf0 403
Laphaze 5:f11bddc1baf0 404 while(game.paused == true)
Laphaze 5:f11bddc1baf0 405 {
Laphaze 5:f11bddc1baf0 406 PrintBottomMenu(); // Display the stats bottom menu
Laphaze 5:f11bddc1baf0 407
Laphaze 5:f11bddc1baf0 408 blinkScreenPause = !blinkScreenPause; // Blink and invert the screen color, fun effect
Laphaze 5:f11bddc1baf0 409
Laphaze 5:f11bddc1baf0 410 if(blinkScreenPause) // Black foreground
Laphaze 5:f11bddc1baf0 411 {
Laphaze 5:f11bddc1baf0 412 lcd.fillrect(127, 0, 0, 22, 1);
Laphaze 5:f11bddc1baf0 413 }
Laphaze 5:f11bddc1baf0 414 else // White foreground
Laphaze 5:f11bddc1baf0 415 {
Laphaze 5:f11bddc1baf0 416 lcd.fillrect(127, 0, 0, 22, 0);
Laphaze 5:f11bddc1baf0 417 }
Laphaze 5:f11bddc1baf0 418
Laphaze 5:f11bddc1baf0 419 if(scrollPosition < 12) // Scrolling text vertically, and teleport it at the top if he reach the bottom limit
Laphaze 5:f11bddc1baf0 420 {
Laphaze 5:f11bddc1baf0 421 lcd.locate(32, scrollPosition);
Laphaze 5:f11bddc1baf0 422 lcd.printf("Game PAUSED");
Laphaze 5:f11bddc1baf0 423 }
Laphaze 5:f11bddc1baf0 424 else
Laphaze 5:f11bddc1baf0 425 {
Laphaze 5:f11bddc1baf0 426 scrollPosition = 1;
Laphaze 5:f11bddc1baf0 427 lcd.locate(32, scrollPosition);
Laphaze 5:f11bddc1baf0 428 lcd.printf("Game PAUSED");
Laphaze 5:f11bddc1baf0 429 }
Laphaze 5:f11bddc1baf0 430
Laphaze 5:f11bddc1baf0 431 scrollPosition += 2;
Laphaze 5:f11bddc1baf0 432
Laphaze 5:f11bddc1baf0 433 if(fire) // Resume pause
Laphaze 5:f11bddc1baf0 434 {
Laphaze 5:f11bddc1baf0 435 if(breakTimer >= 2)
Laphaze 5:f11bddc1baf0 436 {
Laphaze 5:f11bddc1baf0 437 game.paused = false;
Laphaze 5:f11bddc1baf0 438 breakTimer = 0;
Laphaze 5:f11bddc1baf0 439 }
Laphaze 5:f11bddc1baf0 440 else
Laphaze 5:f11bddc1baf0 441 {
Laphaze 5:f11bddc1baf0 442 breakTimer++;
Laphaze 5:f11bddc1baf0 443 }
Laphaze 5:f11bddc1baf0 444 }
Laphaze 5:f11bddc1baf0 445
Laphaze 5:f11bddc1baf0 446 wait(0.5);
Laphaze 5:f11bddc1baf0 447 }
Laphaze 5:f11bddc1baf0 448
Laphaze 5:f11bddc1baf0 449 if(player.firstSpawn == true) // Assign the player to default location, but seems little bit buggy due to the the potentiometer's value which is not reset to zero every time the system reboot.
Laphaze 5:f11bddc1baf0 450 {
Laphaze 5:f11bddc1baf0 451 setLight("green");
Laphaze 5:f11bddc1baf0 452 player.x = 0;
Laphaze 5:f11bddc1baf0 453 player.y = 0;
Laphaze 5:f11bddc1baf0 454 }
Laphaze 5:f11bddc1baf0 455 else // Player positionning with potentiometer
Laphaze 5:f11bddc1baf0 456 {
Laphaze 5:f11bddc1baf0 457 player.x = (float)pot2 * 122;
Laphaze 5:f11bddc1baf0 458 player.y = (float)pot1 * 15;
Laphaze 5:f11bddc1baf0 459 }
Laphaze 5:f11bddc1baf0 460
Laphaze 5:f11bddc1baf0 461 player.firstSpawn = false;
Laphaze 5:f11bddc1baf0 462
Laphaze 5:f11bddc1baf0 463 // Random apple generation
Laphaze 5:f11bddc1baf0 464 if(Apples.size() == 0)
Laphaze 5:f11bddc1baf0 465 {
Laphaze 5:f11bddc1baf0 466 apple.x = rand() % 122;
Laphaze 5:f11bddc1baf0 467 apple.y = rand() % 15;
Laphaze 5:f11bddc1baf0 468 Apples.push_back(apple);
Laphaze 5:f11bddc1baf0 469 }
Laphaze 5:f11bddc1baf0 470
Laphaze 5:f11bddc1baf0 471 // Random monster generation
Laphaze 5:f11bddc1baf0 472 if(Monsters.size() == 0)
Laphaze 5:f11bddc1baf0 473 {
Laphaze 5:f11bddc1baf0 474 monster.x = rand() % 122;
Laphaze 5:f11bddc1baf0 475 monster.y = rand() % 15;
Laphaze 5:f11bddc1baf0 476
Laphaze 5:f11bddc1baf0 477 Monsters.push_back(monster);
Laphaze 5:f11bddc1baf0 478 }
Laphaze 5:f11bddc1baf0 479
Laphaze 5:f11bddc1baf0 480 // Bottom map border
Laphaze 5:f11bddc1baf0 481 lcd.fillrect(0, 22, 128, 22, 1);
Laphaze 5:f11bddc1baf0 482
Laphaze 5:f11bddc1baf0 483 // Colision Verification with apple
Laphaze 5:f11bddc1baf0 484 verifXApple = Apples[0].x - player.x;
Laphaze 5:f11bddc1baf0 485 verifYApple = Apples[0].y - player.y + 4.0;
Laphaze 5:f11bddc1baf0 486
Laphaze 5:f11bddc1baf0 487 // Check collision with apple
Laphaze 5:f11bddc1baf0 488 if(verifXApple < 4 && verifXApple > -4 && verifYApple < 5 && verifYApple > -5)
Laphaze 5:f11bddc1baf0 489 {
Laphaze 5:f11bddc1baf0 490 ColisionEffect("apple");
Laphaze 5:f11bddc1baf0 491 }
Laphaze 5:f11bddc1baf0 492
Laphaze 5:f11bddc1baf0 493 // Verification colision with monster
Laphaze 5:f11bddc1baf0 494 verifXMonster = Monsters[0].x - player.x;
Laphaze 5:f11bddc1baf0 495 verifYMonster = Monsters[0].y - player.y + 4.0;
Laphaze 5:f11bddc1baf0 496
Laphaze 5:f11bddc1baf0 497 // Check collision with monster
Laphaze 5:f11bddc1baf0 498 if(verifXMonster < 4 && verifXMonster > -4 && verifYMonster < 5 && verifYMonster > -5 && Monsters[0].killed == false)
Laphaze 5:f11bddc1baf0 499 {
Laphaze 5:f11bddc1baf0 500 ColisionEffect("monster");
Laphaze 5:f11bddc1baf0 501 }
Laphaze 5:f11bddc1baf0 502 else
Laphaze 5:f11bddc1baf0 503 {
Laphaze 5:f11bddc1baf0 504 PlayMusic();
Laphaze 5:f11bddc1baf0 505 }
Laphaze 5:f11bddc1baf0 506
Laphaze 5:f11bddc1baf0 507
Laphaze 5:f11bddc1baf0 508 /* ------ */
Laphaze 5:f11bddc1baf0 509
Laphaze 5:f11bddc1baf0 510 PrintBottomMenu();
Laphaze 5:f11bddc1baf0 511
Laphaze 5:f11bddc1baf0 512 /* ------ */
Laphaze 5:f11bddc1baf0 513
Laphaze 5:f11bddc1baf0 514 if(right) // Joystick event right/left
Laphaze 5:f11bddc1baf0 515 {
Laphaze 5:f11bddc1baf0 516 Shoot("right");
Laphaze 5:f11bddc1baf0 517 }
Laphaze 5:f11bddc1baf0 518 if(left)
Laphaze 5:f11bddc1baf0 519 {
Laphaze 5:f11bddc1baf0 520 Shoot("left");
Laphaze 5:f11bddc1baf0 521 }
Laphaze 5:f11bddc1baf0 522
Laphaze 5:f11bddc1baf0 523 if(fire)
Laphaze 5:f11bddc1baf0 524 {
Laphaze 5:f11bddc1baf0 525 if(breakTimer >= 2)
Laphaze 5:f11bddc1baf0 526 {
Laphaze 5:f11bddc1baf0 527 game.paused = true;
Laphaze 5:f11bddc1baf0 528 breakTimer = 0;
Laphaze 5:f11bddc1baf0 529 }
Laphaze 5:f11bddc1baf0 530 else
Laphaze 5:f11bddc1baf0 531 {
Laphaze 5:f11bddc1baf0 532 breakTimer++;
Laphaze 5:f11bddc1baf0 533 }
Laphaze 5:f11bddc1baf0 534 }
Laphaze 5:f11bddc1baf0 535
Laphaze 5:f11bddc1baf0 536 // Player positionning
Laphaze 5:f11bddc1baf0 537 lcd.locate(player.x, player.y);
Laphaze 5:f11bddc1baf0 538 lcd.printf("+");
Laphaze 5:f11bddc1baf0 539
Laphaze 5:f11bddc1baf0 540 // Apple positionning
Laphaze 5:f11bddc1baf0 541 lcd.locate(Apples[0].x, Apples[0].y);
Laphaze 5:f11bddc1baf0 542 lcd.printf("o");
Laphaze 5:f11bddc1baf0 543
Laphaze 5:f11bddc1baf0 544 if(Monsters[0].killed == false)
Laphaze 5:f11bddc1baf0 545 {
Laphaze 5:f11bddc1baf0 546 MonsterTrackingPlayer();
Laphaze 5:f11bddc1baf0 547 }
Laphaze 5:f11bddc1baf0 548
Laphaze 5:f11bddc1baf0 549 wait(0.15);
Laphaze 5:f11bddc1baf0 550 }
Laphaze 5:f11bddc1baf0 551
Laphaze 5:f11bddc1baf0 552 lcd.cls(); // Clear screen before GameOverMenu
Laphaze 5:f11bddc1baf0 553
Laphaze 5:f11bddc1baf0 554 while(game.started == false) // GameOver Menu
Laphaze 5:f11bddc1baf0 555 {
Laphaze 5:f11bddc1baf0 556 /* ------ */
Laphaze 5:f11bddc1baf0 557
Laphaze 5:f11bddc1baf0 558 PrintGameOverMenu();
Laphaze 5:f11bddc1baf0 559
Laphaze 5:f11bddc1baf0 560 /* ------ */
Laphaze 5:f11bddc1baf0 561
Laphaze 5:f11bddc1baf0 562 spkr = 0.0;
Laphaze 5:f11bddc1baf0 563 if(blinkEnd == true) // Making cool effect with light
Laphaze 5:f11bddc1baf0 564 {
Laphaze 5:f11bddc1baf0 565 blinkEnd = !blinkEnd;
Laphaze 5:f11bddc1baf0 566 setLight("red");
Laphaze 5:f11bddc1baf0 567 }
Laphaze 5:f11bddc1baf0 568 else
Laphaze 5:f11bddc1baf0 569 {
Laphaze 5:f11bddc1baf0 570 blinkEnd = !blinkEnd;
Laphaze 5:f11bddc1baf0 571 setLight("transparent");
Laphaze 5:f11bddc1baf0 572 }
Laphaze 5:f11bddc1baf0 573
Laphaze 5:f11bddc1baf0 574 if(fire) // Start a new game
Laphaze 5:f11bddc1baf0 575 {
Laphaze 5:f11bddc1baf0 576 player.life = 3;
Laphaze 5:f11bddc1baf0 577 player.eatenApple = 0;
Laphaze 5:f11bddc1baf0 578 player.ammo = 1;
Laphaze 5:f11bddc1baf0 579 player.mobKilled = 0;
Laphaze 5:f11bddc1baf0 580 game.RestartGame();
Laphaze 5:f11bddc1baf0 581 }
Laphaze 5:f11bddc1baf0 582 }
Laphaze 5:f11bddc1baf0 583 }
Laphaze 5:f11bddc1baf0 584 }
Laphaze 5:f11bddc1baf0 585
Laphaze 5:f11bddc1baf0 586 // Wooh, you finished it !