Bullets are inserted at offset to avoid collisions on insert.
This commit is contained in:
parent
59cd09ac16
commit
c679a0ecaa
4 changed files with 23 additions and 10 deletions
|
@ -27,7 +27,7 @@ public:
|
||||||
static const Vector2i SIZE;
|
static const Vector2i SIZE;
|
||||||
// Private variables.
|
// Private variables.
|
||||||
private:
|
private:
|
||||||
static const float SPEED;
|
static const float SPEED; //< If speed is too low, bullets push each other away on insert.
|
||||||
Physical& mShooter;
|
Physical& mShooter;
|
||||||
const int mDamage;
|
const int mDamage;
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,18 +7,27 @@
|
||||||
|
|
||||||
#include "Weapon.h"
|
#include "Weapon.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <thor/Vectors.hpp>
|
||||||
|
|
||||||
#include "../util/Collection.h"
|
#include "../util/Collection.h"
|
||||||
#include "../effects/Bullet.h"
|
#include "../effects/Bullet.h"
|
||||||
#include "../util/Loader.h"
|
#include "../util/Loader.h"
|
||||||
#include "../util/ResourceManager.h"
|
#include "../util/ResourceManager.h"
|
||||||
|
|
||||||
const int Weapon::BULLET_DAMAGE = 10;
|
const int Weapon::BULLET_DAMAGE = 10;
|
||||||
|
|
||||||
Weapon::Weapon(Physical& holder, Collection& collection, b2World& world) :
|
Weapon::Weapon(Physical& holder, Collection& collection, b2World& world,
|
||||||
|
const Vector2i& holderSize) :
|
||||||
Emitter(collection),
|
Emitter(collection),
|
||||||
mHolder(holder),
|
mHolder(holder),
|
||||||
mBulletTexture(ResourceManager::i().acquire(Loader::i().fromFile<sf::Texture>("bullet.png"))),
|
mBulletTexture(ResourceManager::i()
|
||||||
mWorld(world) {
|
.acquire(Loader::i().fromFile<sf::Texture>("bullet.png"))),
|
||||||
|
mWorld(world),
|
||||||
|
mOffset(0, std::max(holderSize.x, holderSize.y) / 2 +
|
||||||
|
b2_linearSlop +
|
||||||
|
std::max(Bullet::SIZE.x, Bullet::SIZE.y) / 2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Weapon::~Weapon() {
|
Weapon::~Weapon() {
|
||||||
|
@ -35,6 +44,9 @@ Weapon::fire() {
|
||||||
|
|
||||||
std::shared_ptr<Particle>
|
std::shared_ptr<Particle>
|
||||||
Weapon::createParticle() {
|
Weapon::createParticle() {
|
||||||
return std::shared_ptr<Particle>(new Bullet(mHolder.getPosition(), mWorld, mBulletTexture,
|
// Minus to account for positive y-axis going downwards in SFML.
|
||||||
mHolder, mHolder.getAngle(), BULLET_DAMAGE));
|
Vector2f offset(- mOffset);
|
||||||
|
thor::rotate(offset, mHolder.getAngle());
|
||||||
|
return std::shared_ptr<Particle>(new Bullet(mHolder.getPosition() + offset,
|
||||||
|
mWorld, mBulletTexture, mHolder, mHolder.getAngle(), BULLET_DAMAGE));
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
class Weapon : public Emitter {
|
class Weapon : public Emitter {
|
||||||
// Public functions.
|
// Public functions.
|
||||||
public:
|
public:
|
||||||
Weapon(Physical& holder, Collection& collection, b2World& world);
|
Weapon(Physical& holder, Collection& collection, b2World& world, const Vector2i& holderSize);
|
||||||
~Weapon();
|
~Weapon();
|
||||||
|
|
||||||
void fire();
|
void fire();
|
||||||
|
@ -37,6 +37,7 @@ private:
|
||||||
Physical& mHolder;
|
Physical& mHolder;
|
||||||
std::shared_ptr<sf::Texture> mBulletTexture;
|
std::shared_ptr<sf::Texture> mBulletTexture;
|
||||||
b2World& mWorld;
|
b2World& mWorld;
|
||||||
|
const Vector2f mOffset; //< Offset to the point where bullets are inserted (from holder center).
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DG_WEAPON_H_ */
|
#endif /* DG_WEAPON_H_ */
|
||||||
|
|
|
@ -22,7 +22,7 @@ Player::Player(b2World& world, Collection& collection, const Vector2f& position)
|
||||||
Sprite("player.png", PhysicalData(position, SIZE, world,
|
Sprite("player.png", PhysicalData(position, SIZE, world,
|
||||||
CATEGORY_ACTOR, MASK_ALL, true)),
|
CATEGORY_ACTOR, MASK_ALL, true)),
|
||||||
Actor(100),
|
Actor(100),
|
||||||
mWeapon(*this, collection, world),
|
mWeapon(*this, collection, world, SIZE),
|
||||||
mDestination(Vector2i(50, 50)) {
|
mDestination(Vector2i(50, 50)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue