void PlayState::HandleInput() { static bool down_is_pressed = false; static bool left_is_pressed = false; static bool right_is_pressed = false; if (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { while (!TheGame::Instance()->GetGameStates()->empty()) { TheGame::Instance()->GetGameStates()->pop(); } return; } if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) { TheGame::Instance()->GetGameStates()->pop(); return; } Block* nextBlock = TheGame::Instance()->GetNextBlock(); if (event.key.keysym.sym == SDLK_SPACE) { if (!nextBlock->CheckEntityCollision(LEFT) && !nextBlock->CheckEntityCollision(RIGHT) && !nextBlock->CheckEntityCollision(DOWN)) { TheGame::Instance()->SwapBlock(); } } Block* focusBlock = TheGame::Instance()->GetFocusBlock(); if (event.key.keysym.sym == SDLK_UP) { if (!focusBlock->CheckRotationCollision()) { focusBlock->Rotate(); } } // TODO: Consolidate Wall and Entity Collision into a signle function for readability. if (event.key.keysym.sym == SDLK_LEFT) { left_is_pressed = true; if (!focusBlock->CheckWallCollision(LEFT) && !focusBlock->CheckEntityCollision(LEFT)) { focusBlock->Move(LEFT); } } if (event.key.keysym.sym == SDLK_RIGHT) { right_is_pressed = true; if (!focusBlock->CheckWallCollision(RIGHT) && !focusBlock->CheckEntityCollision(RIGHT)) { focusBlock->Move(RIGHT); } } if (event.key.keysym.sym == SDLK_DOWN) { down_is_pressed = true; if (!focusBlock->CheckWallCollision(DOWN) && !focusBlock->CheckEntityCollision(DOWN)) { focusBlock->Move(DOWN); } } } } }