X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Ftile.hpp;h=d0dd4247255f4b9904aaa07e70647849bfbf4815;hb=d794aac09d4a3b3f5f93985cd74381bb4de4ce84;hp=4351f115f02aa617e86f0ed406895a642735afbe;hpb=73b14eecd8cbf2d02376c7a9583bd0fa176c6deb;p=supertux.git diff --git a/src/supertux/tile.hpp b/src/supertux/tile.hpp index 4351f115f..d0dd42472 100644 --- a/src/supertux/tile.hpp +++ b/src/supertux/tile.hpp @@ -1,6 +1,7 @@ // SuperTux // Copyright (C) 2004 Tobias Glaesser // Copyright (C) 2006 Matthias Braun +// Copyright (C) 2010 Florian Forster // // 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 @@ -91,6 +92,15 @@ public: 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 imagespecs; std::vector images; @@ -123,9 +133,32 @@ public: 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; + } + + /** Checks the UNISOLID attribute. Returns "true" if set, "false" otherwise. */ + bool is_unisolid() const + { + return attributes & UNISOLID; } void print_debug(int id) const; @@ -135,6 +168,15 @@ private: //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&);