void _TestMove(ref float dt, Vector2 ourVelocity, T2DCollisionComponent theirCollider, List<T2DCollisionInfo> collisions) { ReadOnlyArray<T2DCollisionImage> theirImages = theirCollider.Images; for (int i = 0; i < _collisionImages.Count; i++) { T2DCollisionImage ourImage = _collisionImages[i]; for (int j = 0; j < theirImages.Count; j++) { T2DCollisionImage theirImage = theirImages[j]; // Colliders need to know how to collide with objects with lower priority but not higher if (ourImage.Priority >= theirImage.Priority) ourImage.TestMove(ref dt, ourVelocity, theirImage, collisions); else theirImage.TestMoveAgainst(ref dt, ourVelocity, ourImage, collisions); } } }
/// <summary> /// Test to see if SceneObject can move from current position along given velocity for given amount of time /// without colliding with world limits. /// </summary> /// <param name="dt">Duration to move object, in seconds.</param> /// <param name="searchBox">Box containing entire swept path of object bounds. Used to short cut world bounds check.</param> /// <param name="velocity">Velocity of object.</param> /// <param name="collider">Collision component of object.</param> /// <param name="collisions">List of collisions encountered during move.</param> public void TestMove(ref float dt, RectangleF searchBox, Vector2 velocity, T2DCollisionComponent collider, List<T2DCollisionInfo> collisions) { if (WorldLimitResolveCollision != null || OnWorldLimit != null) { ReadOnlyArray<T2DCollisionImage> images = SceneObject.Collision.Images; for (int i = 0; i < images.Count; i++) { T2DCollisionImage image = images[i]; if (searchBox.X + searchBox.Width > _moveLimitMax.X) { // test against max x _worldLimitPoly[0] = new Vector2(_moveLimitMax.X, _moveLimitMin.Y - 5.0f); _worldLimitPoly[1] = new Vector2(_moveLimitMax.X, _moveLimitMax.Y + 5.0f); _worldLimitImage.CollisionPolyBasis = _worldLimitPoly; image.TestMove(ref dt, velocity, _worldLimitImage, collisions); } if (searchBox.X < _moveLimitMin.X) { // test against min x _worldLimitPoly[0] = new Vector2(_moveLimitMin.X, _moveLimitMax.Y + 5.0f); _worldLimitPoly[1] = new Vector2(_moveLimitMin.X, _moveLimitMin.Y - 5.0f); _worldLimitImage.CollisionPolyBasis = _worldLimitPoly; image.TestMove(ref dt, velocity, _worldLimitImage, collisions); } if (searchBox.Y + searchBox.Height > _moveLimitMax.Y) { // test against max y _worldLimitPoly[0] = new Vector2(_moveLimitMax.X + 5.0f, _moveLimitMax.Y); _worldLimitPoly[1] = new Vector2(_moveLimitMin.X - 5.0f, _moveLimitMax.Y); _worldLimitImage.CollisionPolyBasis = _worldLimitPoly; image.TestMove(ref dt, velocity, _worldLimitImage, collisions); } if (searchBox.Y < _moveLimitMin.Y) { // test against min y _worldLimitPoly[0] = new Vector2(_moveLimitMin.X - 5.0f, _moveLimitMin.Y); _worldLimitPoly[1] = new Vector2(_moveLimitMax.X + 5.0f, _moveLimitMin.Y); _worldLimitImage.CollisionPolyBasis = _worldLimitPoly; image.TestMove(ref dt, velocity, _worldLimitImage, collisions); } } } }