You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
3.9 KiB
C++

#include "game.h"
Game::Game()
{
// Place the player with 10 initial charges onto x: 1, y: 1
hero = std::make_unique<Hero>(1, 1, 10);
// Generate level
level = std::make_unique<Level>();
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<sf::Clock>();
// 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;
}
}