Nouvelle caméra suivant les joueurs dans game

This commit is contained in:
Mattéo Delabre 2016-04-09 00:26:47 +02:00
parent ebb203833b
commit f258e178c6
6 changed files with 60 additions and 38 deletions

View File

@ -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();

View File

@ -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);

View File

@ -6,7 +6,7 @@
class Player : public Object {
private:
mutable sf::Sprite sprite;
mutable sf::CircleShape sprite;
unsigned int player_number;
protected:

View File

@ -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;

View File

@ -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) {

View File

@ -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());