97 lines
3.9 KiB
C++
97 lines
3.9 KiB
C++
#include "InGameAppMenu.h"
|
|
|
|
#include "AppMenu.h"
|
|
|
|
#include <stack>
|
|
#include <memory>
|
|
#include <SFML/Graphics.hpp>
|
|
|
|
|
|
InGameAppMenu::InGameAppMenu(std::shared_ptr<std::stack<AppMenu>> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow) :
|
|
AppMenu(menuStack, settings, renderWindow),
|
|
game(this->settings->getMenu().startGame(this->settings->getGamemode()))
|
|
{
|
|
|
|
this->paused = false;
|
|
}
|
|
|
|
void InGameAppMenu::computeFrame() {
|
|
std::set<Action> 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();
|
|
}
|