A implementation of a simple bomberman game

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

Fork of rtos_basic by mbed official

Committer:
apcastelein
Date:
Mon Oct 31 19:33:11 2016 +0000
Revision:
7:12f7fd2b1a13
Parent:
3:c92e21f305d8
Published bomberman game;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
apcastelein 7:12f7fd2b1a13 2 #include "SDFileSystem.h"
apcastelein 7:12f7fd2b1a13 3 #include "wave_player.h"
apcastelein 7:12f7fd2b1a13 4 #include "myBMP.h"
apcastelein 7:12f7fd2b1a13 5 #include <string>
apcastelein 7:12f7fd2b1a13 6 #include "navSwitch.h"
apcastelein 7:12f7fd2b1a13 7 #include <mpr121.h>
emilmont 1:491820ee784d 8 #include "rtos.h"
apcastelein 7:12f7fd2b1a13 9
apcastelein 7:12f7fd2b1a13 10 float gameTime = 0.0;
apcastelein 7:12f7fd2b1a13 11
apcastelein 7:12f7fd2b1a13 12 string startText = "Loading";
apcastelein 7:12f7fd2b1a13 13
apcastelein 7:12f7fd2b1a13 14 bool gameRestart = false;
apcastelein 7:12f7fd2b1a13 15
apcastelein 7:12f7fd2b1a13 16 SDFileSystem sd(p11, p12, p13, p16, "sd"); //SD card
apcastelein 7:12f7fd2b1a13 17
apcastelein 7:12f7fd2b1a13 18 AnalogOut DACout(p18);
apcastelein 7:12f7fd2b1a13 19
apcastelein 7:12f7fd2b1a13 20 wave_player waver(&DACout);
apcastelein 7:12f7fd2b1a13 21
apcastelein 7:12f7fd2b1a13 22 uLCD_4DGL uLCD(p28,p27,p30);
apcastelein 7:12f7fd2b1a13 23
apcastelein 7:12f7fd2b1a13 24 int BACK = 0x2E0059;
apcastelein 7:12f7fd2b1a13 25
apcastelein 7:12f7fd2b1a13 26 char grid[7][7];
apcastelein 7:12f7fd2b1a13 27
apcastelein 7:12f7fd2b1a13 28 int o_p1I=0, o_p1J=0, o_p2I=6, o_p2J=6;
apcastelein 7:12f7fd2b1a13 29 int p1I=0, p1J=0, p2I=6, p2J=6;
apcastelein 7:12f7fd2b1a13 30
apcastelein 7:12f7fd2b1a13 31 Nav_Switch myNav( p17, p6, p7, p5, p8);
apcastelein 7:12f7fd2b1a13 32 bool navUpPress = false, navLeftPress = false,
apcastelein 7:12f7fd2b1a13 33 navRightPress = false, navDownPress = false, navFirePress = false;
apcastelein 7:12f7fd2b1a13 34
apcastelein 7:12f7fd2b1a13 35 I2C i2c(p9, p10);
apcastelein 7:12f7fd2b1a13 36 Mpr121 pad(&i2c, Mpr121::ADD_VSS);
apcastelein 7:12f7fd2b1a13 37
apcastelein 7:12f7fd2b1a13 38 bool padUpPress = false, padLeftPress = false,
apcastelein 7:12f7fd2b1a13 39 padRightPress = false, padDownPress = false, padFirePress = false;
apcastelein 7:12f7fd2b1a13 40
apcastelein 7:12f7fd2b1a13 41 struct Bomb {
apcastelein 7:12f7fd2b1a13 42 float createTime;
apcastelein 7:12f7fd2b1a13 43 int playerId;
apcastelein 7:12f7fd2b1a13 44 int startI, startJ;
apcastelein 7:12f7fd2b1a13 45 int power;
apcastelein 7:12f7fd2b1a13 46 int minX, maxX, minY, maxY;
apcastelein 7:12f7fd2b1a13 47 bool exploded, soundPlayed;
apcastelein 7:12f7fd2b1a13 48 float cookTime, expTime;
apcastelein 7:12f7fd2b1a13 49 int decay,color;
apcastelein 7:12f7fd2b1a13 50 int o_decay;
apcastelein 7:12f7fd2b1a13 51 };
apcastelein 7:12f7fd2b1a13 52
apcastelein 7:12f7fd2b1a13 53 Bomb bombs[10];
apcastelein 7:12f7fd2b1a13 54 int bombIndex=0, numBombs = 0;
apcastelein 7:12f7fd2b1a13 55 int bufferSize = 10;
apcastelein 7:12f7fd2b1a13 56
apcastelein 7:12f7fd2b1a13 57 int p1Bombs=1, p2Bombs=1;
apcastelein 7:12f7fd2b1a13 58 int p1Power=1, p2Power=1;
apcastelein 7:12f7fd2b1a13 59
apcastelein 7:12f7fd2b1a13 60 void resetVars(){
apcastelein 7:12f7fd2b1a13 61 gameRestart = false;
apcastelein 7:12f7fd2b1a13 62
apcastelein 7:12f7fd2b1a13 63 o_p1I=0;
apcastelein 7:12f7fd2b1a13 64 o_p1J=0;
apcastelein 7:12f7fd2b1a13 65 o_p2I=6;
apcastelein 7:12f7fd2b1a13 66 o_p2J=6;
apcastelein 7:12f7fd2b1a13 67 p1I=0;
apcastelein 7:12f7fd2b1a13 68 p1J=0;
apcastelein 7:12f7fd2b1a13 69 p2I=6;
apcastelein 7:12f7fd2b1a13 70 p2J=6;
apcastelein 7:12f7fd2b1a13 71
apcastelein 7:12f7fd2b1a13 72 numBombs = 0;
apcastelein 7:12f7fd2b1a13 73 bombIndex = 0;
apcastelein 7:12f7fd2b1a13 74
apcastelein 7:12f7fd2b1a13 75 p1Bombs = 1;
apcastelein 7:12f7fd2b1a13 76 p1Power = 1;
apcastelein 7:12f7fd2b1a13 77 p2Bombs = 1;
apcastelein 7:12f7fd2b1a13 78 p2Power = 1;
apcastelein 7:12f7fd2b1a13 79 }
apcastelein 7:12f7fd2b1a13 80
apcastelein 7:12f7fd2b1a13 81 bool outOfBounds(int i, int j){
apcastelein 7:12f7fd2b1a13 82 return i < 0 || i > 6 || j < 0 || j > 6;
apcastelein 7:12f7fd2b1a13 83 }
apcastelein 7:12f7fd2b1a13 84
apcastelein 7:12f7fd2b1a13 85 bool valid(int i, int j)
apcastelein 7:12f7fd2b1a13 86 {
apcastelein 7:12f7fd2b1a13 87 if(outOfBounds(i,j)){
apcastelein 7:12f7fd2b1a13 88 return false;
apcastelein 7:12f7fd2b1a13 89 }
apcastelein 7:12f7fd2b1a13 90
apcastelein 7:12f7fd2b1a13 91 return grid[i][j] != 'b' && grid[i][j] != 's';
apcastelein 7:12f7fd2b1a13 92 }
apcastelein 7:12f7fd2b1a13 93
apcastelein 7:12f7fd2b1a13 94 int getX(int j)
apcastelein 7:12f7fd2b1a13 95 {
apcastelein 7:12f7fd2b1a13 96 return 8+16*j;
apcastelein 7:12f7fd2b1a13 97 }
apcastelein 7:12f7fd2b1a13 98
apcastelein 7:12f7fd2b1a13 99 int getY(int i)
apcastelein 7:12f7fd2b1a13 100 {
apcastelein 7:12f7fd2b1a13 101 return 8+16*i;
apcastelein 7:12f7fd2b1a13 102 }
apcastelein 7:12f7fd2b1a13 103
apcastelein 7:12f7fd2b1a13 104 void createBomb(int pId, int i, int j)
apcastelein 7:12f7fd2b1a13 105 {
apcastelein 7:12f7fd2b1a13 106 Bomb *b = &bombs[(bombIndex + numBombs)%bufferSize];
apcastelein 7:12f7fd2b1a13 107 numBombs++;
apcastelein 7:12f7fd2b1a13 108
apcastelein 7:12f7fd2b1a13 109 b->playerId = pId;
apcastelein 7:12f7fd2b1a13 110 b->createTime = gameTime;
apcastelein 7:12f7fd2b1a13 111 b->startI = i;
apcastelein 7:12f7fd2b1a13 112 b->startJ = j;
apcastelein 7:12f7fd2b1a13 113 b->power = (pId == 1)? p1Power : p2Power;
apcastelein 7:12f7fd2b1a13 114 if(pId == 1) {
apcastelein 7:12f7fd2b1a13 115 p1Bombs--;
apcastelein 7:12f7fd2b1a13 116 } else {
apcastelein 7:12f7fd2b1a13 117 p2Bombs--;
apcastelein 7:12f7fd2b1a13 118 }
apcastelein 7:12f7fd2b1a13 119 b->exploded = false;
apcastelein 7:12f7fd2b1a13 120 b->cookTime = 1.5;
apcastelein 7:12f7fd2b1a13 121 b->expTime = .8;
apcastelein 7:12f7fd2b1a13 122 b->decay = 0;
apcastelein 7:12f7fd2b1a13 123 b->o_decay = 0;
apcastelein 7:12f7fd2b1a13 124 b->soundPlayed = false;
apcastelein 7:12f7fd2b1a13 125 }
apcastelein 7:12f7fd2b1a13 126
apcastelein 7:12f7fd2b1a13 127 void resetBlock(int i, int j){
apcastelein 7:12f7fd2b1a13 128 if(grid[i][j] == ' '){
apcastelein 7:12f7fd2b1a13 129 grid[i][j] = 'c';
apcastelein 7:12f7fd2b1a13 130 return;
apcastelein 7:12f7fd2b1a13 131 }
apcastelein 7:12f7fd2b1a13 132 int rr = (int)(gameTime * 1000) + 1023 * i + 523 * j;
apcastelein 7:12f7fd2b1a13 133 if(rr%3 == 0){
apcastelein 7:12f7fd2b1a13 134 grid[i][j] = 'k';
apcastelein 7:12f7fd2b1a13 135 }else if(rr%3 == 1){
apcastelein 7:12f7fd2b1a13 136 grid[i][j] = 'd';
apcastelein 7:12f7fd2b1a13 137 }else{
apcastelein 7:12f7fd2b1a13 138 grid[i][j] = 'c';
apcastelein 7:12f7fd2b1a13 139 }
apcastelein 7:12f7fd2b1a13 140 }
apcastelein 7:12f7fd2b1a13 141
apcastelein 7:12f7fd2b1a13 142 void clearArea(Bomb *b)
apcastelein 7:12f7fd2b1a13 143 {
apcastelein 7:12f7fd2b1a13 144 //find minX
apcastelein 7:12f7fd2b1a13 145 int p = b->power;
apcastelein 7:12f7fd2b1a13 146 int i = b->startI;
apcastelein 7:12f7fd2b1a13 147 int j = b->startJ;
apcastelein 7:12f7fd2b1a13 148 while(p>0) {
apcastelein 7:12f7fd2b1a13 149 if(outOfBounds(i,j-1) || grid[i][j-1] == 's') {
apcastelein 7:12f7fd2b1a13 150 break;
apcastelein 7:12f7fd2b1a13 151 }
apcastelein 7:12f7fd2b1a13 152 resetBlock(i,j-1);
apcastelein 7:12f7fd2b1a13 153 j--;
apcastelein 7:12f7fd2b1a13 154 p--;
apcastelein 7:12f7fd2b1a13 155 }
apcastelein 7:12f7fd2b1a13 156 b->minX = getX(j) + ((p==0)?3:0);
apcastelein 7:12f7fd2b1a13 157
apcastelein 7:12f7fd2b1a13 158 //find maxX
apcastelein 7:12f7fd2b1a13 159 p = b->power;
apcastelein 7:12f7fd2b1a13 160 i = b->startI;
apcastelein 7:12f7fd2b1a13 161 j = b->startJ;
apcastelein 7:12f7fd2b1a13 162 while(p>0) {
apcastelein 7:12f7fd2b1a13 163 if(outOfBounds(i,j+1) || grid[i][j+1] == 's') {
apcastelein 7:12f7fd2b1a13 164 break;
apcastelein 7:12f7fd2b1a13 165 }
apcastelein 7:12f7fd2b1a13 166 resetBlock(i,j+1);
apcastelein 7:12f7fd2b1a13 167 j++;
apcastelein 7:12f7fd2b1a13 168 p--;
apcastelein 7:12f7fd2b1a13 169 }
apcastelein 7:12f7fd2b1a13 170 b->maxX = getX(j+1)+((p==0)?-3:0);
apcastelein 7:12f7fd2b1a13 171
apcastelein 7:12f7fd2b1a13 172 //find minY
apcastelein 7:12f7fd2b1a13 173 p = b->power;
apcastelein 7:12f7fd2b1a13 174 i = b->startI;
apcastelein 7:12f7fd2b1a13 175 j = b->startJ;
apcastelein 7:12f7fd2b1a13 176 while(p>0) {
apcastelein 7:12f7fd2b1a13 177 if(outOfBounds(i-1,j) || grid[i-1][j] == 's') {
apcastelein 7:12f7fd2b1a13 178 break;
apcastelein 7:12f7fd2b1a13 179 }
apcastelein 7:12f7fd2b1a13 180 resetBlock(i-1,j);
apcastelein 7:12f7fd2b1a13 181 i--;
apcastelein 7:12f7fd2b1a13 182 p--;
apcastelein 7:12f7fd2b1a13 183 }
apcastelein 7:12f7fd2b1a13 184 b->minY = getY(i) + ((p==0)?3:0);
apcastelein 7:12f7fd2b1a13 185
apcastelein 7:12f7fd2b1a13 186 //find maxY
apcastelein 7:12f7fd2b1a13 187 p = b->power;
apcastelein 7:12f7fd2b1a13 188 i = b->startI;
apcastelein 7:12f7fd2b1a13 189 j = b->startJ;
apcastelein 7:12f7fd2b1a13 190 while(p>0) {
apcastelein 7:12f7fd2b1a13 191 if(outOfBounds(i+1,j) || grid[i+1][j] == 's') {
apcastelein 7:12f7fd2b1a13 192 break;
apcastelein 7:12f7fd2b1a13 193 }
apcastelein 7:12f7fd2b1a13 194 resetBlock(i+1,j);
apcastelein 7:12f7fd2b1a13 195 i++;
apcastelein 7:12f7fd2b1a13 196 p--;
apcastelein 7:12f7fd2b1a13 197 }
apcastelein 7:12f7fd2b1a13 198 b->maxY = getY(i+1) + ((p==0)?-3:0);
apcastelein 7:12f7fd2b1a13 199 }
apcastelein 7:12f7fd2b1a13 200
apcastelein 7:12f7fd2b1a13 201 void playExplosion()
apcastelein 7:12f7fd2b1a13 202 {
apcastelein 7:12f7fd2b1a13 203 while(true){
apcastelein 7:12f7fd2b1a13 204 bool expFound = false;
apcastelein 7:12f7fd2b1a13 205 while(!expFound){
apcastelein 7:12f7fd2b1a13 206 for(int i = 0; i < numBombs; i++) {
apcastelein 7:12f7fd2b1a13 207 Bomb *b = &bombs[(bombIndex + i)%bufferSize];
apcastelein 7:12f7fd2b1a13 208 if(b->exploded && !b->soundPlayed){
apcastelein 7:12f7fd2b1a13 209 expFound = true;
apcastelein 7:12f7fd2b1a13 210 b->soundPlayed = true;
apcastelein 7:12f7fd2b1a13 211 }
apcastelein 7:12f7fd2b1a13 212 }
apcastelein 7:12f7fd2b1a13 213 Thread::wait(100);
apcastelein 7:12f7fd2b1a13 214 }
apcastelein 7:12f7fd2b1a13 215 FILE *explosion;
apcastelein 7:12f7fd2b1a13 216 explosion=fopen("/sd/explosion.wav","r");
apcastelein 7:12f7fd2b1a13 217 waver.play(explosion);
apcastelein 7:12f7fd2b1a13 218 fclose(explosion);
apcastelein 7:12f7fd2b1a13 219 }
apcastelein 7:12f7fd2b1a13 220 }
apcastelein 7:12f7fd2b1a13 221
apcastelein 7:12f7fd2b1a13 222 void updateBombs()
apcastelein 7:12f7fd2b1a13 223 {
apcastelein 7:12f7fd2b1a13 224 for(int i = 0; i < numBombs; i++) {
apcastelein 7:12f7fd2b1a13 225 Bomb *b = &bombs[(bombIndex + i)%bufferSize];
apcastelein 7:12f7fd2b1a13 226 if(!b->exploded && (gameTime - b->createTime) > b->cookTime) {
apcastelein 7:12f7fd2b1a13 227 b->exploded = true;
apcastelein 7:12f7fd2b1a13 228 clearArea(b);
apcastelein 7:12f7fd2b1a13 229
apcastelein 7:12f7fd2b1a13 230 }
apcastelein 7:12f7fd2b1a13 231 if(!b->exploded) {
apcastelein 7:12f7fd2b1a13 232 int index = (int)((gameTime - b->createTime)/.15);
apcastelein 7:12f7fd2b1a13 233 if((index & 0x11) == 0) {
apcastelein 7:12f7fd2b1a13 234 b->color = WHITE;
apcastelein 7:12f7fd2b1a13 235 } else {
apcastelein 7:12f7fd2b1a13 236 b->color = BLACK;
apcastelein 7:12f7fd2b1a13 237 }
apcastelein 7:12f7fd2b1a13 238 } else {
apcastelein 7:12f7fd2b1a13 239 int index = (int)((gameTime - b->createTime - b->cookTime)/.2);
apcastelein 7:12f7fd2b1a13 240 if(index == 0) {
apcastelein 7:12f7fd2b1a13 241 b->color = WHITE;
apcastelein 7:12f7fd2b1a13 242 }
apcastelein 7:12f7fd2b1a13 243 if(index == 1) {
apcastelein 7:12f7fd2b1a13 244 b->color = 0xFFFF00;
apcastelein 7:12f7fd2b1a13 245 }
apcastelein 7:12f7fd2b1a13 246 if(index == 2) {
apcastelein 7:12f7fd2b1a13 247 b->color = 0xFF8800;
apcastelein 7:12f7fd2b1a13 248 }
apcastelein 7:12f7fd2b1a13 249 if(index >= 3) {
apcastelein 7:12f7fd2b1a13 250 b->color = RED;
apcastelein 7:12f7fd2b1a13 251 }
apcastelein 7:12f7fd2b1a13 252 index = (int)((gameTime - b->createTime - b->cookTime)/.25);
apcastelein 7:12f7fd2b1a13 253 b->decay = index;
apcastelein 7:12f7fd2b1a13 254 }
apcastelein 7:12f7fd2b1a13 255 }
apcastelein 7:12f7fd2b1a13 256 }
apcastelein 7:12f7fd2b1a13 257
apcastelein 7:12f7fd2b1a13 258 void drawBombs()
apcastelein 7:12f7fd2b1a13 259 {
apcastelein 7:12f7fd2b1a13 260 for(int i = 0; i < numBombs; i++) {
apcastelein 7:12f7fd2b1a13 261 Bomb *b = &bombs[(bombIndex + i)%bufferSize];
apcastelein 7:12f7fd2b1a13 262 int x = getX(b->startJ);
apcastelein 7:12f7fd2b1a13 263 int y = getY(b->startI);
apcastelein 7:12f7fd2b1a13 264 if(!b->exploded) {
apcastelein 7:12f7fd2b1a13 265 if(b->color == WHITE) {
apcastelein 7:12f7fd2b1a13 266 uLCD.filled_circle(x+8,y+8,5, WHITE);
apcastelein 7:12f7fd2b1a13 267 uLCD.filled_rectangle(x+7,y+1,x+9,y+3, WHITE);
apcastelein 7:12f7fd2b1a13 268 } else {
apcastelein 7:12f7fd2b1a13 269 uLCD.filled_circle(x+8,y+8,5, BLACK);
apcastelein 7:12f7fd2b1a13 270 uLCD.filled_rectangle(x+7,y+1,x+9,y+3, 0xFFFF00);
apcastelein 7:12f7fd2b1a13 271 }
apcastelein 7:12f7fd2b1a13 272 } else {
apcastelein 7:12f7fd2b1a13 273 if(b->o_decay != b->decay){
apcastelein 7:12f7fd2b1a13 274 b->o_decay = b->decay;
apcastelein 7:12f7fd2b1a13 275 uLCD.filled_rectangle(b->minX,y+3,b->maxX,y+13, BACK);
apcastelein 7:12f7fd2b1a13 276 uLCD.filled_rectangle(x+3,b->minY,x+13,b->maxY, BACK);
apcastelein 7:12f7fd2b1a13 277 }
apcastelein 7:12f7fd2b1a13 278
apcastelein 7:12f7fd2b1a13 279 if(gameTime - b->createTime < (b->cookTime + b->expTime)) {
apcastelein 7:12f7fd2b1a13 280 uLCD.filled_rectangle(b->minX+b->decay,y+3+b->decay,b->maxX-b->decay,y+13-b->decay, b->color);
apcastelein 7:12f7fd2b1a13 281 uLCD.filled_rectangle(x+3+b->decay,b->minY+b->decay,x+13-b->decay,b->maxY-b->decay, b->color);
apcastelein 7:12f7fd2b1a13 282 } else {
apcastelein 7:12f7fd2b1a13 283 uLCD.filled_rectangle(b->minX,y+3,b->maxX,y+13, BACK);
apcastelein 7:12f7fd2b1a13 284 uLCD.filled_rectangle(x+3,b->minY,x+13,b->maxY, BACK);
apcastelein 7:12f7fd2b1a13 285 if(b->playerId == 1) {
apcastelein 7:12f7fd2b1a13 286 p1Bombs++;
apcastelein 7:12f7fd2b1a13 287 } else {
apcastelein 7:12f7fd2b1a13 288 p2Bombs++;
apcastelein 7:12f7fd2b1a13 289 }
apcastelein 7:12f7fd2b1a13 290 bombIndex=(bombIndex+1)%bufferSize;
apcastelein 7:12f7fd2b1a13 291 numBombs--;
apcastelein 7:12f7fd2b1a13 292 }
apcastelein 7:12f7fd2b1a13 293 }
emilmont 1:491820ee784d 294 }
emilmont 1:491820ee784d 295 }
apcastelein 7:12f7fd2b1a13 296
apcastelein 7:12f7fd2b1a13 297 void generateGrid()
apcastelein 7:12f7fd2b1a13 298 {
apcastelein 7:12f7fd2b1a13 299 //init empty
apcastelein 7:12f7fd2b1a13 300 for(int i = 0; i < 7; i++) {
apcastelein 7:12f7fd2b1a13 301 for(int j = 0; j < 7; j++) {
apcastelein 7:12f7fd2b1a13 302 grid[i][j] = ' ';
apcastelein 7:12f7fd2b1a13 303 }
apcastelein 7:12f7fd2b1a13 304 }
apcastelein 7:12f7fd2b1a13 305 //generate solids
apcastelein 7:12f7fd2b1a13 306 for(int i = 1; i < 7; i+=2) {
apcastelein 7:12f7fd2b1a13 307 for(int j = 1; j < 7; j+=2) {
apcastelein 7:12f7fd2b1a13 308 grid[i][j] = 's';
apcastelein 7:12f7fd2b1a13 309 }
apcastelein 7:12f7fd2b1a13 310 }
apcastelein 7:12f7fd2b1a13 311 //generate breakables
apcastelein 7:12f7fd2b1a13 312 for(int i = 0; i < 7; i++) {
apcastelein 7:12f7fd2b1a13 313 for(int j = 0; j < 7; j++) {
apcastelein 7:12f7fd2b1a13 314 if(grid[i][j] == 's') {
apcastelein 7:12f7fd2b1a13 315 continue;
apcastelein 7:12f7fd2b1a13 316 }
apcastelein 7:12f7fd2b1a13 317 bool hasBreakable = (i*17+j*349)%4 != 0;
apcastelein 7:12f7fd2b1a13 318 if(hasBreakable) {
apcastelein 7:12f7fd2b1a13 319 grid[i][j] = 'b';
apcastelein 7:12f7fd2b1a13 320 }
apcastelein 7:12f7fd2b1a13 321 }
apcastelein 7:12f7fd2b1a13 322 }
apcastelein 7:12f7fd2b1a13 323 //clear player regions
apcastelein 7:12f7fd2b1a13 324 grid[0][0] = ' ';
apcastelein 7:12f7fd2b1a13 325 grid[1][0] = ' ';
apcastelein 7:12f7fd2b1a13 326 grid[0][1] = ' ';
apcastelein 7:12f7fd2b1a13 327 grid[6][6] = ' ';
apcastelein 7:12f7fd2b1a13 328 grid[5][6] = ' ';
apcastelein 7:12f7fd2b1a13 329 grid[6][5] = ' ';
apcastelein 7:12f7fd2b1a13 330 }
apcastelein 7:12f7fd2b1a13 331
apcastelein 7:12f7fd2b1a13 332 void drawImg(string imgName, int x, int y)
apcastelein 7:12f7fd2b1a13 333 {
apcastelein 7:12f7fd2b1a13 334 RGBApixel *Colors = new RGBApixel [2];
apcastelein 7:12f7fd2b1a13 335 string file = "/sd/" + imgName;
apcastelein 7:12f7fd2b1a13 336 ReadBMPFromFile(x,y, file.c_str(), Colors, &uLCD);
apcastelein 7:12f7fd2b1a13 337 }
apcastelein 7:12f7fd2b1a13 338
apcastelein 7:12f7fd2b1a13 339 void drawPlayer(int id)
apcastelein 7:12f7fd2b1a13 340 {
apcastelein 7:12f7fd2b1a13 341 int col_prim, col_sec, x, y;
apcastelein 7:12f7fd2b1a13 342 if(id == 1) {
apcastelein 7:12f7fd2b1a13 343 col_prim = 0xFFD8B2;
apcastelein 7:12f7fd2b1a13 344 col_sec = 0xFFB2B2;
apcastelein 7:12f7fd2b1a13 345 x = getX(p1J);
apcastelein 7:12f7fd2b1a13 346 y = getY(p1I);
apcastelein 7:12f7fd2b1a13 347 }
apcastelein 7:12f7fd2b1a13 348 if(id == 2) {
apcastelein 7:12f7fd2b1a13 349 col_prim = 0xC6B2FF;
apcastelein 7:12f7fd2b1a13 350 col_sec = 0xFFB2FF;
apcastelein 7:12f7fd2b1a13 351 x = getX(p2J);
apcastelein 7:12f7fd2b1a13 352 y = getY(p2I);
apcastelein 7:12f7fd2b1a13 353 }
apcastelein 7:12f7fd2b1a13 354 uLCD.filled_rectangle(x+3,y+3,x+13,y+10, col_prim);
apcastelein 7:12f7fd2b1a13 355 uLCD.filled_rectangle(x+5,y+5,x+6,y+8, BLACK);
apcastelein 7:12f7fd2b1a13 356 uLCD.filled_rectangle(x+10,y+5,x+11,y+8, BLACK);
apcastelein 7:12f7fd2b1a13 357 uLCD.filled_rectangle(x+5,y+10,x+7,y+13, col_sec);
apcastelein 7:12f7fd2b1a13 358 uLCD.filled_rectangle(x+9,y+10,x+11,y+13, col_sec);
apcastelein 7:12f7fd2b1a13 359 }
apcastelein 7:12f7fd2b1a13 360
apcastelein 7:12f7fd2b1a13 361 void initialDraw()
apcastelein 7:12f7fd2b1a13 362 {
apcastelein 7:12f7fd2b1a13 363 uLCD.baudrate(3000000);
apcastelein 7:12f7fd2b1a13 364 uLCD.filled_rectangle(0,0,128,128, BACK);
apcastelein 7:12f7fd2b1a13 365 uLCD.text_width(2);
apcastelein 7:12f7fd2b1a13 366 uLCD.text_height(2);
apcastelein 7:12f7fd2b1a13 367 uLCD.color(WHITE);
apcastelein 7:12f7fd2b1a13 368 uLCD.locate(1,4);
apcastelein 7:12f7fd2b1a13 369 uLCD.printf("%s",startText);
apcastelein 7:12f7fd2b1a13 370 for(int i = -1; i < 8; i++){
apcastelein 7:12f7fd2b1a13 371 for(int j = -1; j < 8; j++){
apcastelein 7:12f7fd2b1a13 372 string img;
apcastelein 7:12f7fd2b1a13 373 int c = -1;
apcastelein 7:12f7fd2b1a13 374 if(i == -1 || j == -1 || i == 7 || j == 7){
apcastelein 7:12f7fd2b1a13 375 img = "wall.bmp";
apcastelein 7:12f7fd2b1a13 376 //c = BLACK;
apcastelein 7:12f7fd2b1a13 377 }else{
apcastelein 7:12f7fd2b1a13 378 if(grid[i][j] == ' '){
apcastelein 7:12f7fd2b1a13 379 c = BACK;
apcastelein 7:12f7fd2b1a13 380 }
apcastelein 7:12f7fd2b1a13 381 if(grid[i][j] == 'b'){
apcastelein 7:12f7fd2b1a13 382 img = "break.bmp";
apcastelein 7:12f7fd2b1a13 383 //c = 0x888888;
apcastelein 7:12f7fd2b1a13 384 }
apcastelein 7:12f7fd2b1a13 385 if(grid[i][j] == 's'){
apcastelein 7:12f7fd2b1a13 386 img = "wall.bmp";
apcastelein 7:12f7fd2b1a13 387 //c = BLACK;
apcastelein 7:12f7fd2b1a13 388 }
apcastelein 7:12f7fd2b1a13 389 }
apcastelein 7:12f7fd2b1a13 390 int x = getX(j);
apcastelein 7:12f7fd2b1a13 391 int y = getY(i);
apcastelein 7:12f7fd2b1a13 392 if(c != -1){
apcastelein 7:12f7fd2b1a13 393 uLCD.filled_rectangle(x,y,x+16,y+16, c);
apcastelein 7:12f7fd2b1a13 394 }else{
apcastelein 7:12f7fd2b1a13 395 drawImg(img, x, y);
apcastelein 7:12f7fd2b1a13 396 }
apcastelein 7:12f7fd2b1a13 397
apcastelein 7:12f7fd2b1a13 398 }
apcastelein 7:12f7fd2b1a13 399 }
apcastelein 7:12f7fd2b1a13 400 drawPlayer(1);
apcastelein 7:12f7fd2b1a13 401 drawPlayer(2);
apcastelein 7:12f7fd2b1a13 402 }
apcastelein 7:12f7fd2b1a13 403
apcastelein 7:12f7fd2b1a13 404
apcastelein 7:12f7fd2b1a13 405 void updateP1()
apcastelein 7:12f7fd2b1a13 406 {
apcastelein 7:12f7fd2b1a13 407 if(!navUpPress && myNav.up()) {
apcastelein 7:12f7fd2b1a13 408 p1I++;
apcastelein 7:12f7fd2b1a13 409 navUpPress = true;
apcastelein 7:12f7fd2b1a13 410 }
apcastelein 7:12f7fd2b1a13 411 if(!navDownPress && myNav.down()) {
apcastelein 7:12f7fd2b1a13 412 p1I--;
apcastelein 7:12f7fd2b1a13 413 navDownPress = true;
apcastelein 7:12f7fd2b1a13 414 }
apcastelein 7:12f7fd2b1a13 415 if(!navLeftPress && myNav.left()) {
apcastelein 7:12f7fd2b1a13 416 p1J++;
apcastelein 7:12f7fd2b1a13 417 navLeftPress = true;
apcastelein 7:12f7fd2b1a13 418 }
apcastelein 7:12f7fd2b1a13 419 if(!navRightPress && myNav.right()) {
apcastelein 7:12f7fd2b1a13 420 p1J--;
apcastelein 7:12f7fd2b1a13 421 navRightPress = true;
apcastelein 7:12f7fd2b1a13 422 }
apcastelein 7:12f7fd2b1a13 423 if(!navFirePress && myNav.fire() && p1Bombs >0) {
apcastelein 7:12f7fd2b1a13 424 createBomb(1,p1I,p1J);
apcastelein 7:12f7fd2b1a13 425 navFirePress = true;
apcastelein 7:12f7fd2b1a13 426 }
apcastelein 7:12f7fd2b1a13 427
apcastelein 7:12f7fd2b1a13 428 if(!valid(p1I,p1J)) {
apcastelein 7:12f7fd2b1a13 429 p1I = o_p1I;
apcastelein 7:12f7fd2b1a13 430 p1J = o_p1J;
apcastelein 7:12f7fd2b1a13 431 }
emilmont 1:491820ee784d 432
apcastelein 7:12f7fd2b1a13 433 if(grid[p1I][p1J] == 'f'){
apcastelein 7:12f7fd2b1a13 434 p1Power++;
apcastelein 7:12f7fd2b1a13 435 grid[p1I][p1J] = 'c';
apcastelein 7:12f7fd2b1a13 436 }
apcastelein 7:12f7fd2b1a13 437 if(grid[p1I][p1J] == 'i'){
apcastelein 7:12f7fd2b1a13 438 p1Bombs++;
apcastelein 7:12f7fd2b1a13 439 grid[p1I][p1J] = 'c';
apcastelein 7:12f7fd2b1a13 440 }
apcastelein 7:12f7fd2b1a13 441
apcastelein 7:12f7fd2b1a13 442 if(!myNav.up()) {
apcastelein 7:12f7fd2b1a13 443 navUpPress = false;
apcastelein 7:12f7fd2b1a13 444 }
apcastelein 7:12f7fd2b1a13 445 if(!myNav.down()) {
apcastelein 7:12f7fd2b1a13 446 navDownPress = false;
apcastelein 7:12f7fd2b1a13 447 }
apcastelein 7:12f7fd2b1a13 448 if(!myNav.left()) {
apcastelein 7:12f7fd2b1a13 449 navLeftPress = false;
apcastelein 7:12f7fd2b1a13 450 }
apcastelein 7:12f7fd2b1a13 451 if(!myNav.right()) {
apcastelein 7:12f7fd2b1a13 452 navRightPress = false;
apcastelein 7:12f7fd2b1a13 453 }
apcastelein 7:12f7fd2b1a13 454 if(!myNav.fire()) {
apcastelein 7:12f7fd2b1a13 455 navFirePress = false;
emilmont 1:491820ee784d 456 }
emilmont 1:491820ee784d 457 }
apcastelein 7:12f7fd2b1a13 458
apcastelein 7:12f7fd2b1a13 459 bool isOne(int val, int pos)
apcastelein 7:12f7fd2b1a13 460 {
apcastelein 7:12f7fd2b1a13 461 return val >> pos & 0x01;
apcastelein 7:12f7fd2b1a13 462 }
apcastelein 7:12f7fd2b1a13 463
apcastelein 7:12f7fd2b1a13 464 void updateP2()
apcastelein 7:12f7fd2b1a13 465 {
apcastelein 7:12f7fd2b1a13 466 int value=pad.read(0x00);
apcastelein 7:12f7fd2b1a13 467 value +=pad.read(0x01)<<8;
apcastelein 7:12f7fd2b1a13 468
apcastelein 7:12f7fd2b1a13 469 bool up = isOne(value,5);
apcastelein 7:12f7fd2b1a13 470 bool down = isOne(value,7);
apcastelein 7:12f7fd2b1a13 471 bool left = isOne(value,10);
apcastelein 7:12f7fd2b1a13 472 bool right = isOne(value,2);
apcastelein 7:12f7fd2b1a13 473 bool fire = isOne(value,6);
apcastelein 7:12f7fd2b1a13 474
apcastelein 7:12f7fd2b1a13 475 if(!padUpPress && up) {
apcastelein 7:12f7fd2b1a13 476 p2I--;
apcastelein 7:12f7fd2b1a13 477 padUpPress = true;
apcastelein 7:12f7fd2b1a13 478 }
apcastelein 7:12f7fd2b1a13 479 if(!padDownPress && down) {
apcastelein 7:12f7fd2b1a13 480 p2I++;
apcastelein 7:12f7fd2b1a13 481 padDownPress = true;
apcastelein 7:12f7fd2b1a13 482 }
apcastelein 7:12f7fd2b1a13 483 if(!padLeftPress && left) {
apcastelein 7:12f7fd2b1a13 484 p2J--;
apcastelein 7:12f7fd2b1a13 485 padLeftPress = true;
apcastelein 7:12f7fd2b1a13 486 }
apcastelein 7:12f7fd2b1a13 487 if(!padRightPress && right) {
apcastelein 7:12f7fd2b1a13 488 p2J++;
apcastelein 7:12f7fd2b1a13 489 padRightPress = true;
apcastelein 7:12f7fd2b1a13 490 }
apcastelein 7:12f7fd2b1a13 491 if(!padFirePress && fire && p2Bombs > 0) {
apcastelein 7:12f7fd2b1a13 492 createBomb(2,p2I,p2J);
apcastelein 7:12f7fd2b1a13 493 padFirePress = true;
apcastelein 7:12f7fd2b1a13 494 }
apcastelein 7:12f7fd2b1a13 495
apcastelein 7:12f7fd2b1a13 496 if(!valid(p2I,p2J)) {
apcastelein 7:12f7fd2b1a13 497 p2I = o_p2I;
apcastelein 7:12f7fd2b1a13 498 p2J = o_p2J;
apcastelein 7:12f7fd2b1a13 499 }
apcastelein 7:12f7fd2b1a13 500
apcastelein 7:12f7fd2b1a13 501 if(grid[p2I][p2J] == 'f'){
apcastelein 7:12f7fd2b1a13 502 p2Power++;
apcastelein 7:12f7fd2b1a13 503 grid[p2I][p2J] = 'c';
apcastelein 7:12f7fd2b1a13 504 }
apcastelein 7:12f7fd2b1a13 505 if(grid[p2I][p2J] == 'i'){
apcastelein 7:12f7fd2b1a13 506 p2Bombs++;
apcastelein 7:12f7fd2b1a13 507 grid[p2I][p2J] = 'c';
apcastelein 7:12f7fd2b1a13 508 }
apcastelein 7:12f7fd2b1a13 509
apcastelein 7:12f7fd2b1a13 510 if(!up) {
apcastelein 7:12f7fd2b1a13 511 padUpPress = false;
apcastelein 7:12f7fd2b1a13 512 }
apcastelein 7:12f7fd2b1a13 513 if(!down) {
apcastelein 7:12f7fd2b1a13 514 padDownPress = false;
apcastelein 7:12f7fd2b1a13 515 }
apcastelein 7:12f7fd2b1a13 516 if(!left) {
apcastelein 7:12f7fd2b1a13 517 padLeftPress = false;
apcastelein 7:12f7fd2b1a13 518 }
apcastelein 7:12f7fd2b1a13 519 if(!right) {
apcastelein 7:12f7fd2b1a13 520 padRightPress = false;
apcastelein 7:12f7fd2b1a13 521 }
apcastelein 7:12f7fd2b1a13 522 if(!fire) {
apcastelein 7:12f7fd2b1a13 523 padFirePress = false;
apcastelein 7:12f7fd2b1a13 524 }
apcastelein 7:12f7fd2b1a13 525 }
apcastelein 7:12f7fd2b1a13 526
apcastelein 7:12f7fd2b1a13 527 void draw()
apcastelein 7:12f7fd2b1a13 528 {
apcastelein 7:12f7fd2b1a13 529 for(int i = 0; i < 7; i++){
apcastelein 7:12f7fd2b1a13 530 for(int j = 0; j < 7; j++){
apcastelein 7:12f7fd2b1a13 531 if(grid[i][j] == 'c' || grid[i][j] == 'd' || grid[i][j] == 'k'){
apcastelein 7:12f7fd2b1a13 532 if(grid[i][j] == 'c') grid[i][j] = ' ';
apcastelein 7:12f7fd2b1a13 533 if(grid[i][j] == 'd') grid[i][j] = 'f';
apcastelein 7:12f7fd2b1a13 534 if(grid[i][j] == 'k') grid[i][j] = 'i';
apcastelein 7:12f7fd2b1a13 535 uLCD.filled_rectangle(getX(j),getY(i),getX(j+1),getY(i+1), BACK);
apcastelein 7:12f7fd2b1a13 536 }
apcastelein 7:12f7fd2b1a13 537 if(grid[i][j] == 'f'){
apcastelein 7:12f7fd2b1a13 538 uLCD.filled_circle(getX(j)+8,getY(i)+8,3,RED);
apcastelein 7:12f7fd2b1a13 539 }
apcastelein 7:12f7fd2b1a13 540 if(grid[i][j] == 'i'){
apcastelein 7:12f7fd2b1a13 541 uLCD.filled_circle(getX(j)+8,getY(i)+8,3,0xFFFF00);
apcastelein 7:12f7fd2b1a13 542 }
apcastelein 7:12f7fd2b1a13 543 }
apcastelein 7:12f7fd2b1a13 544 }
apcastelein 7:12f7fd2b1a13 545 if(p1I != o_p1I || p1J != o_p1J) {
apcastelein 7:12f7fd2b1a13 546 int o_x = getX(o_p1J);
apcastelein 7:12f7fd2b1a13 547 int o_y = getY(o_p1I);
apcastelein 7:12f7fd2b1a13 548 uLCD.filled_rectangle(o_x,o_y,o_x+16,o_y+16, BACK);
apcastelein 7:12f7fd2b1a13 549 o_p1I = p1I;
apcastelein 7:12f7fd2b1a13 550 o_p1J = p1J;
apcastelein 7:12f7fd2b1a13 551 }
apcastelein 7:12f7fd2b1a13 552 if(p2I != o_p2I || p2J != o_p2J) {
apcastelein 7:12f7fd2b1a13 553 int o_x = getX(o_p2J);
apcastelein 7:12f7fd2b1a13 554 int o_y = getY(o_p2I);
apcastelein 7:12f7fd2b1a13 555 uLCD.filled_rectangle(o_x,o_y,o_x+16,o_y+16, BACK);
apcastelein 7:12f7fd2b1a13 556 o_p2I = p2I;
apcastelein 7:12f7fd2b1a13 557 o_p2J = p2J;
apcastelein 7:12f7fd2b1a13 558 }
apcastelein 7:12f7fd2b1a13 559 drawBombs();
apcastelein 7:12f7fd2b1a13 560 drawPlayer(1);
apcastelein 7:12f7fd2b1a13 561 drawPlayer(2);
apcastelein 7:12f7fd2b1a13 562 }
apcastelein 7:12f7fd2b1a13 563
apcastelein 7:12f7fd2b1a13 564 void checkPlayerDeath(int pid){
apcastelein 7:12f7fd2b1a13 565 if(gameRestart) return;
apcastelein 7:12f7fd2b1a13 566 int centerX = getX((pid == 1)?(p1J):(p2J))+8;
apcastelein 7:12f7fd2b1a13 567 int centerY = getY((pid == 1)?(p1I):(p2I))+8;
apcastelein 7:12f7fd2b1a13 568 for(int i = 0; i < numBombs; i++) {
apcastelein 7:12f7fd2b1a13 569 Bomb *b = &bombs[(bombIndex + i)%bufferSize];
apcastelein 7:12f7fd2b1a13 570 if(b->exploded){
apcastelein 7:12f7fd2b1a13 571 int bx = getX(b->startJ);
apcastelein 7:12f7fd2b1a13 572 int by = getY(b->startI);
apcastelein 7:12f7fd2b1a13 573 if(b->minX < centerX && centerX < b->maxX && by < centerY && centerY < by+16){
apcastelein 7:12f7fd2b1a13 574 gameRestart = true;
apcastelein 7:12f7fd2b1a13 575 }
apcastelein 7:12f7fd2b1a13 576 if(b->minY < centerY && centerY < b->maxY && bx < centerX && centerX < bx+16){
apcastelein 7:12f7fd2b1a13 577 gameRestart = true;
apcastelein 7:12f7fd2b1a13 578 }
apcastelein 7:12f7fd2b1a13 579 }
apcastelein 7:12f7fd2b1a13 580 }
apcastelein 7:12f7fd2b1a13 581 if(gameRestart){
apcastelein 7:12f7fd2b1a13 582 if(pid == 1){
apcastelein 7:12f7fd2b1a13 583 startText = "P1 Died";
apcastelein 7:12f7fd2b1a13 584 }else{
apcastelein 7:12f7fd2b1a13 585 startText = "P2 Died";
apcastelein 7:12f7fd2b1a13 586 }
apcastelein 7:12f7fd2b1a13 587 }
apcastelein 7:12f7fd2b1a13 588 }
apcastelein 7:12f7fd2b1a13 589
apcastelein 7:12f7fd2b1a13 590 int main()
apcastelein 7:12f7fd2b1a13 591 {
apcastelein 7:12f7fd2b1a13 592 Thread thr(playExplosion);
apcastelein 7:12f7fd2b1a13 593 while(true){
apcastelein 7:12f7fd2b1a13 594 resetVars();
apcastelein 7:12f7fd2b1a13 595 generateGrid();
apcastelein 7:12f7fd2b1a13 596 initialDraw();
apcastelein 7:12f7fd2b1a13 597 while(!gameRestart) {
apcastelein 7:12f7fd2b1a13 598 updateP1();
apcastelein 7:12f7fd2b1a13 599 updateP2();
apcastelein 7:12f7fd2b1a13 600 updateBombs();
apcastelein 7:12f7fd2b1a13 601 checkPlayerDeath(1);
apcastelein 7:12f7fd2b1a13 602 checkPlayerDeath(2);
apcastelein 7:12f7fd2b1a13 603 draw();
apcastelein 7:12f7fd2b1a13 604 gameTime+=.02;
apcastelein 7:12f7fd2b1a13 605 wait(.02);
apcastelein 7:12f7fd2b1a13 606 }
apcastelein 7:12f7fd2b1a13 607 wait(3);
apcastelein 7:12f7fd2b1a13 608 }
apcastelein 7:12f7fd2b1a13 609 }