/// <summary> /// handles adjusting deltaMovement if we are going up a slope. /// </summary> /// <returns><c>true</c>, if horizontal slope was handled, <c>false</c> otherwise.</returns> /// <param name="deltaMovement">Delta movement.</param> /// <param name="angle">Angle.</param> bool handleHorizontalSlope(ref FixVec3 deltaMovement, Fix angle) { // disregard 90 degree angles (walls) if (FixMath.Round(angle) == 90) { return(false); } if (angle < slopeLimit) { } else // too steep. get out of here { deltaMovement.x = Fix.zero; } return(true); }
/// <summary> /// handles adjusting deltaMovement if we are going up a slope. /// </summary> /// <returns><c>true</c>, if horizontal slope was handled, <c>false</c> otherwise.</returns> /// <param name="deltaMovement">Delta movement.</param> /// <param name="angle">Angle.</param> bool handleHorizontalSlope(ref FixVec2 deltaMovement, Fix angle) { // disregard 90 degree angles (walls) if (FixMath.Round(angle) == 90) { return(false); } if (angle < slopeLimit) { // we only need to adjust the deltaMovement if we are not jumping // TODO: this uses a magic number which isn't ideal! The alternative is to have the user pass in if there is a jump this frame if (deltaMovement.y < jumpingThreshold) { // apply the slopeModifier to slow our movement up the slope Fix slopeModifier = (Fix)slopeSpeedMultiplier.Evaluate((float)angle); deltaMovement.x *= slopeModifier; // we dont set collisions on the sides for this since a slope is not technically a side collision. // smooth y movement when we climb. we make the y movement equivalent to the actual y location that corresponds // to our new x location using our good friend Pythagoras deltaMovement.y = FixMath.Abs(FixMath.Tan(angle * FixMath.Deg2Rad) * deltaMovement.x); var isGoingRight = deltaMovement.x > 0; // safety check. we fire a ray in the direction of movement just in case the diagonal we calculated above ends up // going through a wall. if the ray hits, we back off the horizontal movement to stay in bounds. var ray = isGoingRight ? _raycastOrigins.bottomRight : _raycastOrigins.bottomLeft; TFRaycastHit2D raycastHit; if (collisionState.wasGroundedLastFrame) { raycastHit = TFPhysics.Raycast((FixVec2)ray, (FixVec2)deltaMovement.Normalized(), deltaMovement.GetMagnitude(), platformMask); } else { raycastHit = TFPhysics.Raycast((FixVec2)ray, (FixVec2)deltaMovement.Normalized(), deltaMovement.GetMagnitude(), platformMask & ~oneWayPlatformMask); } if (raycastHit) { // we crossed an edge when using Pythagoras calculation, so we set the actual delta movement to the ray hit location deltaMovement = raycastHit.point - ray; if (isGoingRight) { deltaMovement.x -= _skinWidth; } else { deltaMovement.x += _skinWidth; } } _isGoingUpSlope = true; collisionState.below = true; collisionState.slopeAngle = -angle; } } else // too steep. get out of here { deltaMovement.x = Fix.zero; } return(true); }