add reloading animation
parent
a1ad7f6af0
commit
71be55ee58
|
@ -91,7 +91,7 @@ add_executable(shooter
|
|||
engine/network/UDPConnection.h
|
||||
engine/network/UDPSocket.cpp
|
||||
engine/network/UDPSocket.h
|
||||
engine/SoundController.cpp engine/SoundController.h ShooterMsgType.h ShooterMsgType.cpp engine/animation/AAttractToPoint.h engine/animation/ARotateRelativePoint.h)
|
||||
engine/SoundController.cpp engine/SoundController.h ShooterMsgType.h ShooterMsgType.cpp engine/animation/AAttractToPoint.h engine/animation/ARotateRelativePoint.h engine/animation/ARotateLeft.h)
|
||||
|
||||
if(APPLE OR UNIX)
|
||||
include_directories(/usr/local/include)
|
||||
|
|
12
Player.cpp
12
Player.cpp
|
@ -6,6 +6,9 @@
|
|||
#include "engine/Screen.h"
|
||||
#include "engine/utils/Log.h"
|
||||
|
||||
#include "engine/animation/Timeline.h"
|
||||
#include "engine/animation/ARotateLeft.h"
|
||||
|
||||
Player::Player(ObjectNameTag name) : RigidBody(name) {
|
||||
loadObj(ShooterConsts::CUBE_OBJ, Vec3D{0.5, 1.9, 0.5});
|
||||
setAcceleration(Vec3D{0, -ShooterConsts::GRAVITY, 0});
|
||||
|
@ -79,6 +82,15 @@ void Player::addWeapon(std::shared_ptr<Weapon> weapon) {
|
|||
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, Vec3D{0, 1, 0}, angle().y());
|
||||
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, left(), headAngle());
|
||||
|
||||
// add animation of reloading
|
||||
_weapons.back()->setReloadCallBack([this]() {
|
||||
Timeline::animate(AnimationListTag("reload_weapon"),
|
||||
std::make_shared<ARotateLeft>(_weapons[_selectedWeapon],
|
||||
2 * Consts::PI,
|
||||
_weapons[_selectedWeapon]->reloadTime() / 2));
|
||||
});
|
||||
|
||||
// add call back function to create fire traces
|
||||
if (_addTraceCallBack != nullptr) {
|
||||
_weapons.back()->setAddTraceCallBack(_addTraceCallBack);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
//
|
||||
// Created by Иван Ильин on 01.11.2021.
|
||||
//
|
||||
|
||||
#ifndef SHOOTER_AROTATELEFT_H
|
||||
#define SHOOTER_AROTATELEFT_H
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "Animation.h"
|
||||
#include "../Object.h"
|
||||
|
||||
class ARotateLeft final : public Animation {
|
||||
private:
|
||||
const std::weak_ptr<Object> _object;
|
||||
const double _rotationValue;
|
||||
|
||||
void update() override {
|
||||
if (_object.expired()) {
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
|
||||
_object.lock()->rotateLeft(_rotationValue * dprogress());
|
||||
}
|
||||
|
||||
public:
|
||||
ARotateLeft(std::weak_ptr<Object> object, double r, double duration = 1, LoopOut looped = LoopOut::None,
|
||||
InterpolationType interpolationType = InterpolationType::Bezier)
|
||||
: Animation(duration, looped, interpolationType), _object(object), _rotationValue(r) {}
|
||||
};
|
||||
|
||||
#endif //SHOOTER_AROTATELEFT_H
|
|
@ -208,6 +208,7 @@
|
|||
<ClInclude Include="engine\animation\AWait.h" />
|
||||
<ClInclude Include="engine\animation\AAttractToPoint.h" />
|
||||
<ClInclude Include="engine\animation\ARotateRelativePoint.h" />
|
||||
<ClInclude Include="engine\animation\ARotateLeft.h" />
|
||||
<ClInclude Include="engine\animation\Interpolation.h" />
|
||||
<ClInclude Include="engine\animation\Timeline.h" />
|
||||
<ClInclude Include="engine\Camera.h" />
|
||||
|
|
|
@ -221,6 +221,9 @@
|
|||
<ClInclude Include="engine\animation\ARotateRelativePoint.h">
|
||||
<Filter>Файлы заголовков\engine\animation</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="engine\animation\ARotateLeft.h">
|
||||
<Filter>Файлы заголовков\engine\animation</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="weapon\Ak47.h">
|
||||
<Filter>Файлы заголовков\weapon</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
//
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "Weapon.h"
|
||||
#include "../engine/ResourceManager.h"
|
||||
#include "../engine/utils/Log.h"
|
||||
|
@ -70,6 +71,10 @@ void Weapon::reload() {
|
|||
SoundController::playSound(SoundTag("reloadSound_" + name().str()), _reloadSound);
|
||||
Log::log("Weapon::reload (" + std::to_string(_stockAmmo) + " : " + std::to_string(_clipAmmo) + ")");
|
||||
_lastReloadTime = Time::time();
|
||||
|
||||
if(_reloadCallBack != nullptr) {
|
||||
_reloadCallBack();
|
||||
}
|
||||
}
|
||||
|
||||
std::map<ObjectNameTag, double>
|
||||
|
|
|
@ -38,6 +38,7 @@ private:
|
|||
double _lastReloadTime = std::numeric_limits<double>::min();
|
||||
|
||||
std::function<void(const Vec3D &, const Vec3D &)> _addTraceCallBack;
|
||||
std::function<void()> _reloadCallBack;
|
||||
|
||||
protected:
|
||||
std::map<ObjectNameTag, double>
|
||||
|
@ -58,10 +59,13 @@ public:
|
|||
const Vec3D &direction);
|
||||
|
||||
void reload();
|
||||
[[nodiscard]] double reloadTime() const { return _reloadTime; }
|
||||
|
||||
[[nodiscard]] std::pair<double, double> balance() const { return std::make_pair(_clipAmmo, _stockAmmo); }
|
||||
|
||||
void setAddTraceCallBack(std::function<void(Vec3D, Vec3D)> add) { _addTraceCallBack = std::move(add); }
|
||||
void setReloadCallBack(std::function<void()> reload) { _reloadCallBack = std::move(reload); }
|
||||
|
||||
|
||||
void addAmmo(int ammoAdd) { _stockAmmo += ammoAdd; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue