Ajout du bouton recommencer & fluidification de la caméra
This commit is contained in:
parent
a0a48f98ad
commit
7d46367eb5
|
@ -74,6 +74,11 @@ private:
|
||||||
*/
|
*/
|
||||||
void selectAll();
|
void selectAll();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lance le test du niveau
|
||||||
|
*/
|
||||||
|
void test();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Demande le dessin d'une frame
|
* Demande le dessin d'une frame
|
||||||
|
@ -99,11 +104,6 @@ public:
|
||||||
* Traite l'événement donné
|
* Traite l'événement donné
|
||||||
*/
|
*/
|
||||||
void processEvent(const sf::Event& event) override;
|
void processEvent(const sf::Event& event) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Lance le test du niveau
|
|
||||||
*/
|
|
||||||
void test();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -43,6 +43,17 @@ private:
|
||||||
*/
|
*/
|
||||||
bool isInZone(Object::Ptr object);
|
bool isInZone(Object::Ptr object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recommence le niveau depuis le début
|
||||||
|
*/
|
||||||
|
void restart();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Échange entre le mode pause et le mode normal
|
||||||
|
* (si on est dans un autre mode, ne fait rien)
|
||||||
|
*/
|
||||||
|
void switchPause();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Demande le dessin d'une frame
|
* Demande le dessin d'une frame
|
||||||
|
@ -55,11 +66,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
void draw() override;
|
void draw() override;
|
||||||
|
|
||||||
/**
|
|
||||||
* S'assure que la caméra est centrée sur les joueurs
|
|
||||||
*/
|
|
||||||
void ensureCentered();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Game(Manager& manager, bool test = false);
|
Game(Manager& manager, bool test = false);
|
||||||
virtual ~Game();
|
virtual ~Game();
|
||||||
|
|
|
@ -20,6 +20,8 @@ class Level : public State {
|
||||||
private:
|
private:
|
||||||
sf::View camera;
|
sf::View camera;
|
||||||
float camera_angle;
|
float camera_angle;
|
||||||
|
sf::Vector2f goal_center;
|
||||||
|
|
||||||
Utility::Direction gravity_direction;
|
Utility::Direction gravity_direction;
|
||||||
|
|
||||||
sf::String name;
|
sf::String name;
|
||||||
|
@ -214,6 +216,16 @@ public:
|
||||||
*/
|
*/
|
||||||
void setCamera(sf::View set_camera);
|
void setCamera(sf::View set_camera);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère la cible de l'animation de la caméra
|
||||||
|
*/
|
||||||
|
sf::Vector2f getCenterGoal();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modifie la cible de l'animation de la caméra
|
||||||
|
*/
|
||||||
|
void setCenterGoal(sf::Vector2f set_center);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère le centre de tous les joueurs ou
|
* Récupère le centre de tous les joueurs ou
|
||||||
* zéro si aucun joueur
|
* zéro si aucun joueur
|
||||||
|
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 655 B |
Binary file not shown.
|
@ -208,7 +208,7 @@ void Editor::processEvent(const sf::Event& event) {
|
||||||
|
|
||||||
// sinon, on déplace la vue
|
// sinon, on déplace la vue
|
||||||
else {
|
else {
|
||||||
sf::View camera = getCamera();
|
sf::Vector2f cur_center = getCenterGoal();
|
||||||
|
|
||||||
// la molette est horizontale ssi. elle l'est vraiment ou
|
// la molette est horizontale ssi. elle l'est vraiment ou
|
||||||
// si on utilise la molette verticale et shift
|
// si on utilise la molette verticale et shift
|
||||||
|
@ -219,18 +219,12 @@ void Editor::processEvent(const sf::Event& event) {
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!horizontal) {
|
if (!horizontal) {
|
||||||
camera.move(
|
cur_center.y += event.mouseWheelScroll.delta * WHEEL_SCROLL_SPEED;
|
||||||
sf::Vector2f(0, event.mouseWheelScroll.delta) *
|
|
||||||
WHEEL_SCROLL_SPEED
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
camera.move(
|
cur_center.x += event.mouseWheelScroll.delta * WHEEL_SCROLL_SPEED;
|
||||||
sf::Vector2f(event.mouseWheelScroll.delta, 0) *
|
|
||||||
WHEEL_SCROLL_SPEED
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setCamera(camera);
|
setCenterGoal(cur_center);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,21 +273,21 @@ void Editor::frame() {
|
||||||
|
|
||||||
// scroll de la caméra lorsque la souris se situe sur les bords
|
// scroll de la caméra lorsque la souris se situe sur les bords
|
||||||
if (window.hasFocus()) {
|
if (window.hasFocus()) {
|
||||||
sf::View camera = getCamera();
|
sf::Vector2f cur_center = getCenterGoal();
|
||||||
sf::Vector2i mouse = sf::Mouse::getPosition(window);
|
sf::Vector2i mouse = sf::Mouse::getPosition(window);
|
||||||
|
|
||||||
// détection du dépassement sur un des 4 bords
|
// détection du dépassement sur un des 4 bords
|
||||||
if (mouse.x < POINTER_SCROLL_PADDING && mouse.x >= -POINTER_SCROLL_PADDING) {
|
if (mouse.x < POINTER_SCROLL_PADDING && mouse.x >= -POINTER_SCROLL_PADDING) {
|
||||||
camera.move(sf::Vector2f(-POINTER_SCROLL_SPEED, 0));
|
cur_center.x -= POINTER_SCROLL_SPEED;
|
||||||
} else if (mouse.x >= window_size.x - POINTER_SCROLL_PADDING && mouse.x < window_size.x + POINTER_SCROLL_PADDING) {
|
} else if (mouse.x >= window_size.x - POINTER_SCROLL_PADDING && mouse.x < window_size.x + POINTER_SCROLL_PADDING) {
|
||||||
camera.move(sf::Vector2f(POINTER_SCROLL_SPEED, 0));
|
cur_center.x += POINTER_SCROLL_SPEED;
|
||||||
} else if (mouse.y < POINTER_SCROLL_PADDING && mouse.y >= -POINTER_SCROLL_PADDING) {
|
} else if (mouse.y < POINTER_SCROLL_PADDING && mouse.y >= -POINTER_SCROLL_PADDING) {
|
||||||
camera.move(sf::Vector2f(0, -POINTER_SCROLL_SPEED));
|
cur_center.y -= POINTER_SCROLL_SPEED;
|
||||||
} else if (mouse.y >= window_size.y - POINTER_SCROLL_PADDING && mouse.y < window_size.y + POINTER_SCROLL_PADDING) {
|
} else if (mouse.y >= window_size.y - POINTER_SCROLL_PADDING && mouse.y < window_size.y + POINTER_SCROLL_PADDING) {
|
||||||
camera.move(sf::Vector2f(0, POINTER_SCROLL_SPEED));
|
cur_center.y += POINTER_SCROLL_SPEED;
|
||||||
}
|
}
|
||||||
|
|
||||||
setCamera(camera);
|
setCenterGoal(cur_center);
|
||||||
}
|
}
|
||||||
|
|
||||||
// màj du titre de la fenêtre
|
// màj du titre de la fenêtre
|
||||||
|
|
|
@ -20,7 +20,21 @@ Game::Game(Manager& manager, bool test) : Level(manager),
|
||||||
mode(Game::Mode::NORMAL), test(test),
|
mode(Game::Mode::NORMAL), test(test),
|
||||||
next_frame_time(manager.getCurrentTime()),
|
next_frame_time(manager.getCurrentTime()),
|
||||||
skipped_frames(0),
|
skipped_frames(0),
|
||||||
death_cause(Game::DeathCause::NONE) {}
|
death_cause(Game::DeathCause::NONE) {
|
||||||
|
|
||||||
|
// ajout des boutons d'action de la barre d'action
|
||||||
|
if (!isTest()) {
|
||||||
|
action_toolbar.addButton(
|
||||||
|
*ResourceManager::get().getImage("toolbar/icon_restart.tga"),
|
||||||
|
std::bind(&Game::restart, this)
|
||||||
|
);
|
||||||
|
|
||||||
|
action_toolbar.addButton(
|
||||||
|
*ResourceManager::get().getImage("toolbar/icon_pause.tga"),
|
||||||
|
std::bind(&Game::switchPause, this)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Game::~Game() {}
|
Game::~Game() {}
|
||||||
|
|
||||||
|
@ -51,21 +65,22 @@ void Game::processEvent(const sf::Event& event) {
|
||||||
Level::processEvent(event);
|
Level::processEvent(event);
|
||||||
|
|
||||||
if (event.type == sf::Event::KeyPressed) {
|
if (event.type == sf::Event::KeyPressed) {
|
||||||
// en mode test, retour, échap et sortie pour revenir à l'éditeur
|
// en mode test, retour, échap et espace pour revenir à l'éditeur
|
||||||
|
if (isTest()) {
|
||||||
if (event.key.code == sf::Keyboard::Space ||
|
if (event.key.code == sf::Keyboard::Space ||
|
||||||
event.key.code == sf::Keyboard::Escape ||
|
event.key.code == sf::Keyboard::Escape ||
|
||||||
event.key.code == sf::Keyboard::BackSpace) {
|
event.key.code == sf::Keyboard::BackSpace) {
|
||||||
getManager().popState();
|
getManager().popState();
|
||||||
return;
|
}
|
||||||
|
} else {
|
||||||
|
// appui sur R : recommencer le niveau
|
||||||
|
if (event.key.code == sf::Keyboard::R) {
|
||||||
|
restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
// appui sur espace : échange entre le mode pause et normal
|
// appui sur espace : échange entre le mode pause et normal
|
||||||
if (event.key.code == sf::Keyboard::Space) {
|
if (event.key.code == sf::Keyboard::Space) {
|
||||||
if (getMode() == Game::Mode::NORMAL) {
|
switchPause();
|
||||||
setMode(Game::Mode::PAUSED);
|
|
||||||
} else if (getMode() == Game::Mode::PAUSED) {
|
|
||||||
setMode(Game::Mode::NORMAL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// appui sur retour ou échap : sortie
|
// appui sur retour ou échap : sortie
|
||||||
|
@ -75,6 +90,7 @@ void Game::processEvent(const sf::Event& event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Game::frame() {
|
void Game::frame() {
|
||||||
Level::frame();
|
Level::frame();
|
||||||
|
@ -125,7 +141,7 @@ void Game::frame() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// on s'assure que la caméra soit centrée sur nos joueurs
|
// on s'assure que la caméra soit centrée sur nos joueurs
|
||||||
ensureCentered();
|
setCenterGoal(getPlayerCenter());
|
||||||
|
|
||||||
// si on a encore suffisamment de temps, ou si on a sauté
|
// si on a encore suffisamment de temps, ou si on a sauté
|
||||||
// trop de frames, on dessine
|
// trop de frames, on dessine
|
||||||
|
@ -151,17 +167,20 @@ void Game::draw() {
|
||||||
Level::draw();
|
Level::draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::ensureCentered() {
|
void Game::restart() {
|
||||||
sf::View camera = getCamera();
|
load();
|
||||||
sf::Vector2f previous_center = camera.getCenter();
|
|
||||||
sf::Vector2f new_center = getPlayerCenter();
|
|
||||||
|
|
||||||
// on anime le centre vers le centre des joueurs
|
setGravityDirection(Utility::Direction::SOUTH);
|
||||||
previous_center.x = Utility::animateValue(previous_center.x, 5, new_center.x);
|
setMode(Game::Mode::NORMAL);
|
||||||
previous_center.y = Utility::animateValue(previous_center.y, 5, new_center.y);
|
setDeathCause(Game::DeathCause::NONE);
|
||||||
|
}
|
||||||
|
|
||||||
camera.setCenter(previous_center);
|
void Game::switchPause() {
|
||||||
setCamera(camera);
|
if (getMode() == Game::Mode::NORMAL) {
|
||||||
|
setMode(Game::Mode::PAUSED);
|
||||||
|
} else if (getMode() == Game::Mode::PAUSED) {
|
||||||
|
setMode(Game::Mode::NORMAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::update() {
|
void Game::update() {
|
||||||
|
|
|
@ -181,11 +181,14 @@ void Level::load() {
|
||||||
setMusic(read_music);
|
setMusic(read_music);
|
||||||
setBackground(read_background);
|
setBackground(read_background);
|
||||||
|
|
||||||
// lecture des objets si une callback a été fournie
|
// lecture des objets
|
||||||
int read_object_count;
|
int read_object_count;
|
||||||
file.read(reinterpret_cast<char*>(&read_object_count), 4);
|
file.read(reinterpret_cast<char*>(&read_object_count), 4);
|
||||||
read_object_count = ntohl(read_object_count);
|
read_object_count = ntohl(read_object_count);
|
||||||
|
|
||||||
|
objects.clear();
|
||||||
|
players.clear();
|
||||||
|
|
||||||
for (int i = 0; i < read_object_count; i++) {
|
for (int i = 0; i < read_object_count; i++) {
|
||||||
char read_object_type;
|
char read_object_type;
|
||||||
file.read(&read_object_type, 1);
|
file.read(&read_object_type, 1);
|
||||||
|
@ -281,7 +284,8 @@ void Level::processEvent(const sf::Event& event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level::frame() {
|
void Level::frame() {
|
||||||
sf::Vector2i window_size = (sf::Vector2i) getManager().getWindow().getSize();
|
sf::RenderWindow& window = getManager().getWindow();
|
||||||
|
sf::Vector2i window_size = (sf::Vector2i) window.getSize();
|
||||||
|
|
||||||
// mise à jour de l'icône du mute en fonction de l'état
|
// mise à jour de l'icône du mute en fonction de l'état
|
||||||
sf::Image image;
|
sf::Image image;
|
||||||
|
@ -299,20 +303,27 @@ void Level::frame() {
|
||||||
0, 0, window_size.x,
|
0, 0, window_size.x,
|
||||||
action_toolbar.getHeight()
|
action_toolbar.getHeight()
|
||||||
));
|
));
|
||||||
}
|
|
||||||
|
|
||||||
void Level::draw() {
|
// animation du centre et de la rotation de la caméra
|
||||||
sf::RenderWindow& window = getManager().getWindow();
|
sf::Vector2f cur_center = camera.getCenter();
|
||||||
sf::Vector2u window_size = window.getSize();
|
|
||||||
|
cur_center.x = Utility::animateValue(cur_center.x, 5, goal_center.x);
|
||||||
|
cur_center.y = Utility::animateValue(cur_center.y, 5, goal_center.y);
|
||||||
|
|
||||||
// animation de la rotation de la caméra
|
|
||||||
camera_angle = Utility::animateValue(
|
camera_angle = Utility::animateValue(
|
||||||
camera_angle, 5,
|
camera_angle, 5,
|
||||||
std::fmod((float) gravity_direction * 90, 360)
|
std::fmod((float) gravity_direction * 90, 360)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
camera.setCenter(cur_center);
|
||||||
camera.setRotation(camera_angle + 180);
|
camera.setRotation(camera_angle + 180);
|
||||||
|
|
||||||
window.setView(camera);
|
window.setView(camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Level::draw() {
|
||||||
|
sf::RenderWindow& window = getManager().getWindow();
|
||||||
|
sf::Vector2u window_size = window.getSize();
|
||||||
|
|
||||||
// efface la scène précédente
|
// efface la scène précédente
|
||||||
window.clear(sf::Color(66, 165, 245));
|
window.clear(sf::Color(66, 165, 245));
|
||||||
|
@ -533,6 +544,11 @@ sf::View Level::getCamera() const {
|
||||||
return camera;
|
return camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Level::setCamera(sf::View set_camera) {
|
||||||
|
camera = set_camera;
|
||||||
|
goal_center = set_camera.getCenter();
|
||||||
|
}
|
||||||
|
|
||||||
sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) {
|
sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) {
|
||||||
sf::RenderWindow& window = getManager().getWindow();
|
sf::RenderWindow& window = getManager().getWindow();
|
||||||
sf::View old_view = window.getView();
|
sf::View old_view = window.getView();
|
||||||
|
@ -555,8 +571,12 @@ sf::Vector2i Level::coordsToPixel(sf::Vector2f coords) {
|
||||||
return pixel;
|
return pixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level::setCamera(sf::View set_camera) {
|
sf::Vector2f Level::getCenterGoal() {
|
||||||
camera = set_camera;
|
return goal_center;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Level::setCenterGoal(sf::Vector2f set_center) {
|
||||||
|
goal_center = set_center;
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::Vector2f Level::getPlayerCenter() {
|
sf::Vector2f Level::getPlayerCenter() {
|
||||||
|
|
|
@ -7,7 +7,7 @@ float Utility::animateValue(float current, float speed, float goal) {
|
||||||
float diff = gap * Manager::FRAME_TIME.asSeconds() * speed;
|
float diff = gap * Manager::FRAME_TIME.asSeconds() * speed;
|
||||||
|
|
||||||
// si on est très proches de la fin, on termine
|
// si on est très proches de la fin, on termine
|
||||||
if (std::abs(gap) < .05f) {
|
if (std::abs(gap) < .1f) {
|
||||||
return goal;
|
return goal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue