protected void Load() { Layers = LoadLayers().ToArray(); BackgroundColor = new Color(20, 30, 20); Position = new Rectangle(); Position.Set(Engine.GetScreenSize()); LoadSceneContent(); foreach (var displayable in Layers.SelectMany(p => p.FixedDisplayable)) { Position.ExpandToContain(displayable.Position); } Boundary = new Boundary(this); if (CollisionManager != null) { CollisionManager.Layer.CollidableObjects.Add(Boundary); } if (CameraCenter == null) { CameraCenter = this; } transitions = LoadTransitions().ToArray(); }
void ICollisionResponder <TFirst, TSecond> .RespondToCollision(TFirst moveableObject, TSecond collidable, CollisionInfo collisionInfo) { var movingCollidable = collidable as IMovingCollidable; var tryPosition = new Rectangle(); tryPosition.Set(moveableObject.Position); bool collideX, collideY; tryPosition.Set(moveableObject.Position); tryPosition.SetLeft(moveableObject.Motion.FrameStartPosition.Left); if (movingCollidable != null) { collideX = !movingCollidable.DetectFrameStartCollision(tryPosition); } else { collideX = !collidable.DetectCollision(tryPosition, true); } tryPosition.Set(moveableObject.Position); tryPosition.SetTop(moveableObject.Motion.FrameStartPosition.Top); if (movingCollidable != null) { collideY = !movingCollidable.DetectFrameStartCollision(tryPosition); } else { collideY = !collidable.DetectCollision(tryPosition, true); } tryPosition.Set(moveableObject.Position); if (collideY && !collideX) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: false, correctY: true); } if (collideX && !collideY) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: true, correctY: false); } if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: false, correctY: true); if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, true, true); } } if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, true, true, true); } BeforePositionCorrected(moveableObject, collidable, collisionInfo, tryPosition); if (tryPosition.Center.Y < moveableObject.Position.Center.Y - 18) { GlobalDebugHelper.NoOp(); } moveableObject.Position.Set(tryPosition); }