コード例 #1
0
        private AdjacentStatus IsNextToWallJumpTile()
        {
            List <Collidable <MonkeyBoard> > collidableList = new List <Collidable <MonkeyBoard> >(FindCollidablesWithinRegion());

            foreach (Collidable <MonkeyBoard> collidable in collidableList)
            {
                // temporarily check for crate
                // we should create one interface/class for this special type of ground collision

                // No crates, since the crate wouldn't be able to provide requisite opposing force to kickstart the jump. Instead, the crate itself would move.
                if (collidable is Tile && (collidable as Tile).CanWallJumpOn)
                {
                    int dummy;

                    Position leftOfCurrentPosition  = Position.AddFineness(-1, 0);
                    Position rightOfCurrentPosition = Position.AddFineness(1, 0);

                    if (PerformCollidingInto(Position, leftOfCurrentPosition, RectangularMask, collidable, out dummy) != CollisionStatus.NoCollision)
                    {
                        return(AdjacentStatus.TileOnLeft);
                    }
                    else if (PerformCollidingInto(Position, rightOfCurrentPosition, RectangularMask, collidable, out dummy) != CollisionStatus.NoCollision)
                    {
                        return(AdjacentStatus.TileOnRight);
                    }
                }
            }

            return(AdjacentStatus.None);
        }
コード例 #2
0
        private bool TraverseMotion()
        {
            // defensive programming
            // defend from async nature of event handling
            if (Board == null)
            {
                return(true);
            }

            Position nextPosition = Position.AddFineness(Velocity.FinenessX, Velocity.FinenessY);

            int velocityFinenessX = Velocity.FinenessX;
            int velocityFinenessY = Velocity.FinenessY;
            int collisionDistance;

            // collidables are first sorted according to their proximity to current position
            // this will make the checking of collision done first on collidable
            // that is nearest to the current position
            foreach (Collidable <TBoard> otherCollidable in FindCollidablesWithinRegion().SortProximityReturn(Position))
            {
                CollisionStatus collisionStatus = PerformCollidingInto(Position, nextPosition, this.RectangularMask, otherCollidable, out collisionDistance);

                // correct the velocity before trying everything again
                if (collisionStatus == CollisionStatus.NoCollision)
                {
                    continue;
                }

                if (collisionStatus == CollisionStatus.CollisionFromLeft)
                {
                    velocityFinenessX = collisionDistance;
                }
                else if (collisionStatus == CollisionStatus.CollisionFromRight)
                {
                    velocityFinenessX = -collisionDistance;
                }
                else if (collisionStatus == CollisionStatus.CollisionFromTop)
                {
                    velocityFinenessY = collisionDistance;
                }
                else // collision from bottom
                {
                    velocityFinenessY = -collisionDistance;
                }

                Velocity = new Velocity(velocityFinenessX, velocityFinenessY);

                // false to indicate the motion hasn't been completed
                // will be re-invoked in PerformMotionBind
                return(false);
            }

            // attempt to set the position
            bool positionCanBeSet = SetPosition(nextPosition);

            OnAfterMotion(new MovableEventArgs <TBoard>(this));

            return(true);
        }
コード例 #3
0
        // checks if monkey is on ground; used for implementing its jump functionality
        protected internal bool IsOnGround()
        {
            List <Collidable <MonkeyBoard> > collidableList = new List <Collidable <MonkeyBoard> >(FindCollidablesWithinRegion());

            foreach (Collidable <MonkeyBoard> collidable in collidableList)
            {
                // checks for things that it was supposed to be able to jump on
                if (collidable is Tile && (collidable as Tile).CanGroundJumpOn || collidable is Crate)
                {
                    int      dummy;
                    Position groundPosition = Position.AddFineness(0, 1);

                    if (IsCollidingInto(Position, groundPosition, RectangularMask, collidable, out dummy) != CollisionStatus.NoCollision)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }