Asteroid

Dependencies:   4DGL-uLCD-SE PinDetect mbed

Committer:
Philipjp
Date:
Tue Nov 14 18:03:31 2017 +0000
Revision:
0:73375f76583c
Asteroid

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Philipjp 0:73375f76583c 1 #include "mbed.h"
Philipjp 0:73375f76583c 2 #include "MMA8452.h"
Philipjp 0:73375f76583c 3 #include "uLCD_4DGL.h"
Philipjp 0:73375f76583c 4 #include "PinDetect.h"
Philipjp 0:73375f76583c 5 #include "Speaker.h"
Philipjp 0:73375f76583c 6
Philipjp 0:73375f76583c 7
Philipjp 0:73375f76583c 8 #define ASTEROID_HEIGHT 12
Philipjp 0:73375f76583c 9 #define ASTEROID_WIDTH 15
Philipjp 0:73375f76583c 10 #define SPRITE_MAX 15
Philipjp 0:73375f76583c 11 #define EARTH_WIDTH 10
Philipjp 0:73375f76583c 12 #define EARTH_HEIGHT 10
Philipjp 0:73375f76583c 13 #define EXPLOSION1_WIDTH 20
Philipjp 0:73375f76583c 14
Philipjp 0:73375f76583c 15 #define SCREEN_MAX 125
Philipjp 0:73375f76583c 16 #define SCREEN_MIN 1
Philipjp 0:73375f76583c 17 #define NUM_ASTEROIDS 4
Philipjp 0:73375f76583c 18
Philipjp 0:73375f76583c 19 #define Q 0x808000 //OLIVE
Philipjp 0:73375f76583c 20 #define I 0x008000 //GREEN
Philipjp 0:73375f76583c 21 #define S 0xC0C0C0 //SILVER
Philipjp 0:73375f76583c 22 #define C 0x17202A //UFO GLASS
Philipjp 0:73375f76583c 23 #define D 0x797D7F //DARK GREY
Philipjp 0:73375f76583c 24 #define L 0x00FF00 //LIME
Philipjp 0:73375f76583c 25 #define P 0xFF00FF //PINK
Philipjp 0:73375f76583c 26 #define R 0xF1C40F //YELLOW
Philipjp 0:73375f76583c 27 #define O 0xF39C12 //ORANGE
Philipjp 0:73375f76583c 28 #define G 0xAAB7B8 //GREY
Philipjp 0:73375f76583c 29 #define _ 0x000000 //BLACK
Philipjp 0:73375f76583c 30 #define X 0xFFFFFF //WHITE
Philipjp 0:73375f76583c 31 #define B 0x0000FF //BLUE
Philipjp 0:73375f76583c 32 #define r 0xFF0000 //RED
Philipjp 0:73375f76583c 33
Philipjp 0:73375f76583c 34 int asteroid_sprite_1[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
Philipjp 0:73375f76583c 35 _,_,_,_,X,X,X,X,X,X,X,X,_,_,_,
Philipjp 0:73375f76583c 36 _,_,_,X,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 37 _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 38 _,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 39 X,X,X,X,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 40 _,_,_,X,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 41 _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 42 _,X,_,_,_,_,_,X,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 43 X,_,_,_,_,_,X,X,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 44 _,X,_,_,_,X,_,X,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 45 _,_,X,_,X,_,_,X,_,_,_,X,_,_,_,
Philipjp 0:73375f76583c 46 _,_,_,X,_,_,_,X,X,X,X,_,_,_,_
Philipjp 0:73375f76583c 47 };
Philipjp 0:73375f76583c 48
Philipjp 0:73375f76583c 49 int asteroid_sprite_2[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
Philipjp 0:73375f76583c 50 _,_,_,_,X,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 51 _,_,_,X,_,X,_,_,_,_,_,X,_,X,_,
Philipjp 0:73375f76583c 52 _,_,X,_,_,_,X,_,_,_,X,_,_,_,X,
Philipjp 0:73375f76583c 53 _,X,_,_,_,_,_,X,_,X,_,_,_,X,_,
Philipjp 0:73375f76583c 54 X,_,_,_,_,_,_,_,X,_,_,_,X,_,_,
Philipjp 0:73375f76583c 55 X,_,_,_,_,_,_,_,_,_,_,X,_,_,_,
Philipjp 0:73375f76583c 56 X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 57 X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 58 X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
Philipjp 0:73375f76583c 59 _,X,_,_,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 60 _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 61 _,_,_,X,X,X,X,X,X,X,X,X,_,_,_
Philipjp 0:73375f76583c 62 };
Philipjp 0:73375f76583c 63
Philipjp 0:73375f76583c 64 int asteroid_sprite_3[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
Philipjp 0:73375f76583c 65 _,_,_,_,X,X,X,X,X,X,X,_,_,_,_,
Philipjp 0:73375f76583c 66 _,_,_,X,_,_,_,_,_,_,_,X,X,_,_,
Philipjp 0:73375f76583c 67 _,_,X,_,_,_,_,_,_,_,_,_,_,X,X,
Philipjp 0:73375f76583c 68 _,_,_,X,_,_,_,_,_,_,_,_,X,X,_,
Philipjp 0:73375f76583c 69 X,X,X,X,_,_,_,_,_,_,X,X,_,_,_,
Philipjp 0:73375f76583c 70 X,_,_,_,_,_,_,_,X,X,_,_,_,_,_,
Philipjp 0:73375f76583c 71 X,_,_,_,_,_,_,_,_,_,X,X,_,_,_,
Philipjp 0:73375f76583c 72 X,_,_,_,_,_,_,_,_,_,_,_,X,X,_,
Philipjp 0:73375f76583c 73 X,_,_,_,_,_,_,_,X,_,_,_,_,_,X,
Philipjp 0:73375f76583c 74 _,X,_,_,_,_,X,X,_,X,_,_,_,X,_,
Philipjp 0:73375f76583c 75 _,_,X,_,X,X,_,_,_,_,X,_,X,_,_,
Philipjp 0:73375f76583c 76 _,_,_,X,_,_,_,_,_,_,_,X,_,_,_
Philipjp 0:73375f76583c 77 };
Philipjp 0:73375f76583c 78
Philipjp 0:73375f76583c 79 int asteroid_sprite_4[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
Philipjp 0:73375f76583c 80 _,_,_,_,X,X,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 81 _,_,_,X,_,_,X,X,_,_,X,X,_,X,_,
Philipjp 0:73375f76583c 82 _,_,X,_,_,_,_,_,X,X,_,_,_,_,X,
Philipjp 0:73375f76583c 83 _,X,_,_,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 84 _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 85 _,_,_,X,_,_,_,_,_,_,_,X,_,_,_,
Philipjp 0:73375f76583c 86 _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
Philipjp 0:73375f76583c 87 _,X,_,_,_,_,_,_,_,_,_,_,_,X,_,
Philipjp 0:73375f76583c 88 X,_,_,_,_,_,X,_,_,_,_,_,_,_,X,
Philipjp 0:73375f76583c 89 _,X,_,_,_,X,_,X,X,_,_,_,_,X,_,
Philipjp 0:73375f76583c 90 _,_,X,_,X,_,_,_,_,X,X,_,X,_,_,
Philipjp 0:73375f76583c 91 _,_,_,X,_,_,_,_,_,_,_,X,_,_,_
Philipjp 0:73375f76583c 92 };
Philipjp 0:73375f76583c 93
Philipjp 0:73375f76583c 94 int spaceship_explode[EARTH_WIDTH *EARTH_HEIGHT] = {
Philipjp 0:73375f76583c 95 _,_,r,r,r,r,r,r,_,_,
Philipjp 0:73375f76583c 96 _,r,r,r,r,r,r,r,r,_,
Philipjp 0:73375f76583c 97 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 98 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 99 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 100 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 101 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 102 r,r,r,r,r,r,r,r,r,r,
Philipjp 0:73375f76583c 103 _,r,r,r,r,r,r,r,r,_,
Philipjp 0:73375f76583c 104 _,_,r,r,r,r,r,r,_,_,
Philipjp 0:73375f76583c 105 };
Philipjp 0:73375f76583c 106
Philipjp 0:73375f76583c 107 int spaceship_earth1[EARTH_WIDTH *EARTH_HEIGHT] = {
Philipjp 0:73375f76583c 108 _,_,S,S,S,S,S,S,_,_,
Philipjp 0:73375f76583c 109 _,S,I,I,I,I,I,I,S,_,
Philipjp 0:73375f76583c 110 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 111 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 112 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 113 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 114 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 115 S,I,I,I,I,I,I,I,I,S,
Philipjp 0:73375f76583c 116 S,I,I,I,I,I,I,I,S,_,
Philipjp 0:73375f76583c 117 _,S,S,S,S,S,S,S,_,_,
Philipjp 0:73375f76583c 118 };
Philipjp 0:73375f76583c 119
Philipjp 0:73375f76583c 120
Philipjp 0:73375f76583c 121 int earth_update[EARTH_WIDTH *EARTH_HEIGHT] = {
Philipjp 0:73375f76583c 122 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 123 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 124 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 125 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 126 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 127 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 128 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 129 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 130 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 131 _,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 132 };
Philipjp 0:73375f76583c 133
Philipjp 0:73375f76583c 134 int asteroid_update[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
Philipjp 0:73375f76583c 135 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 136 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 137 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 138 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 139 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 140 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 141 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 142 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 143 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 144 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 145 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
Philipjp 0:73375f76583c 146 _,_,_,_,_,_,_,_,_,_,_,_,_,_,_
Philipjp 0:73375f76583c 147 };
Philipjp 0:73375f76583c 148
Philipjp 0:73375f76583c 149 uLCD_4DGL uLCD(p28, p27, p29);
Philipjp 0:73375f76583c 150 Serial pc(USBTX,USBRX);
Philipjp 0:73375f76583c 151
Philipjp 0:73375f76583c 152 class ScreenObject
Philipjp 0:73375f76583c 153 {
Philipjp 0:73375f76583c 154 protected:
Philipjp 0:73375f76583c 155 int x_pos, y_pos;
Philipjp 0:73375f76583c 156 public:
Philipjp 0:73375f76583c 157 ScreenObject():x_pos(0),y_pos(0) {}
Philipjp 0:73375f76583c 158 ScreenObject(int x, int y):x_pos(x),y_pos(y) {}
Philipjp 0:73375f76583c 159 virtual void draw()=0;
Philipjp 0:73375f76583c 160 virtual void update()=0;
Philipjp 0:73375f76583c 161 double getX() {
Philipjp 0:73375f76583c 162 return x_pos;
Philipjp 0:73375f76583c 163 }
Philipjp 0:73375f76583c 164 double getY() {
Philipjp 0:73375f76583c 165 return y_pos;
Philipjp 0:73375f76583c 166 }
Philipjp 0:73375f76583c 167 void setX(int x){
Philipjp 0:73375f76583c 168 x_pos=x;
Philipjp 0:73375f76583c 169 }
Philipjp 0:73375f76583c 170 void setY(int y){
Philipjp 0:73375f76583c 171 y_pos=y;
Philipjp 0:73375f76583c 172 }
Philipjp 0:73375f76583c 173 };
Philipjp 0:73375f76583c 174 class SpaceShipEarth: public ScreenObject
Philipjp 0:73375f76583c 175 {
Philipjp 0:73375f76583c 176 public:
Philipjp 0:73375f76583c 177 SpaceShipEarth() {
Philipjp 0:73375f76583c 178 x_pos=63;
Philipjp 0:73375f76583c 179 y_pos=63;
Philipjp 0:73375f76583c 180
Philipjp 0:73375f76583c 181 }
Philipjp 0:73375f76583c 182 void setX(double x) {
Philipjp 0:73375f76583c 183 x_pos=x;
Philipjp 0:73375f76583c 184 }
Philipjp 0:73375f76583c 185 void setY(double y) {
Philipjp 0:73375f76583c 186 y_pos=y;
Philipjp 0:73375f76583c 187 }
Philipjp 0:73375f76583c 188
Philipjp 0:73375f76583c 189 void draw() {
Philipjp 0:73375f76583c 190 uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,spaceship_earth1);
Philipjp 0:73375f76583c 191 }
Philipjp 0:73375f76583c 192 void update() {
Philipjp 0:73375f76583c 193
Philipjp 0:73375f76583c 194 uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,earth_update);
Philipjp 0:73375f76583c 195 }
Philipjp 0:73375f76583c 196
Philipjp 0:73375f76583c 197 };
Philipjp 0:73375f76583c 198 class AbstractAsteroid: public ScreenObject
Philipjp 0:73375f76583c 199 {
Philipjp 0:73375f76583c 200 protected:
Philipjp 0:73375f76583c 201 int deltaX, deltaY;
Philipjp 0:73375f76583c 202 };
Philipjp 0:73375f76583c 203 class ConcreteAsteroid1: public AbstractAsteroid
Philipjp 0:73375f76583c 204 {
Philipjp 0:73375f76583c 205 public:
Philipjp 0:73375f76583c 206 ConcreteAsteroid1() {
Philipjp 0:73375f76583c 207 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 208 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 209 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 210 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 211 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 212 if (ranNum==1) {
Philipjp 0:73375f76583c 213 x_pos=0*x_pos;
Philipjp 0:73375f76583c 214 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 215 } else if(ranNum==2) {
Philipjp 0:73375f76583c 216 y_pos=0*y_pos;
Philipjp 0:73375f76583c 217 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 218 } else if (ranNum==3) {
Philipjp 0:73375f76583c 219 x_pos=x_pos*0;
Philipjp 0:73375f76583c 220 y_pos=y_pos*0;
Philipjp 0:73375f76583c 221 } else {
Philipjp 0:73375f76583c 222 x_pos=x_pos;
Philipjp 0:73375f76583c 223 y_pos=y_pos;
Philipjp 0:73375f76583c 224 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 225 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 226 }
Philipjp 0:73375f76583c 227 }
Philipjp 0:73375f76583c 228
Philipjp 0:73375f76583c 229 void draw() {
Philipjp 0:73375f76583c 230 uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_1);
Philipjp 0:73375f76583c 231 }
Philipjp 0:73375f76583c 232 void update() {
Philipjp 0:73375f76583c 233 uLCD.filled_rectangle(x_pos+ASTEROID_WIDTH,y_pos+ASTEROID_HEIGHT,x_pos,y_pos,BLACK);
Philipjp 0:73375f76583c 234 x_pos=x_pos+deltaX;
Philipjp 0:73375f76583c 235 y_pos=y_pos+deltaY;
Philipjp 0:73375f76583c 236 if(x_pos>125 || y_pos>125 || x_pos<1 || y_pos<1) {
Philipjp 0:73375f76583c 237 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 238 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 239 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 240 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 241 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 242 if (ranNum==1) {
Philipjp 0:73375f76583c 243 x_pos=0*x_pos;
Philipjp 0:73375f76583c 244 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 245 } else if(ranNum==2) {
Philipjp 0:73375f76583c 246 y_pos=0*y_pos;
Philipjp 0:73375f76583c 247 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 248 } else if (ranNum==3) {
Philipjp 0:73375f76583c 249 x_pos=x_pos*0;
Philipjp 0:73375f76583c 250 y_pos=y_pos*0;
Philipjp 0:73375f76583c 251 } else {
Philipjp 0:73375f76583c 252 x_pos=x_pos;
Philipjp 0:73375f76583c 253 y_pos=y_pos;
Philipjp 0:73375f76583c 254 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 255 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 256 }
Philipjp 0:73375f76583c 257 }
Philipjp 0:73375f76583c 258 }
Philipjp 0:73375f76583c 259 };
Philipjp 0:73375f76583c 260 class ConcreteAsteroid2: public AbstractAsteroid
Philipjp 0:73375f76583c 261 {
Philipjp 0:73375f76583c 262 public:
Philipjp 0:73375f76583c 263 ConcreteAsteroid2() {
Philipjp 0:73375f76583c 264 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 265 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 266 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 267 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 268 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 269 if (ranNum==1) {
Philipjp 0:73375f76583c 270 x_pos=0*x_pos;
Philipjp 0:73375f76583c 271 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 272 } else if(ranNum==2) {
Philipjp 0:73375f76583c 273 y_pos=0*y_pos;
Philipjp 0:73375f76583c 274 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 275 } else if (ranNum==3) {
Philipjp 0:73375f76583c 276 x_pos=x_pos*0;
Philipjp 0:73375f76583c 277 y_pos=y_pos*0;
Philipjp 0:73375f76583c 278 } else {
Philipjp 0:73375f76583c 279 x_pos=x_pos;
Philipjp 0:73375f76583c 280 y_pos=y_pos;
Philipjp 0:73375f76583c 281 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 282 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 283 }
Philipjp 0:73375f76583c 284 }
Philipjp 0:73375f76583c 285
Philipjp 0:73375f76583c 286 void draw() {
Philipjp 0:73375f76583c 287 uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_2);
Philipjp 0:73375f76583c 288 }
Philipjp 0:73375f76583c 289 void update() {
Philipjp 0:73375f76583c 290 uLCD.filled_rectangle(x_pos+ASTEROID_WIDTH,y_pos+ASTEROID_HEIGHT,x_pos,y_pos,BLACK);
Philipjp 0:73375f76583c 291 x_pos=x_pos+deltaX;
Philipjp 0:73375f76583c 292 y_pos=y_pos+deltaY;
Philipjp 0:73375f76583c 293 if(x_pos>125 || y_pos>125 || x_pos<0 || y_pos<0) {
Philipjp 0:73375f76583c 294 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 295 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 296 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 297 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 298 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 299 if (ranNum==1) {
Philipjp 0:73375f76583c 300 x_pos=0*x_pos;
Philipjp 0:73375f76583c 301 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 302 } else if(ranNum==2) {
Philipjp 0:73375f76583c 303 y_pos=0*y_pos;
Philipjp 0:73375f76583c 304 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 305 } else if (ranNum==3) {
Philipjp 0:73375f76583c 306 x_pos=x_pos*0;
Philipjp 0:73375f76583c 307 y_pos=y_pos*0;
Philipjp 0:73375f76583c 308 } else {
Philipjp 0:73375f76583c 309 x_pos=x_pos;
Philipjp 0:73375f76583c 310 y_pos=y_pos;
Philipjp 0:73375f76583c 311 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 312 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 313 }
Philipjp 0:73375f76583c 314 }
Philipjp 0:73375f76583c 315
Philipjp 0:73375f76583c 316 }
Philipjp 0:73375f76583c 317 };
Philipjp 0:73375f76583c 318
Philipjp 0:73375f76583c 319 class ConcreteAsteroid3: public AbstractAsteroid
Philipjp 0:73375f76583c 320 {
Philipjp 0:73375f76583c 321 public:
Philipjp 0:73375f76583c 322 ConcreteAsteroid3() {
Philipjp 0:73375f76583c 323 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 324 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 325 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 326 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 327 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 328 if (ranNum==1) {
Philipjp 0:73375f76583c 329 x_pos=0*x_pos;
Philipjp 0:73375f76583c 330 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 331 } else if(ranNum==2) {
Philipjp 0:73375f76583c 332 y_pos=0*y_pos;
Philipjp 0:73375f76583c 333 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 334 } else if (ranNum==3) {
Philipjp 0:73375f76583c 335 x_pos=x_pos*0;
Philipjp 0:73375f76583c 336 y_pos=y_pos*0;
Philipjp 0:73375f76583c 337 } else {
Philipjp 0:73375f76583c 338 x_pos=x_pos;
Philipjp 0:73375f76583c 339 y_pos=y_pos;
Philipjp 0:73375f76583c 340 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 341 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 342 }
Philipjp 0:73375f76583c 343 }
Philipjp 0:73375f76583c 344
Philipjp 0:73375f76583c 345 void draw() {
Philipjp 0:73375f76583c 346 uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_3);
Philipjp 0:73375f76583c 347 }
Philipjp 0:73375f76583c 348 void update() {
Philipjp 0:73375f76583c 349 uLCD.filled_rectangle(x_pos+ASTEROID_WIDTH,y_pos+ASTEROID_HEIGHT,x_pos,y_pos,BLACK);
Philipjp 0:73375f76583c 350 x_pos=x_pos+deltaX;
Philipjp 0:73375f76583c 351 y_pos=y_pos+deltaY;
Philipjp 0:73375f76583c 352 if(x_pos>125 || y_pos>125 || x_pos<1 || y_pos<1) {
Philipjp 0:73375f76583c 353 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 354 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 355 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 356 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 357 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 358 if (ranNum==1) {
Philipjp 0:73375f76583c 359 x_pos=0*x_pos;
Philipjp 0:73375f76583c 360 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 361 } else if(ranNum==2) {
Philipjp 0:73375f76583c 362 y_pos=0*y_pos;
Philipjp 0:73375f76583c 363 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 364 } else if (ranNum==3) {
Philipjp 0:73375f76583c 365 x_pos=x_pos*0;
Philipjp 0:73375f76583c 366 y_pos=y_pos*0;
Philipjp 0:73375f76583c 367 } else {
Philipjp 0:73375f76583c 368 x_pos=x_pos;
Philipjp 0:73375f76583c 369 y_pos=y_pos;
Philipjp 0:73375f76583c 370 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 371 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 372 }
Philipjp 0:73375f76583c 373 }
Philipjp 0:73375f76583c 374
Philipjp 0:73375f76583c 375 }
Philipjp 0:73375f76583c 376 };
Philipjp 0:73375f76583c 377
Philipjp 0:73375f76583c 378 class ConcreteAsteroid4: public AbstractAsteroid
Philipjp 0:73375f76583c 379 {
Philipjp 0:73375f76583c 380 public:
Philipjp 0:73375f76583c 381 ConcreteAsteroid4() {
Philipjp 0:73375f76583c 382 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 383 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 384 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 385 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 386 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 387 if (ranNum==1) {
Philipjp 0:73375f76583c 388 x_pos=0*x_pos;
Philipjp 0:73375f76583c 389 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 390 } else if(ranNum==2) {
Philipjp 0:73375f76583c 391 y_pos=0*y_pos;
Philipjp 0:73375f76583c 392 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 393 } else if (ranNum==3) {
Philipjp 0:73375f76583c 394 x_pos=x_pos*0;
Philipjp 0:73375f76583c 395 y_pos=y_pos*0;
Philipjp 0:73375f76583c 396 } else {
Philipjp 0:73375f76583c 397 x_pos=x_pos;
Philipjp 0:73375f76583c 398 y_pos=y_pos;
Philipjp 0:73375f76583c 399 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 400 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 401 }
Philipjp 0:73375f76583c 402 }
Philipjp 0:73375f76583c 403
Philipjp 0:73375f76583c 404 void draw() {
Philipjp 0:73375f76583c 405 uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_4);
Philipjp 0:73375f76583c 406 }
Philipjp 0:73375f76583c 407 void update() {
Philipjp 0:73375f76583c 408 uLCD.filled_rectangle(x_pos+ASTEROID_WIDTH,y_pos+ASTEROID_HEIGHT,x_pos,y_pos,BLACK);
Philipjp 0:73375f76583c 409 x_pos=x_pos+deltaX;
Philipjp 0:73375f76583c 410 y_pos=y_pos+deltaY;
Philipjp 0:73375f76583c 411 if(x_pos>125 || y_pos>125 || x_pos<1 || y_pos<1) {
Philipjp 0:73375f76583c 412 x_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 413 y_pos=rand() % 126 + 1;
Philipjp 0:73375f76583c 414 deltaX=rand() % 4 + 1;
Philipjp 0:73375f76583c 415 deltaY=rand() % 4 + 1;
Philipjp 0:73375f76583c 416 int ranNum=rand() % 4 + 1;
Philipjp 0:73375f76583c 417 if (ranNum==1) {
Philipjp 0:73375f76583c 418 x_pos=0*x_pos;
Philipjp 0:73375f76583c 419 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 420 } else if(ranNum==2) {
Philipjp 0:73375f76583c 421 y_pos=0*y_pos;
Philipjp 0:73375f76583c 422 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 423 } else if (ranNum==3) {
Philipjp 0:73375f76583c 424 x_pos=x_pos*0;
Philipjp 0:73375f76583c 425 y_pos=y_pos*0;
Philipjp 0:73375f76583c 426 } else {
Philipjp 0:73375f76583c 427 x_pos=x_pos;
Philipjp 0:73375f76583c 428 y_pos=y_pos;
Philipjp 0:73375f76583c 429 deltaX=deltaX*-1;
Philipjp 0:73375f76583c 430 deltaY=deltaY*-1;
Philipjp 0:73375f76583c 431 }
Philipjp 0:73375f76583c 432 }
Philipjp 0:73375f76583c 433
Philipjp 0:73375f76583c 434 }
Philipjp 0:73375f76583c 435 };
Philipjp 0:73375f76583c 436
Philipjp 0:73375f76583c 437 bool overlap(ScreenObject & objectA, ScreenObject & objectB)
Philipjp 0:73375f76583c 438 {
Philipjp 0:73375f76583c 439 int EarthX=objectA.getX();
Philipjp 0:73375f76583c 440 int EarthY=objectA.getY();
Philipjp 0:73375f76583c 441
Philipjp 0:73375f76583c 442 int TXSB=EarthX-15;
Philipjp 0:73375f76583c 443 int TYSB=EarthY-12;
Philipjp 0:73375f76583c 444 int LXSB=EarthX+10;
Philipjp 0:73375f76583c 445 int LYSB=EarthY+10;
Philipjp 0:73375f76583c 446 int AstX=objectB.getX();
Philipjp 0:73375f76583c 447 int AstY=objectB.getY();
Philipjp 0:73375f76583c 448
Philipjp 0:73375f76583c 449 if ((AstX>TXSB && AstX<LXSB) && (AstY>TYSB && AstY<LYSB)){
Philipjp 0:73375f76583c 450 return true;
Philipjp 0:73375f76583c 451 }
Philipjp 0:73375f76583c 452 else{
Philipjp 0:73375f76583c 453 return false;
Philipjp 0:73375f76583c 454 }
Philipjp 0:73375f76583c 455 }
Philipjp 0:73375f76583c 456
Philipjp 0:73375f76583c 457
Philipjp 0:73375f76583c 458 Speaker mySpeaker(p21);
Philipjp 0:73375f76583c 459 bool BombUsed=false;
Philipjp 0:73375f76583c 460 bool ExplodeAllAsteroids=false;
Philipjp 0:73375f76583c 461 //DigitalIn pb1(p16);
Philipjp 0:73375f76583c 462
Philipjp 0:73375f76583c 463 PinDetect pb1(p16);
Philipjp 0:73375f76583c 464 void pb1_hit_callback (void)
Philipjp 0:73375f76583c 465 {
Philipjp 0:73375f76583c 466 if (!BombUsed )
Philipjp 0:73375f76583c 467 {
Philipjp 0:73375f76583c 468
Philipjp 0:73375f76583c 469 ExplodeAllAsteroids = true;
Philipjp 0:73375f76583c 470 BombUsed = true;
Philipjp 0:73375f76583c 471
Philipjp 0:73375f76583c 472 }
Philipjp 0:73375f76583c 473 }
Philipjp 0:73375f76583c 474
Philipjp 0:73375f76583c 475
Philipjp 0:73375f76583c 476 int main()
Philipjp 0:73375f76583c 477 {
Philipjp 0:73375f76583c 478 uLCD.baudrate(300000);
Philipjp 0:73375f76583c 479 wait(0.2);
Philipjp 0:73375f76583c 480 srand(time(0));
Philipjp 0:73375f76583c 481
Philipjp 0:73375f76583c 482 ScreenObject * ActiveAsteroids[NUM_ASTEROIDS];
Philipjp 0:73375f76583c 483
Philipjp 0:73375f76583c 484 SpaceShipEarth ship;
Philipjp 0:73375f76583c 485 ConcreteAsteroid1 Ast1;
Philipjp 0:73375f76583c 486 ConcreteAsteroid2 Ast2;
Philipjp 0:73375f76583c 487 ConcreteAsteroid3 Ast3;
Philipjp 0:73375f76583c 488 ConcreteAsteroid4 Ast4;
Philipjp 0:73375f76583c 489
Philipjp 0:73375f76583c 490 //ship draw
Philipjp 0:73375f76583c 491 ActiveAsteroids[0]=&Ast1;
Philipjp 0:73375f76583c 492 ActiveAsteroids[1]=&Ast2;
Philipjp 0:73375f76583c 493 ActiveAsteroids[2]=&Ast3;
Philipjp 0:73375f76583c 494 ActiveAsteroids[3]=&Ast4;
Philipjp 0:73375f76583c 495
Philipjp 0:73375f76583c 496
Philipjp 0:73375f76583c 497
Philipjp 0:73375f76583c 498 double x=0,y=0,z=0;
Philipjp 0:73375f76583c 499 double factor=50;
Philipjp 0:73375f76583c 500
Philipjp 0:73375f76583c 501
Philipjp 0:73375f76583c 502 MMA8452 acc(p9, p10, 40000);
Philipjp 0:73375f76583c 503 acc.setBitDepth(MMA8452::BIT_DEPTH_12);
Philipjp 0:73375f76583c 504 acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
Philipjp 0:73375f76583c 505 acc.setDataRate(MMA8452::RATE_100);
Philipjp 0:73375f76583c 506 set_time(0);
Philipjp 0:73375f76583c 507 time_t startTime;
Philipjp 0:73375f76583c 508 startTime = time(0);
Philipjp 0:73375f76583c 509 time_t timeElapsed;
Philipjp 0:73375f76583c 510 timeElapsed= time(0)-startTime; // timeBar;
Philipjp 0:73375f76583c 511
Philipjp 0:73375f76583c 512
Philipjp 0:73375f76583c 513
Philipjp 0:73375f76583c 514 int x_pos=63;
Philipjp 0:73375f76583c 515 int y_pos=63;
Philipjp 0:73375f76583c 516 bool check=true;
Philipjp 0:73375f76583c 517
Philipjp 0:73375f76583c 518
Philipjp 0:73375f76583c 519 pb1.mode(PullUp);
Philipjp 0:73375f76583c 520 pb1.attach_asserted(&pb1_hit_callback);
Philipjp 0:73375f76583c 521 pb1.setSampleFrequency();
Philipjp 0:73375f76583c 522
Philipjp 0:73375f76583c 523
Philipjp 0:73375f76583c 524 for (int i=0; i<NUM_ASTEROIDS; i++) {
Philipjp 0:73375f76583c 525 ActiveAsteroids[i]->draw();
Philipjp 0:73375f76583c 526 }
Philipjp 0:73375f76583c 527
Philipjp 0:73375f76583c 528 while (timeElapsed<3 && check) {
Philipjp 0:73375f76583c 529 timeElapsed= time(0)-startTime;
Philipjp 0:73375f76583c 530 uLCD.filled_rectangle(0,0,126,3,BLACK);
Philipjp 0:73375f76583c 531 uLCD.filled_rectangle(0,0,126-(126/29) * timeElapsed,3,BLUE);
Philipjp 0:73375f76583c 532
Philipjp 0:73375f76583c 533
Philipjp 0:73375f76583c 534 for (int i=0; i<NUM_ASTEROIDS; i++) {
Philipjp 0:73375f76583c 535 ActiveAsteroids[i]->update();
Philipjp 0:73375f76583c 536 }
Philipjp 0:73375f76583c 537 ship.update();
Philipjp 0:73375f76583c 538
Philipjp 0:73375f76583c 539
Philipjp 0:73375f76583c 540
Philipjp 0:73375f76583c 541 if(!acc.isXYZReady()) {
Philipjp 0:73375f76583c 542 wait(0.01);
Philipjp 0:73375f76583c 543 } else {
Philipjp 0:73375f76583c 544 acc.readXYZGravity(&x,&y,&z); //notice this is passed by reference use pointers
Philipjp 0:73375f76583c 545 ship.setX(-x*factor+x_pos);
Philipjp 0:73375f76583c 546 ship.setY(-y*factor+y_pos);
Philipjp 0:73375f76583c 547 ship.draw();
Philipjp 0:73375f76583c 548 }
Philipjp 0:73375f76583c 549
Philipjp 0:73375f76583c 550 for (int i=0; i<NUM_ASTEROIDS; i++) {
Philipjp 0:73375f76583c 551 ActiveAsteroids[i]->draw();
Philipjp 0:73375f76583c 552 if (overlap(ship,*ActiveAsteroids[i])){
Philipjp 0:73375f76583c 553 uLCD.BLIT(ship.getX(),ship.getY(),EARTH_WIDTH,EARTH_HEIGHT,spaceship_explode);
Philipjp 0:73375f76583c 554 mySpeaker.PlayNote(160.0 + x*200, .4 + 0.2*y, 0.05);
Philipjp 0:73375f76583c 555 check=false;
Philipjp 0:73375f76583c 556 }
Philipjp 0:73375f76583c 557 }
Philipjp 0:73375f76583c 558
Philipjp 0:73375f76583c 559 if (ExplodeAllAsteroids){
Philipjp 0:73375f76583c 560 for (int i=0; i<NUM_ASTEROIDS; i++) {
Philipjp 0:73375f76583c 561 ActiveAsteroids[i]->update();
Philipjp 0:73375f76583c 562 ActiveAsteroids[i]->setX(127);
Philipjp 0:73375f76583c 563 ActiveAsteroids[i]->setY(127);
Philipjp 0:73375f76583c 564 }
Philipjp 0:73375f76583c 565 mySpeaker.PlayNote(880, .750, 0.015);
Philipjp 0:73375f76583c 566 ExplodeAllAsteroids=false;
Philipjp 0:73375f76583c 567 }
Philipjp 0:73375f76583c 568
Philipjp 0:73375f76583c 569
Philipjp 0:73375f76583c 570
Philipjp 0:73375f76583c 571 }
Philipjp 0:73375f76583c 572 if (!check){
Philipjp 0:73375f76583c 573 uLCD.cls();
Philipjp 0:73375f76583c 574 mySpeaker.PlayNote(658, .125, 0.015);
Philipjp 0:73375f76583c 575 mySpeaker.PlayNote(1320, .500, 0.015);
Philipjp 0:73375f76583c 576 mySpeaker.PlayNote(990, .250, 0.015);
Philipjp 0:73375f76583c 577 mySpeaker.PlayNote(1056, .250, 0.015);
Philipjp 0:73375f76583c 578 mySpeaker.PlayNote(1188, .250, 0.015);
Philipjp 0:73375f76583c 579 mySpeaker.PlayNote(1320, .125, 0.015);
Philipjp 0:73375f76583c 580 mySpeaker.PlayNote(1188, .125, 0.015);
Philipjp 0:73375f76583c 581 mySpeaker.PlayNote(1056, .250, 0.015);
Philipjp 0:73375f76583c 582 mySpeaker.PlayNote(990, .250, 0.015);
Philipjp 0:73375f76583c 583 mySpeaker.PlayNote(880, .500, 0.015);
Philipjp 0:73375f76583c 584 mySpeaker.PlayNote(880, .250, 0.015);
Philipjp 0:73375f76583c 585 mySpeaker.PlayNote(1056, .250, 0.015);
Philipjp 0:73375f76583c 586 mySpeaker.PlayNote(1320, .500, 0.015);
Philipjp 0:73375f76583c 587 mySpeaker.PlayNote(1188, .250, 0.015);
Philipjp 0:73375f76583c 588 mySpeaker.PlayNote(1056, .250, 0.015);
Philipjp 0:73375f76583c 589 mySpeaker.PlayNote(990, .750, 0.015);
Philipjp 0:73375f76583c 590 mySpeaker.PlayNote(1056, .250, 0.015);
Philipjp 0:73375f76583c 591 mySpeaker.PlayNote(1188, .5, 0.015);
Philipjp 0:73375f76583c 592 mySpeaker.PlayNote(1320, .500, 0.015);
Philipjp 0:73375f76583c 593 mySpeaker.PlayNote(1056, .500, 0.015);
Philipjp 0:73375f76583c 594 mySpeaker.PlayNote(880, .500, 0.015);
Philipjp 0:73375f76583c 595 mySpeaker.PlayNote(880, .750, 0.015);
Philipjp 0:73375f76583c 596
Philipjp 0:73375f76583c 597 uLCD.locate(5,8);
Philipjp 0:73375f76583c 598 uLCD.printf("Game Over!");
Philipjp 0:73375f76583c 599 }
Philipjp 0:73375f76583c 600 else{
Philipjp 0:73375f76583c 601 uLCD.cls();
Philipjp 0:73375f76583c 602 uLCD.locate(5,5);
Philipjp 0:73375f76583c 603 uLCD.printf("Congrat!\n");
Philipjp 0:73375f76583c 604 uLCD.printf("YOU SAVE THE WORLD");
Philipjp 0:73375f76583c 605 }
Philipjp 0:73375f76583c 606 }