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.

116 lines
2.9 KiB
C++

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "main.hpp"
#include "game.hpp"
namespace Proto4 {
bool Game::init() {
mainView.setCenter(0, 0);
mainView.setSize(xResolution, yResolution);
return true;
}
AppState Game::handleKey(const sf::Event &event) {
switch (state) {
case GameState::Paused:
switch (event.key.code) {
case sf::Keyboard::Q:
state = GameState::Finished;
break;
case sf::Keyboard::S:
state = GameState::Running;
break;
default:
break;
}
break;
case GameState::Running:
if (event.key.code == sf::Keyboard::Q)
state = GameState::Paused;
default:
break;
}
return AppState::Game;
}
AppState Game::update(sf::RenderWindow &window, sf::Time timestep) {
switch (state) {
case GameState::Finished:
reset();
return AppState::MainMenu;
case GameState::Uninitialized:
start();
break;
case GameState::Paused:
break;
case GameState::Running:
level.update(timestep);
player.update(timestep, window.mapPixelToCoords(sf::Mouse::getPosition(window), mainView));
// mainView acts as camera. TODO: introduce lagging camera
mainView.setCenter(player.getPosition());
break;
default:
break;
}
return AppState::Game;
}
void Game::draw(sf::RenderTarget &target, sf::RenderStates states) const {
states.transform *= getTransform();
target.setView(mainView);
target.draw(level, states);
target.draw(player, states);
}
bool Game::reset() {
player.reset();
state = GameState::Uninitialized;
return true;
}
bool Game::start() {
player.setPosition(mainView.getCenter());
level = Level(mainView.getCenter());
level.spawn(200);
level.spawn(200);
level.spawn(200);
level.spawn(700);
level.spawn(100);
level.spawn(100);
level.spawn(100);
level.spawn(100);
level.spawn(100);
level.spawn(100);
state = GameState::Running;
return true;
}
// TODO: pause menu
void Game::pause() {
if (state == GameState::Running)
state = GameState::Paused;
}
void Game::resume() {
if (state == GameState::Paused)
state = GameState::Running;
}
void Game::resize(sf::Event &resizeEvent) {
mainView.setSize(resizeEvent.size.width, resizeEvent.size.height);
mainView.setCenter(resizeEvent.size.width / 2, resizeEvent.size.height / 2);
}
sf::View& Game::getMainView() { return mainView; }
}