Mode test dans jeu nouveaux raccourcis, amélioration transition caméra

This commit is contained in:
Mattéo Delabre 2016-04-28 08:48:54 +02:00
parent 656bd60643
commit a0a48f98ad
6 changed files with 81 additions and 44 deletions

View File

@ -3,6 +3,7 @@
#include "../gui/object_toolbar.hpp"
#include "level.hpp"
#include "game.hpp"
/**
* La classe Editor permet l'édition de

View File

@ -21,6 +21,7 @@ public:
private:
Mode mode;
bool test;
sf::Time next_frame_time;
unsigned int skipped_frames;
@ -60,7 +61,7 @@ protected:
void ensureCentered();
public:
Game(Manager& manager);
Game(Manager& manager, bool test = false);
virtual ~Game();
/**
@ -94,6 +95,11 @@ public:
* Modifie le temps total du niveau
*/
virtual void setTotalTime(int set_total_time);
/**
* Récupère si on est en mode test
*/
bool isTest();
};
#endif

View File

@ -213,6 +213,12 @@ public:
* Modifie la caméra
*/
void setCamera(sf::View set_camera);
/**
* Récupère le centre de tous les joueurs ou
* zéro si aucun joueur
*/
sf::Vector2f getPlayerCenter();
};
#endif

View File

@ -65,6 +65,11 @@ void Editor::enable() {
getManager().setTitle(sf::String(L"Édition de ") + getName());
getManager().getWindow().setFramerateLimit(Manager::FPS);
// on positionne la caméra au centre des joueurs
sf::View camera = getCamera();
camera.setCenter(getPlayerCenter());
setCamera(camera);
// joue la musique de l'éditeur
ResourceManager::get().playMusic("editor.ogg");
@ -504,30 +509,31 @@ void Editor::selectAll() {
}
void Editor::test() {
auto game = std::unique_ptr<Game>(new Game(getManager()));
// création d'une partie en mode test
auto test_game = std::unique_ptr<Game>(new Game(getManager(), true));
clearSelection();
// copie des propriétés
game->setName(getName());
game->setTotalTime(getTotalTime());
game->setBackground(getBackground());
game->setMusic(getMusic());
test_game->setName(getName());
test_game->setTotalTime(getTotalTime());
test_game->setBackground(getBackground());
test_game->setMusic(getMusic());
test_game->getObjects().clear();
test_game->getZone().clear();
// copie des objets du niveau vers le jeu
std::vector<Object::Ptr>& objects = getObjects();
game->getObjects().clear();
for (auto it = objects.begin(); it != objects.end(); it++) {
game->addObject((*it)->clone());
for (auto const &object : getObjects()) {
test_game->addObject(object->clone());
}
// copie de la zone de jeu
std::vector<sf::Vector2f>& zone = getZone();
game->getZone().clear();
for (auto it = zone.begin(); it != zone.end(); it++) {
game->getZone().push_back(*it);
for (auto const &point : getZone()) {
test_game->getZone().push_back(point);
}
getManager().pushState(std::move(game));
// repositionnement de la caméra
test_game->setCamera(getCamera());
getManager().pushState(std::move(test_game));
}

View File

@ -16,8 +16,8 @@ namespace {
const unsigned int MAX_FRAME_SKIP = 5;
}
Game::Game(Manager& manager) : Level(manager),
mode(Game::Mode::NORMAL),
Game::Game(Manager& manager, bool test) : Level(manager),
mode(Game::Mode::NORMAL), test(test),
next_frame_time(manager.getCurrentTime()),
skipped_frames(0),
death_cause(Game::DeathCause::NONE) {}
@ -31,6 +31,14 @@ void Game::enable() {
getManager().setTitle(getName());
getManager().getWindow().setFramerateLimit(0);
// en dehors du mode test, on positionne la caméra directement
// au centre des joueurs
if (!isTest()) {
sf::View camera = getCamera();
camera.setCenter(getPlayerCenter());
setCamera(camera);
}
// si musique il y a, on la joue
if (getMusic() != "") {
ResourceManager::get().playMusic("levels/" + getMusic());
@ -43,20 +51,28 @@ void Game::processEvent(const sf::Event& event) {
Level::processEvent(event);
if (event.type == sf::Event::KeyPressed) {
// appui sur espace : retour
if (event.key.code == sf::Keyboard::Space) {
// en mode test, retour, échap et sortie pour revenir à l'éditeur
if (event.key.code == sf::Keyboard::Space ||
event.key.code == sf::Keyboard::Escape ||
event.key.code == sf::Keyboard::BackSpace) {
getManager().popState();
return;
}
// appui sur retour échap : échange entre le mode pause et normal
if (event.key.code == sf::Keyboard::Escape ||
event.key.code == sf::Keyboard::BackSpace) {
// appui sur espace : échange entre le mode pause et normal
if (event.key.code == sf::Keyboard::Space) {
if (getMode() == Game::Mode::NORMAL) {
setMode(Game::Mode::PAUSED);
} else if (getMode() == Game::Mode::PAUSED) {
setMode(Game::Mode::NORMAL);
}
}
// appui sur retour ou échap : sortie
if (event.key.code == sf::Keyboard::Escape ||
event.key.code == sf::Keyboard::BackSpace) {
getManager().popState();
}
}
}
@ -136,28 +152,13 @@ void Game::draw() {
}
void Game::ensureCentered() {
std::vector<Player::Ptr>& players = getPlayers();
unsigned int player_count = players.size();
sf::View camera = getCamera();
sf::Vector2f previous_center = camera.getCenter();
sf::Vector2f position_sum, goal_center;
sf::Vector2f new_center = getPlayerCenter();
for (unsigned int i = 0; i < player_count; i++) {
position_sum += players[i]->getPosition();
}
if (player_count == 0) {
// on évite la division par zéro
goal_center = sf::Vector2f(0, 0);
} else {
// on place la caméra à la position médiane de tous les joueurs
goal_center = position_sum / (float) player_count;
}
// on anime le centre vers la nouvelle position
previous_center.x = Utility::animateValue(previous_center.x, 5, goal_center.x);
previous_center.y = Utility::animateValue(previous_center.y, 5, goal_center.y);
// on anime le centre vers le centre des joueurs
previous_center.x = Utility::animateValue(previous_center.x, 5, new_center.x);
previous_center.y = Utility::animateValue(previous_center.y, 5, new_center.y);
camera.setCenter(previous_center);
setCamera(camera);
@ -293,3 +294,7 @@ void Game::setTotalTime(int set_total_time) {
Level::setTotalTime(set_total_time);
time_left = getTotalTime();
}
bool Game::isTest() {
return test;
}

View File

@ -103,7 +103,6 @@ void Level::enable() {
sf::Vector2u window_size = getManager().getWindow().getSize();
camera.setSize(window_size.x, window_size.y);
camera.setCenter(0, 0);
camera_angle = 180.f;
// on affiche la barre d'actions
@ -559,3 +558,17 @@ sf::Vector2i Level::coordsToPixel(sf::Vector2f coords) {
void Level::setCamera(sf::View set_camera) {
camera = set_camera;
}
sf::Vector2f Level::getPlayerCenter() {
sf::Vector2f sum;
for (auto const &player : getPlayers()) {
sum += player->getPosition();
}
if (getPlayers().size() == 0) {
return sf::Vector2f(0, 0);
}
return sum / (float) getPlayers().size();
}