Flesh out the intro scene some more.
[supertux.git] / src / object / tilemap.hpp
index ff6bd0b..428c5f4 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef HEADER_SUPERTUX_OBJECT_TILEMAP_HPP
 #define HEADER_SUPERTUX_OBJECT_TILEMAP_HPP
 
+#include <boost/shared_ptr.hpp>
+
 #include "object/path_walker.hpp"
 #include "supertux/game_object.hpp"
 #include "supertux/script_interface.hpp"
@@ -76,13 +78,23 @@ public:
   Vector get_offset() const
   { return offset; }
 
-  const Vector& get_movement() const
+  /** Get the movement of this tilemap. The collision detection code may need a
+   *  non-negative y-movement. Passing `false' as the `actual' argument will
+   *  provide that. Used exclusively in src/supertux/sector.cpp. */
+  Vector get_movement(bool actual) const
   {
-    return movement;
+    if(actual) {
+      return movement;
+    } else {
+      return Vector(movement.x, std::max(0.0f,movement.y));
+    }
   }
 
-  Path *get_path()
-  { return path.get(); }
+  boost::shared_ptr<Path> get_path()
+  { return path; }
+
+  boost::shared_ptr<PathWalker> get_walker()
+  { return walker; }
 
   void set_offset(const Vector &offset)
   { this->offset = offset; }
@@ -106,7 +118,7 @@ public:
   { return z_pos; }
 
   bool is_solid() const
-  { return solid; }
+  { return real_solid && effective_solid; }
 
   /**
    * Changes Tilemap's solidity, i.e. whether to consider it when doing collision detection.
@@ -161,7 +173,14 @@ private:
   typedef std::vector<uint32_t> Tiles;
   Tiles tiles;
 
-  bool solid;
+  /* read solid: In *general*, is this a solid layer?
+   * effective solid: is the layer *currently* solid? A generally solid layer
+   * may be not solid when its alpha is low.
+   * See `is_solid' above. */
+  bool real_solid;
+  bool effective_solid;
+  void update_effective_solid (void);
+
   float speed_x;
   float speed_y;
   int width, height;
@@ -174,8 +193,8 @@ private:
   float current_alpha; /**< current tilemap opacity */
   float remaining_fade_time; /**< seconds until requested tilemap opacity is reached */
 
-  std::auto_ptr<Path> path;
-  std::auto_ptr<PathWalker> walker;
+  boost::shared_ptr<Path> path;
+  boost::shared_ptr<PathWalker> walker;
 
   DrawingContext::Target draw_target; /**< set to LIGHTMAP to draw to lightmap */