Added secondary weapon.
This commit is contained in:
parent
ef0fa839b9
commit
60518e1eda
12 changed files with 61 additions and 111 deletions
|
@ -5,5 +5,6 @@ health: 100
|
|||
speed: 100
|
||||
radius: 25
|
||||
size: [50, 50]
|
||||
weapon: assault_rifle.yaml
|
||||
first_weapon: assault_rifle.yaml
|
||||
second_weapon: pistol.yaml
|
||||
faction: 1
|
|
@ -5,5 +5,6 @@ health: 100
|
|||
speed: 100
|
||||
radius: 25
|
||||
size: [50, 50]
|
||||
weapon: hmg.yaml
|
||||
first_weapon: hmg.yaml
|
||||
second_weapon: shotgun.yaml
|
||||
faction: 0
|
|
@ -116,6 +116,9 @@ Game::input() {
|
|||
mPlayer->setCrosshairPosition(convertCoordinates(event.mouseMove.x,
|
||||
event.mouseMove.y));
|
||||
break;
|
||||
case sf::Event::MouseWheelMoved:
|
||||
mPlayer->toggleWeapon();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -172,6 +175,12 @@ Game::keyDown(const sf::Event& event) {
|
|||
case sf::Keyboard::R:
|
||||
mPlayer->reload();
|
||||
break;
|
||||
case sf::Keyboard::Num1:
|
||||
mPlayer->selectFirstWeapon();
|
||||
break;
|
||||
case sf::Keyboard::Num2:
|
||||
mPlayer->selectSecondWeapon();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -31,8 +31,11 @@ Character::Character(const sf::Vector2f& position, Category category,
|
|||
mMaxHealth(config.get("health", 100)),
|
||||
mCurrentHealth(mMaxHealth),
|
||||
mMovementSpeed(config.get("speed", 0.0f)),
|
||||
mWeapon(new Weapon(world, *this,
|
||||
Yaml(config.get("weapon", std::string())))),
|
||||
mFirstWeapon(new Weapon(world, *this,
|
||||
Yaml(config.get("first_weapon", std::string())))),
|
||||
mSecondWeapon(new Weapon(world, *this,
|
||||
Yaml(config.get("second_weapon", std::string())))),
|
||||
mActiveWeapon(mFirstWeapon),
|
||||
mLastPosition(getPosition()),
|
||||
mFaction((Faction) config.get("faction", 1)) {
|
||||
}
|
||||
|
@ -64,7 +67,7 @@ Character::onDamage(int damage) {
|
|||
*/
|
||||
void
|
||||
Character::onThink(int elapsed) {
|
||||
mWeapon->onThink(elapsed);
|
||||
mActiveWeapon->onThink(elapsed);
|
||||
move();
|
||||
}
|
||||
|
||||
|
@ -98,7 +101,7 @@ Character::getMovementSpeed() const {
|
|||
*/
|
||||
void
|
||||
Character::pullTrigger() {
|
||||
mWeapon->pullTrigger();
|
||||
mActiveWeapon->pullTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -106,7 +109,7 @@ Character::pullTrigger() {
|
|||
*/
|
||||
void
|
||||
Character::releaseTrigger() {
|
||||
mWeapon->releaseTrigger();
|
||||
mActiveWeapon->releaseTrigger();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -171,15 +174,35 @@ Character::getCharacters() const {
|
|||
|
||||
int
|
||||
Character::getMagazineAmmo() const {
|
||||
return mWeapon->getMagazineAmmo();
|
||||
return mActiveWeapon->getMagazineAmmo();
|
||||
}
|
||||
|
||||
int
|
||||
Character::getTotalAmmo() const {
|
||||
return mWeapon->getTotalAmmo();
|
||||
return mActiveWeapon->getTotalAmmo();
|
||||
}
|
||||
|
||||
void
|
||||
Character::reload() {
|
||||
mWeapon->reload();
|
||||
mActiveWeapon->reload();
|
||||
}
|
||||
|
||||
void
|
||||
Character::toggleWeapon() {
|
||||
mActiveWeapon->cancelReload();
|
||||
mActiveWeapon = (mActiveWeapon == mFirstWeapon)
|
||||
? mSecondWeapon
|
||||
: mFirstWeapon;
|
||||
}
|
||||
|
||||
void
|
||||
Character::selectFirstWeapon() {
|
||||
mActiveWeapon->cancelReload();
|
||||
mActiveWeapon = mFirstWeapon;
|
||||
}
|
||||
|
||||
void
|
||||
Character::selectSecondWeapon() {
|
||||
mActiveWeapon->cancelReload();
|
||||
mActiveWeapon = mSecondWeapon;
|
||||
}
|
||||
|
|
|
@ -50,6 +50,9 @@ protected:
|
|||
int getMagazineAmmo() const;
|
||||
int getTotalAmmo() const;
|
||||
void reload();
|
||||
void toggleWeapon();
|
||||
void selectFirstWeapon();
|
||||
void selectSecondWeapon();
|
||||
|
||||
private:
|
||||
void move();
|
||||
|
@ -65,7 +68,9 @@ private:
|
|||
const int mMaxHealth;
|
||||
int mCurrentHealth; //< Current health. Between 0 and mMaxHealth.
|
||||
const float mMovementSpeed;
|
||||
std::unique_ptr<Weapon> mWeapon;
|
||||
std::shared_ptr<Weapon> mFirstWeapon;
|
||||
std::shared_ptr<Weapon> mSecondWeapon;
|
||||
std::shared_ptr<Weapon> mActiveWeapon;
|
||||
std::vector<sf::Vector2f> mPath; //< Contains nodes to reach a set destination.
|
||||
sf::Vector2f mLastPosition;
|
||||
Faction mFaction;
|
||||
|
|
|
@ -125,6 +125,13 @@ Weapon::reload() {
|
|||
mTimer.restart(sf::milliseconds(mReloadTime));
|
||||
}
|
||||
|
||||
void
|
||||
Weapon::cancelReload() {
|
||||
mIsReloading = false;
|
||||
// To make sure time isn't skipped.
|
||||
mTimer.restart(sf::milliseconds(mFireInterval));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new projectile and inserts it into the world.
|
||||
*
|
||||
|
|
|
@ -32,6 +32,7 @@ public:
|
|||
int getMagazineAmmo() const;
|
||||
int getTotalAmmo() const;
|
||||
void reload();
|
||||
void cancelReload();
|
||||
|
||||
private:
|
||||
void fire();
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* Emitter.cpp
|
||||
*
|
||||
* Created on: 15.08.2012
|
||||
* Author: Felix
|
||||
*/
|
||||
|
||||
#include "Emitter.h"
|
||||
|
||||
#include "../World.h"
|
||||
|
||||
Emitter::Emitter(World& world) :
|
||||
mWorld(world) {
|
||||
}
|
||||
|
||||
Emitter::~Emitter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a new particle into the system, using createParticle().
|
||||
*/
|
||||
void
|
||||
Emitter::emit() {
|
||||
mWorld.insert(createParticle());
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Emitter.h
|
||||
*
|
||||
* Created on: 15.08.2012
|
||||
* Author: Felix
|
||||
*/
|
||||
|
||||
#ifndef DG_EMITTER_H_
|
||||
#define DG_EMITTER_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
class World;
|
||||
class Particle;
|
||||
class Sprite;
|
||||
|
||||
class Emitter {
|
||||
public:
|
||||
explicit Emitter(World& world);
|
||||
virtual ~Emitter();
|
||||
|
||||
protected:
|
||||
void emit();
|
||||
/// Creates a particle. Allows to use a user-defined particle class and custom settings.
|
||||
virtual std::shared_ptr<Sprite> createParticle() = 0;
|
||||
|
||||
private:
|
||||
World& mWorld;
|
||||
};
|
||||
|
||||
#endif /* DG_EMITTER_H_ */
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
* Particle.cpp
|
||||
*
|
||||
* Created on: 15.08.2012
|
||||
* Author: Felix
|
||||
*/
|
||||
|
||||
#include "Particle.h"
|
||||
|
||||
Particle::Particle(const sf::Vector2f& position, Category category,
|
||||
unsigned short mask, const Yaml& config,
|
||||
const sf::Vector2f& direction) :
|
||||
Circle(position, category, mask, config, direction) {
|
||||
}
|
||||
|
||||
Particle::~Particle() {
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
/*
|
||||
* Particle.h
|
||||
*
|
||||
* Created on: 15.08.2012
|
||||
* Author: Felix
|
||||
*/
|
||||
|
||||
#ifndef DG_PARTICLE_H_
|
||||
#define DG_PARTICLE_H_
|
||||
|
||||
#include "../abstract/Circle.h"
|
||||
|
||||
class Yaml;
|
||||
|
||||
/**
|
||||
* Prototype for a particle.
|
||||
*/
|
||||
class Particle : public Circle {
|
||||
public:
|
||||
explicit Particle(const sf::Vector2f& position, Category category,
|
||||
unsigned short mask, const Yaml& config,
|
||||
const sf::Vector2f& direction);
|
||||
virtual ~Particle();
|
||||
};
|
||||
|
||||
#endif /* DG_PARTICLE_H_ */
|
|
@ -39,6 +39,9 @@ public:
|
|||
using Character::getMagazineAmmo;
|
||||
using Character::getTotalAmmo;
|
||||
using Character::reload;
|
||||
using Character::toggleWeapon;
|
||||
using Character::selectFirstWeapon;
|
||||
using Character::selectSecondWeapon;
|
||||
|
||||
private:
|
||||
void onThink(int elapsed) override;
|
||||
|
|
Reference in a new issue