116 lines
3.0 KiB
C#
116 lines
3.0 KiB
C#
using OpenTK.Mathematics;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Voxel
|
|
{
|
|
public class Entity
|
|
{
|
|
public Vector3 Position;
|
|
public Vector3 Velocity;
|
|
public bool OnGround;
|
|
public float Rotation;
|
|
|
|
public float Width;
|
|
public float Height;
|
|
|
|
private float _gravity = 0.08f;
|
|
private float _terminalVelocity = -3.92f;
|
|
private float _airMultiplier = 0.91f;
|
|
private float _yMultiplier = 0.98f;
|
|
private float _groundMultiplier = 0.6f;
|
|
|
|
protected World _world;
|
|
|
|
public Entity(Vector3 position, float width, float height, World world)
|
|
{
|
|
Position = position;
|
|
Width = width;
|
|
Height = height;
|
|
_world = world;
|
|
}
|
|
|
|
public void Tick()
|
|
{
|
|
Move();
|
|
|
|
if (!OnGround)
|
|
{
|
|
Vector3 acceleration = new Vector3(0, -_gravity, 0);
|
|
Velocity += acceleration;
|
|
Velocity.X *= _airMultiplier;
|
|
Velocity.Z *= _airMultiplier;
|
|
Velocity.Y *= _yMultiplier;
|
|
|
|
|
|
if (Velocity.Y < _terminalVelocity)
|
|
{
|
|
Velocity.Y = _terminalVelocity;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Velocity = new Vector3(Velocity.X * _groundMultiplier, 0f, Velocity.Z * _groundMultiplier);
|
|
}
|
|
}
|
|
|
|
public void Move()
|
|
{
|
|
Vector3 moveVector = Velocity;
|
|
Vector3 originalVector = moveVector;
|
|
|
|
AABB body = AABB.FromCenter(Position, Width, Height, Width);
|
|
|
|
List<AABB> collisionChecks = _world.GetColliders(body.Expand(Velocity.X, Velocity.Y, Velocity.Z).Grow(1,1,1));
|
|
|
|
foreach (AABB collider in collisionChecks)
|
|
{
|
|
moveVector.X = body.GetClipX(collider, moveVector.X);
|
|
}
|
|
|
|
body.Move(moveVector.X, 0, 0);
|
|
|
|
foreach (AABB collider in collisionChecks)
|
|
{
|
|
moveVector.Y = body.GetClipY(collider, moveVector.Y);
|
|
}
|
|
|
|
body.Move(0, moveVector.Y, 0);
|
|
|
|
foreach (AABB collider in collisionChecks)
|
|
{
|
|
moveVector.Z = body.GetClipZ(collider, moveVector.Z);
|
|
}
|
|
|
|
body.Move(0, 0, moveVector.Z);
|
|
|
|
if (moveVector.X != originalVector.X)
|
|
{
|
|
Velocity.X = 0;
|
|
}
|
|
|
|
if (moveVector.Y != originalVector.Y)
|
|
{
|
|
Velocity.Y = 0;
|
|
}
|
|
|
|
if (moveVector.Z != originalVector.Z)
|
|
{
|
|
Velocity.Z = 0;
|
|
}
|
|
|
|
OnGround = moveVector.Y != originalVector.Y && originalVector.Y < 0;
|
|
|
|
Position = body.GetCenter();
|
|
}
|
|
|
|
public void ApplyImpulse(Vector3 force)
|
|
{
|
|
Velocity += force;
|
|
}
|
|
}
|
|
} |