Sound update

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

Committer:
jsanchez307
Date:
Tue Dec 06 22:48:35 2022 +0000
Revision:
22:601e6f9077e4
Parent:
20:73e4f12277bd
Child:
23:214c0c828d98
Added working Tetris Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jstephens78 19:6d9bee043ede 1 #include "mbed.h"
jsanchez307 22:601e6f9077e4 2 #include "uLCD_4DGL.h"
jstephens78 19:6d9bee043ede 3 #include "Game.h"
jsanchez307 22:601e6f9077e4 4 #include "Nav_Switch.h"
jstephens78 19:6d9bee043ede 5
jsanchez307 22:601e6f9077e4 6 uLCD_4DGL uLCD(p13, p14, p30);
jsanchez307 22:601e6f9077e4 7 Nav_Switch myNav(p19, p16, p17, p15, p18); // pins(up, down, left, right, fire)
jstephens78 19:6d9bee043ede 8
jstephens78 19:6d9bee043ede 9 int SinglePiecePoints = 50;
jstephens78 19:6d9bee043ede 10 int LineClearPoints = 200;
jstephens78 19:6d9bee043ede 11 int key_input = 0;
jstephens78 19:6d9bee043ede 12 bool gameStarted = false;
jstephens78 19:6d9bee043ede 13 void input_left() // FIX
jstephens78 19:6d9bee043ede 14 {
jstephens78 19:6d9bee043ede 15 if(!gameStarted)
jstephens78 19:6d9bee043ede 16 { gameStarted=true;
jstephens78 19:6d9bee043ede 17 return;
jstephens78 19:6d9bee043ede 18 }
jstephens78 19:6d9bee043ede 19 key_input = 1;
jstephens78 19:6d9bee043ede 20 }
jstephens78 19:6d9bee043ede 21
jstephens78 19:6d9bee043ede 22 void input_right()
jstephens78 19:6d9bee043ede 23 {
jstephens78 19:6d9bee043ede 24 if(!gameStarted)
jstephens78 19:6d9bee043ede 25 { gameStarted=true;
jstephens78 19:6d9bee043ede 26 return;
jstephens78 19:6d9bee043ede 27 }
jstephens78 19:6d9bee043ede 28 key_input = 2;
jstephens78 19:6d9bee043ede 29 }
jstephens78 19:6d9bee043ede 30
jstephens78 19:6d9bee043ede 31 void input_rotate()
jstephens78 19:6d9bee043ede 32 {
jstephens78 19:6d9bee043ede 33 if(!gameStarted)
jstephens78 19:6d9bee043ede 34 { gameStarted=true;
jstephens78 19:6d9bee043ede 35 return;
jstephens78 19:6d9bee043ede 36 }
jstephens78 19:6d9bee043ede 37 key_input = 3;
jstephens78 19:6d9bee043ede 38 }
jstephens78 19:6d9bee043ede 39
jstephens78 19:6d9bee043ede 40 void input_down()
jstephens78 19:6d9bee043ede 41 {
jstephens78 19:6d9bee043ede 42 if(!gameStarted)
jstephens78 19:6d9bee043ede 43 { gameStarted=true;
jstephens78 19:6d9bee043ede 44 return;
jstephens78 19:6d9bee043ede 45 }
jstephens78 19:6d9bee043ede 46 key_input=4;
jstephens78 19:6d9bee043ede 47 }
jstephens78 19:6d9bee043ede 48
jstephens78 19:6d9bee043ede 49 void clear_board()
jstephens78 19:6d9bee043ede 50 {
jstephens78 19:6d9bee043ede 51 uLCD.filled_rectangle(20,0,79,128,0);
jstephens78 19:6d9bee043ede 52 }
jstephens78 19:6d9bee043ede 53
jstephens78 19:6d9bee043ede 54 void clear_next_piece()
jstephens78 19:6d9bee043ede 55 {
jstephens78 19:6d9bee043ede 56 uLCD.filled_rectangle(92,20,122,50,0);
jstephens78 19:6d9bee043ede 57 }
jstephens78 19:6d9bee043ede 58
jsanchez307 22:601e6f9077e4 59 void UpdateGameStatus(int points) // used to include int lines
jstephens78 19:6d9bee043ede 60 {
jsanchez307 22:601e6f9077e4 61 uLCD.locate(13,12);
jsanchez307 22:601e6f9077e4 62 uLCD.printf("Score");
jsanchez307 22:601e6f9077e4 63 uLCD.locate(13,13);
jsanchez307 22:601e6f9077e4 64 uLCD.printf("%d",points);
jstephens78 19:6d9bee043ede 65 }
jstephens78 19:6d9bee043ede 66
jstephens78 19:6d9bee043ede 67
jsanchez307 22:601e6f9077e4 68 /*int RandomGen(char range)
jstephens78 19:6d9bee043ede 69 {
jstephens78 19:6d9bee043ede 70 pc.printf("%c",range);
jstephens78 19:6d9bee043ede 71 while(!pc.readable()) wait(0.5);
jstephens78 19:6d9bee043ede 72 char buffer[4];
jstephens78 19:6d9bee043ede 73 pc.gets(buffer,4);
jstephens78 19:6d9bee043ede 74 int i = buffer[0]-'0';
jstephens78 19:6d9bee043ede 75 return i;
jsanchez307 22:601e6f9077e4 76 }*/
jstephens78 19:6d9bee043ede 77
jsanchez307 22:601e6f9077e4 78 void tetrisGame()
jstephens78 19:6d9bee043ede 79 {
jsanchez307 22:601e6f9077e4 80 /*while(1){
jsanchez307 22:601e6f9077e4 81 uLCD.printf("test");
jsanchez307 22:601e6f9077e4 82 }*/
jsanchez307 22:601e6f9077e4 83
jsanchez307 22:601e6f9077e4 84
jsanchez307 22:601e6f9077e4 85
jstephens78 19:6d9bee043ede 86
jsanchez307 22:601e6f9077e4 87 /*if (myNav.up()) input_rotate();
jsanchez307 22:601e6f9077e4 88 if (myNav.down()) input_down();;
jsanchez307 22:601e6f9077e4 89 if (myNav.left()) input_left();
jsanchez307 22:601e6f9077e4 90 if (myNav.right()) input_right();;
jsanchez307 22:601e6f9077e4 91 //check mouse left button click*/ // FIXQ
jsanchez307 22:601e6f9077e4 92 //if (myNav.fire()) input_down; // FIX, CAN ADD MENU FUNCTIONALITY
jsanchez307 22:601e6f9077e4 93
jstephens78 19:6d9bee043ede 94
jsanchez307 22:601e6f9077e4 95
jsanchez307 22:601e6f9077e4 96 uLCD.text_width(2);
jsanchez307 22:601e6f9077e4 97 uLCD.text_height(2);
jsanchez307 22:601e6f9077e4 98 uLCD.color(WHITE);
jsanchez307 22:601e6f9077e4 99 uLCD.printf("TETRIS");
jsanchez307 22:601e6f9077e4 100 wait(2);
jsanchez307 22:601e6f9077e4 101
jstephens78 19:6d9bee043ede 102 uLCD.baudrate(3000000);
jstephens78 19:6d9bee043ede 103
jstephens78 20:73e4f12277bd 104
jsanchez307 22:601e6f9077e4 105 /*pc.baud(9600);
jstephens78 19:6d9bee043ede 106 pc.format(8,SerialBase::None,1);
jstephens78 19:6d9bee043ede 107 pc.printf("0");
jstephens78 19:6d9bee043ede 108 while(!pc.readable()) wait(0.5);
jstephens78 19:6d9bee043ede 109 char buffer[4];
jsanchez307 22:601e6f9077e4 110 pc.gets(buffer,4);*/
jsanchez307 22:601e6f9077e4 111
jsanchez307 22:601e6f9077e4 112
jstephens78 19:6d9bee043ede 113
jsanchez307 22:601e6f9077e4 114
jsanchez307 22:601e6f9077e4 115
jsanchez307 22:601e6f9077e4 116
jstephens78 19:6d9bee043ede 117 bool isGameOver = false;
jstephens78 19:6d9bee043ede 118 int mScreenHeight = 128;
jstephens78 19:6d9bee043ede 119 Pieces mPieces;
jstephens78 19:6d9bee043ede 120 Board mBoard (&mPieces, mScreenHeight);
jsanchez307 22:601e6f9077e4 121 int a = 1; // RandomGen('a')
jsanchez307 22:601e6f9077e4 122 int b = 2;
jsanchez307 22:601e6f9077e4 123 int c = 3;
jsanchez307 22:601e6f9077e4 124 int d = 4;
jstephens78 19:6d9bee043ede 125 Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d);
jstephens78 19:6d9bee043ede 126
jstephens78 19:6d9bee043ede 127
jstephens78 19:6d9bee043ede 128 // ----- Main Loop -----
jstephens78 19:6d9bee043ede 129 int prevX=0;
jstephens78 19:6d9bee043ede 130 int prevY=0;
jstephens78 19:6d9bee043ede 131 int prevPiece=-1;
jstephens78 19:6d9bee043ede 132 int prevRot=0;
jstephens78 19:6d9bee043ede 133 Timer timer;
jstephens78 19:6d9bee043ede 134 timer.start();
jstephens78 19:6d9bee043ede 135 key_input=0;
jstephens78 19:6d9bee043ede 136 bool needErase = false;
jstephens78 19:6d9bee043ede 137 uLCD.cls();
jsanchez307 22:601e6f9077e4 138
jsanchez307 22:601e6f9077e4 139
jsanchez307 22:601e6f9077e4 140
jsanchez307 22:601e6f9077e4 141 int piece = 0;
jsanchez307 22:601e6f9077e4 142 int rotate = 0;
jsanchez307 22:601e6f9077e4 143
jsanchez307 22:601e6f9077e4 144 UpdateGameStatus(mGame.GetPoints());
jsanchez307 22:601e6f9077e4 145
jstephens78 19:6d9bee043ede 146 while (1)
jstephens78 19:6d9bee043ede 147 {
jsanchez307 22:601e6f9077e4 148 if (myNav.up()) input_rotate();
jsanchez307 22:601e6f9077e4 149 if (myNav.down()) input_down();;
jsanchez307 22:601e6f9077e4 150 if (myNav.left()) input_left();
jsanchez307 22:601e6f9077e4 151 if (myNav.right()) input_right();;
jsanchez307 22:601e6f9077e4 152 //check mouse left button click // FIXQ
jsanchez307 22:601e6f9077e4 153 //if (myNav.fire()) input_down; // FIX, CAN ADD MENU FUNCTIONALITY
jsanchez307 22:601e6f9077e4 154
jstephens78 19:6d9bee043ede 155 if(isGameOver)
jstephens78 19:6d9bee043ede 156 {
jstephens78 19:6d9bee043ede 157 wait(1);
jsanchez307 22:601e6f9077e4 158 uLCD.cls();
jsanchez307 22:601e6f9077e4 159 uLCD.text_width(2);
jsanchez307 22:601e6f9077e4 160 uLCD.text_height(2);
jsanchez307 22:601e6f9077e4 161 uLCD.printf("GAME OVER");
jsanchez307 22:601e6f9077e4 162 while(1);
jstephens78 19:6d9bee043ede 163 }
jstephens78 19:6d9bee043ede 164 // ----- Draw ----
jstephens78 19:6d9bee043ede 165 if(needErase)
jstephens78 19:6d9bee043ede 166 {
jstephens78 19:6d9bee043ede 167 mGame.ErasePiece(prevX,prevY,prevPiece,prevRot);
jstephens78 19:6d9bee043ede 168 needErase=false;
jstephens78 19:6d9bee043ede 169 }
jstephens78 19:6d9bee043ede 170 mGame.DrawScene();
jstephens78 19:6d9bee043ede 171
jstephens78 19:6d9bee043ede 172 prevX=mGame.mPosX;
jstephens78 19:6d9bee043ede 173 prevY=mGame.mPosY;
jstephens78 19:6d9bee043ede 174 prevPiece=mGame.mPiece;
jstephens78 19:6d9bee043ede 175 prevRot=mGame.mRotation;
jsanchez307 22:601e6f9077e4 176
jstephens78 19:6d9bee043ede 177 // ----- Input -----
jstephens78 19:6d9bee043ede 178 switch (key_input)
jstephens78 19:6d9bee043ede 179 {
jstephens78 19:6d9bee043ede 180 case (2): //right
jstephens78 19:6d9bee043ede 181 {
jstephens78 19:6d9bee043ede 182 if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
jstephens78 19:6d9bee043ede 183 {mGame.mPosX++;needErase=true;}
jstephens78 19:6d9bee043ede 184 break;
jstephens78 19:6d9bee043ede 185 }
jstephens78 19:6d9bee043ede 186
jstephens78 19:6d9bee043ede 187 case (1): //left
jstephens78 19:6d9bee043ede 188 {
jstephens78 19:6d9bee043ede 189 if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
jstephens78 19:6d9bee043ede 190 {mGame.mPosX--;needErase=true;}
jstephens78 19:6d9bee043ede 191 break;
jstephens78 19:6d9bee043ede 192 }
jstephens78 19:6d9bee043ede 193
jstephens78 19:6d9bee043ede 194 case (4)://down
jstephens78 19:6d9bee043ede 195 {
jstephens78 19:6d9bee043ede 196 // Check collision from up to down
jstephens78 19:6d9bee043ede 197 while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; }
jstephens78 19:6d9bee043ede 198 needErase=true;
jstephens78 19:6d9bee043ede 199 mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation);
jstephens78 19:6d9bee043ede 200 mGame.AddPoints(SinglePiecePoints);
jstephens78 19:6d9bee043ede 201 int linesDeleted = mBoard.DeletePossibleLines ();
jstephens78 19:6d9bee043ede 202 if(linesDeleted>0)
jstephens78 19:6d9bee043ede 203 {
jstephens78 19:6d9bee043ede 204 mGame.AddClearedLines(linesDeleted);
jstephens78 19:6d9bee043ede 205 mGame.AddPoints(LineClearPoints*linesDeleted);
jstephens78 19:6d9bee043ede 206 //Thread t1(FlashLight);
jstephens78 19:6d9bee043ede 207 //PlayClearSound();
jstephens78 19:6d9bee043ede 208 clear_board();
jstephens78 19:6d9bee043ede 209 }
jsanchez307 22:601e6f9077e4 210 UpdateGameStatus(mGame.GetPoints()); // FIX
jstephens78 19:6d9bee043ede 211
jstephens78 19:6d9bee043ede 212 if (mBoard.IsGameOver())
jstephens78 19:6d9bee043ede 213 {
jstephens78 19:6d9bee043ede 214 isGameOver=true;
jstephens78 19:6d9bee043ede 215 uLCD.cls();
jstephens78 19:6d9bee043ede 216
jstephens78 19:6d9bee043ede 217 }
jstephens78 19:6d9bee043ede 218
jstephens78 19:6d9bee043ede 219 if(!isGameOver)
jstephens78 19:6d9bee043ede 220 {
jsanchez307 22:601e6f9077e4 221 mGame.CreateNewPiece(piece,rotate);
jsanchez307 22:601e6f9077e4 222 clear_next_piece();
jsanchez307 22:601e6f9077e4 223
jsanchez307 22:601e6f9077e4 224 piece++;
jsanchez307 22:601e6f9077e4 225 rotate++;
jsanchez307 22:601e6f9077e4 226
jsanchez307 22:601e6f9077e4 227 if (piece==7) piece = 0;
jsanchez307 22:601e6f9077e4 228 if (rotate==4) rotate = 0;
jstephens78 19:6d9bee043ede 229 }
jstephens78 19:6d9bee043ede 230 break;
jstephens78 19:6d9bee043ede 231 }
jstephens78 19:6d9bee043ede 232
jstephens78 19:6d9bee043ede 233 case (3)://rotate
jstephens78 19:6d9bee043ede 234 {
jstephens78 19:6d9bee043ede 235 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4))
jstephens78 19:6d9bee043ede 236 {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;}
jstephens78 19:6d9bee043ede 237 break;
jstephens78 19:6d9bee043ede 238 }
jstephens78 19:6d9bee043ede 239
jstephens78 19:6d9bee043ede 240 case (0):{break;}
jstephens78 19:6d9bee043ede 241 }
jstephens78 19:6d9bee043ede 242 key_input = 0;
jstephens78 19:6d9bee043ede 243
jstephens78 19:6d9bee043ede 244 // ----- Vertical movement -----
jsanchez307 22:601e6f9077e4 245
jstephens78 19:6d9bee043ede 246 if(timer.read_ms()>WAIT_TIME)
jstephens78 19:6d9bee043ede 247 {
jstephens78 19:6d9bee043ede 248 needErase=true;
jstephens78 19:6d9bee043ede 249 if(!isGameOver)
jstephens78 19:6d9bee043ede 250 {
jstephens78 19:6d9bee043ede 251 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation))
jstephens78 19:6d9bee043ede 252 {
jstephens78 19:6d9bee043ede 253 mGame.mPosY++;
jstephens78 19:6d9bee043ede 254 }
jstephens78 19:6d9bee043ede 255 else
jstephens78 19:6d9bee043ede 256 {
jstephens78 19:6d9bee043ede 257 mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation);
jstephens78 19:6d9bee043ede 258 mGame.AddPoints(SinglePiecePoints);
jstephens78 19:6d9bee043ede 259 int linesDeleted = mBoard.DeletePossibleLines ();
jstephens78 19:6d9bee043ede 260 if(linesDeleted>0)
jstephens78 19:6d9bee043ede 261 {
jstephens78 19:6d9bee043ede 262 mGame.AddClearedLines(linesDeleted);
jstephens78 19:6d9bee043ede 263 mGame.AddPoints(LineClearPoints*linesDeleted);
jstephens78 19:6d9bee043ede 264 //Thread t1(FlashLight);
jstephens78 19:6d9bee043ede 265 //PlayClearSound();
jstephens78 19:6d9bee043ede 266 clear_board();
jstephens78 19:6d9bee043ede 267 }
jsanchez307 22:601e6f9077e4 268 UpdateGameStatus(mGame.GetPoints());
jstephens78 19:6d9bee043ede 269
jstephens78 19:6d9bee043ede 270 if (mBoard.IsGameOver())
jstephens78 19:6d9bee043ede 271 {
jstephens78 19:6d9bee043ede 272 isGameOver=true;
jstephens78 19:6d9bee043ede 273 uLCD.cls();
jstephens78 19:6d9bee043ede 274 }
jstephens78 19:6d9bee043ede 275
jstephens78 19:6d9bee043ede 276 if(!isGameOver)
jstephens78 19:6d9bee043ede 277 {
jsanchez307 22:601e6f9077e4 278 mGame.CreateNewPiece(piece,rotate);
jsanchez307 22:601e6f9077e4 279 clear_next_piece(); // 0-6 Pieces, 0-3 rotations^^
jsanchez307 22:601e6f9077e4 280 piece++;
jsanchez307 22:601e6f9077e4 281 rotate++;
jsanchez307 22:601e6f9077e4 282
jsanchez307 22:601e6f9077e4 283 if (piece==7) piece = 0;
jsanchez307 22:601e6f9077e4 284 if (rotate==4) rotate = 0;
jstephens78 19:6d9bee043ede 285 }
jstephens78 19:6d9bee043ede 286 }
jstephens78 19:6d9bee043ede 287 }
jstephens78 19:6d9bee043ede 288 timer.reset();
jstephens78 19:6d9bee043ede 289 }
jstephens78 19:6d9bee043ede 290 wait(0.1);
jstephens78 19:6d9bee043ede 291 }
jstephens78 19:6d9bee043ede 292 }