diff options
author | Philipp Sehmisch <mana@crushnet.org> | 2011-03-14 20:56:40 +0100 |
---|---|---|
committer | Philipp Sehmisch <mana@crushnet.org> | 2011-03-15 18:23:37 +0100 |
commit | 91e2779891973cdbefc6e07ca3dee7a432a05112 (patch) | |
tree | 7b594b3aead19f6550d66384c342a3d3668ec086 /src/gui/viewport.h | |
parent | 25a2abd09e3b76115ed0b6b1a02cdddc6c1c5bfc (diff) | |
download | mana-91e2779891973cdbefc6e07ca3dee7a432a05112.tar.gz mana-91e2779891973cdbefc6e07ca3dee7a432a05112.tar.bz2 mana-91e2779891973cdbefc6e07ca3dee7a432a05112.tar.xz mana-91e2779891973cdbefc6e07ca3dee7a432a05112.zip |
Implemented a screen shake effect system in the viewport class.
The screen can either be "nudged" in a random direction with a specific
intensity or you can define an exact x and y intensity, decay factor and
duration. On a tmwAthena server an effect is triggered when the player
character dies. A method for stopping all shake effects is also
implemented, but not used yet. I added a netcode message for Manaserv to
trigger an effect server-sided. Because our protocol has currently no way
to transport floating point values, the decay is transported as a fixed
point value with 4 decimals which is entirely sufficient for this purpose.
Diffstat (limited to 'src/gui/viewport.h')
-rw-r--r-- | src/gui/viewport.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 93e36b5b..f4db806b 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -29,6 +29,8 @@ #include <guichan/mouselistener.hpp> +#include <list> + class ActorSprite; class Being; class BeingPopup; @@ -153,6 +155,22 @@ class Viewport : public WindowContainer, public gcn::MouseListener, */ void hideBeingPopup(); + /** + * Makes the screen shake in a random direction + */ + void shakeScreen(int intensity); + + /** + * Makes the screen shake in a specific direction + */ + void shakeScreen(float x, float y, float decay = 0.95f, unsigned duration = 0); + + /** + * Stops all active screen shake effects + */ + void shakeScreenStop() + { mShakeEffects.clear(); } + void event(Channels channel, const Mana::Event &event); private: @@ -190,6 +208,16 @@ class Viewport : public WindowContainer, public gcn::MouseListener, float mPixelViewY; /**< Current viewpoint in pixels. */ int mShowDebugPath; /**< Show a path from player to pointer. */ + struct ShakeEffect + { + float x; + float y; + float decay; + unsigned duration; + }; + typedef std::list<ShakeEffect> ShakeEffects; + ShakeEffects mShakeEffects; + bool mPlayerFollowMouse; int mLocalWalkTime; /**< Timestamp before the next walk can be sent. */ |