added a missing include line.
[supertux.git] / src / moving_object.hpp
index 63950cc..69d36a3 100644 (file)
@@ -31,7 +31,7 @@ class CollisionGrid;
 
 enum CollisionGroup {
   /** Objects in DISABLED group are not tested for collisions */
-  COLGROUP_DISABLED,
+  COLGROUP_DISABLED = 0,
   /**
    * "default" is moving object. MovingObjects get tested against all other
    * objects and against other movingobjects
@@ -42,6 +42,8 @@ enum CollisionGroup {
    * MovingOnlyStatic objects), but is tested against all other objects.
    */
   COLGROUP_MOVING_ONLY_STATIC,
+  /** TODO write docu :-/ */
+  COLGROUP_MOVING_STATIC,
   /**
    * Doesn't move and isn't explicitely checked for collisions with other
    * objects (but other objects might check with this)
@@ -63,7 +65,7 @@ enum CollisionGroup {
    * coins
    */
   COLGROUP_TOUCHABLE,
-  
+
   /**
    * Should be used for tilemaps
    */
@@ -79,57 +81,93 @@ class MovingObject : public GameObject
 public:
   MovingObject();
   virtual ~MovingObject();
-  
-  /** this function is called when the object collided with any other object
+
+  /** this function is called when the object collided with something solid */
+  virtual void collision_solid(const CollisionHit& hit)
+  {
+    (void) hit;
+  }
+  /**
+   * when 2 objects collided, we will first call the pre_collision_check
+   * functions of both objects that can decide on how to react to the collision.
    */
-  virtual HitResponse collision(GameObject& other,
-                                const CollisionHit& hit) = 0;
+  virtual bool collides(GameObject& other, const CollisionHit& hit)
+  {
+    (void) other;
+    (void) hit;
+    return true;
+  }
+  /** this function is called when the object collided with any other object */
+  virtual HitResponse collision(GameObject& other, const CollisionHit& hit) = 0;
   /** called when tiles with special attributes have been touched */
   virtual void collision_tile(uint32_t tile_attributes)
   {
     (void) tile_attributes;
   }
-  
+
   const Vector& get_pos() const
   {
     return bbox.p1;
   }
-  
+
   /** returns the bounding box of the Object */
   const Rect& get_bbox() const
   {
     return bbox;
   }
-  
+
   const Vector& get_movement() const
   {
     return movement;
   }
-  
+
   /** places the moving object at a specific position. Be carefull when
    * using this function. There are no collision detection checks performed
    * here so bad things could happen.
    */
   virtual void set_pos(const Vector& pos)
   {
+    dest.move(pos-get_pos());
     bbox.set_pos(pos);
   }
 
-  CollisionGroup get_group() const
+  /**
+   * sets the moving object's bbox to a specific width. Be careful when
+   * using this function. There are no collision detection checks performed
+   * here so bad things could happen.
+   */
+  virtual void set_width(float w)
   {
-    return group;
+    dest.set_width(w);
+    bbox.set_width(w);
   }
 
-  void set_group(CollisionGroup group)
+  /**
+   * sets the moving object's bbox to a specific size. Be careful when
+   * using this function. There are no collision detection checks performed
+   * here so bad things could happen.
+   */
+  virtual void set_size(float w, float h)
   {
-    this->group = group;
+    dest.set_size(w, h);
+    bbox.set_size(w, h);
   }
-  
+
+  CollisionGroup get_group() const
+  {
+    return group;
+  }
+
 protected:
   friend class Sector;
   friend class CollisionGrid;
   friend class Platform;
-  
+
+  void set_group(CollisionGroup group)
+  {
+    this->group = group;
+  }
+
   /** The bounding box of the object (as used for collision detection, this
    * isn't necessarily the bounding box for graphics)
    */