#include "supertux/sector.hpp"#include <algorithm>#include <math.h>#include "audio/sound_manager.hpp"#include "badguy/jumpy.hpp"#include "lisp/list_iterator.hpp"#include "math/aatriangle.hpp"#include "object/background.hpp"#include "object/bonus_block.hpp"#include "object/brick.hpp"#include "object/bullet.hpp"#include "object/camera.hpp"#include "object/cloud_particle_system.hpp"#include "object/coin.hpp"#include "object/comet_particle_system.hpp"#include "object/display_effect.hpp"#include "object/ghost_particle_system.hpp"#include "object/gradient.hpp"#include "object/invisible_block.hpp"#include "object/particlesystem.hpp"#include "object/particlesystem_interactive.hpp"#include "object/player.hpp"#include "object/portable.hpp"#include "object/pulsing_light.hpp"#include "object/rain_particle_system.hpp"#include "object/smoke_cloud.hpp"#include "object/snow_particle_system.hpp"#include "object/text_object.hpp"#include "object/tilemap.hpp"#include "physfs/ifile_stream.hpp"#include "scripting/squirrel_util.hpp"#include "supertux/collision.hpp"#include "supertux/constants.hpp"#include "supertux/game_session.hpp"#include "supertux/globals.hpp"#include "supertux/level.hpp"#include "supertux/object_factory.hpp"#include "supertux/player_status.hpp"#include "supertux/spawn_point.hpp"#include "supertux/tile.hpp"#include "trigger/sequence_trigger.hpp"#include "util/file_system.hpp"Go to the source code of this file.
Functions | |
| void | check_collisions (collision::Constraints *constraints, const Vector &obj_movement, const Rectf &obj_rect, const Rectf &other_rect, GameObject *object=NULL, MovingObject *other=NULL, const Vector &other_movement=Vector(0, 0)) |
| r1 is supposed to be moving, r2 a solid object | |
| static void | get_hit_normal (const Rectf &r1, const Rectf &r2, CollisionHit &hit, Vector &normal) |
| fills in CollisionHit and Normal vector of 2 intersecting rectangle | |
Variables | |
| const float | MAX_SPEED = 16.0f |
| void check_collisions | ( | collision::Constraints * | constraints, | |
| const Vector & | obj_movement, | |||
| const Rectf & | obj_rect, | |||
| const Rectf & | other_rect, | |||
| GameObject * | object = NULL, |
|||
| MovingObject * | other = NULL, |
|||
| const Vector & | other_movement = Vector(0,0) | |||
| ) |
r1 is supposed to be moving, r2 a solid object
Definition at line 888 of file sector.cpp.
References ABORT_MOVE, CollisionHit::bottom, MovingObject::collides(), collision::Constraints::constrain_bottom(), collision::Constraints::constrain_left(), collision::Constraints::constrain_right(), collision::Constraints::constrain_top(), Rectf::get_bottom(), Rectf::get_left(), Rectf::get_right(), Rectf::get_top(), collision::Constraints::ground_movement, collision::Constraints::hit, collision::intersects(), CollisionHit::left, CollisionHit::right, SHIFT_DELTA, CollisionHit::top, Vector::x, and Vector::y.
Referenced by Sector::collision_static(), and Sector::collision_tilemap().
00891 { 00892 if(!collision::intersects(obj_rect, other_rect)) 00893 return; 00894 00895 MovingObject *moving_object = dynamic_cast<MovingObject*> (object); 00896 CollisionHit dummy; 00897 if(other != NULL && !other->collides(*object, dummy)) 00898 return; 00899 if(moving_object != NULL && !moving_object->collides(*other, dummy)) 00900 return; 00901 00902 // calculate intersection 00903 float itop = obj_rect.get_bottom() - other_rect.get_top(); 00904 float ibottom = other_rect.get_bottom() - obj_rect.get_top(); 00905 float ileft = obj_rect.get_right() - other_rect.get_left(); 00906 float iright = other_rect.get_right() - obj_rect.get_left(); 00907 00908 if(fabsf(obj_movement.y) > fabsf(obj_movement.x)) { 00909 if(ileft < SHIFT_DELTA) { 00910 constraints->constrain_right(other_rect.get_left(), other_movement.x); 00911 return; 00912 } else if(iright < SHIFT_DELTA) { 00913 constraints->constrain_left(other_rect.get_right(), other_movement.x); 00914 return; 00915 } 00916 } else { 00917 // shiftout bottom/top 00918 if(itop < SHIFT_DELTA) { 00919 constraints->constrain_bottom(other_rect.get_top(), other_movement.y); 00920 return; 00921 } else if(ibottom < SHIFT_DELTA) { 00922 constraints->constrain_top(other_rect.get_bottom(), other_movement.y); 00923 return; 00924 } 00925 } 00926 00927 constraints->ground_movement += other_movement; 00928 if(other != NULL) { 00929 HitResponse response = other->collision(*object, dummy); 00930 if(response == ABORT_MOVE) 00931 return; 00932 00933 if(other->get_movement() != Vector(0, 0)) { 00934 // TODO what todo when we collide with 2 moving objects?!? 00935 constraints->ground_movement = other->get_movement(); 00936 } 00937 } 00938 00939 float vert_penetration = std::min(itop, ibottom); 00940 float horiz_penetration = std::min(ileft, iright); 00941 if(vert_penetration < horiz_penetration) { 00942 if(itop < ibottom) { 00943 constraints->constrain_bottom(other_rect.get_top(), other_movement.y); 00944 constraints->hit.bottom = true; 00945 } else { 00946 constraints->constrain_top(other_rect.get_bottom(), other_movement.y); 00947 constraints->hit.top = true; 00948 } 00949 } else { 00950 if(ileft < iright) { 00951 constraints->constrain_right(other_rect.get_left(), other_movement.x); 00952 constraints->hit.right = true; 00953 } else { 00954 constraints->constrain_left(other_rect.get_right(), other_movement.x); 00955 constraints->hit.left = true; 00956 } 00957 } 00958 }
| static void get_hit_normal | ( | const Rectf & | r1, | |
| const Rectf & | r2, | |||
| CollisionHit & | hit, | |||
| Vector & | normal | |||
| ) | [static] |
fills in CollisionHit and Normal vector of 2 intersecting rectangle
Definition at line 1055 of file sector.cpp.
References CollisionHit::bottom, Rectf::get_bottom(), Rectf::get_left(), Rectf::get_right(), Rectf::get_top(), CollisionHit::left, CollisionHit::right, CollisionHit::top, Vector::x, and Vector::y.
Referenced by Sector::collision_object(), and Sector::handle_collisions().
01057 { 01058 float itop = r1.get_bottom() - r2.get_top(); 01059 float ibottom = r2.get_bottom() - r1.get_top(); 01060 float ileft = r1.get_right() - r2.get_left(); 01061 float iright = r2.get_right() - r1.get_left(); 01062 01063 float vert_penetration = std::min(itop, ibottom); 01064 float horiz_penetration = std::min(ileft, iright); 01065 if(vert_penetration < horiz_penetration) { 01066 if(itop < ibottom) { 01067 hit.bottom = true; 01068 normal.y = vert_penetration; 01069 } else { 01070 hit.top = true; 01071 normal.y = -vert_penetration; 01072 } 01073 } else { 01074 if(ileft < iright) { 01075 hit.right = true; 01076 normal.x = horiz_penetration; 01077 } else { 01078 hit.left = true; 01079 normal.x = -horiz_penetration; 01080 } 01081 } 01082 }
const float MAX_SPEED = 16.0f [static] |
1.5.1