stair stepping

This commit is contained in:
GoaLitiuM
2021-05-31 22:07:58 +03:00
parent d6b52edab3
commit 1b6e828abe
2 changed files with 124 additions and 14 deletions

View File

@@ -162,13 +162,13 @@
"Transform": {
"Translation": {
"X": 0.0,
"Y": 356.0,
"Y": 734.0,
"Z": 0.0
}
},
"Control": "FlaxEngine.GUI.Label",
"Data": {
"Text": "uFPS: 64\nrFPS: 68\npFPS: 22\nCon: NaNms\nDirectX11\nGC memory: 18.61586MB",
"Text": "uFPS: 120\nrFPS: 120\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 10.44299MB",
"TextColor": {
"R": 1.0,
"G": 1.0,
@@ -214,7 +214,7 @@
},
"Offsets": {
"Left": 0.0,
"Right": 158.400009,
"Right": 143.0,
"Top": -80.0,
"Bottom": 96.0
},
@@ -254,8 +254,8 @@
"Name": "ContainerControl 0",
"Transform": {
"Translation": {
"X": 45122.0,
"Y": -188.0,
"X": 45676.0,
"Y": 1.0,
"Z": 0.0
}
},

View File

@@ -1,9 +1,10 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using FlaxEngine;
using Cabrito;
using System.Diagnostics;
using System.Threading.Tasks;
using FlaxEngine.Assertions;
using Console = Cabrito.Console;
namespace Game
{
@@ -221,14 +222,97 @@ namespace Game
}
}
private void SlideMove(ref Vector3 position, bool stepUp, ref Vector3 velocity)
private SlideMoveHit StepSlideMove(ref Vector3 position, ref Vector3 velocity, bool onGround)
{
if (velocity.IsZero)
return;
return SlideMoveHit.Nothing;
Vector3 originalPosition = position;
Vector3 originalVelocity = velocity;
SlideMoveHit slideMoveHit = SlideMove(ref position, ref velocity);
if (slideMoveHit == SlideMoveHit.Nothing)
return slideMoveHit;
// hit something, try to step up
if (onGround)
{
Vector3 slidePosition = position;
Vector3 slideVelocity = velocity;
position = originalPosition;
velocity = originalVelocity;
Vector3 stepUp = position + (-Physics.Gravity.Normalized * stepSize);
TraceInfo traceUp = TracePlayer(position, stepUp);
if (traceUp.fraction > 0f)
position = traceUp.endPosition;
SlideMoveHit slideMoveStepHit = SlideMove(ref position, ref velocity);
Vector3 stepDown = position + (Physics.Gravity.Normalized * stepSize);
TraceInfo traceDown = TracePlayer(position, stepDown);
if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < 0.7)
{
// can't step down, slide move like normally
position = slidePosition;
velocity = slideVelocity;
return slideMoveHit;
}
else if (traceDown.fraction > 0f)
position = traceDown.endPosition;
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)
{
// ?
position = slidePosition;
velocity = slideVelocity;
return slideMoveHit;
}
Vector3 stepPosition = position;
Vector3 slidePosition2 = slidePosition;
Vector3 stepPosition2 = stepPosition;
slidePosition2.Y = 0f;
stepPosition2.Y = 0f;
// choose which one went furthest away from the original position
if ((stepPosition2 - originalPosition).Length < (slidePosition2 - originalPosition).Length)
{
position = slidePosition;
velocity = slideVelocity;
return slideMoveHit;
}
slideMoveHit = slideMoveStepHit;
}
return slideMoveHit;
}
[Flags]
enum SlideMoveHit
{
Nothing = 0,
Step = 1,
Floor = 2,
Other = 4,
}
private SlideMoveHit SlideMove(ref Vector3 position, ref Vector3 velocity)
{
if (velocity.IsZero)
return SlideMoveHit.Nothing;
Vector3 originalPosition = position;
Vector3 originalVelocity = velocity;
SlideMoveHit slideMoveHit = SlideMoveHit.Nothing;
float timeleft = Time.DeltaTime;
List<Vector3> hitNormals = new List<Vector3>();
@@ -261,6 +345,13 @@ namespace Game
timeleft *= 1.0f - fraction;
if (trace.hitNormal.Y > 0.7)
slideMoveHit |= SlideMoveHit.Floor;
else if (Math.Abs(trace.hitNormal.Y) < 0.0001f)
slideMoveHit |= SlideMoveHit.Step;
else
slideMoveHit |= SlideMoveHit.Other;
// this doesn't seem to do anything, we never have any hitNormals stored here
bool hitPreviousNormal = false;
foreach (Vector3 normal in hitNormals)
@@ -340,6 +431,8 @@ namespace Game
break;
}
}
return slideMoveHit;
}
public override void OnUpdate()
@@ -376,6 +469,7 @@ namespace Game
private const float airStrafeAcceleration = 70f * 0f; //CPM?
private const float strafeAcceleration = 10f; //QW
private const float airControl = 0f; //CPM
private const float stepSize = 16f;
private bool physicsInteractions = false;
private bool jumped = false;
@@ -385,6 +479,15 @@ namespace Game
[ReadOnly]
public float CurrentVelocity { get { return currentVelocity.Length; } set {} }
[ReadOnly]
public float UPS { get
{
Vector3 horizontalSpeed = currentVelocity;
horizontalSpeed.Y = 0f;
return horizontalSpeed.Length;
} set {} }
private Vector3 currentVelocity;
public override void OnFixedUpdate()
{
@@ -394,7 +497,7 @@ namespace Game
Vector3 moveDirection = rootTrans.TransformDirection(inputDirection);
Vector3 position = rigidBody.Position;
Vector3 velocity = rigidBody.LinearVelocity;//currentVelocity;
Vector3 velocity = currentVelocity;//rigidBody.LinearVelocity;
Vector3 wishVelocity = Vector3.Zero;
if (!inputDirection.IsZero)
@@ -432,15 +535,21 @@ namespace Game
else
{
onGround = !traceGround.startSolid;
velocity.Y = 0f;
}
// TODO: snap to ground here
// jump
if (onGround)
{
if (!jumped && InputManager.GetAction("Jump"))
{
//jumped = true;
// reset velocity from gravity
if (-Vector3.Dot(Physics.Gravity.Normalized, velocity) < 0 &&
Vector3.Dot(velocity, traceGround.hitNormal) < -0.1)
{
velocity = Vector3.ProjectOnPlane(velocity, traceGround.hitNormal);
}
velocity += Vector3.Up * jumpVelocity;
onGround = false;
@@ -490,10 +599,11 @@ namespace Game
rigidBody.LinearVelocity = velocity;
else
{
SlideMove(ref position, false, ref velocity);
StepSlideMove(ref position, ref velocity, onGround);
rigidBody.Position = position;
rigidBody.LinearVelocity = velocity;
currentVelocity = velocity;
//rigidBody.LinearVelocity = velocity;
}
}