This is a remake of tetris game for mbed. Please see detail here http://developer.mbed.org/users/sucrelv/notebook/tetris-game-on-mbed
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player
Diff: Game.cpp
- Revision:
- 0:3b5e97ab5884
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Game.cpp Tue Oct 21 15:10:36 2014 +0000 @@ -0,0 +1,196 @@ +#include "Game.h" + +/* +====================================== +Init +====================================== +*/ +Game::Game(Board *pBoard, Pieces *pPieces, int pScreenHeight, uLCD_4DGL *pLCD,int initPiece,int initPos,int initNextPiece,int initNextPos) +{ + mScreenHeight = pScreenHeight; + + // Get the pointer to the Board and Pieces classes + mBoard = pBoard; + mPieces = pPieces; + uLCD = pLCD; + // Game initialization + InitGame (initPiece,initPos,initNextPiece,initNextPos); +} + + + +/* +====================================== +Initial parameters of the game +====================================== +*/ +void Game::InitGame(int initPiece,int initPos,int initNextPiece,int initNextPos) +{ + //points + points = 0; + clearedLineCount=0; + + // First piece + mPiece = initPiece; + mRotation = initPos; + mPosX = (BOARD_WIDTH / 2) + mPieces->GetXInitialPosition (mPiece, mRotation); + mPosY = mPieces->GetYInitialPosition (mPiece, mRotation); + + // Next piece + mNextPiece = initNextPiece; + mNextRotation = initNextPos; + mNextPosX = BOARD_WIDTH + 2; + mNextPosY = 2; +} + + +/* +====================================== +Create a random piece +====================================== +*/ +void Game::CreateNewPiece(int piece,int pos) +{ + // The new piece + mPiece = mNextPiece; + mRotation = mNextRotation; + mPosX = (BOARD_WIDTH / 2) + mPieces->GetXInitialPosition (mPiece, mRotation); + mPosY = mPieces->GetYInitialPosition (mPiece, mRotation); + + // Random next piece + mNextPiece = piece; + mNextRotation = pos; +} + + +/* +====================================== +Draw piece + +Parameters: + +>> pX: Horizontal position in blocks +>> pY: Vertical position in blocks +>> pPiece: Piece to draw +>> pRotation: 1 of the 4 possible rotations +====================================== +*/ +void Game::DrawPiece (int pX, int pY, int pPiece, int pRotation, int colorIndex) +{ + // Obtain the position in pixel in the screen of the block we want to draw + int mPixelsX = mBoard->GetXPosInPixels (pX); + int mPixelsY = mBoard->GetYPosInPixels (pY); + int mColors [7]={16711680, 15955765, 16761893, 45401, 44763, 12462572, 29669}; + // Travel the matrix of blocks of the piece and draw the blocks that are filled + for (int i = 0; i < PIECE_BLOCKS; i++) + { + for (int j = 0; j < PIECE_BLOCKS; j++) + { + if (mPieces->GetBlockType (pPiece, pRotation, j, i) != 0) + uLCD->filled_rectangle (mPixelsX + i * BLOCK_SIZE, + mPixelsY + j * BLOCK_SIZE, + (mPixelsX + i * BLOCK_SIZE) + BLOCK_SIZE - 1, + (mPixelsY + j * BLOCK_SIZE) + BLOCK_SIZE - 1, + mColors[colorIndex]); + } + } +} + + +/* +====================================== +Draw board + +Draw the two lines that delimit the board +====================================== +*/ +void Game::DrawBoard () +{ + // Calculate the limits of the board in pixels + int mX1 = BOARD_POSITION - (BLOCK_SIZE * (BOARD_WIDTH / 2)) - 1; + int mX2 = BOARD_POSITION + (BLOCK_SIZE * (BOARD_WIDTH / 2)); + int mY = mScreenHeight - (BLOCK_SIZE * BOARD_HEIGHT); + + // Check that the vertical margin is not to small + //assert (mY > MIN_VERTICAL_MARGIN); + + // Rectangles that delimits the board + uLCD->filled_rectangle (mX1 - BOARD_LINE_WIDTH, mY, mX1, mScreenHeight - 1, BLUE); + uLCD->filled_rectangle (mX2, mY, mX2 + BOARD_LINE_WIDTH, mScreenHeight - 1, BLUE); + + // Check that the horizontal margin is not to small + //assert (mX1 > MIN_HORIZONTAL_MARGIN); + + // Drawing the blocks that are already stored in the board + mX1 += 1; + for (int i = 0; i < BOARD_WIDTH; i++) + { + for (int j = 0; j < BOARD_HEIGHT; j++) + { + // Check if the block is filled, if so, draw it + if (!mBoard->IsFreeBlock(i, j)) + uLCD->filled_rectangle ( mX1 + i * BLOCK_SIZE, + mY + j * BLOCK_SIZE, + (mX1 + i * BLOCK_SIZE) + BLOCK_SIZE - 1, + (mY + j * BLOCK_SIZE) + BLOCK_SIZE - 1, + 10066329); + } + } +} + + +/* +====================================== +Draw scene + +Draw all the objects of the scene +====================================== +*/ +void Game::DrawScene () +{ + DrawBoard(); + DrawPiece (mPosX, mPosY, mPiece, mRotation, mPiece); // Draw the playing piece + DrawPiece (mNextPosX, mNextPosY, mNextPiece, mNextRotation, mNextPiece); // Draw the next piece +} + +void Game::ErasePiece (int pX, int pY, int pPiece, int pRotation) +{ + if(pPiece==-1) return; + // Obtain the position in pixel in the screen of the block we want to draw + int mPixelsX = mBoard->GetXPosInPixels (pX); + int mPixelsY = mBoard->GetYPosInPixels (pY); + + // Travel the matrix of blocks of the piece and draw the blocks that are filled + for (int i = 0; i < PIECE_BLOCKS; i++) + { + for (int j = 0; j < PIECE_BLOCKS; j++) + { + if (mPieces->GetBlockType (pPiece, pRotation, j, i) != 0) + uLCD->filled_rectangle (mPixelsX + i * BLOCK_SIZE, + mPixelsY + j * BLOCK_SIZE, + (mPixelsX + i * BLOCK_SIZE) + BLOCK_SIZE - 1, + (mPixelsY + j * BLOCK_SIZE) + BLOCK_SIZE - 1, + 0); + } + } +} + +void Game::AddPoints(int newGain) +{ + points+=newGain; +} + +void Game::AddClearedLines(int newGain) +{ + clearedLineCount+=newGain; +} + +int Game::GetPoints() +{ + return points; +} + +int Game::GetClearedLines() +{ + return clearedLineCount; +} \ No newline at end of file