Mais c'est la mort qui t'a assassinée
This commit is contained in:
parent
f864712da3
commit
871fe9ff48
|
@ -58,7 +58,13 @@ public:
|
||||||
/**
|
/**
|
||||||
* Appelé lorsque le bloc est activé par un objet
|
* Appelé lorsque le bloc est activé par un objet
|
||||||
*/
|
*/
|
||||||
virtual void activated(Level& level, Object* object);
|
virtual void activate(Level& level, Object* object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appelé lorsque le bloc a été tué. Si cette fonction
|
||||||
|
* est appelé, le bloc sera supprimé à la frame suivante
|
||||||
|
*/
|
||||||
|
virtual void kill(Game& game);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère l'identifiant de type des blocs
|
* Récupère l'identifiant de type des blocs
|
||||||
|
|
|
@ -18,6 +18,8 @@ public:
|
||||||
private:
|
private:
|
||||||
WidgetTimer widget_timer;
|
WidgetTimer widget_timer;
|
||||||
sf::Time next_frame_time;
|
sf::Time next_frame_time;
|
||||||
|
std::vector<Object::Ptr> pending_kill;
|
||||||
|
|
||||||
bool test_mode;
|
bool test_mode;
|
||||||
std::shared_ptr<Editor> return_state;
|
std::shared_ptr<Editor> return_state;
|
||||||
Mode mode;
|
Mode mode;
|
||||||
|
@ -28,6 +30,12 @@ private:
|
||||||
*/
|
*/
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vérifie si l'objet donné se trouve dans
|
||||||
|
* la zone de jeu ou non
|
||||||
|
*/
|
||||||
|
bool isInZone(Object::Ptr object);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Dessine tous les objets, le fond et
|
* Dessine tous les objets, le fond et
|
||||||
|
|
|
@ -42,7 +42,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Appelé lorsque le bloc de gravité est activé par un objet
|
* Appelé lorsque le bloc de gravité est activé par un objet
|
||||||
*/
|
*/
|
||||||
virtual void activated(Level& level, Object* object);
|
virtual void activate(Level& level, Object* object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère l'identifiant de type des blocs de gravité
|
* Récupère l'identifiant de type des blocs de gravité
|
||||||
|
|
|
@ -171,6 +171,7 @@ public:
|
||||||
* Supprime l'objet donné
|
* Supprime l'objet donné
|
||||||
*/
|
*/
|
||||||
void removeObject(Object::Ptr object);
|
void removeObject(Object::Ptr object);
|
||||||
|
void removeObject(Object* object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la zone du niveau
|
* Récupère la zone du niveau
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "resource_manager.hpp"
|
#include "resource_manager.hpp"
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
|
class Game;
|
||||||
|
|
||||||
class Object {
|
class Object {
|
||||||
public:
|
public:
|
||||||
|
@ -78,7 +79,13 @@ public:
|
||||||
/**
|
/**
|
||||||
* Appelé lorsque l'objet est activé par un autre
|
* Appelé lorsque l'objet est activé par un autre
|
||||||
*/
|
*/
|
||||||
virtual void activated(Level& level, Object* object) = 0;
|
virtual void activate(Level& level, Object* object) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appelé lorsque l'objet a été tué. Si cette fonction
|
||||||
|
* est appelé, l'objet sera supprimé à la frame suivante
|
||||||
|
*/
|
||||||
|
virtual void kill(Game& game) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère l'identifiant de type de cet objet
|
* Récupère l'identifiant de type de cet objet
|
||||||
|
|
|
@ -57,7 +57,13 @@ public:
|
||||||
/**
|
/**
|
||||||
* Appelé lorsque le joueur est activé par un objet
|
* Appelé lorsque le joueur est activé par un objet
|
||||||
*/
|
*/
|
||||||
virtual void activated(Level& level, Object* object);
|
virtual void activate(Level& level, Object* object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appelé lorsque le jouer a été tué. Si cette fonction
|
||||||
|
* est appelé, le joueur sera supprimé à la frame suivante
|
||||||
|
*/
|
||||||
|
virtual void kill(Game& game);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère l'identifiant de type des joueurs
|
* Récupère l'identifiant de type des joueurs
|
||||||
|
|
|
@ -73,12 +73,16 @@ void Block::draw(Level& level) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Block::activated(Level& level, Object* object) {
|
void Block::activate(Level& level, Object* object) {
|
||||||
// ne rien faire si le bloc est activé.
|
// ne rien faire si le bloc est activé.
|
||||||
// Ceci est un bloc de base qui n'a pas a réagir
|
// Ceci est un bloc de base qui n'a pas a réagir
|
||||||
// aux activations
|
// aux activations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Block::kill(Game& game) {
|
||||||
|
// rien à faire de plus si le bloc a été tué
|
||||||
|
}
|
||||||
|
|
||||||
sf::FloatRect Block::getAABB() const {
|
sf::FloatRect Block::getAABB() const {
|
||||||
return sf::FloatRect(
|
return sf::FloatRect(
|
||||||
getPosition().x - Constants::GRID / 2,
|
getPosition().x - Constants::GRID / 2,
|
||||||
|
|
39
src/game.cpp
39
src/game.cpp
|
@ -1,4 +1,5 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
#include "game.hpp"
|
#include "game.hpp"
|
||||||
#include "player.hpp"
|
#include "player.hpp"
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
|
@ -120,6 +121,23 @@ void Game::update() {
|
||||||
std::vector<CollisionData> colliding;
|
std::vector<CollisionData> colliding;
|
||||||
std::vector<Object::Ptr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
|
// on tue les objets qui étaient déjà planifiés pour mourir
|
||||||
|
for (auto it = pending_kill.begin(); it != pending_kill.end(); it++) {
|
||||||
|
removeObject(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
pending_kill.empty();
|
||||||
|
|
||||||
|
// détection des objets en dehors de la zone de jeu
|
||||||
|
for (auto it = objects.begin(); it != objects.end(); it++) {
|
||||||
|
if (!isInZone(*it)) {
|
||||||
|
// l'objet est sorti de la zone, on le signale et on
|
||||||
|
// planifie sa mort à la prochaine frame
|
||||||
|
(*it)->kill(*this);
|
||||||
|
pending_kill.push_back(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// détection des objets en collision
|
// détection des objets en collision
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
Object::Ptr obj_a = objects[i];
|
Object::Ptr obj_a = objects[i];
|
||||||
|
@ -162,6 +180,27 @@ void Game::update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implémentation tirée de
|
||||||
|
* http://stackoverflow.com/a/2922778/3452708
|
||||||
|
*/
|
||||||
|
bool Game::isInZone(Object::Ptr object) {
|
||||||
|
std::vector<sf::Vector2f>& zone = getZone();
|
||||||
|
sf::Vector2f pos = object->getPosition();
|
||||||
|
unsigned int vertices = getZone().size();
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
for (unsigned int i = 0, j = vertices - 1; i < vertices; j = i++) {
|
||||||
|
if (((zone[i].y > pos.y) != (zone[j].y > pos.y)) &&
|
||||||
|
(pos.x < (zone[j].x - zone[i].x) * (pos.y - zone[i].y) /
|
||||||
|
(zone[j].y - zone[i].y) + zone[i].x)) {
|
||||||
|
result = !result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
bool Game::getTestMode() {
|
bool Game::getTestMode() {
|
||||||
return test_mode;
|
return test_mode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@ std::string GravityBlock::getTexture() {
|
||||||
return texture_name + ".tga";
|
return texture_name + ".tga";
|
||||||
}
|
}
|
||||||
|
|
||||||
void GravityBlock::activated(Level& level, Object* object) {
|
void GravityBlock::activate(Level& level, Object* object) {
|
||||||
Block::activated(level, object);
|
Block::activate(level, object);
|
||||||
|
|
||||||
// lorsque le bloc est activé, il transmet son
|
// lorsque le bloc est activé, il transmet son
|
||||||
// sens de gravité au niveau
|
// sens de gravité au niveau
|
||||||
|
|
|
@ -234,8 +234,8 @@ void Object::solveCollision(Level& level, Object::Ptr obj, const sf::Vector2f& n
|
||||||
|
|
||||||
// en ce point, on est bertins qu'une collision a eu lieu.
|
// en ce point, on est bertins qu'une collision a eu lieu.
|
||||||
// activation réciproque des deux objets
|
// activation réciproque des deux objets
|
||||||
activated(level, obj.get());
|
activate(level, obj.get());
|
||||||
obj->activated(level, this);
|
obj->activate(level, this);
|
||||||
|
|
||||||
// on utilise le plus petit coefficient de friction entre les
|
// on utilise le plus petit coefficient de friction entre les
|
||||||
// deux objets comme le coefficient de la collision
|
// deux objets comme le coefficient de la collision
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "player.hpp"
|
#include "player.hpp"
|
||||||
|
#include "game.hpp"
|
||||||
#include "level.hpp"
|
#include "level.hpp"
|
||||||
#include "block.hpp"
|
#include "block.hpp"
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
|
@ -89,12 +90,16 @@ void Player::draw(Level& level) {
|
||||||
level.getWindow().draw(sprite);
|
level.getWindow().draw(sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::activated(Level& level, Object* object) {
|
void Player::activate(Level& level, Object* object) {
|
||||||
// ne rien faire si le joueur est activé.
|
// ne rien faire si le joueur est activé.
|
||||||
// en règle générale, c'est l'objet activé par le joueur
|
// en règle générale, c'est l'objet activé par le joueur
|
||||||
// qui s'occupe de la réponse
|
// qui s'occupe de la réponse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::kill(Game& game) {
|
||||||
|
game.setMode(Game::Mode::LOST);
|
||||||
|
}
|
||||||
|
|
||||||
void Player::updatePosition() {
|
void Player::updatePosition() {
|
||||||
// calcul de la différence de position pour connaître
|
// calcul de la différence de position pour connaître
|
||||||
// (approximativement) la rotation de la balle
|
// (approximativement) la rotation de la balle
|
||||||
|
|
Loading…
Reference in New Issue