diff --git a/Content/Settings/TimeSettings.json b/Content/Settings/TimeSettings.json index 7b943c2..d1ff977 100644 --- a/Content/Settings/TimeSettings.json +++ b/Content/Settings/TimeSettings.json @@ -5,7 +5,7 @@ "Data": { "UpdateFPS": 60.0, "PhysicsFPS": 60.0, - "DrawFPS": 0.0, + "DrawFPS": 60.0, "TimeScale": 1.0, "MaxUpdateDeltaTime": 0.1 } diff --git a/Source/Game/PlayerMovement.cs b/Source/Game/PlayerMovement.cs index 94bb9c1..ac7ab5c 100644 --- a/Source/Game/PlayerMovement.cs +++ b/Source/Game/PlayerMovement.cs @@ -38,6 +38,7 @@ namespace Game private InputEvent onExit = new InputEvent("Exit"); private const float collisionMargin = 0.031f * 1.666f; + private const float slopeNormal = 0.7f; Actor rootActor; private RigidBody rigidBody; @@ -237,31 +238,39 @@ namespace Game SlideMoveHit slideMoveHit = SlideMove(ref position, ref velocity); if (slideMoveHit == SlideMoveHit.Nothing) + { + // TODO: step down here return slideMoveHit; + } // hit something, try to step up if (onGround) { + Vector3 stepDelta = -Physics.Gravity.Normalized * stepSize; + Vector3 slidePosition = position; Vector3 slideVelocity = velocity; position = originalPosition; velocity = originalVelocity; - Vector3 stepUp = position + (-Physics.Gravity.Normalized * stepSize); + // step up + Vector3 stepUp = position + stepDelta; TraceInfo traceUp = TracePlayer(position, stepUp); if (traceUp.fraction > 0f) position = traceUp.endPosition; + // try moving from step up position SlideMoveHit slideMoveStepHit = SlideMove(ref position, ref velocity); - Vector3 stepDown = position + (Physics.Gravity.Normalized * stepSize); + // step down + Vector3 stepDown = position - stepDelta; TraceInfo traceDown = TracePlayer(position, stepDown); - if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < 0.7) + if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < slopeNormal) { // can't step down, slide move like normally - Console.Print("no stepping 1, frac: " + traceDown.fraction.ToString() + ", dot: " + - (-Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal)).ToString() + - ", norm: " + traceDown.hitNormal.ToString()); + Console.Print("no stepping 1, frac: " + traceDown.fraction + ", dot: " + + (-Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal)) + + ", norm: " + traceDown.hitNormal); position = slidePosition; velocity = slideVelocity; return slideMoveHit; @@ -269,29 +278,31 @@ namespace Game else if (traceDown.fraction > 0f) position = traceDown.endPosition; + // add some margin from the ground in order to avoid getting stuck if (traceDown.fraction < 1f) position.Y += collisionMargin; + // ?? var d1 = -Vector3.Dot(Physics.Gravity.Normalized, position); var d2 = -Vector3.Dot(Physics.Gravity.Normalized, originalPosition); if (d1 < d2) { - // ? - Console.Print("no stepping 2, " + d1.ToString() + " < " + d2.ToString()); + Console.Print("no stepping 2, " + d1 + " < " + d2); position = slidePosition; velocity = slideVelocity; return slideMoveHit; } - Vector3 stepPosition = position; - Vector3 slidePosition2 = slidePosition; - Vector3 stepPosition2 = stepPosition; + Vector3 slidePosition2 = slidePosition; //down + Vector3 stepPosition2 = position; //up + // FIXME, negate gravity slidePosition2.Y = 0f; stepPosition2.Y = 0f; - // choose which one went furthest away from the original position - if ((stepPosition2 - originalPosition).Length < (slidePosition2 - originalPosition).Length) + // take the slide movement results if furthest away from original position + //if ((stepPosition2 - originalPosition).Length < (slidePosition2 - originalPosition).Length) + if ((slidePosition2 - originalPosition).Length >= (stepPosition2 - originalPosition).Length) { Console.Print("no stepping 3"); position = slidePosition; @@ -355,7 +366,7 @@ namespace Game timeleft *= 1.0f - fraction; - if (trace.hitNormal.Y > 0.7) + if (trace.hitNormal.Y > slopeNormal) slideMoveHit |= SlideMoveHit.Floor; else if (Math.Abs(trace.hitNormal.Y) < 0.0001f) slideMoveHit |= SlideMoveHit.Step; @@ -528,7 +539,7 @@ namespace Game TraceInfo traceGround = TracePlayer(position, position + groundDelta); if (!traceGround.startSolid && traceGround.fraction < 1f && - -Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < 0.7f) + -Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < slopeNormal) { // slope // clip velocity @@ -546,7 +557,7 @@ namespace Game } if (!traceGround.startSolid && (traceGround.fraction >= 1f || - -Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < 0.7f)) + -Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < slopeNormal)) { // falling or sliding down a slope onGround = false;