Faizan and Pages fun little game

Dependencies:   4DGL-uLCD-SE mbed SDFileSystem wave_player

Committer:
kswanson31
Date:
Mon Oct 31 18:48:11 2016 +0000
Revision:
15:b18537055368
Parent:
14:e51c9827f788
Child:
16:702313ea97b9
Fixed a bug with life updates, added splash screen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkhan39 0:de9ffb858be9 1 #include "mbed.h"
fkhan39 0:de9ffb858be9 2 #include "uLCD_4DGL.h"
kswanson31 9:f2ee3ef97af1 3 #include "SongPlayer.h"
kswanson31 9:f2ee3ef97af1 4 #include "NavSwitch.h"
fkhan39 0:de9ffb858be9 5 #include "food.h"
fkhan39 0:de9ffb858be9 6 #include "stack.h"
fkhan39 1:9eeeb0d8f036 7 #include <ctime>
fkhan39 1:9eeeb0d8f036 8 #include <cstdlib>
fkhan39 3:058e10b8ecf6 9 #include <cmath>
fkhan39 2:4c5f409d6bb8 10 #include <vector>
fkhan39 0:de9ffb858be9 11
fkhan39 0:de9ffb858be9 12 #define BREAD 1
fkhan39 0:de9ffb858be9 13 #define LETTUCE 2
fkhan39 0:de9ffb858be9 14 #define CHEESE 3
fkhan39 0:de9ffb858be9 15 #define TOMATO 4
fkhan39 0:de9ffb858be9 16 #define BADLETTUCE 5
fkhan39 0:de9ffb858be9 17 #define BADCHEESE 6
fkhan39 0:de9ffb858be9 18 #define BADTOMATO 7
fkhan39 0:de9ffb858be9 19
fkhan39 8:b2df3588d8e0 20 #define MAROON 0x8b0000
fkhan39 8:b2df3588d8e0 21 #define DARKBROWN 0x654321
fkhan39 8:b2df3588d8e0 22 #define YELLOW 0xffff00
fkhan39 8:b2df3588d8e0 23 #define PURPLE 0x551a8b
fkhan39 8:b2df3588d8e0 24 #define BROWN 0xf4a460
fkhan39 8:b2df3588d8e0 25
fkhan39 0:de9ffb858be9 26 uLCD_4DGL lcd(p9,p10,p11);
kswanson31 9:f2ee3ef97af1 27 SongPlayer speaker(p26);
kswanson31 10:75e221ead102 28 Nav_Switch joystick(p20, p19, p18, p17, p16); // pin order on Sparkfun breakout
kswanson31 15:b18537055368 29 DigitalIn speed(p21);
kswanson31 15:b18537055368 30 DigitalIn pause(p22);
kswanson31 15:b18537055368 31
fkhan39 1:9eeeb0d8f036 32 vector<Food> foods;
fkhan39 3:058e10b8ecf6 33 Food * collided;
fkhan39 3:058e10b8ecf6 34
fkhan39 3:058e10b8ecf6 35 using namespace std;
fkhan39 1:9eeeb0d8f036 36 Stack sandwich(64,&lcd);
fkhan39 2:4c5f409d6bb8 37 int score, lives;
fkhan39 2:4c5f409d6bb8 38 float clk, clk2;
fkhan39 2:4c5f409d6bb8 39 Timer t;
fkhan39 3:058e10b8ecf6 40 int indexToRemove;
fkhan39 2:4c5f409d6bb8 41
fkhan39 2:4c5f409d6bb8 42 bool collisionCheck();
kswanson31 5:d832d2d67411 43 void updateScore(int);
kswanson31 5:d832d2d67411 44 void drawLives();
fkhan39 0:de9ffb858be9 45
fkhan39 0:de9ffb858be9 46 int main() {
kswanson31 15:b18537055368 47 speed.mode(PullUp);
kswanson31 15:b18537055368 48 pause.mode(PullUp);
kswanson31 15:b18537055368 49
kswanson31 15:b18537055368 50 // splash sequence
kswanson31 15:b18537055368 51 lcd.filled_rectangle(34, 18, 44, 19, BROWN);
kswanson31 15:b18537055368 52 lcd.filled_rectangle(30, 22, 50, 20, BROWN); // top bun
kswanson31 15:b18537055368 53 lcd.filled_rectangle(34, 38, 44, 42, YELLOW); // cheese
kswanson31 15:b18537055368 54 lcd.filled_rectangle(34, 56, 44, 60, GREEN); // lettuce
kswanson31 15:b18537055368 55 lcd.filled_rectangle(34, 74, 44, 78, RED); // tomato
kswanson31 15:b18537055368 56 lcd.filled_rectangle(30, 94, 50, 96, BROWN); // bottom bun
kswanson31 15:b18537055368 57 lcd.filled_rectangle(34, 98, 44, 97, BROWN);
kswanson31 15:b18537055368 58 wait(2);
kswanson31 15:b18537055368 59 lcd.text_string("bun", 11, 3, FONT_7X8, WHITE);
kswanson31 15:b18537055368 60 wait(1);
kswanson31 15:b18537055368 61 lcd.text_string("cheese", 11, 5, FONT_7X8, WHITE);
kswanson31 15:b18537055368 62 wait(1);
kswanson31 15:b18537055368 63 lcd.text_string("lettuce", 11, 7, FONT_7X8, WHITE);
kswanson31 15:b18537055368 64 wait(1);
kswanson31 15:b18537055368 65 lcd.text_string("tomato", 11, 9, FONT_7X8, WHITE);
kswanson31 15:b18537055368 66 wait(1);
kswanson31 15:b18537055368 67 lcd.text_string("bun", 11, 11, FONT_7X8, WHITE);
kswanson31 15:b18537055368 68 wait(4);
kswanson31 15:b18537055368 69 lcd.cls();
kswanson31 15:b18537055368 70
kswanson31 15:b18537055368 71 lcd.filled_rectangle(34, 38, 44, 42, MAROON); // bad foods
kswanson31 15:b18537055368 72 lcd.filled_rectangle(34, 56, 44, 60, DARKBROWN);
kswanson31 15:b18537055368 73 lcd.filled_rectangle(34, 74, 44, 78, PURPLE);
kswanson31 15:b18537055368 74 wait(2);
kswanson31 15:b18537055368 75 lcd.text_string("GROSS!", 11, 7, FONT_7X8, WHITE);
kswanson31 15:b18537055368 76 wait(2);
kswanson31 15:b18537055368 77 lcd.cls();
fkhan39 0:de9ffb858be9 78
fkhan39 1:9eeeb0d8f036 79 score = 0;
fkhan39 2:4c5f409d6bb8 80 lives = 3;
fkhan39 2:4c5f409d6bb8 81 t.start();
fkhan39 1:9eeeb0d8f036 82 srand(time(NULL));
fkhan39 2:4c5f409d6bb8 83 clk = clk2 = 0;
fkhan39 4:c00da0b158c4 84 sandwich.draw();
fkhan39 1:9eeeb0d8f036 85
kswanson31 5:d832d2d67411 86 lcd.line(108, 1, 108, 128, WHITE);
kswanson31 5:d832d2d67411 87
kswanson31 5:d832d2d67411 88 // inital lives
kswanson31 5:d832d2d67411 89 lcd.filled_circle(118, 80, 3, YELLOW); // x, y, radius, color
kswanson31 5:d832d2d67411 90 lcd.filled_circle(118, 90, 3, YELLOW);
kswanson31 5:d832d2d67411 91 lcd.filled_circle(118, 100, 3, YELLOW);
fkhan39 1:9eeeb0d8f036 92
fkhan39 8:b2df3588d8e0 93 updateScore(0);
fkhan39 8:b2df3588d8e0 94
fkhan39 2:4c5f409d6bb8 95 while(lives) {
kswanson31 12:3053789a2140 96 if (joystick.left()) {
fkhan39 1:9eeeb0d8f036 97 sandwich.move(-1);
kswanson31 12:3053789a2140 98 } else if (joystick.right()) {
kswanson31 13:a8eaced521a3 99 sandwich.move(+1);
fkhan39 1:9eeeb0d8f036 100 }
fkhan39 1:9eeeb0d8f036 101 if (collisionCheck()) {
fkhan39 3:058e10b8ecf6 102 collided->erase();
fkhan39 3:058e10b8ecf6 103 if (collided->isBad) {
fkhan39 3:058e10b8ecf6 104 lives--;
kswanson31 14:e51c9827f788 105 drawLives();
fkhan39 3:058e10b8ecf6 106 // make a noise!1111
fkhan39 3:058e10b8ecf6 107 } else if (collided->typeOfFood == BREAD) {
fkhan39 3:058e10b8ecf6 108 // updateScore(sandwich.size()); // add the points to the overall score
fkhan39 3:058e10b8ecf6 109 sandwich.clear(); // should redraw
fkhan39 3:058e10b8ecf6 110 // make a noise!!11
fkhan39 3:058e10b8ecf6 111 } else {
fkhan39 3:058e10b8ecf6 112 // remove from falling object list, erase
fkhan39 3:058e10b8ecf6 113 foods.erase(foods.begin() + indexToRemove);
fkhan39 3:058e10b8ecf6 114 sandwich.add(collided);
fkhan39 3:058e10b8ecf6 115 }
fkhan39 1:9eeeb0d8f036 116 }
fkhan39 1:9eeeb0d8f036 117 // every 3 seconds add new food! use timer.
fkhan39 2:4c5f409d6bb8 118 float curr = t.read();
fkhan39 11:4c91567fc089 119 if (curr - clk >= 5.0) {
fkhan39 2:4c5f409d6bb8 120 clk = curr;
fkhan39 2:4c5f409d6bb8 121 // lcd.printf(" new ");
fkhan39 8:b2df3588d8e0 122 int x = rand()%90+1;
fkhan39 2:4c5f409d6bb8 123 int type = rand()%7+1;
fkhan39 2:4c5f409d6bb8 124 Food item(type, x, &lcd);
fkhan39 2:4c5f409d6bb8 125 foods.push_back(item);
fkhan39 2:4c5f409d6bb8 126 // add new food
fkhan39 2:4c5f409d6bb8 127 }
fkhan39 1:9eeeb0d8f036 128 // every .2 second each food should fall a lil bit! use timer.
fkhan39 11:4c91567fc089 129 if (curr - clk2 >= 0.1) {
fkhan39 2:4c5f409d6bb8 130 clk2 = curr;
fkhan39 2:4c5f409d6bb8 131 // lcd.printf(" fall ");
fkhan39 2:4c5f409d6bb8 132 for (int i = 0; i < foods.size(); i++) {
fkhan39 2:4c5f409d6bb8 133 Food * f = &foods[i];
fkhan39 2:4c5f409d6bb8 134 f->fall();
fkhan39 2:4c5f409d6bb8 135 }
fkhan39 2:4c5f409d6bb8 136 // each food should fall a lil bit!
fkhan39 2:4c5f409d6bb8 137 }
fkhan39 0:de9ffb858be9 138 }
fkhan39 2:4c5f409d6bb8 139
fkhan39 2:4c5f409d6bb8 140 lcd.printf("Your score is: %i", score);
fkhan39 0:de9ffb858be9 141 }
fkhan39 1:9eeeb0d8f036 142
fkhan39 1:9eeeb0d8f036 143 bool collisionCheck() {
fkhan39 3:058e10b8ecf6 144 if (!foods.empty()) {
fkhan39 3:058e10b8ecf6 145 Food * f = &foods.front();
fkhan39 3:058e10b8ecf6 146 if (f->y > 128) foods.erase(foods.begin()); // removed if offscreen!
fkhan39 3:058e10b8ecf6 147 }
fkhan39 3:058e10b8ecf6 148 for (int i = 0; i < foods.size(); i++) {
fkhan39 3:058e10b8ecf6 149 if (foods[i].y + 6 == sandwich.top) {
fkhan39 3:058e10b8ecf6 150 if (abs(foods[i].x - sandwich.x) < 8) {
fkhan39 3:058e10b8ecf6 151 collided = &foods[i];
fkhan39 3:058e10b8ecf6 152 indexToRemove = i;
fkhan39 3:058e10b8ecf6 153 return true;
fkhan39 3:058e10b8ecf6 154 } else break;
fkhan39 3:058e10b8ecf6 155 }
fkhan39 3:058e10b8ecf6 156 }
fkhan39 3:058e10b8ecf6 157 return false;
fkhan39 1:9eeeb0d8f036 158 // find foods that have an (x,y) that is within the range of the top of the stack
fkhan39 1:9eeeb0d8f036 159 // if nothing found w/i the range
fkhan39 1:9eeeb0d8f036 160 // return false
fkhan39 1:9eeeb0d8f036 161 // if something found
fkhan39 1:9eeeb0d8f036 162 // collidedFood = that food item
fkhan39 1:9eeeb0d8f036 163 // return true
fkhan39 2:4c5f409d6bb8 164 }
fkhan39 1:9eeeb0d8f036 165
kswanson31 5:d832d2d67411 166 void updateScore(int sandwichSize) {
kswanson31 5:d832d2d67411 167 char scoreString[2]; // max 2-digit score
kswanson31 9:f2ee3ef97af1 168 // C#, D#, F, A, D, E, F#, A#, _, A, Bb, B, C
kswanson31 9:f2ee3ef97af1 169 float notes[14] = {554.4, 622.3, 698.5, 880, 587.3, 659.3, 740, 932.3, 0, 440, 466.2, 493.9, 523.3, 0};
kswanson31 9:f2ee3ef97af1 170 float times[14] = {0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.48, 0.48, 0.48, 0.48, 0.48, 0};
kswanson31 9:f2ee3ef97af1 171
kswanson31 9:f2ee3ef97af1 172 speaker.PlaySong(notes, times);
kswanson31 5:d832d2d67411 173 score += sandwichSize;
kswanson31 5:d832d2d67411 174 score = (score > 99) ? score - 100 : score; // score rollover
kswanson31 5:d832d2d67411 175 sprintf(scoreString, "%d", score); // keep score as a char string
kswanson31 5:d832d2d67411 176 lcd.text_string(scoreString, 16, 1, FONT_7X8, WHITE); // 16 chars over, 1 down
kswanson31 5:d832d2d67411 177 }
kswanson31 5:d832d2d67411 178
kswanson31 5:d832d2d67411 179 void drawLives() {
kswanson31 9:f2ee3ef97af1 180 // G, D, _, D, D, C, B, G, E, _, E, C, _
kswanson31 9:f2ee3ef97af1 181 float notes[13] = {195.9, 293.6, 0, 293.6, 293.6, 261.6, 246.9, 195.9, 164.8, 0, 164.8, 130.8, 0};
kswanson31 9:f2ee3ef97af1 182 float times[13] = {0.24, 0.24, 0.24, 0.24, 0.32, 0.32, 0.32, 0.24, 0.24, 0.24, 0.24, 0.24, 0};
kswanson31 9:f2ee3ef97af1 183
kswanson31 9:f2ee3ef97af1 184 speaker.PlaySong(notes, times);
kswanson31 9:f2ee3ef97af1 185
kswanson31 15:b18537055368 186 if (lives == 2) {
kswanson31 5:d832d2d67411 187 lcd.filled_circle(118, 100, 3, BLACK); // erase the life symbol
kswanson31 5:d832d2d67411 188 }
kswanson31 15:b18537055368 189 else if (lives == 1) {
kswanson31 5:d832d2d67411 190 lcd.filled_circle(118, 108, 3, BLACK);
kswanson31 5:d832d2d67411 191 }
kswanson31 15:b18537055368 192 else if (lives == 0) {
kswanson31 5:d832d2d67411 193 lcd.filled_circle(118, 116, 3, BLACK);
kswanson31 5:d832d2d67411 194 }
kswanson31 5:d832d2d67411 195 }