at main 1.1 kB view raw
1using System.Numerics; 2 3namespace Electropunk.World; 4 5public class MovementMode 6{ 7 public bool Frozen = false; 8 public bool Collides = true; 9 public float MinSpeed = 0.10f; 10 public float Friction = 1.50f; 11 public float SpeedMod = 0.00f; 12 13 public void Move(Level level, Entity e) 14 { 15 if (Frozen) 16 return; 17 18 Vector2 delta = e.Vel * (e.Speed + SpeedMod) * Program.DeltaTime; 19 20 if (Collides) 21 { 22 if (delta.X != 0 && !e.CanMoveInDirection(level, new(delta.X, 0))) 23 delta.X = 0; 24 if (delta.Y != 0 && !e.CanMoveInDirection(level, new(0, delta.Y))) 25 delta.Y = 0; 26 } 27 28 e.Pos += delta; 29 30 if (e.Vel.X > -MinSpeed && e.Vel.X < MinSpeed) 31 e.Vel.X = 0; 32 else if (e.Vel.X != 0) 33 e.Vel.X /= Friction; 34 35 if (e.Vel.Y > -MinSpeed && e.Vel.Y < MinSpeed) 36 e.Vel.Y = 0; 37 else if (e.Vel.Y != 0) 38 e.Vel.Y /= Friction; 39 } 40 41 public static readonly MovementMode None = new() { Frozen = true }; 42 public static readonly MovementMode Default = new(); 43 public static readonly MovementMode Flying = new() { 44 Collides = false, 45 Friction = 1.05f, 46 SpeedMod = 0.25f 47 }; 48}