// SuperTux
// Copyright (C) 2004 Tobias Glaesser <tobi.web@gmx.de>
// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
+// Copyright (C) 2010 Florian Forster <supertux at octo.it>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Rectf rect;
};
+ enum
+ {
+ UNI_DIR_NORTH = 0,
+ UNI_DIR_SOUTH = 1,
+ UNI_DIR_WEST = 2,
+ UNI_DIR_EAST = 3,
+ UNI_DIR_MASK = 3
+ };
+
private:
std::vector<ImageSpec> imagespecs;
std::vector<SurfacePtr> images;
int getData() const
{ return data; }
- bool is_slope (void) const
+ /** Checks the SLOPE attribute. Returns "true" if set, "false" otherwise. */
+ bool is_slope() const
+ {
+ return attributes & SLOPE;
+ }
+
+ /** Determine the solidity of a tile. This version behaves correctly for
+ * unisolid tiles by taking position and movement of the object in question
+ * into account. Because creating the arguments for this function can be
+ * expensive, you should handle trivial cases using the "is_solid()" and
+ * "is_unisolid()" methods first. */
+ bool is_solid (const Rectf& tile_bbox, const Rectf& position, const Vector& movement) const;
+
+ /** This version only checks the SOLID flag to determine the solidity of a
+ * tile. This means it will always return "true" for unisolid tiles. To
+ * determine the *current* solidity of unisolid tiles, use the "is_solid"
+ * method that takes position and movement into account (see above). */
+ bool is_solid() const
{
- return ((attributes & SLOPE) != 0);
+ return attributes & SOLID;
}
- bool is_unisolid (void) const
+ /** Checks the UNISOLID attribute. Returns "true" if set, "false" otherwise. */
+ bool is_unisolid() const
{
- return ((attributes & UNISOLID) != 0);
+ return attributes & UNISOLID;
}
void print_debug(int id) const;
//might miss (and rebuke them for it)
void correct_attributes();
+ /** Returns zero if a unisolid tile is non-solid due to the movement
+ * direction, non-zero if the tile is solid due to direction. */
+ bool check_movement_unisolid (const Vector& movement) const;
+
+ /** Returns zero if a unisolid tile is non-solid due to the position of the
+ * tile and the object, non-zero if the tile is solid. */
+ bool check_position_unisolid (const Rectf& obj_bbox,
+ const Rectf& tile_bbox) const;
+
private:
Tile(const Tile&);
Tile& operator=(const Tile&);