UnstableTile now has configurable sprite and allows for animations
authorChristoph Sommer <mail@christoph-sommer.de>
Sat, 20 May 2006 13:32:55 +0000 (13:32 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Sat, 20 May 2006 13:32:55 +0000 (13:32 +0000)
SVN-Revision: 3555

data/images/objects/unstable_tile/crumbling-0.png [new file with mode: 0644]
data/images/objects/unstable_tile/crumbling-1.png [new file with mode: 0644]
data/images/objects/unstable_tile/normal.png [new file with mode: 0644]
data/images/objects/unstable_tile/unstable_tile.png [deleted file]
data/images/objects/unstable_tile/unstable_tile.sprite
src/object/unstable_tile.cpp
src/object/unstable_tile.hpp

diff --git a/data/images/objects/unstable_tile/crumbling-0.png b/data/images/objects/unstable_tile/crumbling-0.png
new file mode 100644 (file)
index 0000000..9cc8e68
Binary files /dev/null and b/data/images/objects/unstable_tile/crumbling-0.png differ
diff --git a/data/images/objects/unstable_tile/crumbling-1.png b/data/images/objects/unstable_tile/crumbling-1.png
new file mode 100644 (file)
index 0000000..a60fbf7
Binary files /dev/null and b/data/images/objects/unstable_tile/crumbling-1.png differ
diff --git a/data/images/objects/unstable_tile/normal.png b/data/images/objects/unstable_tile/normal.png
new file mode 100644 (file)
index 0000000..a60fbf7
Binary files /dev/null and b/data/images/objects/unstable_tile/normal.png differ
diff --git a/data/images/objects/unstable_tile/unstable_tile.png b/data/images/objects/unstable_tile/unstable_tile.png
deleted file mode 100644 (file)
index a60fbf7..0000000
Binary files a/data/images/objects/unstable_tile/unstable_tile.png and /dev/null differ
index b51635b..b741102 100644 (file)
@@ -1,6 +1,31 @@
 (supertux-sprite
   (action
-    (name "default")
-    (images "unstable_tile.png")
+    (name "normal")
+    (images 
+      "normal.png"
+    )
+  )
+  (action
+    (name "crumbling")
+    (fps 20)
+    (images 
+      "crumbling-0.png"
+      "crumbling-1.png"
+      "crumbling-0.png"
+      "crumbling-1.png"
+      "crumbling-0.png"
+      "crumbling-1.png"
+      "crumbling-0.png"
+      "crumbling-1.png"
+      "crumbling-0.png"
+      "crumbling-1.png"
+    )
+  )
+  (action
+    (name "disintegrating")
+    (fps 1)
+    (images 
+      "normal.png"
+    )
   )
 )
index 8a61d09..1d08958 100644 (file)
@@ -1,7 +1,8 @@
 //  $Id$
 //
-//  SuperTux
+//  SuperTux - Unstable Tile
 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
+//  Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
 #include "resources.hpp"
 #include "sprite/sprite.hpp"
 #include "random_generator.hpp"
-
-static const float CRACKTIME = 0.3;
-static const float FALLTIME = 0.8;
+#include "object/bullet.hpp"
 
 UnstableTile::UnstableTile(const lisp::Lisp& lisp)
-       : MovingSprite(lisp, "images/objects/unstable_tile/unstable_tile.sprite", LAYER_TILES, COLGROUP_STATIC), hit(false), falling(false)
+  : MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL)
 {
+  sprite->set_action("normal");
   flags |= FLAG_SOLID;
 }
 
 HitResponse
-UnstableTile::collision(GameObject& other, const CollisionHit& hitdata)
+UnstableTile::collision(GameObject& other, const CollisionHit& hit)
 {
-  if(hitdata.normal.y < 0.8)
-    return FORCE_MOVE;
+  switch (state) {
 
-  Player* player = dynamic_cast<Player*> (&other);
-  if(player)
-    hit = true;
+    case STATE_NORMAL:
+      if ((hit.normal.y >= 0.8 ) && (dynamic_cast<Player*>(&other))) {
+       state = STATE_CRUMBLING;
+       sprite->set_action("crumbling", 1);
+       return FORCE_MOVE;
+      }
+      return FORCE_MOVE;
+      break;
 
-  return FORCE_MOVE;
-}
+    case STATE_CRUMBLING:
+      return FORCE_MOVE;
+      break;
 
-void
-UnstableTile::draw(DrawingContext& context)
-{
-  Vector pos = get_pos();
-  // shacking
-  if(timer.get_timegone() > CRACKTIME) {
-    pos.x += systemRandom.rand(-3, 3);
-  } 
+    case STATE_DISINTEGRATING:
+      return FORCE_MOVE;
+      break;
+
+  }
 
-  sprite->draw(context, pos, LAYER_TILES);
+  log_debug << "unhandled state" << std::endl;
+  return FORCE_MOVE;
 }
 
 void
 UnstableTile::update(float elapsed_time)
 {
-  if(falling) {
-    movement = physic.get_movement(elapsed_time);
-    if(!Sector::current()->inside(bbox)) {
-      remove_me();
-      return;
-    }
-  } else if(hit) {
-    if(timer.check()) {
-      falling = true;
-      physic.enable_gravity(true);      
-      flags &= ~FLAG_SOLID;
-      timer.stop();
-    } else if(!timer.started()) {
-      timer.start(FALLTIME);
-    }
-  } else {
-    timer.stop();
+  switch (state) {
+
+    case STATE_NORMAL:
+      break;
+
+    case STATE_CRUMBLING:
+      if (sprite->animation_done()) {
+       state = STATE_DISINTEGRATING;
+       sprite->set_action("disintegrating", 1);
+       flags &= ~FLAG_SOLID;
+        set_group(COLGROUP_DISABLED);
+       physic.enable_gravity(true);
+      }
+      break;
+
+    case STATE_DISINTEGRATING:
+      movement = physic.get_movement(elapsed_time);
+      if (sprite->animation_done()) {
+       remove_me();
+       return;
+      }
+      break;
+
   }
-  hit = false;
 }
 
 IMPLEMENT_FACTORY(UnstableTile, "unstable_tile");
index 0e8cb32..cd19c4e 100644 (file)
@@ -1,7 +1,8 @@
 //  $Id$
 //
-//  SuperTux
+//  SuperTux - Unstable Tile
 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
+//  Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
@@ -25,9 +26,9 @@
 #include "physic.hpp"
 #include "timer.hpp"
 
-class Player;
-
-/** A tile that starts falling down if tux stands to long on it */
+/** 
+ * A block that disintegrates when stood on
+ */
 class UnstableTile : public MovingSprite
 {
 public:
@@ -36,13 +37,16 @@ public:
 
   HitResponse collision(GameObject& other, const CollisionHit& hit);
   void update(float elapsed_time);
-  void draw(DrawingContext& context);
 
 private:
+  enum State {
+    STATE_NORMAL,        /**< default state */
+    STATE_CRUMBLING,     /**< crumbling, still solid */
+    STATE_DISINTEGRATING /**< disintegrating, no longer solid */
+  };
+  State state;
+
   Physic physic;
-  Timer timer;
-  bool hit;
-  bool falling;
 };
 
 #endif