fixed movement

This commit is contained in:
maxwes08
2025-10-07 10:37:46 +02:00
parent bd2c87ddd1
commit 7835ade2c1
6 changed files with 91 additions and 30 deletions

View File

@@ -9,9 +9,14 @@ namespace Voxel
public static float Pitch = -22.5f; public static float Pitch = -22.5f;
public static float Yaw = 0f; public static float Yaw = 0f;
public static float FOV = 60f; public static float FOV = 60f;
public static float TargetFOV = FOV;
public static float FOVLerpSpeed = 10f;
public static float Speed = 5f; public static float Speed = 5f;
public static float ShiftSpeed = 20f; public static float ShiftSpeed = 20f;
private static int _width;
private static int _height;
public static Matrix4 view => public static Matrix4 view =>
Matrix4.LookAt(Position, Position + Front, Vector3.UnitY); Matrix4.LookAt(Position, Position + Front, Vector3.UnitY);
@@ -39,14 +44,28 @@ namespace Voxel
Pitch = MathHelper.Clamp(Pitch, -89f, 89f); Pitch = MathHelper.Clamp(Pitch, -89f, 89f);
} }
public static void UpdateProjection(int width, int height) public static void UpdateProjection()
{ {
float fov = MathHelper.DegreesToRadians(FOV); float fov = MathHelper.DegreesToRadians(FOV);
float aspectRatio = width / (float)height; float aspectRatio = _width / (float)_height;
float near = 0.1f; float near = 0.1f;
float far = 1000f; float far = 1000f;
projection = Matrix4.CreatePerspectiveFieldOfView(fov, aspectRatio, near, far); projection = Matrix4.CreatePerspectiveFieldOfView(fov, aspectRatio, near, far);
} }
public static void UpdateSize(int width, int height)
{
_width = width;
_height = height;
UpdateProjection();
}
public static void UpdateFOV(float deltaTime, float alpha)
{
float currentFOV = MathHelper.Lerp(FOV, TargetFOV, FOVLerpSpeed * deltaTime);
Camera.FOV = currentFOV;
Camera.UpdateProjection();
}
} }
} }

View File

@@ -19,8 +19,8 @@ namespace Voxel
private float _gravity = 0.08f; private float _gravity = 0.08f;
private float _terminalVelocity = -3.92f; private float _terminalVelocity = -3.92f;
private float _airMultiplier = 0.98f; private float _airMultiplier = 0.91f;
private float _groundMultiplier = 0.91f; private float _groundMultiplier = 0.6f;
private const float COLLISION_EPSILON = 0.01f; private const float COLLISION_EPSILON = 0.01f;
@@ -46,7 +46,9 @@ namespace Voxel
if (!OnGround) if (!OnGround)
{ {
Vector3 acceleration = new Vector3(0, -_gravity, 0); Vector3 acceleration = new Vector3(0, -_gravity, 0);
Velocity = (Velocity + acceleration) * _airMultiplier; Velocity += acceleration;
Velocity *= _airMultiplier;
if (Velocity.Y < _terminalVelocity) if (Velocity.Y < _terminalVelocity)
{ {
@@ -55,11 +57,7 @@ namespace Voxel
} }
else else
{ {
Velocity = new Vector3( Velocity = new Vector3(Velocity.X * _groundMultiplier, 0f, Velocity.Z * _groundMultiplier);
Velocity.X * _groundMultiplier,
0f,
Velocity.Z * _groundMultiplier
);
} }
UpdateOnGround(); UpdateOnGround();

View File

@@ -1,4 +1,5 @@
using OpenTK.Windowing.GraphicsLibraryFramework; using OpenTK.Windowing.Common;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace Voxel namespace Voxel
{ {
@@ -7,6 +8,8 @@ namespace Voxel
private static Dictionary<Keys, bool> _keystates = new Dictionary<Keys, bool>(); private static Dictionary<Keys, bool> _keystates = new Dictionary<Keys, bool>();
private static Dictionary<MouseButton, bool> _mouseButtonStates = new Dictionary<MouseButton, bool>(); private static Dictionary<MouseButton, bool> _mouseButtonStates = new Dictionary<MouseButton, bool>();
public static Action<MouseWheelEventArgs> OnMouseWheel;
public static bool GetMouseButton(MouseButton button) public static bool GetMouseButton(MouseButton button)
{ {
return _mouseButtonStates.TryGetValue(button, out bool pressed) && pressed; return _mouseButtonStates.TryGetValue(button, out bool pressed) && pressed;
@@ -26,5 +29,10 @@ namespace Voxel
{ {
_keystates[key] = pressed; _keystates[key] = pressed;
} }
public static void MouseWheel(MouseWheelEventArgs e)
{
OnMouseWheel.Invoke(e);
}
} }
} }

View File

@@ -1,4 +1,5 @@
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.GraphicsLibraryFramework; using OpenTK.Windowing.GraphicsLibraryFramework;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -16,14 +17,14 @@ namespace Voxel
private int _blockIndex = 0; private int _blockIndex = 0;
private double _tickTime = 0; private double _tickTime = 0;
private bool _isJumping = false; private bool _isSprinting = false;
private Blocks _selectedBlock = Blocks.OakPlanks; private Blocks _selectedBlock = Blocks.OakPlanks;
private Vector3 previousPosition; private Vector3 previousPosition;
public Player(Vector3 startPos, World world) : base(startPos, 0.5f, 1.8f, world) public Player(Vector3 startPos, World world) : base(startPos, 0.5f, 1.8f, world)
{ {
Input.OnMouseWheel += SwitchBlock;
} }
public void PlaceBlock() public void PlaceBlock()
@@ -46,26 +47,36 @@ namespace Voxel
_world.SetBlock(x, y, z, Blocks.Air); _world.SetBlock(x, y, z, Blocks.Air);
} }
public void Tick() public new void Tick()
{ {
previousPosition = Position; previousPosition = Position;
bool sprinting = Input.GetKey(Keys.LeftControl); float forwards = 0;
float sidewards = 0;
if (Input.GetKey(Keys.W)) if (Input.GetKey(Keys.W))
ApplyWalkSpeed(0, -1, sprinting); forwards = -1;
if (Input.GetKey(Keys.S)) if (Input.GetKey(Keys.S))
ApplyWalkSpeed(0, 1, sprinting); forwards = 1;
if (Input.GetKey(Keys.A)) if (Input.GetKey(Keys.A))
ApplyWalkSpeed(-1, 0, false); sidewards = -1;
if (Input.GetKey(Keys.D)) if (Input.GetKey(Keys.D))
ApplyWalkSpeed(1, 0, false); sidewards = 1;
_isSprinting = (Input.GetKey(Keys.LeftControl) && forwards != 0);
if (Input.GetKey(Keys.Space) && OnGround) if (Input.GetKey(Keys.Space) && OnGround)
{ {
Console.WriteLine("Jump"); Console.WriteLine("Jump");
Velocity = new Vector3(Velocity.X, 0.42f, Velocity.Z); Velocity = new Vector3(Velocity.X, 0.42f, Velocity.Z);
OnGround = false; OnGround = false;
if (_isSprinting)
{
float yawRad = MathHelper.DegreesToRadians(Rotation);
Velocity.X += 0.2f * MathF.Sin(yawRad);
Velocity.Z += 0.2f * -MathF.Cos(yawRad);
}
} }
if (Input.GetMouseButton(MouseButton.Right) && lastClick == 0) if (Input.GetMouseButton(MouseButton.Right) && lastClick == 0)
@@ -82,6 +93,7 @@ namespace Voxel
BreakBlock(); BreakBlock();
} }
ApplyWalkSpeed(sidewards, forwards);
base.Tick(); base.Tick();
Console.WriteLine(Velocity.X.ToString() + ", " + Velocity.Y.ToString() + ", " + Velocity.Z.ToString()); Console.WriteLine(Velocity.X.ToString() + ", " + Velocity.Y.ToString() + ", " + Velocity.Z.ToString());
@@ -92,6 +104,16 @@ namespace Voxel
Camera.Position = Vector3.Lerp(previousPosition, Position, alpha) + Vector3.UnitY * 0.62f; Camera.Position = Vector3.Lerp(previousPosition, Position, alpha) + Vector3.UnitY * 0.62f;
Rotation = Camera.Yaw; Rotation = Camera.Yaw;
if (_isSprinting)
{
Camera.TargetFOV = 70;
Camera.UpdateProjection();
}
else
{
Camera.TargetFOV = 60;
}
if (lastClick > 0) if (lastClick > 0)
{ {
lastClick -= deltaTime; lastClick -= deltaTime;
@@ -104,7 +126,7 @@ namespace Voxel
} }
} }
public void ApplyWalkSpeed(float x, float z, bool sprinting) public void ApplyWalkSpeed(float x, float z)
{ {
Vector3 inputDir = new Vector3(x, 0, z); Vector3 inputDir = new Vector3(x, 0, z);
if (inputDir.LengthSquared > 0) if (inputDir.LengthSquared > 0)
@@ -120,15 +142,32 @@ namespace Voxel
inputDir.X * sin + inputDir.Z * cos inputDir.X * sin + inputDir.Z * cos
); );
float speed = sprinting ? 0.13f : 0.10f; float M_t = _isSprinting ? 1.3f : 1f;
float groundMultiplier = 0.6f;
Velocity += worldDir * speed; if (!OnGround)
{
Vector3 airAccel = worldDir * 0.02f * M_t;
Velocity = new Vector3(Velocity.X + airAccel.X, Velocity.Y, Velocity.Z + airAccel.Z);
}
else
{
Vector3 groundAccel = worldDir * 0.1f * M_t;
Velocity = new Vector3(Velocity.X * groundMultiplier + groundAccel.X,
Velocity.Y,
Velocity.Z * groundMultiplier + groundAccel.Z);
}
} }
public void SwitchBlock(bool inverted) public void SwitchBlock(MouseWheelEventArgs e)
{ {
var keys = BlockDefinitions.Blocks.Keys.ToList(); var keys = BlockDefinitions.Blocks.Keys.ToList();
bool inverted = false;
if (e.OffsetY < 0)
inverted = true;
if (inverted) if (inverted)
if (_blockIndex == 0) if (_blockIndex == 0)
_blockIndex = keys.Count -1; _blockIndex = keys.Count -1;

View File

@@ -47,6 +47,7 @@ internal class Program
window.Tick += player.Tick; window.Tick += player.Tick;
window.Update += player.Update; window.Update += player.Update;
window.Update += Camera.UpdateFOV;
window.Run(); window.Run();
} }

View File

@@ -73,7 +73,7 @@ namespace Voxel
{ {
base.OnFramebufferResize(e); base.OnFramebufferResize(e);
Camera.UpdateProjection(e.Width, e.Height); Camera.UpdateSize(e.Width, e.Height);
GL.Viewport(0, 0, e.Width, e.Height); GL.Viewport(0, 0, e.Width, e.Height);
} }
@@ -92,7 +92,7 @@ namespace Voxel
CursorState = CursorState.Grabbed; CursorState = CursorState.Grabbed;
VSync = VSyncMode.On; VSync = VSyncMode.On;
Camera.UpdateProjection(Width, Height); Camera.UpdateSize(Width, Height);
} }
protected override void OnMouseMove(MouseMoveEventArgs e) protected override void OnMouseMove(MouseMoveEventArgs e)
@@ -129,11 +129,7 @@ namespace Voxel
protected override void OnMouseWheel(MouseWheelEventArgs e) protected override void OnMouseWheel(MouseWheelEventArgs e)
{ {
base.OnMouseWheel(e); base.OnMouseWheel(e);
Input.MouseWheel(e);
bool inverted = false;
if (e.OffsetY < 0)
inverted = true;
} }
} }
} }