From d1235174157bd498d0c148325d7c8066e3ab6ac7 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 15 Feb 2021 12:05:18 -0500 Subject: Added camera shake to lightning event --- src/effect_system.cpp | 28 ++++++++++++++++++++++++++++ src/effect_system.h | 17 +++++++++++++++++ src/renderer.cpp | 6 ++++-- src/script_system.cpp | 4 +++- 4 files changed, 52 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/effect_system.cpp b/src/effect_system.cpp index 3a0afe4..74fc8f3 100644 --- a/src/effect_system.cpp +++ b/src/effect_system.cpp @@ -18,6 +18,22 @@ void EffectSystem::tick(double dt) { mapFade_ = (mapFadeDest_ - mapFadeStart_) / mapFadeLength_ * mapFadeThus_ + mapFadeStart_; } + + if (cameraShaking_) { + cameraShakeTimer_.accumulate(dt); + + while (cameraShakeTimer_.step()) { + cameraShakeOn_ = !cameraShakeOn_; + } + + if (cameraShakeOn_) { + cameraShakeOffset_.x() = 8; + cameraShakeOffset_.y() = 8; + } else { + cameraShakeOffset_.x() = 0; + cameraShakeOffset_.y() = 0; + } + } } void EffectSystem::fadeScreen(int length, double amount) { @@ -33,3 +49,15 @@ void EffectSystem::fadeMap(int length, double amount) { mapFadeLength_ = length; mapFadeThus_ = 0; } + +void EffectSystem::shakeCamera(int period) { + cameraShaking_ = true; + cameraShakeOffset_ = { 0, 0 }; + cameraShakeOn_ = false; + cameraShakeTimer_ = Timer(period); +} + +void EffectSystem::stopShakingCamera() { + cameraShaking_ = false; + cameraShakeOffset_ = { 0, 0 }; +} diff --git a/src/effect_system.h b/src/effect_system.h index 2cdcb10..12ec7ca 100644 --- a/src/effect_system.h +++ b/src/effect_system.h @@ -2,6 +2,8 @@ #define EFFECT_SYSTEM_H_0B497B39 #include "system.h" +#include "timer.h" +#include "vector.h" class Game; @@ -26,6 +28,12 @@ public: // - amount is [0,1] void fadeMap(int length, double amount); + // Shakes the viewport by 1 tile in both directions. + // - period is in milliseconds, it's actually a half period + void shakeCamera(int period); + + void stopShakingCamera(); + /* Information */ bool isScreenFaded() const { return screenFade_ > 0.0; } @@ -40,6 +48,10 @@ public: bool isMapFadeComplete() const { return mapFade_ == mapFadeDest_; } + const vec2i& getCameraShakeOffset() const { return cameraShakeOffset_; } + + bool isCameraShaking() const { return cameraShaking_; } + private: Game& game_; @@ -55,6 +67,11 @@ private: double mapFadeStart_ = 0.0; double mapFadeLength_ = 0.0; double mapFadeThus_ = 0.0; + + bool cameraShaking_ = false; + vec2i cameraShakeOffset_ { 0, 0 }; + bool cameraShakeOn_ = false; + Timer cameraShakeTimer_ { 0 }; }; #endif /* end of include guard: EFFECT_SYSTEM_H_0B497B39 */ diff --git a/src/renderer.cpp b/src/renderer.cpp index c80b0d3..5aeb232 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -194,9 +194,11 @@ void Renderer::render(Game& game) { renderSprite(sprite); } + vec2i viewport = game.getSystem().getCameraPosition() + effects.getCameraShakeOffset(); + SDL_Rect cameraField { - game.getSystem().getCameraPosition().x(), - game.getSystem().getCameraPosition().y(), + viewport.x(), + viewport.y(), game.getSystem().getFieldOfView().w(), game.getSystem().getFieldOfView().h() }; diff --git a/src/script_system.cpp b/src/script_system.cpp index 7109d98..cbbd473 100644 --- a/src/script_system.cpp +++ b/src/script_system.cpp @@ -59,7 +59,9 @@ ScriptSystem::ScriptSystem(Game& game) : game_(game) { "fadeScreen", &EffectSystem::fadeScreen, "isScreenFadeComplete", &EffectSystem::isScreenFadeComplete, "fadeMap", &EffectSystem::fadeMap, - "isMapFadeComplete", &EffectSystem::isMapFadeComplete); + "isMapFadeComplete", &EffectSystem::isMapFadeComplete, + "shakeCamera", &EffectSystem::shakeCamera, + "stopShakingCamera", &EffectSystem::stopShakingCamera); engine_.new_usertype( "mixer", -- cgit 1.4.1