Made SpriteParticle's action configurable
[supertux.git] / src / moving_object.hpp
index 753914b..e6ae483 100644 (file)
@@ -1,7 +1,7 @@
-//  $Id: moving_object.h 2295 2005-03-30 01:52:14Z matzebraun $
+//  $Id$
 //
-//  SuperTux -  A Jump'n Run
-//  Copyright (C) 2004 Matthias Braun <matze@braunis.de
+//  SuperTux
+//  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
@@ -19,6 +19,8 @@
 #ifndef SUPERTUX_MOVING_OBJECT_H
 #define SUPERTUX_MOVING_OBJECT_H
 
+#include <stdint.h>
+
 #include "game_object.hpp"
 #include "collision_hit.hpp"
 #include "math/vector.hpp"
 class Sector;
 class CollisionGrid;
 
+enum CollisionGroup {
+  /** Objects in DISABLED group are not tested for collisions */
+  COLGROUP_DISABLED,
+  /**
+   * "default" is moving object. MovingObjects get tested against all other
+   * objects and against other movingobjects
+   */
+  COLGROUP_MOVING,
+  /**
+   * a Moving object, that is not tested against other MovingObjects (or other
+   * MovingOnlyStatic objects), but is tested against all other objects.
+   */
+  COLGROUP_MOVING_ONLY_STATIC,
+  /**
+   * Doesn't move and isn't explicitely checked for collisions with other
+   * objects (but other objects might check with this)
+   * The difference to COLGROUP_TOUCHABLE is that we can do multiple
+   * collision response tests in a row which is needed for static object
+   * that tux walks on. The results for collisions with STATIC objects
+   * are also sorted by time (so that the first hit gets handled first).
+   *
+   * Use this for static obstacles
+   */
+  COLGROUP_STATIC,
+  /**
+   * Isn't explicitely checked for collisions with other objects. But other
+   * objects might check with this object.
+   * Difference to COLGROUP_STATIC is that collisions with this object are
+   * only tested once and collision response is typically not handled
+   *
+   * Use this for touchable things like spikes/areas or collectibles like
+   * coins
+   */
+  COLGROUP_TOUCHABLE,
+  
+  /**
+   * Should be used for tilemaps
+   */
+  COLGROUP_TILEMAP
+};
+
 /**
  * Base class for all dynamic/moving game objects. This class contains things
  * for handling the bounding boxes and collision feedback.
@@ -41,6 +84,11 @@ public:
    */
   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
   {
@@ -64,8 +112,41 @@ public:
    */
   virtual void set_pos(const Vector& pos)
   {
+    dest.move(pos-get_pos());
     bbox.set_pos(pos);
   }
+
+  /**
+   * 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)
+  {
+    dest.set_width(w);
+    bbox.set_width(w);
+  }
+
+  /**
+   * 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)
+  {
+    dest.set_size(w, h);
+    bbox.set_size(w, h);
+  }
+
+  CollisionGroup get_group() const
+  {
+    return group;
+  }
+
+  void set_group(CollisionGroup group)
+  {
+    this->group = group;
+  }
   
 protected:
   friend class Sector;
@@ -79,6 +160,18 @@ protected:
   /** The movement that will happen till next frame
    */
   Vector movement;
+  /** The collision group */
+  CollisionGroup group;
+
+private:
+  /**
+   * this is only here for internal collision detection use (don't touch this
+   * from outside collision detection code)
+   *
+   * This field holds the currently anticipated destination of the object
+   * during collision detection
+   */
+  Rect dest;
 };
 
 #endif