Correction du chargement
This commit is contained in:
parent
ed0f2f5ace
commit
4a3953a1c6
|
@ -2,15 +2,25 @@
|
||||||
#define __PTF_BLOCK_HPP__
|
#define __PTF_BLOCK_HPP__
|
||||||
|
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <memory>
|
||||||
#include "object.hpp"
|
#include "object.hpp"
|
||||||
|
|
||||||
class Block : public Object {
|
class Block : public Object {
|
||||||
|
public:
|
||||||
|
typedef std::shared_ptr<Block> Ptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable sf::Sprite select_sprite;
|
sf::Sprite select_sprite;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
mutable sf::Sprite sprite;
|
mutable sf::Sprite sprite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialisation des propriétés du bloc donné
|
||||||
|
* depuis le fichier donné
|
||||||
|
*/
|
||||||
|
static void init(std::ifstream& file, Object::Ptr object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Identifiant unique du type "bloc"
|
* Identifiant unique du type "bloc"
|
||||||
|
@ -23,7 +33,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Clone ce bloc en un bloc avec les mêmes propriétés
|
* Clone ce bloc en un bloc avec les mêmes propriétés
|
||||||
*/
|
*/
|
||||||
virtual ObjectPtr clone() const;
|
virtual Object::Ptr clone() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la boîte englobante du bloc
|
* Récupère la boîte englobante du bloc
|
||||||
|
@ -61,9 +71,9 @@ public:
|
||||||
virtual CollisionType getCollisionType() const;
|
virtual CollisionType getCollisionType() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chargement du bloc depuis le fichier donné
|
* Chargement d'un bloc depuis le fichier donné
|
||||||
*/
|
*/
|
||||||
static ObjectPtr load(std::ifstream& file);
|
static Object::Ptr load(std::ifstream& file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sauvegarde le bloc dans le fichier donné
|
* Sauvegarde le bloc dans le fichier donné
|
||||||
|
|
|
@ -15,7 +15,7 @@ enum class SelectionMode {REPLACE, FLIP, ADD};
|
||||||
*/
|
*/
|
||||||
class Editor : public Level {
|
class Editor : public Level {
|
||||||
private:
|
private:
|
||||||
std::vector<ObjectPtr> selection;
|
std::vector<Object::Ptr> selection;
|
||||||
sf::Vector2i drag_start;
|
sf::Vector2i drag_start;
|
||||||
sf::Vector2i drag_end;
|
sf::Vector2i drag_end;
|
||||||
DragMode drag_mode;
|
DragMode drag_mode;
|
||||||
|
@ -27,17 +27,17 @@ private:
|
||||||
* Renvoie l'objet pointé à la position donnée
|
* Renvoie l'objet pointé à la position donnée
|
||||||
* ou nullptr si aucun
|
* ou nullptr si aucun
|
||||||
*/
|
*/
|
||||||
ObjectPtr getObject(sf::Vector2f position);
|
Object::Ptr getObject(sf::Vector2f position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ajoute un objet du type actuel à la position donnée
|
* Ajoute un objet du type actuel à la position donnée
|
||||||
*/
|
*/
|
||||||
ObjectPtr addObject(sf::Vector2f position);
|
Object::Ptr addObject(sf::Vector2f position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Supprime l'objet à la position donnée ou passé par pointeur
|
* Supprime l'objet à la position donnée ou passé par pointeur
|
||||||
*/
|
*/
|
||||||
void removeObject(ObjectPtr object);
|
void removeObject(Object::Ptr object);
|
||||||
void removeObject(sf::Vector2f position);
|
void removeObject(sf::Vector2f position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,7 @@ private:
|
||||||
* - FLIP : sélectionne l'élément s'il ne l'est pas, sinon le désélectionne
|
* - FLIP : sélectionne l'élément s'il ne l'est pas, sinon le désélectionne
|
||||||
* - ADD : rajoute à la sélection courante
|
* - ADD : rajoute à la sélection courante
|
||||||
*/
|
*/
|
||||||
void select(ObjectPtr object, SelectionMode mode);
|
void select(Object::Ptr object, SelectionMode mode);
|
||||||
void select(sf::Vector2f position, SelectionMode mode);
|
void select(sf::Vector2f position, SelectionMode mode);
|
||||||
void select(sf::Vector2f top_left, sf::Vector2f bottom_right);
|
void select(sf::Vector2f top_left, sf::Vector2f bottom_right);
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,25 @@
|
||||||
#ifndef __PTF_GRAVITY_BLOCK_HPP__
|
#ifndef __PTF_GRAVITY_BLOCK_HPP__
|
||||||
#define __PTF_GRAVITY_BLOCK_HPP__
|
#define __PTF_GRAVITY_BLOCK_HPP__
|
||||||
|
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <memory>
|
||||||
#include "block.hpp"
|
#include "block.hpp"
|
||||||
#include "level.hpp"
|
#include "level.hpp"
|
||||||
|
|
||||||
class GravityBlock : public Block {
|
class GravityBlock : public Block {
|
||||||
|
public:
|
||||||
|
typedef std::shared_ptr<GravityBlock> Ptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GravityDirection gravity_direction;
|
GravityDirection gravity_direction;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Initialisation des propriétés du bloc de gravité donné
|
||||||
|
* depuis le fichier donné
|
||||||
|
*/
|
||||||
|
static void init(std::ifstream& file, Object::Ptr object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Identifiant unique du type "bloc de gravité"
|
* Identifiant unique du type "bloc de gravité"
|
||||||
|
@ -20,7 +32,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Clone ce bloc de gravité en un bloc de gravité avec les mêmes propriétés
|
* Clone ce bloc de gravité en un bloc de gravité avec les mêmes propriétés
|
||||||
*/
|
*/
|
||||||
virtual ObjectPtr clone() const;
|
virtual Object::Ptr clone() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opérations de préparation de la texture du bloc
|
* Opérations de préparation de la texture du bloc
|
||||||
|
@ -38,9 +50,9 @@ public:
|
||||||
virtual unsigned int getTypeId() const;
|
virtual unsigned int getTypeId() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chargement du bloc de gravité depuis le fichier donné
|
* Chargement d'un bloc de gravité depuis le fichier donné
|
||||||
*/
|
*/
|
||||||
static ObjectPtr load(std::ifstream& file);
|
static Object::Ptr load(std::ifstream& file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sauvegarde le bloc de gravité dans le fichier donné
|
* Sauvegarde le bloc de gravité dans le fichier donné
|
||||||
|
|
|
@ -29,7 +29,7 @@ private:
|
||||||
std::string background;
|
std::string background;
|
||||||
std::string music;
|
std::string music;
|
||||||
|
|
||||||
std::vector<ObjectPtr> objects;
|
std::vector<Object::Ptr> objects;
|
||||||
std::vector<std::pair<float, float>> zone;
|
std::vector<std::pair<float, float>> zone;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -143,12 +143,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* Récupère la liste des objets
|
* Récupère la liste des objets
|
||||||
*/
|
*/
|
||||||
std::vector<ObjectPtr>& getObjects();
|
std::vector<Object::Ptr>& getObjects();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la liste des objets (version constante)
|
* Récupère la liste des objets (version constante)
|
||||||
*/
|
*/
|
||||||
const std::vector<ObjectPtr>& getObjects() const;
|
const std::vector<Object::Ptr>& getObjects() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la zone du niveau
|
* Récupère la zone du niveau
|
||||||
|
|
|
@ -8,11 +8,12 @@
|
||||||
#include "manager.hpp"
|
#include "manager.hpp"
|
||||||
#include "resource_manager.hpp"
|
#include "resource_manager.hpp"
|
||||||
|
|
||||||
typedef std::shared_ptr<Object> ObjectPtr;
|
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
|
|
||||||
class Object {
|
class Object {
|
||||||
|
public:
|
||||||
|
typedef std::shared_ptr<Object> Ptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
sf::Vector2f acceleration;
|
sf::Vector2f acceleration;
|
||||||
sf::Vector2f velocity;
|
sf::Vector2f velocity;
|
||||||
|
@ -34,6 +35,12 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual sf::Vector2f getForces(const Level& level) const;
|
virtual sf::Vector2f getForces(const Level& level) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialisation des propriétés communes à tous les objets
|
||||||
|
* depuis le fichier donné dans l'objet donné
|
||||||
|
*/
|
||||||
|
static void init(std::ifstream& file, Object::Ptr object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Identifiants uniques des propriétés communes modifiables
|
* Identifiants uniques des propriétés communes modifiables
|
||||||
|
@ -51,7 +58,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Clone cet objet en un objet avec les mêmes propriétés
|
* Clone cet objet en un objet avec les mêmes propriétés
|
||||||
*/
|
*/
|
||||||
virtual ObjectPtr clone() const = 0;
|
virtual Object::Ptr clone() const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la boîte englobante de l'objet
|
* Récupère la boîte englobante de l'objet
|
||||||
|
@ -83,12 +90,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual CollisionType getCollisionType() const = 0;
|
virtual CollisionType getCollisionType() const = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Charge les propriétés communes à tous les objets
|
|
||||||
* depuis le fichier donné dans l'objet donné
|
|
||||||
*/
|
|
||||||
static void load(std::ifstream& file, ObjectPtr object);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sauvegarde cet objet dans le fichier donné
|
* Sauvegarde cet objet dans le fichier donné
|
||||||
*/
|
*/
|
||||||
|
@ -238,7 +239,7 @@ public:
|
||||||
* qui doit être dessinée avant celle du second
|
* qui doit être dessinée avant celle du second
|
||||||
*/
|
*/
|
||||||
struct ObjectCompare {
|
struct ObjectCompare {
|
||||||
bool operator()(ObjectPtr const &t1, ObjectPtr const &t2) const;
|
bool operator()(Object::Ptr const &t1, Object::Ptr const &t2) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,9 +2,13 @@
|
||||||
#define __PTF_PLAYER_HPP__
|
#define __PTF_PLAYER_HPP__
|
||||||
|
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <memory>
|
||||||
#include "object.hpp"
|
#include "object.hpp"
|
||||||
|
|
||||||
class Player : public Object {
|
class Player : public Object {
|
||||||
|
public:
|
||||||
|
typedef std::shared_ptr<Player> Ptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable sf::CircleShape sprite;
|
mutable sf::CircleShape sprite;
|
||||||
unsigned int player_number;
|
unsigned int player_number;
|
||||||
|
@ -15,6 +19,12 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual sf::Vector2f getForces(const Level& level) const;
|
virtual sf::Vector2f getForces(const Level& level) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialisation des propriétés du joueur donné
|
||||||
|
* depuis le fichier donné
|
||||||
|
*/
|
||||||
|
static void init(std::ifstream& file, Object::Ptr object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Identifiant unique du type "joueur"
|
* Identifiant unique du type "joueur"
|
||||||
|
@ -27,7 +37,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Clone ce joueur en un joueur avec les mêmes propriétés
|
* Clone ce joueur en un joueur avec les mêmes propriétés
|
||||||
*/
|
*/
|
||||||
virtual ObjectPtr clone() const;
|
virtual Object::Ptr clone() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la boîte englobante du joueur
|
* Récupère la boîte englobante du joueur
|
||||||
|
@ -60,9 +70,9 @@ public:
|
||||||
virtual CollisionType getCollisionType() const;
|
virtual CollisionType getCollisionType() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chargement du joueur depuis le fichier donné
|
* Chargement d'un joueur depuis le fichier donné
|
||||||
*/
|
*/
|
||||||
static ObjectPtr load(std::ifstream& file);
|
static Object::Ptr load(std::ifstream& file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sauvegarde le joueur dans le fichier donné
|
* Sauvegarde le joueur dans le fichier donné
|
||||||
|
|
|
@ -18,17 +18,18 @@ Block::Block() : Object() {
|
||||||
|
|
||||||
Block::~Block() {}
|
Block::~Block() {}
|
||||||
|
|
||||||
ObjectPtr Block::clone() const {
|
Object::Ptr Block::clone() const {
|
||||||
return ObjectPtr(new Block(*this));
|
return Object::Ptr(new Block(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectPtr Block::load(std::ifstream& file) {
|
void Block::init(std::ifstream& file, Object::Ptr object) {
|
||||||
ObjectPtr object = ObjectPtr(new Block);
|
|
||||||
|
|
||||||
// lecture des propriétés communes des objets
|
// lecture des propriétés communes des objets
|
||||||
Object::load(file, object);
|
Object::init(file, object);
|
||||||
file.seekg(1, file.cur);
|
}
|
||||||
|
|
||||||
|
Object::Ptr Block::load(std::ifstream& file) {
|
||||||
|
Object::Ptr object = Object::Ptr(new Block);
|
||||||
|
Block::init(file, object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ void Editor::processEvent(const sf::Event& event) {
|
||||||
if (event.type == sf::Event::MouseButtonPressed) {
|
if (event.type == sf::Event::MouseButtonPressed) {
|
||||||
sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y);
|
sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y);
|
||||||
sf::Vector2f position = pixelToCoords(mouse_position);
|
sf::Vector2f position = pixelToCoords(mouse_position);
|
||||||
ObjectPtr pointed_object = getObject(position);
|
Object::Ptr pointed_object = getObject(position);
|
||||||
|
|
||||||
if (event.mouseButton.button == sf::Mouse::Left) {
|
if (event.mouseButton.button == sf::Mouse::Left) {
|
||||||
// clic + shift : sélection par rectangle de sélection
|
// clic + shift : sélection par rectangle de sélection
|
||||||
|
@ -107,7 +107,7 @@ void Editor::processEvent(const sf::Event& event) {
|
||||||
if (event.type == sf::Event::MouseMoved) {
|
if (event.type == sf::Event::MouseMoved) {
|
||||||
sf::Vector2i mouse_position(event.mouseMove.x, event.mouseMove.y);
|
sf::Vector2i mouse_position(event.mouseMove.x, event.mouseMove.y);
|
||||||
sf::Vector2f position = pixelToCoords(mouse_position);
|
sf::Vector2f position = pixelToCoords(mouse_position);
|
||||||
ObjectPtr pointed_object = getObject(position);
|
Object::Ptr pointed_object = getObject(position);
|
||||||
|
|
||||||
drag_end = mouse_position;
|
drag_end = mouse_position;
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ void Editor::processEvent(const sf::Event& event) {
|
||||||
if (event.type == sf::Event::KeyPressed) {
|
if (event.type == sf::Event::KeyPressed) {
|
||||||
// appui sur suppr : suppression des blocs sélectionnés
|
// appui sur suppr : suppression des blocs sélectionnés
|
||||||
if (event.key.code == sf::Keyboard::Delete) {
|
if (event.key.code == sf::Keyboard::Delete) {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < selection.size(); i++) {
|
for (unsigned int i = 0; i < selection.size(); i++) {
|
||||||
objects.erase(std::remove(
|
objects.erase(std::remove(
|
||||||
|
@ -244,8 +244,8 @@ void Editor::draw() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectPtr Editor::getObject(sf::Vector2f position) {
|
Object::Ptr Editor::getObject(sf::Vector2f position) {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
if (objects[i]->getAABB().contains(position)) {
|
if (objects[i]->getAABB().contains(position)) {
|
||||||
|
@ -256,8 +256,8 @@ ObjectPtr Editor::getObject(sf::Vector2f position) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectPtr Editor::addObject(sf::Vector2f position) {
|
Object::Ptr Editor::addObject(sf::Vector2f position) {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
// on arrondit à l'unité de grille la plus proche
|
// on arrondit à l'unité de grille la plus proche
|
||||||
position /= Constants::GRID;
|
position /= Constants::GRID;
|
||||||
|
@ -266,7 +266,7 @@ ObjectPtr Editor::addObject(sf::Vector2f position) {
|
||||||
position *= Constants::GRID;
|
position *= Constants::GRID;
|
||||||
|
|
||||||
// TODO: ajouter un objet du type choisi, pas uniquement de bloc
|
// TODO: ajouter un objet du type choisi, pas uniquement de bloc
|
||||||
ObjectPtr object = ObjectPtr(new Block);
|
Object::Ptr object = Object::Ptr(new Block);
|
||||||
object->setPosition(position);
|
object->setPosition(position);
|
||||||
|
|
||||||
// avant d'ajouter l'objet, on vérifie qu'il ne soit
|
// avant d'ajouter l'objet, on vérifie qu'il ne soit
|
||||||
|
@ -287,12 +287,12 @@ ObjectPtr Editor::addObject(sf::Vector2f position) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::removeObject(ObjectPtr object) {
|
void Editor::removeObject(Object::Ptr object) {
|
||||||
if (object == nullptr) {
|
if (object == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
// on supprime l'objet de la sélection
|
// on supprime l'objet de la sélection
|
||||||
selection.erase(std::remove(
|
selection.erase(std::remove(
|
||||||
|
@ -309,7 +309,7 @@ void Editor::removeObject(sf::Vector2f position) {
|
||||||
removeObject(getObject(position));
|
removeObject(getObject(position));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::select(ObjectPtr object, SelectionMode mode) {
|
void Editor::select(Object::Ptr object, SelectionMode mode) {
|
||||||
if (object == nullptr) {
|
if (object == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ void Editor::select(sf::Vector2f position, SelectionMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::select(sf::Vector2f top_left, sf::Vector2f bottom_right) {
|
void Editor::select(sf::Vector2f top_left, sf::Vector2f bottom_right) {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
sf::FloatRect selection_rect(
|
sf::FloatRect selection_rect(
|
||||||
std::min(top_left.x, bottom_right.x),
|
std::min(top_left.x, bottom_right.x),
|
||||||
std::min(top_left.y, bottom_right.y),
|
std::min(top_left.y, bottom_right.y),
|
||||||
|
@ -369,7 +369,7 @@ void Editor::clearSelection() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::selectAll() {
|
void Editor::selectAll() {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
objects[i]->setSelected(true);
|
objects[i]->setSelected(true);
|
||||||
|
@ -388,7 +388,7 @@ void Editor::test() {
|
||||||
game->setMusic(getMusic());
|
game->setMusic(getMusic());
|
||||||
|
|
||||||
// copie des objets du niveau vers le jeu
|
// copie des objets du niveau vers le jeu
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
game->getObjects().push_back(objects[i]->clone());
|
game->getObjects().push_back(objects[i]->clone());
|
||||||
|
|
|
@ -81,7 +81,7 @@ void Game::draw() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::ensureCentered() {
|
void Game::ensureCentered() {
|
||||||
std::vector<ObjectPtr>& objects = getObjects();
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
sf::Vector2f total_position;
|
sf::Vector2f total_position;
|
||||||
int player_count = 0;
|
int player_count = 0;
|
||||||
|
@ -111,10 +111,10 @@ void Game::update() {
|
||||||
|
|
||||||
// détection des objets en collision
|
// détection des objets en collision
|
||||||
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
||||||
ObjectPtr obj_a = getObjects()[i];
|
Object::Ptr obj_a = getObjects()[i];
|
||||||
|
|
||||||
for (unsigned int j = i + 1; j < getObjects().size(); j++) {
|
for (unsigned int j = i + 1; j < getObjects().size(); j++) {
|
||||||
ObjectPtr obj_b = getObjects()[j];
|
Object::Ptr obj_b = getObjects()[j];
|
||||||
CollisionData data(*obj_a, *obj_b);
|
CollisionData data(*obj_a, *obj_b);
|
||||||
|
|
||||||
if (obj_a->detectCollision(*obj_b, data)) {
|
if (obj_a->detectCollision(*obj_b, data)) {
|
||||||
|
|
|
@ -6,8 +6,8 @@ const unsigned int GravityBlock::TYPE_ID = 3;
|
||||||
GravityBlock::GravityBlock() : Block() {}
|
GravityBlock::GravityBlock() : Block() {}
|
||||||
GravityBlock::~GravityBlock() {}
|
GravityBlock::~GravityBlock() {}
|
||||||
|
|
||||||
ObjectPtr GravityBlock::clone() const {
|
Object::Ptr GravityBlock::clone() const {
|
||||||
return ObjectPtr(new GravityBlock(*this));
|
return Object::Ptr(new GravityBlock(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GravityBlock::beforeDraw(Level& level) {
|
void GravityBlock::beforeDraw(Level& level) {
|
||||||
|
@ -51,18 +51,21 @@ unsigned int GravityBlock::getTypeId() const {
|
||||||
return TYPE_ID;
|
return TYPE_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectPtr GravityBlock::load(std::ifstream& file) {
|
void GravityBlock::init(std::ifstream& file, Object::Ptr object) {
|
||||||
|
GravityBlock::Ptr gravity_block = std::dynamic_pointer_cast<GravityBlock>(object);
|
||||||
|
|
||||||
// lecture de la direction de la gravité
|
// lecture de la direction de la gravité
|
||||||
char gravity_direction;
|
char gravity_direction;
|
||||||
file.read(&gravity_direction, 1);
|
file.read(&gravity_direction, 1);
|
||||||
|
gravity_block->setGravityDirection((GravityDirection) gravity_direction);
|
||||||
|
|
||||||
// lecture des propriétés d'un bloc
|
// lecture des propriétés d'un bloc
|
||||||
ObjectPtr object = Block::load(file);
|
Block::init(file, object);
|
||||||
std::shared_ptr<GravityBlock> block = std::dynamic_pointer_cast<GravityBlock>(object);
|
}
|
||||||
|
|
||||||
// attribution de la direction
|
|
||||||
block->setGravityDirection((GravityDirection) gravity_direction);
|
|
||||||
|
|
||||||
|
Object::Ptr GravityBlock::load(std::ifstream& file) {
|
||||||
|
Object::Ptr object = Object::Ptr(new GravityBlock);
|
||||||
|
GravityBlock::init(file, object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ const unsigned int VERSION_NUMBER = 0;
|
||||||
* à des instances qui seront utilisées pour la
|
* à des instances qui seront utilisées pour la
|
||||||
* construction d'autres objets de ces types
|
* construction d'autres objets de ces types
|
||||||
*/
|
*/
|
||||||
std::map<unsigned int, std::function<ObjectPtr(std::ifstream&)>> object_type_map = {
|
std::map<unsigned int, std::function<Object::Ptr(std::ifstream&)>> object_type_map = {
|
||||||
{Player::TYPE_ID, Player::load},
|
{Player::TYPE_ID, Player::load},
|
||||||
{Block::TYPE_ID, Block::load},
|
{Block::TYPE_ID, Block::load},
|
||||||
{GravityBlock::TYPE_ID, GravityBlock::load}
|
{GravityBlock::TYPE_ID, GravityBlock::load}
|
||||||
|
@ -222,7 +222,7 @@ void Level::draw() {
|
||||||
window.draw(background_sprite);
|
window.draw(background_sprite);
|
||||||
|
|
||||||
// chargement de la file d'affichage des objets
|
// chargement de la file d'affichage des objets
|
||||||
std::priority_queue<ObjectPtr, std::vector<ObjectPtr>, ObjectCompare> display_queue;
|
std::priority_queue<Object::Ptr, std::vector<Object::Ptr>, ObjectCompare> display_queue;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
display_queue.push(objects[i]);
|
display_queue.push(objects[i]);
|
||||||
|
@ -322,11 +322,11 @@ void Level::setGravityDirection(GravityDirection set_gravity_direction) {
|
||||||
gravity_direction = set_gravity_direction;
|
gravity_direction = set_gravity_direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ObjectPtr>& Level::getObjects() {
|
std::vector<Object::Ptr>& Level::getObjects() {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<ObjectPtr>& Level::getObjects() const {
|
const std::vector<Object::Ptr>& Level::getObjects() const {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ Object::Object() :
|
||||||
|
|
||||||
Object::~Object() {}
|
Object::~Object() {}
|
||||||
|
|
||||||
void Object::load(std::ifstream& file, ObjectPtr object) {
|
void Object::init(std::ifstream& file, Object::Ptr object) {
|
||||||
// lecture de la position de l'objet
|
// lecture de la position de l'objet
|
||||||
float pos_x, pos_y;
|
float pos_x, pos_y;
|
||||||
|
|
||||||
|
@ -85,9 +85,7 @@ void Object::load(std::ifstream& file, ObjectPtr object) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// propriété de type inconnu : on recule
|
// propriété de type inconnu : on sort
|
||||||
// d'un octet et on sort
|
|
||||||
file.seekg(-1, file.cur);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,7 +147,7 @@ void Object::save(std::ofstream& file) const {
|
||||||
|
|
||||||
sf::Vector2f Object::getForces(const Level& level) const {
|
sf::Vector2f Object::getForces(const Level& level) const {
|
||||||
sf::Vector2f forces(0, 0);
|
sf::Vector2f forces(0, 0);
|
||||||
const std::vector<ObjectPtr>& objects = level.getObjects();
|
const std::vector<Object::Ptr>& objects = level.getObjects();
|
||||||
|
|
||||||
// force de gravité
|
// force de gravité
|
||||||
forces += getMass() * level.getGravity();
|
forces += getMass() * level.getGravity();
|
||||||
|
@ -157,7 +155,7 @@ sf::Vector2f Object::getForces(const Level& level) const {
|
||||||
// force d'attraction entre objets chargés
|
// force d'attraction entre objets chargés
|
||||||
if (getCharge() != 0) {
|
if (getCharge() != 0) {
|
||||||
for (unsigned int j = 0; j < objects.size(); j++) {
|
for (unsigned int j = 0; j < objects.size(); j++) {
|
||||||
ObjectPtr attractive = objects[j];
|
Object::Ptr attractive = objects[j];
|
||||||
|
|
||||||
if (attractive.get() == this || attractive->getCharge() == 0) {
|
if (attractive.get() == this || attractive->getCharge() == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -384,7 +382,7 @@ void Object::setLayer(int set_layer) {
|
||||||
layer = set_layer;
|
layer = set_layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObjectCompare::operator()(ObjectPtr const &t1, ObjectPtr const &t2) const {
|
bool ObjectCompare::operator()(Object::Ptr const &t1, Object::Ptr const &t2) const {
|
||||||
sf::Vector2f t1_pos = t1->getPosition();
|
sf::Vector2f t1_pos = t1->getPosition();
|
||||||
sf::Vector2f t2_pos = t2->getPosition();
|
sf::Vector2f t2_pos = t2->getPosition();
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,12 @@ Player::Player() : Object() {
|
||||||
|
|
||||||
Player::~Player() {}
|
Player::~Player() {}
|
||||||
|
|
||||||
ObjectPtr Player::clone() const {
|
Object::Ptr Player::clone() const {
|
||||||
return ObjectPtr(new Player(*this));
|
return Object::Ptr(new Player(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectPtr Player::load(std::ifstream& file) {
|
void Player::init(std::ifstream& file, Object::Ptr object) {
|
||||||
ObjectPtr object = ObjectPtr(new Player);
|
Player::Ptr player = std::dynamic_pointer_cast<Player>(object);
|
||||||
std::shared_ptr<Player> player = std::dynamic_pointer_cast<Player>(object);
|
|
||||||
|
|
||||||
// lecture du numéro de joueur
|
// lecture du numéro de joueur
|
||||||
char player_number;
|
char player_number;
|
||||||
|
@ -28,9 +27,12 @@ ObjectPtr Player::load(std::ifstream& file) {
|
||||||
player->setPlayerNumber(player_number);
|
player->setPlayerNumber(player_number);
|
||||||
|
|
||||||
// lecture des propriétés communes des objets
|
// lecture des propriétés communes des objets
|
||||||
Object::load(file, object);
|
Object::init(file, object);
|
||||||
file.seekg(1, file.cur);
|
}
|
||||||
|
|
||||||
|
Object::Ptr Player::load(std::ifstream& file) {
|
||||||
|
Object::Ptr object = Object::Ptr(new Player);
|
||||||
|
Player::init(file, object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue