Sound update
Dependencies: 4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed
Diff: tetris/tetris.cpp
- Revision:
- 19:6d9bee043ede
- Child:
- 20:73e4f12277bd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tetris/tetris.cpp Sun Dec 04 23:31:28 2022 +0000 @@ -0,0 +1,493 @@ +#include "tetris.h" +#include "globals.h" + +#include "mbed.h" +#include "Game.h" +#include "PinDetect.h" +//#include "Speaker.h" +//#include "TextLCD.h" +//#include "Shiftbrite.h" +//#include "SDFileSystem.h" +//#include "wave_player.h" +#include "rtos.h" + +//TextLCD textLCD(p26, p25, p24, p23, p22, p15); +//Speaker mySpeaker(p21); +//Shiftbrite myShiftbrite(p9, p10, p11, p12, p13); +//SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card + +PinDetect LEFT_KEY(p16); // need to use NavSwitch for this +PinDetect RIGHT_KEY(p19); +PinDetect ROTATE_KEY(p17); +PinDetect DOWN_KEY(p30); + +int SinglePiecePoints = 50; +int LineClearPoints = 200; +int key_input = 0; +bool gameStarted = false; +void input_left() // FIX +{ + if(!gameStarted) + { gameStarted=true; + return; + } + key_input = 1; + //mySpeaker.PlayNote(400.0,0.05,0.025); + //mySpeaker.PlayNote(500.0,0.05,0.025); +} + +void input_right() +{ + if(!gameStarted) + { gameStarted=true; + return; + } + key_input = 2; + //mySpeaker.PlayNote(400.0,0.05,0.025); + //mySpeaker.PlayNote(500.0,0.05,0.025); +} + +void input_rotate() +{ + if(!gameStarted) + { gameStarted=true; + return; + } + key_input = 3; + /*mySpeaker.PlayNote(600.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025);*/ +} + +void input_down() +{ + if(!gameStarted) + { gameStarted=true; + return; + } + key_input=4; + /*mySpeaker.PlayNote(500.0,0.05,0.025); + mySpeaker.PlayNote(1500.0,0.05,0.025); + mySpeaker.PlayNote(500.0,0.05,0.025); + mySpeaker.PlayNote(1500.0,0.05,0.025);*/ +} + +void clear_board() +{ + uLCD.filled_rectangle(20,0,79,128,0); +} + +void clear_next_piece() +{ + uLCD.filled_rectangle(92,20,122,50,0); +} + +/* +void UpdateGameStatus(int points,int lines) +{ + textLCD.locate(7,0); + textLCD.printf("%d",points); + textLCD.locate(13,1); + textLCD.printf("%d",lines); +}*/ + +/* ShiftBright Code +void FlashLight(void const *args) +{ + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + + myShiftbrite.RGB(0,0,42); + myShiftbrite.RGB(0,0,42); + Thread::wait(100); + + + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,42,0); + Thread::wait(100); + + myShiftbrite.RGB(0,0,42); + myShiftbrite.RGB(0,0,42); + Thread::wait(100); + + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); +} + +void GameOverLight(void const *args) +{ + + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,200); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); +} + +void GameStartLight(void const *args) +{ + + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + + myShiftbrite.RGB(0,200,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,200,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,200,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,200,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + Thread::wait(100); + myShiftbrite.RGB(0,200,0); + Thread::wait(100); + myShiftbrite.RGB(0,0,0); + myShiftbrite.RGB(0,0,0); + +} */ + +/* Speaker Code +void PlayStartSound() +{ + mySpeaker.PlayNote(500.0,0.05,0.025); + mySpeaker.PlayNote(600.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(600.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(1300.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(1300.0,0.05,0.025); + mySpeaker.PlayNote(1400.0,0.05,0.025); +} + +void PlayOverSound() +{ + mySpeaker.PlayNote(1400.0,0.05,0.025); + mySpeaker.PlayNote(1300.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(1300.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(600.0,0.05,0.025); + mySpeaker.PlayNote(1200.0,0.05,0.025); + mySpeaker.PlayNote(1100.0,0.05,0.025); + mySpeaker.PlayNote(1000.0,0.05,0.025); + mySpeaker.PlayNote(900.0,0.05,0.025); + mySpeaker.PlayNote(800.0,0.05,0.025); + mySpeaker.PlayNote(700.0,0.05,0.025); + mySpeaker.PlayNote(600.0,0.05,0.025); + mySpeaker.PlayNote(500.0,0.05,0.025); +} + +void PlayClearSound() +{ + mySpeaker.PlayNote(900.0,0.2,0.025); + mySpeaker.PlayNote(1000.0,0.2,0.025); + mySpeaker.PlayNote(1100.0,0.2,0.025); + mySpeaker.PlayNote(1000.0,0.2,0.025); + mySpeaker.PlayNote(9000.0,0.2,0.025); +} */ + +int RandomGen(char range) +{ + pc.printf("%c",range); + while(!pc.readable()) wait(0.5); + char buffer[4]; + pc.gets(buffer,4); + int i = buffer[0]-'0'; + return i; +} + +void tetrisGame(void) +{ + //hardware setup // FIX + LEFT_KEY.mode(PullUp); + RIGHT_KEY.mode(PullUp); + ROTATE_KEY.mode(PullUp); + DOWN_KEY.mode(PullUp); + + LEFT_KEY.attach_deasserted(&input_left); + RIGHT_KEY.attach_deasserted(&input_right); + ROTATE_KEY.attach_deasserted(&input_rotate); + DOWN_KEY.attach_deasserted(&input_down); + + LEFT_KEY.setSampleFrequency(); + RIGHT_KEY.setSampleFrequency(); + ROTATE_KEY.setSampleFrequency(); + DOWN_KEY.setSampleFrequency(); // FIX + uLCD.baudrate(3000000); + + //myShiftbrite.RGB(0,0,0); + //myShiftbrite.RGB(0,0,0); + + /* SD card used for Startup Image + sd.disk_initialize(); // ? might need to delete + uLCD.media_init(); + uLCD.set_sector_address(0x001D, 0x7801); + uLCD.display_image(0,0);*/ + + /*textLCD.cls(); + textLCD.locate(0,0); + textLCD.printf("Waiting for PC...");*/ + + pc.baud(9600); + pc.format(8,SerialBase::None,1); + pc.printf("0"); + while(!pc.readable()) wait(0.5); + char buffer[4]; + pc.gets(buffer,4); + /* + //wait for game start + textLCD.cls(); + textLCD.locate(0,0); + textLCD.printf("TETRIS READY!!"); + textLCD.locate(0,1); + textLCD.printf("PRESS ANY KEY..."); + while(!gameStarted) wait(0.5); + PlayStartSound(); + textLCD.cls(); + textLCD.printf("Starting game now..."); + wait(2); + textLCD.cls(); + textLCD.locate(0,0); + textLCD.printf("Points"); + textLCD.locate(0,1); + textLCD.printf("Cleared Line");*/ + + //Thread t1(GameStartLight); + //game classes init + bool isGameOver = false; + int mScreenHeight = 128; + Pieces mPieces; + Board mBoard (&mPieces, mScreenHeight); + int a = RandomGen('a'); + int b = RandomGen('b'); + int c = RandomGen('a'); + int d = RandomGen('b'); + Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d); + + + // ----- Main Loop ----- + int prevX=0; + int prevY=0; + int prevPiece=-1; + int prevRot=0; + Timer timer; + timer.start(); + key_input=0; + bool needErase = false; + uLCD.cls(); + while (1) + { + if(isGameOver) + { + wait(1); + continue; + } + // ----- Draw ---- + if(needErase) + { + mGame.ErasePiece(prevX,prevY,prevPiece,prevRot); + needErase=false; + } + mGame.DrawScene(); + + prevX=mGame.mPosX; + prevY=mGame.mPosY; + prevPiece=mGame.mPiece; + prevRot=mGame.mRotation; + + // ----- Input ----- + switch (key_input) + { + case (2): //right + { + if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) + {mGame.mPosX++;needErase=true;} + break; + } + + case (1): //left + { + if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) + {mGame.mPosX--;needErase=true;} + break; + } + + case (4)://down + { + // Check collision from up to down + while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; } + needErase=true; + mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation); + mGame.AddPoints(SinglePiecePoints); + int linesDeleted = mBoard.DeletePossibleLines (); + if(linesDeleted>0) + { + mGame.AddClearedLines(linesDeleted); + mGame.AddPoints(LineClearPoints*linesDeleted); + //Thread t1(FlashLight); + //PlayClearSound(); + clear_board(); + } + //!!! UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); + + if (mBoard.IsGameOver()) + { + isGameOver=true; + uLCD.cls(); + + // FIX add Game Over mechanic + + //uLCD.media_init(); + //uLCD.set_sector_address(0x001D, 0x7842); + //uLCD.display_image(0,0); + //Thread t2(GameOverLight); + //PlayOverSound(); + + } + + if(!isGameOver) + { + mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); + clear_next_piece(); + } + break; + } + + case (3)://rotate + { + if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4)) + {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;} + break; + } + + case (0):{break;} + } + key_input = 0; + + // ----- Vertical movement ----- + + if(timer.read_ms()>WAIT_TIME) + { + needErase=true; + if(!isGameOver) + { + if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation)) + { + mGame.mPosY++; + } + else + { + mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation); + mGame.AddPoints(SinglePiecePoints); + int linesDeleted = mBoard.DeletePossibleLines (); + if(linesDeleted>0) + { + mGame.AddClearedLines(linesDeleted); + mGame.AddPoints(LineClearPoints*linesDeleted); + //Thread t1(FlashLight); + //PlayClearSound(); + clear_board(); + } + //!!! UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); + + if (mBoard.IsGameOver()) + { + isGameOver=true; + uLCD.cls(); + + // FIX add Game Over mechanic + + //uLCD.media_init(); + //uLCD.set_sector_address(0x001D, 0x7842); + //uLCD.display_image(0,0); + //Thread t2(GameOverLight); + //PlayOverSound(); + } + + if(!isGameOver) + { + mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); + clear_next_piece(); + } + } + } + timer.reset(); + } + wait(0.1); + } +}