#include "game.h" Game::Game() { // Place the player with 10 initial charges onto x: 1, y: 1 hero = std::make_unique(1, 1, 10); // Generate level level = std::make_unique(); main_window.create(sf::VideoMode(window_side, window_side), "SFML-Test Application", sf::Style::Default); main_window.setActive(); } int Game::run() { clock = std::make_unique(); // To where player moved each step of the game loop Direction direction; // On the game loop while (main_window.isOpen()) { // By default player doesn't move anywhere direction = Direction::None; sf::Event event; while (main_window.pollEvent(event)) { if (event.type == sf::Event::Closed) main_window.close(); // Handling keyboard activity if (event.type == sf::Event::KeyPressed) { // Move direction = onMoving(event.key.code); } } // Draw level renderMap(direction); main_window.display(); } return EXIT_SUCCESS; } //////////////////////////////////////////////////// Direction Game::getDirection(sf::Keyboard::Key &key) const { switch (key) { case sf::Keyboard::A: case sf::Keyboard::Left: case sf::Keyboard::Num4: return Direction::Left; case sf::Keyboard::W: case sf::Keyboard::Up: case sf::Keyboard::Num8: return Direction::Up; case sf::Keyboard::D: case sf::Keyboard::Right: case sf::Keyboard::Num6: return Direction::Right; case sf::Keyboard::S: case sf::Keyboard::Down: case sf::Keyboard::Num2: return Direction::Down; default: return Direction::None; } } Direction Game::onMoving(sf::Keyboard::Key &key) { // Determine where to move const Direction direction = getDirection(key); if (direction != Direction::None) { // Save the initial coordinates coordinate initial_x, initial_y; hero->position(initial_x, initial_y); // Try to move hero hero->move(direction); // Save the new coordinates after moving coordinate attempt_x, attempt_y; hero->position(attempt_x, attempt_y); ////////////////////////// // If the following cell is water if (level->isCellOfType(attempt_x, attempt_y, CellType::Water)) { // Try to use one charge to place a bridge if (hero->useCharge()) level->placeBridge(attempt_x, attempt_y); // If hero doesn't have enough charges, we move Hero back else hero->setPosition(initial_x, initial_y); } ////////////////////////// // If the following cell is a charge if (level->isCellOfType(attempt_x, attempt_y, CellType::Charge)) { // Hero picks up the charge; remove it from the map hero->refillCharges(1); level->removeCharge(attempt_x, attempt_y); } } return direction; } void Game::renderMap(const Direction direction) { if (direction == Direction::None) return; // Player didn't move this step of loop, so map couldn't change const Map &map = level->mapArray(); coordinate painter_x = 0, painter_y = 0; for (const Row &row : map) { for (const CellType &cell : row) { switch (cell) { // TO DO!! case CellType::Ground: ; break; case CellType::Charge: ; break; case CellType::Bridge: ; break; case CellType::Water: default: ; } // Move painter to next cell of row painter_x += cell_length; } // Move painter to next row of the map painter_x = 0; painter_y += cell_length; } }