attribution automatique des numéros de joueurs
This commit is contained in:
parent
48adba301e
commit
201b99b24a
|
@ -5,6 +5,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "state.hpp"
|
#include "state.hpp"
|
||||||
#include "object.hpp"
|
#include "object.hpp"
|
||||||
|
#include "player.hpp"
|
||||||
#include "manager.hpp"
|
#include "manager.hpp"
|
||||||
#include "resource_manager.hpp"
|
#include "resource_manager.hpp"
|
||||||
|
|
||||||
|
@ -30,6 +31,7 @@ private:
|
||||||
std::string music;
|
std::string music;
|
||||||
|
|
||||||
std::vector<Object::Ptr> objects;
|
std::vector<Object::Ptr> objects;
|
||||||
|
std::vector<Player::Ptr> players;
|
||||||
std::vector<sf::Vector2f> zone;
|
std::vector<sf::Vector2f> zone;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -146,10 +148,30 @@ public:
|
||||||
std::vector<Object::Ptr>& getObjects();
|
std::vector<Object::Ptr>& getObjects();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la liste des objets (version constante)
|
* Récupère la liste des objets (constante)
|
||||||
*/
|
*/
|
||||||
const std::vector<Object::Ptr>& getObjects() const;
|
const std::vector<Object::Ptr>& getObjects() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère la liste des joueurs
|
||||||
|
*/
|
||||||
|
std::vector<Player::Ptr>& getPlayers();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère la liste des joueurs (constante)
|
||||||
|
*/
|
||||||
|
const std::vector<Player::Ptr>& getPlayers() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ajoute un nouvel objet
|
||||||
|
*/
|
||||||
|
void addObject(Object::Ptr object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supprime l'objet donné
|
||||||
|
*/
|
||||||
|
void removeObject(Object::Ptr object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère la zone du niveau
|
* Récupère la zone du niveau
|
||||||
*/
|
*/
|
||||||
|
|
Binary file not shown.
|
@ -189,12 +189,8 @@ 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<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(
|
removeObject(selection[i]);
|
||||||
objects.begin(), objects.end(), selection[i]
|
|
||||||
), objects.end());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clearSelection();
|
clearSelection();
|
||||||
|
@ -299,7 +295,7 @@ void Editor::draw() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Object::Ptr Editor::getObject(sf::Vector2f position) {
|
Object::Ptr Editor::getObject(sf::Vector2f position) {
|
||||||
std::vector<Object::Ptr>& objects = getObjects();
|
const 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)) {
|
||||||
|
@ -323,7 +319,7 @@ sf::Vector2f* Editor::getControlPoint(sf::Vector2f position) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Object::Ptr Editor::addObject(sf::Vector2f position) {
|
Object::Ptr Editor::addObject(sf::Vector2f position) {
|
||||||
std::vector<Object::Ptr>& objects = getObjects();
|
const 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 = roundVectorToGrid(position);
|
position = roundVectorToGrid(position);
|
||||||
|
@ -346,7 +342,7 @@ Object::Ptr Editor::addObject(sf::Vector2f position) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!overlaps) {
|
if (!overlaps) {
|
||||||
objects.push_back(object);
|
Level::addObject(object);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,17 +354,12 @@ void Editor::removeObject(Object::Ptr object) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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(
|
||||||
selection.begin(), selection.end(), object
|
selection.begin(), selection.end(), object
|
||||||
), selection.end());
|
), selection.end());
|
||||||
|
|
||||||
// on supprime l'objet de la liste d'objets
|
Level::removeObject(object);
|
||||||
objects.erase(std::remove(
|
|
||||||
objects.begin(), objects.end(), object
|
|
||||||
), objects.end());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::removeControlPoint(sf::Vector2f* control_point) {
|
void Editor::removeControlPoint(sf::Vector2f* control_point) {
|
||||||
|
@ -421,7 +412,7 @@ void Editor::select(sf::Vector2f position, Editor::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<Object::Ptr>& objects = getObjects();
|
const 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),
|
||||||
|
@ -448,7 +439,7 @@ void Editor::clearSelection() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::selectAll() {
|
void Editor::selectAll() {
|
||||||
std::vector<Object::Ptr>& objects = getObjects();
|
const 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);
|
||||||
|
@ -470,7 +461,7 @@ void Editor::test() {
|
||||||
std::vector<Object::Ptr>& 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->addObject(objects[i]->clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// copie de la zone de jeu
|
// copie de la zone de jeu
|
||||||
|
|
33
src/game.cpp
33
src/game.cpp
|
@ -91,19 +91,15 @@ void Game::draw() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::ensureCentered() {
|
void Game::ensureCentered() {
|
||||||
std::vector<Object::Ptr>& objects = getObjects();
|
std::vector<Player::Ptr>& players = getPlayers();
|
||||||
|
|
||||||
sf::Vector2f total_position;
|
sf::Vector2f total_position;
|
||||||
int player_count = 0;
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
|
||||||
if (Player* player = dynamic_cast<Player*>(objects[i].get())) {
|
|
||||||
total_position += player->getPosition();
|
|
||||||
player_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sf::View camera = getCamera();
|
sf::View camera = getCamera();
|
||||||
|
unsigned int player_count = players.size();
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < player_count; i++) {
|
||||||
|
total_position += players[i]->getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
if (player_count == 0) {
|
if (player_count == 0) {
|
||||||
// on évite la division par zéro
|
// on évite la division par zéro
|
||||||
|
@ -118,13 +114,14 @@ void Game::ensureCentered() {
|
||||||
|
|
||||||
void Game::update() {
|
void Game::update() {
|
||||||
std::vector<CollisionData> colliding;
|
std::vector<CollisionData> colliding;
|
||||||
|
std::vector<Object::Ptr>& objects = getObjects();
|
||||||
|
|
||||||
// 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 < objects.size(); i++) {
|
||||||
Object::Ptr obj_a = getObjects()[i];
|
Object::Ptr obj_a = objects[i];
|
||||||
|
|
||||||
for (unsigned int j = i + 1; j < getObjects().size(); j++) {
|
for (unsigned int j = i + 1; j < objects.size(); j++) {
|
||||||
Object::Ptr obj_b = getObjects()[j];
|
Object::Ptr obj_b = objects[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)) {
|
||||||
|
@ -134,8 +131,8 @@ void Game::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// intégration des forces dans la vitesse (seconde moitié)
|
// intégration des forces dans la vitesse (seconde moitié)
|
||||||
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
getObjects()[i]->updateVelocity(*this);
|
objects[i]->updateVelocity(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// résolution des collisions détectées
|
// résolution des collisions détectées
|
||||||
|
@ -145,8 +142,8 @@ void Game::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// intégration de la vitesse dans la position
|
// intégration de la vitesse dans la position
|
||||||
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
getObjects()[i]->updatePosition();
|
objects[i]->updatePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
// application de la correction positionnelle
|
// application de la correction positionnelle
|
||||||
|
|
|
@ -126,7 +126,13 @@ void Level::load(std::string filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// lecture de l'objet
|
// lecture de l'objet
|
||||||
objects.push_back(object_type_map[object_type](file));
|
Object::Ptr read_object = object_type_map[object_type](file);
|
||||||
|
objects.push_back(read_object);
|
||||||
|
|
||||||
|
// si c'est un joueur, on l'ajoute à la liste
|
||||||
|
if ((unsigned int) object_type == Player::TYPE_ID) {
|
||||||
|
players.push_back(std::dynamic_pointer_cast<Player>(read_object));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +204,7 @@ void Level::begin() {
|
||||||
camera.setSize(window_size.x, window_size.y);
|
camera.setSize(window_size.x, window_size.y);
|
||||||
camera.setCenter(0, 0);
|
camera.setCenter(0, 0);
|
||||||
camera_angle = 180.f;
|
camera_angle = 180.f;
|
||||||
|
|
||||||
gravity_direction = GravityDirection::SOUTH;
|
gravity_direction = GravityDirection::SOUTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,7 +340,7 @@ void Level::setGravityDirection(GravityDirection set_gravity_direction) {
|
||||||
gravity_direction = set_gravity_direction;
|
gravity_direction = set_gravity_direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Object::Ptr>& Level::getObjects() {
|
std::vector<Object::Ptr>& Level::getObjects() {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,6 +348,47 @@ const std::vector<Object::Ptr>& Level::getObjects() const {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<Player::Ptr>& Level::getPlayers() {
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<Player::Ptr>& Level::getPlayers() const {
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Level::addObject(Object::Ptr object) {
|
||||||
|
// si c'est un joueur, on le met dans le tableau des joueurs
|
||||||
|
// et on lui attribue un numéro
|
||||||
|
if (object->getTypeId() == Player::TYPE_ID) {
|
||||||
|
Player::Ptr player = std::dynamic_pointer_cast<Player>(object);
|
||||||
|
|
||||||
|
player->setPlayerNumber(players.size());
|
||||||
|
players.push_back(std::dynamic_pointer_cast<Player>(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
objects.push_back(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Level::removeObject(Object::Ptr object) {
|
||||||
|
// si c'est un joueur, on le supprime de la liste des joueurs
|
||||||
|
if (object->getTypeId() == Player::TYPE_ID) {
|
||||||
|
Player::Ptr player = std::dynamic_pointer_cast<Player>(object);
|
||||||
|
players.erase(std::remove(
|
||||||
|
players.begin(), players.end(), player
|
||||||
|
), players.end());
|
||||||
|
|
||||||
|
// on réattribue les numéros de joueurs
|
||||||
|
for (unsigned int i = 0; i < players.size(); i++) {
|
||||||
|
players[i]->setPlayerNumber(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// on supprime l'objet de la liste d'objets
|
||||||
|
objects.erase(std::remove(
|
||||||
|
objects.begin(), objects.end(), object
|
||||||
|
), objects.end());
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<sf::Vector2f>& Level::getZone() {
|
std::vector<sf::Vector2f>& Level::getZone() {
|
||||||
return zone;
|
return zone;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,11 +21,6 @@ Object::Ptr Player::clone() const {
|
||||||
void Player::init(std::ifstream& file, Object::Ptr object) {
|
void Player::init(std::ifstream& file, Object::Ptr object) {
|
||||||
Player::Ptr player = std::dynamic_pointer_cast<Player>(object);
|
Player::Ptr player = std::dynamic_pointer_cast<Player>(object);
|
||||||
|
|
||||||
// lecture du numéro de joueur
|
|
||||||
char player_number;
|
|
||||||
file.read(&player_number, 1);
|
|
||||||
player->setPlayerNumber(player_number);
|
|
||||||
|
|
||||||
// lecture des propriétés communes des objets
|
// lecture des propriétés communes des objets
|
||||||
Object::init(file, object);
|
Object::init(file, object);
|
||||||
}
|
}
|
||||||
|
@ -37,10 +32,6 @@ Object::Ptr Player::load(std::ifstream& file) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::save(std::ofstream& file) const {
|
void Player::save(std::ofstream& file) const {
|
||||||
// écriture du numéro de joueur
|
|
||||||
char write_player_number = player_number;
|
|
||||||
file.write(&write_player_number, 1);
|
|
||||||
|
|
||||||
// écriture des propriétés communes
|
// écriture des propriétés communes
|
||||||
Object::save(file);
|
Object::save(file);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue