X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fcollision.cpp;h=237590f0200c6a4e982000b40a253f9628dc9b6b;hb=5a542dea3c6043703683b68fcaa774f6cb0d9127;hp=58c48c6bd5a5acbd6ac6ad37ce7bf7bc5a0929ce;hpb=67df4c8d8e37b4843af5ec262a89f267f4fd93d4;p=supertux.git diff --git a/src/collision.cpp b/src/collision.cpp index 58c48c6bd..237590f02 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -18,14 +18,17 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. +#include + +#include #include "defines.h" #include "collision.h" -#include "bitmask.h" #include "scene.h" -#include "world.h" -#include "level.h" +#include "sector.h" +#include "tilemap.h" #include "tile.h" +#if 0 bool rectcollision(const base_type& one, const base_type& two) { return (one.x >= two.x - one.width + 1 && @@ -42,13 +45,19 @@ bool rectcollision_offset(const base_type& one, const base_type& two, float off_ one.y <= two.y + two.height + off_y - 1); } +bool collision_object_map(const Rectangle& rect) +{ + base_type base; + base.x = rect.p1.x; + base.y = rect.p1.y; + base.width = rect.get_width(); + base.height = rect.get_height(); + return collision_object_map(base); +} + bool collision_object_map(const base_type& base) { - if(!World::current()) - return false; - - const Level& level = *World::current()->get_level(); - TileManager& tilemanager = *TileManager::instance(); + const TileMap& tilemap = *Sector::current()->solids; // we make the collision rectangle 1 pixel smaller int starttilex = int(base.x+1) / 32; @@ -58,8 +67,8 @@ bool collision_object_map(const base_type& base) for(int x = starttilex; x*32 < max_x; ++x) { for(int y = starttiley; y*32 < max_y; ++y) { - Tile* tile = tilemanager.get(level.get_tile_at(x, y)); - if(tile && tile->solid) + const Tile* tile = tilemap.get_tile(x, y); + if(tile && tile->attributes & Tile::SOLID) return true; } } @@ -69,8 +78,7 @@ bool collision_object_map(const base_type& base) void* collision_func(const base_type& base, tiletestfunction function) { - const Level& level = *World::current()->get_level(); - TileManager& tilemanager = *TileManager::instance(); + const TileMap& tilemap = *Sector::current()->solids; int starttilex = int(base.x) / 32; int starttiley = int(base.y) / 32; @@ -79,7 +87,7 @@ void* collision_func(const base_type& base, tiletestfunction function) for(int x = starttilex; x*32 < max_x; ++x) { for(int y = starttiley; y*32 < max_y; ++y) { - Tile* tile = tilemanager.get(level.get_tile_at(x, y)); + const Tile* tile = tilemap.get_tile(x, y); void* result = function(tile); if(result != 0) return result; @@ -89,16 +97,22 @@ void* collision_func(const base_type& base, tiletestfunction function) return 0; } -static void* test_goal_tile_function(Tile* tile) +static void* test_goal_tile_function(const Tile* tile) { - if(tile && tile->goal) - return tile; + if(tile && (tile->attributes & Tile::GOAL)) + return const_cast ((const void*) tile); // evil cast... return 0; } -Tile* collision_goal(const base_type& base) +const Tile* collision_goal(const Rectangle& rect) { - return (Tile*) collision_func(base, test_goal_tile_function); + // too lazy to rewrite for now, so we transform to base_type... + base_type base; + base.x = rect.p1.x; + base.y = rect.p1.y; + base.width = rect.get_width(); + base.height = rect.get_height(); + return (const Tile*) collision_func(base, test_goal_tile_function); } void collision_swept_object_map(base_type* old, base_type* current) @@ -240,54 +254,47 @@ void collision_swept_object_map(base_type* old, base_type* current) *old = *current; } -Tile* gettile(float x, float y) +const Tile* gettile(float x, float y) { - return TileManager::instance()->get(World::current()->get_level()->gettileid(x, y)); + const TileMap& tilemap = *Sector::current()->solids; + return tilemap.get_tile_at(Vector(x, y)); } bool issolid(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->solid; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::SOLID); } -bool isunisolid(float x, float y) -{ - Tile* tile = gettile(x,y); - return tile && tile->unisolid; -} - - bool isbrick(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->brick; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::BRICK); } bool isice(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->ice; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::ICE); } bool isspike(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->spike; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::SPIKE); } bool isfullbox(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->fullbox; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::FULLBOX); } -bool isdistro(float x, float y) +bool iscoin(float x, float y) { - Tile* tile = gettile(x,y); - return tile && tile->distro; + const Tile* tile = gettile(x,y); + return tile && (tile->attributes & Tile::COIN); } -/* EOF */ - +#endif