2016-03-25 17:40:39 +00:00
|
|
|
#include "player.hpp"
|
2016-03-15 21:00:03 +00:00
|
|
|
#include "block.hpp"
|
2016-03-14 20:20:40 +00:00
|
|
|
#include "constants.hpp"
|
2016-03-15 21:00:03 +00:00
|
|
|
#include <array>
|
2016-03-04 15:29:31 +00:00
|
|
|
|
2016-04-02 13:18:29 +00:00
|
|
|
const unsigned int Player::TYPE_ID = 1;
|
2016-03-31 17:45:57 +00:00
|
|
|
|
2016-04-02 13:18:29 +00:00
|
|
|
Player::Player() : Object() {
|
2016-03-22 19:04:18 +00:00
|
|
|
// déplacement de l'origine au centre de la balle
|
|
|
|
sprite.setOrigin(sf::Vector2f(getRadius(), getRadius()));
|
2016-03-14 20:11:09 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 18:06:49 +00:00
|
|
|
Player::~Player() {}
|
2016-03-28 18:02:23 +00:00
|
|
|
|
2016-04-06 11:54:03 +00:00
|
|
|
ObjectPtr Player::clone() const {
|
|
|
|
return ObjectPtr(new Player(*this));
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectPtr Player::load(std::ifstream& file) {
|
|
|
|
ObjectPtr object = ObjectPtr(new Player);
|
2016-04-02 13:18:29 +00:00
|
|
|
std::shared_ptr<Player> player = std::dynamic_pointer_cast<Player>(object);
|
2016-04-01 20:44:10 +00:00
|
|
|
|
2016-04-02 13:18:29 +00:00
|
|
|
// lecture du numéro de joueur
|
|
|
|
char player_number;
|
|
|
|
file.read(&player_number, 1);
|
|
|
|
player->setPlayerNumber(player_number);
|
2016-04-01 20:44:10 +00:00
|
|
|
|
2016-04-02 13:18:29 +00:00
|
|
|
// lecture des propriétés communes des objets
|
|
|
|
Object::load(file, object);
|
|
|
|
file.seekg(1, file.cur);
|
2016-04-01 20:44:10 +00:00
|
|
|
|
2016-04-02 13:18:29 +00:00
|
|
|
return object;
|
2016-04-01 20:44:10 +00:00
|
|
|
}
|
|
|
|
|
2016-03-30 12:03:36 +00:00
|
|
|
sf::Vector2f Player::getForces(const Manager& manager, const std::vector<ObjectPtr>& objects) const {
|
2016-03-28 15:23:47 +00:00
|
|
|
sf::Vector2f forces = Object::getForces(manager, objects);
|
2016-03-25 19:13:47 +00:00
|
|
|
|
2016-03-25 19:56:04 +00:00
|
|
|
// déplacement de la balle après appui sur les touches de direction
|
2016-03-30 12:05:01 +00:00
|
|
|
if (getPlayerNumber() == 0) {
|
2016-03-28 15:23:47 +00:00
|
|
|
if (manager.isKeyPressed(sf::Keyboard::Left)) {
|
2016-03-25 17:40:39 +00:00
|
|
|
forces += sf::Vector2f(-Constants::MOVE, 0);
|
|
|
|
}
|
2016-03-08 18:52:55 +00:00
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
if (manager.isKeyPressed(sf::Keyboard::Right)) {
|
2016-03-25 17:40:39 +00:00
|
|
|
forces += sf::Vector2f(Constants::MOVE, 0);
|
|
|
|
}
|
2016-03-08 18:52:55 +00:00
|
|
|
}
|
2016-03-25 19:56:04 +00:00
|
|
|
|
2016-03-30 12:05:01 +00:00
|
|
|
if (getPlayerNumber() == 1) {
|
2016-03-28 15:23:47 +00:00
|
|
|
if (manager.isKeyPressed(sf::Keyboard::Q)) {
|
2016-03-25 17:40:39 +00:00
|
|
|
forces += sf::Vector2f(-Constants::MOVE, 0);
|
|
|
|
}
|
2016-03-25 19:13:47 +00:00
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
if (manager.isKeyPressed(sf::Keyboard::D)) {
|
2016-03-25 17:40:39 +00:00
|
|
|
forces += sf::Vector2f(Constants::MOVE, 0);
|
|
|
|
}
|
2016-03-08 18:52:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return forces;
|
2016-03-04 15:29:31 +00:00
|
|
|
}
|
2016-03-15 21:00:03 +00:00
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
void Player::draw(Manager& manager) {
|
2016-03-22 19:04:18 +00:00
|
|
|
// utilisation de la texture
|
2016-03-28 15:23:47 +00:00
|
|
|
sprite.setTexture(
|
|
|
|
manager.getResourceManager().getTexture("ball.png")
|
|
|
|
);
|
2016-03-15 21:00:03 +00:00
|
|
|
|
2016-04-07 09:22:20 +00:00
|
|
|
// si le joueur est sélectionné, on le colore en rouge vif
|
|
|
|
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));
|
|
|
|
} else if (getPlayerNumber() == 1) {
|
|
|
|
sprite.setColor(sf::Color(92, 107, 192));
|
|
|
|
}
|
2016-04-06 15:04:03 +00:00
|
|
|
}
|
|
|
|
|
2016-03-22 19:04:18 +00:00
|
|
|
// déplacement du sprite à la position de la balle
|
|
|
|
sprite.setPosition(getPosition());
|
2016-03-28 15:23:47 +00:00
|
|
|
manager.getWindow().draw(sprite);
|
2016-03-15 21:00:03 +00:00
|
|
|
}
|
|
|
|
|
2016-04-06 13:35:15 +00:00
|
|
|
void Player::updatePosition(float delta){
|
2016-04-03 18:36:07 +00:00
|
|
|
// calcul de la différence de position pour connaître
|
|
|
|
// (approximativement) la rotation de la balle
|
|
|
|
sf::Vector2f last_position = getPosition();
|
|
|
|
Object::updatePosition(delta);
|
|
|
|
sprite.rotate((getPosition() - last_position).x * 3.f);
|
|
|
|
}
|
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
std::unique_ptr<sf::FloatRect> Player::getAABB() const {
|
2016-03-31 08:20:09 +00:00
|
|
|
return std::unique_ptr<sf::FloatRect>(new sf::FloatRect(
|
2016-03-19 21:59:44 +00:00
|
|
|
getPosition().x - getRadius(),
|
|
|
|
getPosition().y - getRadius(),
|
|
|
|
2 * getRadius(), 2 * getRadius()
|
2016-03-31 08:20:09 +00:00
|
|
|
));
|
2016-03-15 21:00:03 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
unsigned int Player::getTypeId() const {
|
2016-03-30 18:28:51 +00:00
|
|
|
return TYPE_ID;
|
2016-03-15 21:00:03 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
float Player::getRadius() const {
|
2016-03-25 19:13:47 +00:00
|
|
|
return 10 * getMass();
|
2016-03-15 21:00:03 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 15:23:47 +00:00
|
|
|
unsigned int Player::getPlayerNumber() const {
|
2016-03-25 19:13:47 +00:00
|
|
|
return player_number;
|
2016-03-15 21:00:03 +00:00
|
|
|
}
|
2016-03-19 21:59:44 +00:00
|
|
|
|
2016-03-25 19:13:47 +00:00
|
|
|
void Player::setPlayerNumber(unsigned int set_number) {
|
|
|
|
player_number = set_number;
|
2016-03-19 21:59:44 +00:00
|
|
|
}
|