ECE2036 Lab5 (SHIP Game)
Dependencies: 4DGL-uLCD-SE mbed PinDetect SDFileSystem mbed-rtos
Fork of mythermostat by
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
main.cpp@5:d6c2e01b0596, 2017-03-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |