X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=125d186486878fe6ddfeeae2cdbb6afd325427f8;hb=ffaadd80066a2a0f8c30d58ef3466f79e98254d7;hp=3b3cbc8f5033a26619b944626158c575b3324cec;hpb=a983f6648d43492632c41e2b7519b70458b53cf4;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 3b3cbc8f5..125d18648 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -1184,6 +1184,10 @@ Sector::collision_static_constrains(MovingObject& object) } } +namespace { + const float MAX_SPEED = 16.0f; +} + void Sector::handle_collisions() { @@ -1193,6 +1197,13 @@ Sector::handle_collisions() for(MovingObjects::iterator i = moving_objects.begin(); i != moving_objects.end(); ++i) { MovingObject* moving_object = *i; + Vector mov = moving_object->get_movement(); + + // make sure movement is never faster than MAX_SPEED. Norm is pretty fat, so two addl. checks are done before. + if (((mov.x > MAX_SPEED * M_SQRT1_2) || (mov.y > MAX_SPEED * M_SQRT1_2)) && (mov.norm() > MAX_SPEED)) { + moving_object->movement = mov.unit() * MAX_SPEED; + //log_debug << "Temporarily reduced object's speed of " << mov.norm() << " to " << moving_object->movement.norm() << "." << std::endl; + } moving_object->dest = moving_object->get_bbox(); moving_object->dest.move(moving_object->get_movement()); @@ -1288,7 +1299,7 @@ Sector::handle_collisions() } bool -Sector::is_free_of_tiles(const Rect& rect) const +Sector::is_free_of_tiles(const Rect& rect, const bool ignoreUnisolid) const { using namespace collision; @@ -1313,7 +1324,8 @@ Sector::is_free_of_tiles(const Rect& rect) const Constraints constraints; return collision::rectangle_aatriangle(&constraints, rect, triangle); } - if(tile->getAttributes() & Tile::SOLID) return false; + if((tile->getAttributes() & Tile::SOLID) && !ignoreUnisolid) return false; + if((tile->getAttributes() & Tile::SOLID) && !(tile->getAttributes() & Tile::UNISOLID)) return false; } } } @@ -1322,11 +1334,11 @@ Sector::is_free_of_tiles(const Rect& rect) const } bool -Sector::is_free_of_statics(const Rect& rect, const MovingObject* ignore_object) const +Sector::is_free_of_statics(const Rect& rect, const MovingObject* ignore_object, const bool ignoreUnisolid) const { using namespace collision; - if (!is_free_of_tiles(rect)) return false; + if (!is_free_of_tiles(rect, ignoreUnisolid)) return false; for(MovingObjects::const_iterator i = moving_objects.begin(); i != moving_objects.end(); ++i) {