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); }
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); }
// 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); }