#include "InGameAppMenu.h" #include "AppMenu.h" #include #include #include InGameAppMenu::InGameAppMenu(std::shared_ptr> menuStack, std::shared_ptr settings, std::shared_ptr renderWindow) : AppMenu(menuStack, settings, renderWindow), game(this->settings->getMenu().startGame(this->settings->getGamemode())) { this->paused = false; } void InGameAppMenu::computeFrame() { std::set actions; for (Action action : ACTION_LIST_IN_ORDER) { for (sfKey key : this->settings->getKeybinds().getKeybinds(action)) { if (sf::Keyboard::isKeyPressed(key)) { actions.insert(action); } } } if (actions.contains(RETRY)) { this->game.reset(); this->game.start(); } if (actions.contains(PAUSE)) { this->paused = (!this->paused); } if (!paused) { this->game.nextFrame(actions); } if (sf::Keyboard::isKeyPressed(sfKey::Escape)) { this->menuStack->pop(); } } void InGameAppMenu::drawFrame() const { this->renderWindow->clear(sf::Color::Black); for (int y = this->game.getBoard().getBaseHeight() + 5; y >= 0; y--) { for (int x = 0; x < this->game.getBoard().getWidth(); x++) { bool isActivePieceHere = (this->game.getActivePiece() != nullptr) && (this->game.getActivePiece()->getPositions().contains(Position{x, y} - this->game.getActivePiecePosition())); bool isGhostPieceHere = (this->game.getActivePiece() != nullptr) && (this->game.getActivePiece()->getPositions().contains(Position{x, y} - this->game.ghostPiecePosition())); Block block = (isActivePieceHere || isGhostPieceHere) ? this->game.getActivePiece()->getBlockType() : this->game.getBoard().getBlock(Position{x, y}); sf::RectangleShape cell(sf::Vector2f(20.f, 20.f)); cell.setFillColor(sf::Color(BLOCKS_COLOR[block].red, BLOCKS_COLOR[block].green, BLOCKS_COLOR[block].blue, (isGhostPieceHere && !isActivePieceHere) ? 150 : 255)); cell.setPosition(sf::Vector2f(x*20, (this->game.getBoard().getBaseHeight() + 10 - y)*20)); this->renderWindow->draw(cell); } } if (this->game.getNextPieces().size() > 0) { for (int y = 10; y >= 0; y--) { for (int x = 0; x <= 10; x++) { Block block = this->game.getNextPieces().at(0).getBlockType(); sf::RectangleShape cell(sf::Vector2f(20.f, 20.f)); cell.setPosition(sf::Vector2f((x + 2 + this->game.getBoard().getWidth())*20, (this->game.getBoard().getBaseHeight() - y)*20)); if (this->game.getNextPieces().at(0).getPositions().contains(Position({x, y}))) { cell.setFillColor(sf::Color(BLOCKS_COLOR[block].red, BLOCKS_COLOR[block].green, BLOCKS_COLOR[block].blue)); } else { cell.setFillColor(sf::Color(0, 0, 0)); } this->renderWindow->draw(cell); } } } if (this->game.getHeldPiece() != nullptr) { for (int y = 10; y >= 0; y--) { for (int x = 0; x <= 10; x++) { Block block = this->game.getHeldPiece()->getBlockType(); sf::RectangleShape cell(sf::Vector2f(20.f, 20.f)); cell.setPosition(sf::Vector2f((x + 12 + this->game.getBoard().getWidth())*20, (this->game.getBoard().getBaseHeight() - y)*20)); if (this->game.getHeldPiece()->getPositions().contains(Position({x, y}))) { cell.setFillColor(sf::Color(BLOCKS_COLOR[block].red, BLOCKS_COLOR[block].green, BLOCKS_COLOR[block].blue)); } else { cell.setFillColor(sf::Color(0, 0, 0)); } this->renderWindow->draw(cell); } } } this->renderWindow->display(); }