Nouvelle caméra suivant les joueurs dans game
This commit is contained in:
parent
ebb203833b
commit
f258e178c6
|
@ -33,6 +33,11 @@ protected:
|
|||
*/
|
||||
virtual void processEvent(const sf::Event& event);
|
||||
|
||||
/**
|
||||
* S'assure que la caméra est centrée sur les joueurs
|
||||
*/
|
||||
void ensureCentered();
|
||||
|
||||
public:
|
||||
Game(Manager& manager);
|
||||
virtual ~Game();
|
||||
|
|
|
@ -38,7 +38,13 @@ protected:
|
|||
* Convertit les coordonnées à l'écran en coordonnées du monde
|
||||
* d'après la vue caméra
|
||||
*/
|
||||
sf::Vector2f convertCoords(sf::Vector2i initial);
|
||||
sf::Vector2f pixelToCoords(sf::Vector2i pixel);
|
||||
|
||||
/**
|
||||
* Convertit les coordonnées du monde en coordonnées à l'écran
|
||||
* d'après la vue caméra
|
||||
*/
|
||||
sf::Vector2i coordsToPixel(sf::Vector2f coords);
|
||||
|
||||
public:
|
||||
Level(Manager& manager);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
class Player : public Object {
|
||||
private:
|
||||
mutable sf::Sprite sprite;
|
||||
mutable sf::CircleShape sprite;
|
||||
unsigned int player_number;
|
||||
|
||||
protected:
|
||||
|
|
49
src/game.cpp
49
src/game.cpp
|
@ -3,6 +3,8 @@
|
|||
#include "player.hpp"
|
||||
#include "constants.hpp"
|
||||
|
||||
const float CAMERA_TOLERANCE_RATIO = 2.f / 3.f;
|
||||
|
||||
Game::Game(Manager& manager) : Level(manager),
|
||||
widget_timer(manager, false),
|
||||
next_frame_time(manager.getCurrentTime()),
|
||||
|
@ -29,32 +31,8 @@ void Game::frame() {
|
|||
// on met à jour la physique d'un cran temporel
|
||||
update();
|
||||
|
||||
// on place la caméra à la position médiane des joueurs
|
||||
// s'ils sont trop éloignés
|
||||
std::vector<ObjectPtr>& objects = getObjects();
|
||||
sf::Vector2f position_first_player;
|
||||
sf::Vector2f position_second_player;
|
||||
|
||||
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||
if (Player* player = dynamic_cast<Player*>(objects[i].get())) {
|
||||
if (player->getPlayerNumber() == 0) {
|
||||
position_first_player = player->getPosition();
|
||||
}
|
||||
|
||||
if (player->getPlayerNumber() == 1) {
|
||||
position_second_player = player->getPosition();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sf::Vector2f diff = position_second_player - position_first_player;
|
||||
sf::View camera = getCamera();
|
||||
|
||||
if (std::pow(diff.x, 2) + std::pow(diff.y, 2) > std::pow(camera.getSize().x / 3, 2)) {
|
||||
sf::Vector2f middle = (position_second_player + position_first_player) / 2.f;
|
||||
camera.setCenter(floor(middle.x), floor(middle.y));
|
||||
setCamera(camera);
|
||||
}
|
||||
// on s'assure que la caméré soit centrée sur nos joueurs
|
||||
ensureCentered();
|
||||
|
||||
// si on a encore suffisamment de temps, on dessine
|
||||
if (current_time < next_frame_time) {
|
||||
|
@ -88,6 +66,25 @@ void Game::draw() {
|
|||
widget_timer.draw(sf::Vector2f(window_size.x / 2 - 50, 0));
|
||||
}
|
||||
|
||||
void Game::ensureCentered() {
|
||||
sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize();
|
||||
std::vector<ObjectPtr>& objects = getObjects();
|
||||
|
||||
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();
|
||||
camera.setCenter(total_position / (float) player_count);
|
||||
setCamera(camera);
|
||||
}
|
||||
|
||||
void Game::update() {
|
||||
std::vector<CollisionData> colliding;
|
||||
|
||||
|
|
|
@ -202,15 +202,26 @@ sf::View Level::getCamera() {
|
|||
return camera;
|
||||
}
|
||||
|
||||
sf::Vector2f Level::convertCoords(sf::Vector2i initial) {
|
||||
sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) {
|
||||
sf::RenderWindow& window = manager.getWindow();
|
||||
sf::View old_view = window.getView();
|
||||
|
||||
window.setView(camera);
|
||||
sf::Vector2f converted = window.mapPixelToCoords(initial);
|
||||
sf::Vector2f coords = window.mapPixelToCoords(pixel);
|
||||
window.setView(old_view);
|
||||
|
||||
return converted;
|
||||
return coords;
|
||||
}
|
||||
|
||||
sf::Vector2i Level::coordsToPixel(sf::Vector2f coords) {
|
||||
sf::RenderWindow& window = manager.getWindow();
|
||||
sf::View old_view = window.getView();
|
||||
|
||||
window.setView(camera);
|
||||
sf::Vector2i pixel = window.mapCoordsToPixel(coords);
|
||||
window.setView(old_view);
|
||||
|
||||
return pixel;
|
||||
}
|
||||
|
||||
void Level::setCamera(sf::View set_camera) {
|
||||
|
|
|
@ -8,6 +8,9 @@ const unsigned int Player::TYPE_ID = 1;
|
|||
Player::Player() : Object() {
|
||||
// déplacement de l'origine au centre de la balle
|
||||
sprite.setOrigin(sf::Vector2f(getRadius(), getRadius()));
|
||||
sprite.setRadius(getRadius());
|
||||
sprite.setOutlineColor(sf::Color::Black);
|
||||
sprite.setOutlineThickness(1.5f);
|
||||
}
|
||||
|
||||
Player::~Player() {}
|
||||
|
@ -62,20 +65,20 @@ sf::Vector2f Player::getForces(const Manager& manager, const std::vector<ObjectP
|
|||
void Player::draw(Manager& manager) {
|
||||
// utilisation de la texture
|
||||
sprite.setTexture(
|
||||
manager.getResourceManager().getTexture("ball.png")
|
||||
&manager.getResourceManager().getTexture("player.tga")
|
||||
);
|
||||
|
||||
// si le joueur est sélectionné, on le colore en rouge vif
|
||||
if (isSelected()) {
|
||||
sprite.setColor(sf::Color(255, 0, 0));
|
||||
} else {
|
||||
// if (isSelected()) {
|
||||
// sprite.setColor(sf::Color(255, 0, 0));
|
||||
// } else {
|
||||
// coloration du joueur en fonction de son numéro
|
||||
if (getPlayerNumber() == 0) {
|
||||
sprite.setColor(sf::Color(239, 83, 80));
|
||||
sprite.setFillColor(sf::Color(239, 83, 80));
|
||||
} else if (getPlayerNumber() == 1) {
|
||||
sprite.setColor(sf::Color(92, 107, 192));
|
||||
}
|
||||
sprite.setFillColor(sf::Color(92, 107, 192));
|
||||
}
|
||||
// }
|
||||
|
||||
// déplacement du sprite à la position de la balle
|
||||
sprite.setPosition(getPosition());
|
||||
|
|
Loading…
Reference in New Issue