ECE2036 Lab5 (SHIP Game)

Dependencies:   4DGL-uLCD-SE mbed PinDetect SDFileSystem mbed-rtos

Fork of mythermostat by jim hamblen

This is a Lab assignment for ECE 2036. This program uses the object oriented methodology to design a LAME attack ship game. Pushbuttons, speaker and uLCD are used in LPC1768. Sample video is posted by the instructor to assist the design of this Game at: https://youtu.be/d8ekTKvMWqw

Committer:
pkoirala3
Date:
Sat Mar 18 14:24:26 2017 +0000
Revision:
5:d6c2e01b0596
Parent:
4:9a4d22a279b3
Formated ECE 2036 Lab5 (MiniProject, GAME)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:cc87c48aa43c 1 #include "mbed.h"
4180_1 2:58d85409f7ff 2 #include "SDFileSystem.h"
4180_1 4:9a4d22a279b3 3 #include "uLCD_4DGL.h"
4180_1 0:cc87c48aa43c 4 #include "PinDetect.h"
4180_1 2:58d85409f7ff 5 #include "Speaker.h"
pkoirala3 5:d6c2e01b0596 6 #include <string>
pkoirala3 5:d6c2e01b0596 7 #include <cstdlib>
pkoirala3 5:d6c2e01b0596 8 #include <ctime>
pkoirala3 5:d6c2e01b0596 9 #include <vector>
pkoirala3 5:d6c2e01b0596 10 #include <iterator>
pkoirala3 5:d6c2e01b0596 11 #include <algorithm>
4180_1 2:58d85409f7ff 12
pkoirala3 5:d6c2e01b0596 13 #define SHIP_HEIGHT 4
pkoirala3 5:d6c2e01b0596 14 #define SHIP_WIDTH 15
pkoirala3 5:d6c2e01b0596 15 #define ALIEN_HEIGHT 8
pkoirala3 5:d6c2e01b0596 16 #define ALIEN_WIDTH 11
pkoirala3 5:d6c2e01b0596 17
pkoirala3 5:d6c2e01b0596 18 #define _ 0x000000 // BLACK
pkoirala3 5:d6c2e01b0596 19 #define X 0xFFFFFF // WHITE
pkoirala3 5:d6c2e01b0596 20 #define Y 0x0000FF // Blue
pkoirala3 5:d6c2e01b0596 21 using namespace std;
pkoirala3 5:d6c2e01b0596 22 uLCD_4DGL uLCD(p28, p27, p29);
pkoirala3 5:d6c2e01b0596 23 Speaker mySpeaker(p21);
pkoirala3 5:d6c2e01b0596 24 PinDetect left(p17);
pkoirala3 5:d6c2e01b0596 25 PinDetect shoot(p18);
pkoirala3 5:d6c2e01b0596 26 PinDetect right(p16);
pkoirala3 5:d6c2e01b0596 27 Timer timer; // For measuring Elapsed time
4180_1 0:cc87c48aa43c 28
pkoirala3 5:d6c2e01b0596 29 static int shipx = 57;
pkoirala3 5:d6c2e01b0596 30 static int shipy = 120;
pkoirala3 5:d6c2e01b0596 31 static int bulletx = 65;
pkoirala3 5:d6c2e01b0596 32 static int bullety = 115;
pkoirala3 5:d6c2e01b0596 33 static bool movement = false;
pkoirala3 5:d6c2e01b0596 34 static bool direction = false;
pkoirala3 5:d6c2e01b0596 35 static bool fire = false;
pkoirala3 5:d6c2e01b0596 36 int clear[8*11] = {
pkoirala3 5:d6c2e01b0596 37 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 38 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 39 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 40 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 41 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 42 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 43 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
pkoirala3 5:d6c2e01b0596 44 Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y
pkoirala3 5:d6c2e01b0596 45 };
4180_1 2:58d85409f7ff 46
pkoirala3 5:d6c2e01b0596 47 int alienAli_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
pkoirala3 5:d6c2e01b0596 48 X,X,X,_,_,_,_,_,X,X,X,
pkoirala3 5:d6c2e01b0596 49 X,X,X,_,_,_,_,X,X,X,_,
pkoirala3 5:d6c2e01b0596 50 X,X,X,_,_,X,X,X,_,_,_,
pkoirala3 5:d6c2e01b0596 51 X,X,X,X,X,X,_,_,_,_,_,
pkoirala3 5:d6c2e01b0596 52 X,X,X,X,X,X,X,_,_,_,_,
pkoirala3 5:d6c2e01b0596 53 X,X,X,_,_,X,X,X,_,_,_,
pkoirala3 5:d6c2e01b0596 54 X,X,X,_,_,_,_,X,X,X,_,
pkoirala3 5:d6c2e01b0596 55 X,X,X,_,_,_,_,_,X,X,X
pkoirala3 5:d6c2e01b0596 56 };
pkoirala3 5:d6c2e01b0596 57 int alienAlice_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
pkoirala3 5:d6c2e01b0596 58 _,_,_,_,X,X,X,_,_,_,_,
pkoirala3 5:d6c2e01b0596 59 _,X,X,X,X,X,X,X,X,X,_,
pkoirala3 5:d6c2e01b0596 60 X,X,X,X,X,X,X,X,X,X,X,
pkoirala3 5:d6c2e01b0596 61 X,X,X,_,_,X,_,_,X,X,X,
pkoirala3 5:d6c2e01b0596 62 X,X,X,X,X,X,X,X,X,X,X,
pkoirala3 5:d6c2e01b0596 63 _,_,_,X,X,_,X,X,_,_,_,
pkoirala3 5:d6c2e01b0596 64 _,_,X,X,_,_,_,X,X,_,_,
pkoirala3 5:d6c2e01b0596 65 X,X,_,_,_,X,_,_,_,X,X
pkoirala3 5:d6c2e01b0596 66 };
pkoirala3 5:d6c2e01b0596 67 int alienBobDown_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
pkoirala3 5:d6c2e01b0596 68 _,_,X,_,_,_,_,_,X,_,_,
pkoirala3 5:d6c2e01b0596 69 _,_,_,X,_,_,_,X,_,_,_,
pkoirala3 5:d6c2e01b0596 70 _,_,X,X,X,X,X,X,X,_,_,
pkoirala3 5:d6c2e01b0596 71 _,X,X,_,X,X,X,_,X,X,_,
pkoirala3 5:d6c2e01b0596 72 X,X,X,X,X,X,X,X,X,X,X,
pkoirala3 5:d6c2e01b0596 73 X,_,X,X,X,X,X,X,X,_,X,
pkoirala3 5:d6c2e01b0596 74 X,_,X,_,_,_,_,_,X,_,X,
pkoirala3 5:d6c2e01b0596 75 _,_,_,X,X,_,X,X,_,_,_
pkoirala3 5:d6c2e01b0596 76 };
4180_1 2:58d85409f7ff 77
pkoirala3 5:d6c2e01b0596 78 int alienBobUp_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
pkoirala3 5:d6c2e01b0596 79 _,_,X,_,_,_,_,_,X,_,_,
pkoirala3 5:d6c2e01b0596 80 X,_,_,X,_,_,_,X,_,_,X,
pkoirala3 5:d6c2e01b0596 81 X,_,X,X,X,X,X,X,X,_,X,
pkoirala3 5:d6c2e01b0596 82 X,X,X,_,X,X,X,_,X,X,X,
pkoirala3 5:d6c2e01b0596 83 X,X,X,X,X,X,X,X,X,X,X,
pkoirala3 5:d6c2e01b0596 84 _,_,X,X,X,X,X,X,X,_,_,
pkoirala3 5:d6c2e01b0596 85 _,_,X,_,_,_,_,_,X,_,_,
pkoirala3 5:d6c2e01b0596 86 _,X,_,_,_,_,_,_,_,X,_
pkoirala3 5:d6c2e01b0596 87 };
pkoirala3 5:d6c2e01b0596 88
pkoirala3 5:d6c2e01b0596 89 // Base Class
pkoirala3 5:d6c2e01b0596 90 class ScreenAliens
pkoirala3 5:d6c2e01b0596 91 {
pkoirala3 5:d6c2e01b0596 92 public:
pkoirala3 5:d6c2e01b0596 93 ScreenAliens(string, int, int);
4180_1 2:58d85409f7ff 94
pkoirala3 5:d6c2e01b0596 95 virtual void draw() = 0;
pkoirala3 5:d6c2e01b0596 96 virtual void update() = 0;
pkoirala3 5:d6c2e01b0596 97
pkoirala3 5:d6c2e01b0596 98 void setName(string);
pkoirala3 5:d6c2e01b0596 99 void setxPos(int);
pkoirala3 5:d6c2e01b0596 100 void setyPos(int);
pkoirala3 5:d6c2e01b0596 101 void setDir(int);
pkoirala3 5:d6c2e01b0596 102
pkoirala3 5:d6c2e01b0596 103 string getName();
pkoirala3 5:d6c2e01b0596 104 int getxPos();
pkoirala3 5:d6c2e01b0596 105 int getyPos();
pkoirala3 5:d6c2e01b0596 106 int getDir();
pkoirala3 5:d6c2e01b0596 107 private:
pkoirala3 5:d6c2e01b0596 108
pkoirala3 5:d6c2e01b0596 109 string name;
pkoirala3 5:d6c2e01b0596 110 int xPos;
pkoirala3 5:d6c2e01b0596 111 int yPos;
pkoirala3 5:d6c2e01b0596 112 int dir;
pkoirala3 5:d6c2e01b0596 113 };
4180_1 0:cc87c48aa43c 114
pkoirala3 5:d6c2e01b0596 115 ScreenAliens::ScreenAliens(string name, int xPos, int yPos)
pkoirala3 5:d6c2e01b0596 116 {
pkoirala3 5:d6c2e01b0596 117 setName(name);
pkoirala3 5:d6c2e01b0596 118 setxPos(xPos);
pkoirala3 5:d6c2e01b0596 119 setyPos(yPos);
pkoirala3 5:d6c2e01b0596 120 srand(time(NULL));
pkoirala3 5:d6c2e01b0596 121 int status = rand()%2;
pkoirala3 5:d6c2e01b0596 122 setDir(status);
pkoirala3 5:d6c2e01b0596 123 }
pkoirala3 5:d6c2e01b0596 124
pkoirala3 5:d6c2e01b0596 125 void ScreenAliens::setName(string name)
pkoirala3 5:d6c2e01b0596 126 {
pkoirala3 5:d6c2e01b0596 127 this -> name = name;
pkoirala3 5:d6c2e01b0596 128 }
pkoirala3 5:d6c2e01b0596 129
pkoirala3 5:d6c2e01b0596 130 void ScreenAliens::setxPos(int xPos)
pkoirala3 5:d6c2e01b0596 131 {
pkoirala3 5:d6c2e01b0596 132 this -> xPos = xPos;
pkoirala3 5:d6c2e01b0596 133 }
pkoirala3 5:d6c2e01b0596 134
pkoirala3 5:d6c2e01b0596 135 void ScreenAliens::setyPos(int yPos)
pkoirala3 5:d6c2e01b0596 136 {
pkoirala3 5:d6c2e01b0596 137 this -> yPos = yPos;
pkoirala3 5:d6c2e01b0596 138 }
4180_1 2:58d85409f7ff 139
pkoirala3 5:d6c2e01b0596 140 void ScreenAliens::setDir(int dir)
pkoirala3 5:d6c2e01b0596 141 {
pkoirala3 5:d6c2e01b0596 142 this -> dir = dir;
pkoirala3 5:d6c2e01b0596 143 }
pkoirala3 5:d6c2e01b0596 144
pkoirala3 5:d6c2e01b0596 145 string ScreenAliens::getName()
pkoirala3 5:d6c2e01b0596 146 {
pkoirala3 5:d6c2e01b0596 147 return name;
pkoirala3 5:d6c2e01b0596 148 }
4180_1 2:58d85409f7ff 149
pkoirala3 5:d6c2e01b0596 150 int ScreenAliens::getxPos()
pkoirala3 5:d6c2e01b0596 151 {
pkoirala3 5:d6c2e01b0596 152 return xPos;
pkoirala3 5:d6c2e01b0596 153 }
pkoirala3 5:d6c2e01b0596 154
pkoirala3 5:d6c2e01b0596 155 int ScreenAliens::getyPos()
pkoirala3 5:d6c2e01b0596 156 {
pkoirala3 5:d6c2e01b0596 157 return yPos;
pkoirala3 5:d6c2e01b0596 158 }
pkoirala3 5:d6c2e01b0596 159
pkoirala3 5:d6c2e01b0596 160 int ScreenAliens::getDir()
pkoirala3 5:d6c2e01b0596 161 {
pkoirala3 5:d6c2e01b0596 162 return dir;
pkoirala3 5:d6c2e01b0596 163 }
4180_1 4:9a4d22a279b3 164
4180_1 0:cc87c48aa43c 165
pkoirala3 5:d6c2e01b0596 166 // Derived class AlienBob
pkoirala3 5:d6c2e01b0596 167 class AlienBob:public ScreenAliens
pkoirala3 5:d6c2e01b0596 168 {
pkoirala3 5:d6c2e01b0596 169
pkoirala3 5:d6c2e01b0596 170 public:
pkoirala3 5:d6c2e01b0596 171 AlienBob(int xPos, int yPos):ScreenAliens("AlienBob", xPos, yPos) {
pkoirala3 5:d6c2e01b0596 172 int status;
pkoirala3 5:d6c2e01b0596 173 srand(time(NULL));
pkoirala3 5:d6c2e01b0596 174 status = rand()%2;
pkoirala3 5:d6c2e01b0596 175 setUpDown(status);
pkoirala3 5:d6c2e01b0596 176 }
pkoirala3 5:d6c2e01b0596 177
pkoirala3 5:d6c2e01b0596 178 void setUpDown(int upDown) {
pkoirala3 5:d6c2e01b0596 179 this -> upDown = upDown;
pkoirala3 5:d6c2e01b0596 180 }
pkoirala3 5:d6c2e01b0596 181
pkoirala3 5:d6c2e01b0596 182 int getUpDown() {
pkoirala3 5:d6c2e01b0596 183 return upDown;
pkoirala3 5:d6c2e01b0596 184 }
pkoirala3 5:d6c2e01b0596 185
pkoirala3 5:d6c2e01b0596 186 virtual void draw() {
pkoirala3 5:d6c2e01b0596 187 if (getUpDown() == 0) {
pkoirala3 5:d6c2e01b0596 188 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienBobDown_sprite);
pkoirala3 5:d6c2e01b0596 189 setUpDown(1);
pkoirala3 5:d6c2e01b0596 190 } else {
pkoirala3 5:d6c2e01b0596 191 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienBobUp_sprite);
pkoirala3 5:d6c2e01b0596 192 setUpDown(0);
pkoirala3 5:d6c2e01b0596 193 }
pkoirala3 5:d6c2e01b0596 194 }
pkoirala3 5:d6c2e01b0596 195
pkoirala3 5:d6c2e01b0596 196 virtual void update() {
pkoirala3 5:d6c2e01b0596 197 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
pkoirala3 5:d6c2e01b0596 198 if (ScreenAliens::getDir() == 0) {
pkoirala3 5:d6c2e01b0596 199 if (ScreenAliens::getxPos() - 5 <= 0 ) {
pkoirala3 5:d6c2e01b0596 200 ScreenAliens::setDir(1);
pkoirala3 5:d6c2e01b0596 201 ScreenAliens::setxPos(ScreenAliens::getxPos() + 5);
pkoirala3 5:d6c2e01b0596 202 } else {
pkoirala3 5:d6c2e01b0596 203 ScreenAliens::setxPos(ScreenAliens::getxPos() - 5);
pkoirala3 5:d6c2e01b0596 204 }
pkoirala3 5:d6c2e01b0596 205 draw();
pkoirala3 5:d6c2e01b0596 206 } else {
pkoirala3 5:d6c2e01b0596 207 if (ScreenAliens::getxPos() + 5 + ALIEN_WIDTH >= 128) {
pkoirala3 5:d6c2e01b0596 208 ScreenAliens::setDir(0);
pkoirala3 5:d6c2e01b0596 209 ScreenAliens::setxPos(ScreenAliens::getxPos() - 5);
pkoirala3 5:d6c2e01b0596 210 } else {
pkoirala3 5:d6c2e01b0596 211 ScreenAliens::setxPos(ScreenAliens::getxPos() + 5);
pkoirala3 5:d6c2e01b0596 212 }
pkoirala3 5:d6c2e01b0596 213 draw();
pkoirala3 5:d6c2e01b0596 214 }
pkoirala3 5:d6c2e01b0596 215 }
pkoirala3 5:d6c2e01b0596 216 private:
pkoirala3 5:d6c2e01b0596 217 int upDown;
pkoirala3 5:d6c2e01b0596 218 };
pkoirala3 5:d6c2e01b0596 219
pkoirala3 5:d6c2e01b0596 220 class AlienAlice:public ScreenAliens
pkoirala3 5:d6c2e01b0596 221 {
4180_1 2:58d85409f7ff 222
pkoirala3 5:d6c2e01b0596 223 public:
pkoirala3 5:d6c2e01b0596 224 AlienAlice(int xPos, int yPos):ScreenAliens("AlienAlice", xPos, yPos) {}
4180_1 2:58d85409f7ff 225
pkoirala3 5:d6c2e01b0596 226 virtual void draw() {
pkoirala3 5:d6c2e01b0596 227 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienAlice_sprite);
pkoirala3 5:d6c2e01b0596 228 }
pkoirala3 5:d6c2e01b0596 229
pkoirala3 5:d6c2e01b0596 230 virtual void update() {
pkoirala3 5:d6c2e01b0596 231 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
pkoirala3 5:d6c2e01b0596 232 if (ScreenAliens::getDir() == 0) {
pkoirala3 5:d6c2e01b0596 233 if (ScreenAliens::getxPos() - 8 <= 0 ) {
pkoirala3 5:d6c2e01b0596 234 ScreenAliens::setDir(1);
pkoirala3 5:d6c2e01b0596 235 ScreenAliens::setxPos(ScreenAliens::getxPos() + 8);
pkoirala3 5:d6c2e01b0596 236 } else {
pkoirala3 5:d6c2e01b0596 237 ScreenAliens::setxPos(ScreenAliens::getxPos() - 8);
pkoirala3 5:d6c2e01b0596 238 }
pkoirala3 5:d6c2e01b0596 239 draw();
pkoirala3 5:d6c2e01b0596 240 } else {
pkoirala3 5:d6c2e01b0596 241 if (ScreenAliens::getxPos() + 8 + ALIEN_WIDTH >= 128) {
pkoirala3 5:d6c2e01b0596 242 ScreenAliens::setDir(0);
pkoirala3 5:d6c2e01b0596 243 ScreenAliens::setxPos(ScreenAliens::getxPos() - 8);
pkoirala3 5:d6c2e01b0596 244 } else {
pkoirala3 5:d6c2e01b0596 245 ScreenAliens::setxPos(ScreenAliens::getxPos() + 8);
pkoirala3 5:d6c2e01b0596 246 }
pkoirala3 5:d6c2e01b0596 247 draw();
pkoirala3 5:d6c2e01b0596 248 }
pkoirala3 5:d6c2e01b0596 249 }
pkoirala3 5:d6c2e01b0596 250 };
pkoirala3 5:d6c2e01b0596 251
pkoirala3 5:d6c2e01b0596 252 class AlienAli:public ScreenAliens
pkoirala3 5:d6c2e01b0596 253 {
pkoirala3 5:d6c2e01b0596 254
pkoirala3 5:d6c2e01b0596 255 public:
pkoirala3 5:d6c2e01b0596 256
pkoirala3 5:d6c2e01b0596 257 AlienAli(int xPos, int yPos):ScreenAliens("AlienAli", xPos, yPos) {}
pkoirala3 5:d6c2e01b0596 258
pkoirala3 5:d6c2e01b0596 259 virtual void draw() {
pkoirala3 5:d6c2e01b0596 260 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienAli_sprite);
pkoirala3 5:d6c2e01b0596 261 }
pkoirala3 5:d6c2e01b0596 262
pkoirala3 5:d6c2e01b0596 263 virtual void update() {
pkoirala3 5:d6c2e01b0596 264 uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
pkoirala3 5:d6c2e01b0596 265 if (ScreenAliens::getDir() == 0) {
pkoirala3 5:d6c2e01b0596 266 if (ScreenAliens::getxPos() - 10 <= 0 ) {
pkoirala3 5:d6c2e01b0596 267 ScreenAliens::setDir(1);
pkoirala3 5:d6c2e01b0596 268 ScreenAliens::setxPos(ScreenAliens::getxPos() + 10);
pkoirala3 5:d6c2e01b0596 269 } else {
pkoirala3 5:d6c2e01b0596 270 ScreenAliens::setxPos(ScreenAliens::getxPos() - 10);
pkoirala3 5:d6c2e01b0596 271 }
pkoirala3 5:d6c2e01b0596 272 draw();
pkoirala3 5:d6c2e01b0596 273 } else {
pkoirala3 5:d6c2e01b0596 274 if (ScreenAliens::getxPos() + 10 + ALIEN_WIDTH >= 128) {
pkoirala3 5:d6c2e01b0596 275 ScreenAliens::setDir(0);
pkoirala3 5:d6c2e01b0596 276 ScreenAliens::setxPos(ScreenAliens::getxPos() - 10);
pkoirala3 5:d6c2e01b0596 277 } else {
pkoirala3 5:d6c2e01b0596 278 ScreenAliens::setxPos(ScreenAliens::getxPos() + 10);
pkoirala3 5:d6c2e01b0596 279 }
pkoirala3 5:d6c2e01b0596 280 draw();
pkoirala3 5:d6c2e01b0596 281 }
pkoirala3 5:d6c2e01b0596 282 }
pkoirala3 5:d6c2e01b0596 283 };
4180_1 2:58d85409f7ff 284
4180_1 2:58d85409f7ff 285
pkoirala3 5:d6c2e01b0596 286 vector <ScreenAliens*> aliens(6);
4180_1 0:cc87c48aa43c 287
pkoirala3 5:d6c2e01b0596 288 //Code for the function of the pushbuttons
pkoirala3 5:d6c2e01b0596 289 void left_hit_callback(void)
4180_1 2:58d85409f7ff 290 {
pkoirala3 5:d6c2e01b0596 291 movement = true;
pkoirala3 5:d6c2e01b0596 292 direction = false;
4180_1 0:cc87c48aa43c 293 }
pkoirala3 5:d6c2e01b0596 294
pkoirala3 5:d6c2e01b0596 295 void right_hit_callback (void)
4180_1 2:58d85409f7ff 296 {
pkoirala3 5:d6c2e01b0596 297 movement = true;
pkoirala3 5:d6c2e01b0596 298 direction = true;
4180_1 1:768b8bd42e33 299 }
4180_1 2:58d85409f7ff 300
pkoirala3 5:d6c2e01b0596 301 void shoot_hit_callback (void)
pkoirala3 5:d6c2e01b0596 302 {
pkoirala3 5:d6c2e01b0596 303 if (!fire) {
pkoirala3 5:d6c2e01b0596 304 bulletx = shipx + 8;
pkoirala3 5:d6c2e01b0596 305 }
pkoirala3 5:d6c2e01b0596 306 fire = true;
pkoirala3 5:d6c2e01b0596 307 }
pkoirala3 5:d6c2e01b0596 308 void start()
pkoirala3 5:d6c2e01b0596 309 {
pkoirala3 5:d6c2e01b0596 310
pkoirala3 5:d6c2e01b0596 311 srand(time(0));
pkoirala3 5:d6c2e01b0596 312 int randomNum[6];
pkoirala3 5:d6c2e01b0596 313 int xpos[6];
pkoirala3 5:d6c2e01b0596 314 for (int i = 0; i < aliens.size(); i++) {
pkoirala3 5:d6c2e01b0596 315 randomNum[i] = rand()%3 + 1;
pkoirala3 5:d6c2e01b0596 316 xpos[i] = rand()%117 + 1;
pkoirala3 5:d6c2e01b0596 317 }
pkoirala3 5:d6c2e01b0596 318
pkoirala3 5:d6c2e01b0596 319 for (int i = 0; i < 6; i++) {
pkoirala3 5:d6c2e01b0596 320 if (randomNum[i] == 1) {
pkoirala3 5:d6c2e01b0596 321 aliens[i] = new AlienBob(xpos[i], i*10 + 10);
pkoirala3 5:d6c2e01b0596 322 } else if (randomNum[i] == 2) {
pkoirala3 5:d6c2e01b0596 323 aliens[i] = new AlienAlice(xpos[i], i*10 + 10);
pkoirala3 5:d6c2e01b0596 324 } else if (randomNum[i] == 3) {
pkoirala3 5:d6c2e01b0596 325 aliens[i] = new AlienAli(xpos[i], i*10 + 10);
pkoirala3 5:d6c2e01b0596 326 }
pkoirala3 5:d6c2e01b0596 327 }
pkoirala3 5:d6c2e01b0596 328
pkoirala3 5:d6c2e01b0596 329 aliens[0] -> draw();
pkoirala3 5:d6c2e01b0596 330 aliens[1] -> draw();
pkoirala3 5:d6c2e01b0596 331 aliens[2] -> draw();
pkoirala3 5:d6c2e01b0596 332 aliens[3] -> draw();
pkoirala3 5:d6c2e01b0596 333 aliens[4] -> draw();
pkoirala3 5:d6c2e01b0596 334 aliens[5] -> draw();
pkoirala3 5:d6c2e01b0596 335
pkoirala3 5:d6c2e01b0596 336 uLCD.filled_rectangle(shipx,shipy,shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT, X);
pkoirala3 5:d6c2e01b0596 337 }
4180_1 0:cc87c48aa43c 338
4180_1 2:58d85409f7ff 339 int main()
4180_1 2:58d85409f7ff 340 {
pkoirala3 5:d6c2e01b0596 341 uLCD.background_color(BLUE); // Background color blue
4180_1 2:58d85409f7ff 342
pkoirala3 5:d6c2e01b0596 343 left.mode(PullUp);
pkoirala3 5:d6c2e01b0596 344 right.mode(PullUp);
pkoirala3 5:d6c2e01b0596 345 shoot.mode(PullUp);
pkoirala3 5:d6c2e01b0596 346
pkoirala3 5:d6c2e01b0596 347 uLCD.printf("\n\nLAME Attack Game!"); // Welcome message
pkoirala3 5:d6c2e01b0596 348 wait(2.0); //1 pause system for 2.0
pkoirala3 5:d6c2e01b0596 349 uLCD.cls(); // clear screen
4180_1 2:58d85409f7ff 350
4180_1 2:58d85409f7ff 351
pkoirala3 5:d6c2e01b0596 352 // Setup Interrupt callback functions for a pb hit
pkoirala3 5:d6c2e01b0596 353 left.attach_deasserted(&left_hit_callback);
pkoirala3 5:d6c2e01b0596 354 right.attach_deasserted(&right_hit_callback);
pkoirala3 5:d6c2e01b0596 355 shoot.attach_deasserted(&shoot_hit_callback);
4180_1 2:58d85409f7ff 356
pkoirala3 5:d6c2e01b0596 357 // Start sampling pb inputs using interrupts
pkoirala3 5:d6c2e01b0596 358 left.setSampleFrequency();
pkoirala3 5:d6c2e01b0596 359 right.setSampleFrequency();
pkoirala3 5:d6c2e01b0596 360 shoot.setSampleFrequency();
pkoirala3 5:d6c2e01b0596 361 start();
pkoirala3 5:d6c2e01b0596 362 timer.start(); // Starting timer to keep track how much time taken
pkoirala3 5:d6c2e01b0596 363 int startT = timer.read_ms();
pkoirala3 5:d6c2e01b0596 364 while (aliens.size() > 0) {
4180_1 2:58d85409f7ff 365
pkoirala3 5:d6c2e01b0596 366 for (int i = 0; i < aliens.size(); i++) {
pkoirala3 5:d6c2e01b0596 367 aliens[i] -> update();
pkoirala3 5:d6c2e01b0596 368 }
pkoirala3 5:d6c2e01b0596 369 if (fire) {
pkoirala3 5:d6c2e01b0596 370 uLCD.filled_rectangle(bulletx, bullety, bulletx + 2, bullety +4, Y);
pkoirala3 5:d6c2e01b0596 371 for (int i = 0; i < aliens.size(); i++) {
pkoirala3 5:d6c2e01b0596 372 if (((*aliens[i]).getxPos()- 4 <= bulletx) && (bulletx + 2 <= (*aliens[i]).getxPos() + ALIEN_WIDTH + 4)
pkoirala3 5:d6c2e01b0596 373 && ((*aliens[i]).getyPos()- 8 <= bullety) && ((*aliens[i]).getyPos()+8 >= bullety - ALIEN_HEIGHT )) {
pkoirala3 5:d6c2e01b0596 374 uLCD.BLIT((*aliens[i]).getxPos(),(*aliens[i]).getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
pkoirala3 5:d6c2e01b0596 375 fire = false;
pkoirala3 5:d6c2e01b0596 376 bullety = 115;
pkoirala3 5:d6c2e01b0596 377 aliens.erase(aliens.begin()+i);
pkoirala3 5:d6c2e01b0596 378 mySpeaker.PlayNote(100.0, 0.25, 0.01);
pkoirala3 5:d6c2e01b0596 379 } else if (bullety < 0) {
pkoirala3 5:d6c2e01b0596 380 fire = false;
pkoirala3 5:d6c2e01b0596 381 bullety = 115;
4180_1 2:58d85409f7ff 382 }
pkoirala3 5:d6c2e01b0596 383 }
pkoirala3 5:d6c2e01b0596 384 if (fire) {
pkoirala3 5:d6c2e01b0596 385 bullety = bullety - 8;
pkoirala3 5:d6c2e01b0596 386 uLCD.filled_rectangle(bulletx, bullety, bulletx + 2, bullety + 4, RED);
4180_1 2:58d85409f7ff 387 }
4180_1 2:58d85409f7ff 388 }
pkoirala3 5:d6c2e01b0596 389 if (movement) {
pkoirala3 5:d6c2e01b0596 390 uLCD.filled_rectangle(shipx,shipy,shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT,Y);
pkoirala3 5:d6c2e01b0596 391 if (direction) {
pkoirala3 5:d6c2e01b0596 392 if (shipx + SHIP_WIDTH + ALIEN_WIDTH > 128) {
pkoirala3 5:d6c2e01b0596 393 shipx = 128-SHIP_WIDTH;
pkoirala3 5:d6c2e01b0596 394 } else {
pkoirala3 5:d6c2e01b0596 395 shipx = shipx + ALIEN_WIDTH;
pkoirala3 5:d6c2e01b0596 396 }
pkoirala3 5:d6c2e01b0596 397 } else {
pkoirala3 5:d6c2e01b0596 398 if (shipx - ALIEN_WIDTH < 0) {
pkoirala3 5:d6c2e01b0596 399 shipx = 0;
pkoirala3 5:d6c2e01b0596 400 } else {
pkoirala3 5:d6c2e01b0596 401 shipx = shipx - ALIEN_WIDTH;
pkoirala3 5:d6c2e01b0596 402 }
pkoirala3 5:d6c2e01b0596 403 }
pkoirala3 5:d6c2e01b0596 404 movement = false;
pkoirala3 5:d6c2e01b0596 405 uLCD.filled_rectangle(shipx, shipy, shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT,X);
pkoirala3 5:d6c2e01b0596 406 }
4180_1 0:cc87c48aa43c 407 }
pkoirala3 5:d6c2e01b0596 408 wait(1.0);
pkoirala3 5:d6c2e01b0596 409 mySpeaker.PlayNote(800.0, 1.0, 0.25);
pkoirala3 5:d6c2e01b0596 410 int endT = timer.read_ms();
pkoirala3 5:d6c2e01b0596 411 timer.stop(); // End of timer
pkoirala3 5:d6c2e01b0596 412 int total = (endT - startT)/1000;
pkoirala3 5:d6c2e01b0596 413 uLCD.cls();
pkoirala3 5:d6c2e01b0596 414 uLCD.printf("Earth Saved!\n\n%d seconds.", total);
4180_1 0:cc87c48aa43c 415 }