object/unstable_tile.[ch]pp: Implement third state, "shake".
authorFlorian Forster <supertux@octo.it>
Mon, 1 Mar 2010 16:07:21 +0000 (16:07 +0000)
committerFlorian Forster <supertux@octo.it>
Mon, 1 Mar 2010 16:07:21 +0000 (16:07 +0000)
The order of the states is now:

  shake → dissolve → fall-down

Each state is optional. The tile will be made non-solid at the end of
"dissolve". If that action is missing in the sprite, the tile will be solid
when it falls down, making it possible to jump off of it.

Jumping off of a falling tile works better than I had expected. I've changed
the gravity modifier to 0.98 nonetheless, so that the tile falls slightly
slower than Tux does.

The "unstable_tile" and "castleblock" sprites now use the "shake" action and
not the "dissolve" action.

SVN-Revision: 6492

data/images/objects/unstable_tile/castleblock.sprite
data/images/objects/unstable_tile/unstable_tile.sprite
src/object/unstable_tile.cpp
src/object/unstable_tile.hpp

index 90670dc..41a1f9e 100644 (file)
@@ -6,7 +6,7 @@
     )
   )
   (action
-    (name "dissolve")
+    (name "shake")
     (fps 8)
     (images 
       "castleblock-0.png"
       "castleblock-3.png"
     )
   )
-;  (action
-;    (name "fall-down")
-;    (fps 1)
-;    (images 
-;      "castleblock-3.png"
-;    )
-;  )
+  (action
+    (name "fall-down")
+    (fps 1)
+    (images 
+      "castleblock-3.png"
+    )
+  )
 )
index 8b6a2bd..14d56a7 100644 (file)
@@ -6,7 +6,7 @@
     )
   )
   (action
-    (name "dissolve")
+    (name "shake")
     (fps 20)
     (images 
       "crumbling-0.png"
       "crumbling-1.png"
     )
   )
-;  (action
-;    (name "fall-down")
-;    (fps 1)
-;    (images 
-;      "normal.png"
-;    )
-;  )
+  (action
+    (name "fall-down")
+    (fps 1)
+    (images 
+      "normal.png"
+    )
+  )
 )
index 0d69f15..f83d716 100644 (file)
@@ -30,6 +30,8 @@ UnstableTile::UnstableTile(const Reader& lisp) :
   state(STATE_NORMAL)
 {
   sprite->set_action("normal");
+  physic.set_gravity_modifier (.98);
+  physic.enable_gravity (false);
 }
 
 HitResponse
@@ -39,21 +41,35 @@ UnstableTile::collision(GameObject& other, const CollisionHit& )
     Player* player = dynamic_cast<Player*> (&other);
     if(player != NULL &&
        player->get_bbox().get_bottom() < get_bbox().get_top() + SHIFT_DELTA) {
-      dissolve ();
+      shake ();
     }
 
     if (dynamic_cast<Explosion*> (&other)) {
-      dissolve ();
+      shake ();
     }
   }
   return FORCE_MOVE;
 }
 
-void UnstableTile::dissolve (void)
+void UnstableTile::shake (void)
 {
   if (state != STATE_NORMAL)
     return;
 
+  if (sprite->has_action ("shake")) {
+    state = STATE_SHAKE;
+    this->set_action ("shake", /* loops = */ 1);
+  }
+  else {
+    dissolve ();
+  }
+}
+
+void UnstableTile::dissolve (void)
+{
+  if ((state != STATE_NORMAL) && (state != STATE_SHAKE))
+    return;
+
   if (sprite->has_action ("dissolve")) {
     state = STATE_DISSOLVE;
     this->set_action ("dissolve", /* loops = */ 1);
@@ -65,13 +81,14 @@ void UnstableTile::dissolve (void)
 
 void UnstableTile::fall_down (void)
 {
-  if ((state != STATE_NORMAL) && (state != STATE_DISSOLVE))
+  if ((state != STATE_NORMAL)
+      && (state != STATE_SHAKE)
+      && (state != STATE_DISSOLVE))
     return;
 
   if (sprite->has_action ("fall-down")) {
     state = STATE_FALL;
     this->set_action ("fall-down", /* loops = */ 1);
-    set_group (COLGROUP_DISABLED);
     physic.enable_gravity (true);
   }
   else {
@@ -87,9 +104,17 @@ UnstableTile::update(float elapsed_time)
     case STATE_NORMAL:
       break;
 
-    case STATE_DISSOLVE:
+    case STATE_SHAKE:
       if (sprite->animation_done())
+        dissolve ();
+      break;
+
+    case STATE_DISSOLVE:
+      if (sprite->animation_done()) {
+        /* dissolving is done. Set to non-solid. */
+        set_group (COLGROUP_DISABLED);
         fall_down ();
+      }
       break;
 
     case STATE_FALL:
index 0abbacb..aea657d 100644 (file)
@@ -37,13 +37,15 @@ public:
 private:
   enum State {
     STATE_NORMAL,   /**< default state */
-    STATE_DISSOLVE, /**< crumbling, still solid */
-    STATE_FALL      /**< disintegrating, no longer solid */
+    STATE_SHAKE,    /**< shaking, still solid */
+    STATE_DISSOLVE, /**< dissolving, will turn non-solid after this */
+    STATE_FALL      /**< falling down */
   };
 
   void startCrumbling();
 
 private:
+  void shake (void);
   void dissolve (void);
   void fall_down (void);