summaryrefslogtreecommitdiff
path: root/src/gui/viewport.h
diff options
context:
space:
mode:
authorPhilipp Sehmisch <mana@crushnet.org>2011-03-14 20:56:40 +0100
committerPhilipp Sehmisch <mana@crushnet.org>2011-03-15 18:23:37 +0100
commit91e2779891973cdbefc6e07ca3dee7a432a05112 (patch)
tree7b594b3aead19f6550d66384c342a3d3668ec086 /src/gui/viewport.h
parent25a2abd09e3b76115ed0b6b1a02cdddc6c1c5bfc (diff)
downloadmana-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.h28
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. */