Made flip_level_transformer flip platforms.
authorChristoph Sommer <mail@christoph-sommer.de>
Fri, 30 Jun 2006 21:42:04 +0000 (21:42 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Fri, 30 Jun 2006 21:42:04 +0000 (21:42 +0000)
SVN-Revision: 3815

src/flip_level_transformer.cpp
src/flip_level_transformer.hpp
src/object/camera.cpp
src/object/path.hpp
src/object/path_walker.cpp
src/object/path_walker.hpp
src/object/platform.cpp
src/object/platform.hpp

index 228c620..2d966de 100644 (file)
@@ -52,6 +52,10 @@ FlipLevelTransformer::transform_sector(Sector* sector)
     if(badguy) {
       transform_badguy(height, badguy);
     }
+    Platform* platform = dynamic_cast<Platform*> (object);
+    if(platform) {
+      transform_platform(height, *platform);
+    }
     MovingObject* mobject = dynamic_cast<MovingObject*> (object);
     if(mobject) {
       transform_moving_object(height, mobject);
@@ -110,3 +114,12 @@ FlipLevelTransformer::transform_moving_object(float height, MovingObject*object)
   object->set_pos(pos);
 }
 
+void 
+FlipLevelTransformer::transform_platform(float height, Platform& platform)
+{
+  Path& path = platform.get_path();
+  for (std::vector<Path::Node>::iterator i = path.nodes.begin(); i != path.nodes.end(); i++) {
+    Vector& pos = i->position;
+    pos.y = height - pos.y - platform.get_bbox().get_height();
+  }
+}
index d58bc93..fde90f8 100644 (file)
@@ -21,6 +21,8 @@
 #define __FLIP_LEVEL_TRANSFORMER_H__
 
 #include "level_transformer.hpp"
+#include "object/platform.hpp"
+#include "object/path.hpp"
 
 class TileMap;
 class BadGuy;
@@ -38,6 +40,7 @@ private:
   void transform_moving_object(float height, MovingObject* object);
   void transform_badguy(float height, BadGuy* badguy);
   void transform_spawnpoint(float height, SpawnPoint* spawnpoint);
+  void transform_platform(float height, Platform& platform);
 };
 
 #endif
index 6289b9e..9c46ca3 100644 (file)
@@ -300,7 +300,7 @@ Camera::update_scroll_autoscroll(float elapsed_time)
   if(player->is_dying())
     return;
 
-  translation += autoscroll_walker->advance(elapsed_time);
+  translation = autoscroll_walker->advance(elapsed_time);
 
   keep_in_bounds(translation);
   shake();
index 60812ec..5ac0fe0 100644 (file)
@@ -38,6 +38,18 @@ public:
 
   Vector get_base() const;
 
+  /**
+   * Helper class that stores an individual node of a Path
+   */
+  class Node
+  {
+  public:
+    Vector position; /**< the position of this node */
+    float time; /**< time (in seconds) to get from this node to next node */
+  };
+
+  std::vector<Node> nodes;
+
 private:
   friend class PathWalker;
 
@@ -50,18 +62,6 @@ private:
     CIRCULAR
   };
 
-  /**
-   * Helper class that stores an individual node of a Path
-   */
-  class Node
-  {
-  public:
-    Vector position; /**< the position of this node */
-    float time; /**< time (in seconds) to get from this node to next node */
-  };
-
-  std::vector<Node> nodes;
-  
   WalkMode mode;
 };
 
index d0d55dd..29ee6fc 100644 (file)
@@ -27,7 +27,6 @@ PathWalker::PathWalker(const Path* path, bool running)
   : path(path), running(running), current_node_nr(0), next_node_nr(0), stop_at_node_nr(running?-1:0), node_time(0),
     walking_speed(1.0)
 {
-  last_pos = path->nodes[0].position;
   node_mult = 1 / path->nodes[0].time;
   next_node_nr = path->nodes.size() > 1 ? 1 : 0;
 }
@@ -39,7 +38,7 @@ PathWalker::~PathWalker()
 Vector
 PathWalker::advance(float elapsed_time)
 {
-  if (!running) return Vector(0,0);
+  if (!running) return path->nodes[current_node_nr].position;
 
   assert(elapsed_time >= 0);
 
@@ -70,10 +69,7 @@ PathWalker::advance(float elapsed_time)
   Vector new_pos = current_node->position + 
     (next_node->position - current_node->position) * node_time;
     
-  Vector result = new_pos - last_pos;
-  last_pos = new_pos;
-  
-  return result;
+  return new_pos;
 }
 
 void 
index 0b8357f..5bb3300 100644 (file)
@@ -69,8 +69,6 @@ private:
    */
   int stop_at_node_nr;
 
-  Vector last_pos;
-
   /**
    * the position between the current node and the next node as fraction
    * between 0 and 1
index d6dde0a..333fd07 100644 (file)
@@ -83,7 +83,7 @@ Platform::collision(GameObject& other, const CollisionHit& hit)
 void
 Platform::update(float elapsed_time)
 {
-  movement = walker->advance(elapsed_time);
+  movement = walker->advance(elapsed_time) - get_pos();
   speed = movement / elapsed_time;
 }
 
index c38f24a..f5e1d24 100644 (file)
@@ -56,6 +56,10 @@ public:
   virtual void expose(HSQUIRRELVM vm, SQInteger table_idx);
   virtual void unexpose(HSQUIRRELVM vm, SQInteger table_idx);
 
+  Path& get_path() {
+    return *path.get();
+  }
+
 private:
   std::string name; /**< user-defined name for use in scripts or empty string if not scriptable */
   std::auto_ptr<Path> path;