예제 #1
0
        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();
        }
예제 #2
0
        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);
        }