This repository has been archived on 2019-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
dungeon-gunner/source/sprite/Player.cpp

129 lines
3.1 KiB
C++
Raw Normal View History

/*
* Player.cpp
*
* Created on: 21.07.2012
* Author: Felix
*/
#include "Player.h"
#include <Thor/Vectors.hpp>
#include "../util/Vector.h"
#include "../items/Weapon.h"
#include "../util/String.h"
const float Player::POINT_REACHED_DISTANCE = 1.0f;
/**
* Initializes Sprite.
2012-09-12 12:21:57 +00:00
*/
Player::Player(const Instances& instances, const Vector2f& position, const Yaml& config) :
Character(instances, "player.png", PhysicalData(position, instances.world,
CATEGORY_ACTOR, MASK_ALL, true, false, true), config),
2012-09-12 18:10:29 +00:00
mDirection(0),
mPathfinder(instances.pathfinder) {
}
/**
* Sets the point where to look and shoot at.
*
* @param Absolute world coordinates of the crosshair.
*/
void
Player::setCrosshairPosition(const Vector2f& position) {
mCrosshairPosition = position - getPosition();
}
2012-09-12 18:10:29 +00:00
/**
2012-09-12 18:10:29 +00:00
* Fires the attached Weapon, emitting a Bullet object.
*/
void
Player::fire() {
2012-10-13 16:57:12 +00:00
Character::fire();
}
/**
* Moves the player to a destination point.
2012-09-12 18:10:29 +00:00
* Disables any previous calls to Player::setDirection().
*
* @param destination Absolute world coordinate of the destination point.
*/
void
Player::move(const Vector2f& destination) {
mPath = mPathfinder.getPath(*this, destination);
// Make sure we found a path.
if (mPath != std::vector<Vector2f>()) {
setSpeed(*mPath.end() - getPosition(), getMovementSpeed());
}
// Otherwise stop (in case this was called during movement).
else {
setSpeed(Vector2f(), 0);
}
2012-09-12 18:10:29 +00:00
}
/**
* Sets the movement direction. This is destined for input via keys (eg. WASD).
* Disables any previous commands via Player::move().
*
* @param direction The direction to move to.
* @param unset False to start movement into the direction, true to stop it.
*/
void
Player::setDirection(Direction direction, bool unset) {
if (unset) {
mDirection = mDirection & ~(uint8) direction;
2012-09-12 18:10:29 +00:00
} else {
mDirection = mDirection | (uint8) direction;
2012-09-12 18:10:29 +00:00
}
// Convert directions into a vector.
Vector2f dirVec(0, 0);
if (mDirection & (uint8) Direction::RIGHT) {
2012-09-12 18:10:29 +00:00
dirVec.x += 1.0f;
}
if (mDirection & (uint8) Direction::LEFT) {
2012-09-12 18:10:29 +00:00
dirVec.x += - 1.0f;
}
if (mDirection & (uint8) Direction::DOWN) {
2012-09-12 18:10:29 +00:00
dirVec.y += 1.0f;
}
if (mDirection & (uint8) Direction::UP) {
2012-09-12 18:10:29 +00:00
dirVec.y += - 1.0f;
}
setSpeed(dirVec, getMovementSpeed());
}
2012-09-12 18:10:29 +00:00
/**
* Check if we arrived at destination, turn towards cursor.
*/
void
Player::onThink(float elapsedTime) {
2012-09-12 18:10:29 +00:00
// Stop if we are close enough to destination.
if (!mPath.empty()) {
// Reached a point.
if (thor::length(*mPath.end() - getPosition()) < POINT_REACHED_DISTANCE) {
mPath.pop_back();
if (!mPath.empty()) {
// Move to next.
setSpeed(*mPath.end() - getPosition(), getMovementSpeed());
}
else {
// Reached destination.
setSpeed(Vector2f(), 0);
}
}
}
// Look towards crosshair.
setAngle(angle(mCrosshairPosition));
}
/**
* Stop movement if we collide with anything except bullets.
*/
void
Player::onCollide(Physical& other, uint16 category) {
if (category != CATEGORY_PARTICLE) {
mPath.clear();
}
}