Added knife.
This commit is contained in:
parent
60518e1eda
commit
203a34f0a0
9 changed files with 44 additions and 15 deletions
BIN
resources/textures/transparent.png
Normal file
BIN
resources/textures/transparent.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 B |
5
resources/yaml/bullet_invisible.yaml
Normal file
5
resources/yaml/bullet_invisible.yaml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name: Bullet
|
||||||
|
texture: transparent.png
|
||||||
|
|
||||||
|
radius: 5
|
||||||
|
size: [1, 1]
|
|
@ -5,6 +5,6 @@ health: 100
|
||||||
speed: 100
|
speed: 100
|
||||||
radius: 25
|
radius: 25
|
||||||
size: [50, 50]
|
size: [50, 50]
|
||||||
first_weapon: assault_rifle.yaml
|
first_weapon: pistol.yaml
|
||||||
second_weapon: pistol.yaml
|
second_weapon: knife.yaml
|
||||||
faction: 1
|
faction: 1
|
11
resources/yaml/knife.yaml
Normal file
11
resources/yaml/knife.yaml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
name: Knife
|
||||||
|
|
||||||
|
bullet: bullet_invisible.yaml
|
||||||
|
projectile_speed: 1000
|
||||||
|
damage: 10
|
||||||
|
fire_interval: 2000
|
||||||
|
automatic: false
|
||||||
|
spread: 0
|
||||||
|
spread_moving: 0
|
||||||
|
max_range: 50
|
||||||
|
requires_no_ammo: true
|
|
@ -5,6 +5,6 @@ health: 100
|
||||||
speed: 100
|
speed: 100
|
||||||
radius: 25
|
radius: 25
|
||||||
size: [50, 50]
|
size: [50, 50]
|
||||||
first_weapon: hmg.yaml
|
first_weapon: pistol.yaml
|
||||||
second_weapon: shotgun.yaml
|
second_weapon: knife.yaml
|
||||||
faction: 0
|
faction: 0
|
|
@ -22,12 +22,14 @@
|
||||||
*/
|
*/
|
||||||
Bullet::Bullet(const sf::Vector2f& position, Character& shooter,
|
Bullet::Bullet(const sf::Vector2f& position, Character& shooter,
|
||||||
sf::Vector2f direction, const Yaml& config, float speed,
|
sf::Vector2f direction, const Yaml& config, float speed,
|
||||||
float damage) :
|
float damage, float maxRange) :
|
||||||
Circle(position, CATEGORY_PARTICLE, ~CATEGORY_PARTICLE,
|
Circle(position, CATEGORY_PARTICLE, ~CATEGORY_PARTICLE,
|
||||||
config, thor::rotatedVector(direction, -90.0f)),
|
config, thor::rotatedVector(direction, -90.0f)),
|
||||||
mShooter(shooter),
|
mShooter(shooter),
|
||||||
mDamage(damage),
|
mDamage(damage),
|
||||||
mSpeed(speed) {
|
mSpeed(speed),
|
||||||
|
mMaxRangeSquared((maxRange == 0) ? std::numeric_limits<float>::max() : maxRange * maxRange),
|
||||||
|
mStartPoint(getPosition()) {
|
||||||
setSpeed(thor::rotatedVector(direction, -90.0f), mSpeed);
|
setSpeed(thor::rotatedVector(direction, -90.0f), mSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,9 +39,13 @@ Bullet::Bullet(const sf::Vector2f& position, Character& shooter,
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Bullet::onCollide(std::shared_ptr<Sprite> other) {
|
Bullet::onCollide(std::shared_ptr<Sprite> other) {
|
||||||
|
if (thor::squaredLength(getPosition() - mStartPoint) >= mMaxRangeSquared) {
|
||||||
|
setDelete(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure we do not damage twice.
|
// Make sure we do not damage twice.
|
||||||
if (!getDelete() && (&*other != &mShooter)) {
|
if (!getDelete() && (&*other != &mShooter)) {
|
||||||
// Call onShot on other, with damage as param.
|
|
||||||
if (other->getCategory() == CATEGORY_ACTOR) {
|
if (other->getCategory() == CATEGORY_ACTOR) {
|
||||||
std::shared_ptr<Character> character = std::static_pointer_cast<Character>(other);
|
std::shared_ptr<Character> character = std::static_pointer_cast<Character>(other);
|
||||||
character->onDamage(mDamage);
|
character->onDamage(mDamage);
|
||||||
|
|
|
@ -20,14 +20,16 @@ class Bullet : public Circle {
|
||||||
public:
|
public:
|
||||||
explicit Bullet(const sf::Vector2f& position, Character& shooter,
|
explicit Bullet(const sf::Vector2f& position, Character& shooter,
|
||||||
sf::Vector2f direction, const Yaml& config, float speed,
|
sf::Vector2f direction, const Yaml& config, float speed,
|
||||||
float damage);
|
float damage, float maxRange);
|
||||||
|
|
||||||
void onCollide(std::shared_ptr<Sprite> other);
|
void onCollide(std::shared_ptr<Sprite> other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Character& mShooter;
|
const Character& mShooter;
|
||||||
const int mDamage;
|
const int mDamage;
|
||||||
const float mSpeed;
|
const float mSpeed;
|
||||||
|
const float mMaxRangeSquared;
|
||||||
|
sf::Vector2f mStartPoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DG_BULLET_H_ */
|
#endif /* DG_BULLET_H_ */
|
||||||
|
|
|
@ -31,7 +31,9 @@ Weapon::Weapon(World& world, Character& holder, const Yaml& config) :
|
||||||
mPelletSpread(config.get("pellet_spread", 0.0f)),
|
mPelletSpread(config.get("pellet_spread", 0.0f)),
|
||||||
mReloadSingle(config.get("reload_single", false)),
|
mReloadSingle(config.get("reload_single", false)),
|
||||||
mSpread(config.get("spread", 0.0f)),
|
mSpread(config.get("spread", 0.0f)),
|
||||||
mSpreadMoving(config.get("spread_moving", 0.0f)) {
|
mSpreadMoving(config.get("spread_moving", 0.0f)),
|
||||||
|
mMaxRange(config.get("max_range", 0.0f)),
|
||||||
|
mRequiresAmmo(!config.get("requires_no_ammo", false)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,13 +82,13 @@ Weapon::onThink(int elapsed) {
|
||||||
mIsReloading = false;
|
mIsReloading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mFiring && mMagazineAmmo != 0) {
|
if (mFiring && (!mRequiresAmmo || mMagazineAmmo != 0)) {
|
||||||
fire();
|
fire();
|
||||||
if (!mAutomatic)
|
if (!mAutomatic)
|
||||||
mFiring = false;
|
mFiring = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mMagazineAmmo == 0 && mTotalAmmo != 0)
|
if (mRequiresAmmo && mMagazineAmmo == 0 && mTotalAmmo != 0)
|
||||||
reload();
|
reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +98,8 @@ Weapon::onThink(int elapsed) {
|
||||||
void
|
void
|
||||||
Weapon::fire() {
|
Weapon::fire() {
|
||||||
mTimer.restart(sf::milliseconds(mFireInterval));
|
mTimer.restart(sf::milliseconds(mFireInterval));
|
||||||
mMagazineAmmo--;
|
if (mRequiresAmmo)
|
||||||
|
mMagazineAmmo--;
|
||||||
|
|
||||||
|
|
||||||
if (mPellets == 0)
|
if (mPellets == 0)
|
||||||
|
@ -155,6 +158,6 @@ Weapon::insertProjectile(float angle) {
|
||||||
|
|
||||||
std::shared_ptr<Sprite> projectile(new Bullet(mHolder.getPosition() + offset,
|
std::shared_ptr<Sprite> projectile(new Bullet(mHolder.getPosition() + offset,
|
||||||
mHolder, direction, mProjectile, mProjectileSpeed,
|
mHolder, direction, mProjectile, mProjectileSpeed,
|
||||||
mDamage));
|
mDamage, mMaxRange));
|
||||||
mWorld.insert(projectile);
|
mWorld.insert(projectile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,8 @@ private:
|
||||||
const bool mReloadSingle;
|
const bool mReloadSingle;
|
||||||
const float mSpread;
|
const float mSpread;
|
||||||
const float mSpreadMoving;
|
const float mSpreadMoving;
|
||||||
|
const float mMaxRange;
|
||||||
|
const float mRequiresAmmo;
|
||||||
std::default_random_engine mGenerator;
|
std::default_random_engine mGenerator;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Reference in a new issue