/ godot / nodes / Fighter.cs
Fighter.cs
 1  using Godot;
 2  using Game.Util;
 3  
 4  namespace Game.Nodes;
 5  
 6  public partial class Fighter : CharacterBody3D
 7  {
 8  	private static Vector3 MaxVelocity = new(5.0f, 5.0f, 5.0f);
 9  	
10  	[Export]
11  	public float DashSpeed { get; set; } = 15.0f;
12  	[Export]
13  	public float Speed { get; set; } = 5.0f;
14  	[Export]
15  	public float FrictionModifier { get; set; } = 2.0f;
16  	
17  	public bool Active { get; set; }
18  	public int Life { get; set; } = 1000;
19  	public bool MirrorInputs { get; set; }
20  	public Fighter Opponent { get; set; }
21  	
22  	public override void _PhysicsProcess(double delta)
23  	{
24  		var felta = (float)delta;
25  		var velocity = Velocity;
26  		
27  		LookAt(Opponent.GlobalPosition);
28  		
29  		velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed * FrictionModifier * felta);
30  		velocity.Z = Mathf.MoveToward(Velocity.Z, 0, Speed * FrictionModifier * felta);
31  		
32  		if (!IsOnFloor())
33  			velocity += GetGravity() * felta;
34  		
35  		Velocity = velocity.Clamp(-MaxVelocity, MaxVelocity);
36  		MoveAndSlide();
37  	}
38  	
39  	public override void _Ready() {}
40  	
41  	public void HandleFightInput(FightInput fightInput)
42  	{
43  		var vector = fightInput switch
44  		{
45  			FightInput.MoveBackward => Vector3.Back,
46  			FightInput.MoveDashBackward => Vector3.Back,
47  			FightInput.MoveLeft => Vector3.Left,
48  			FightInput.MoveRight => Vector3.Right,
49  			_ => Vector3.Forward,
50  		};
51  		
52  		var speed = fightInput switch
53  		{
54  			FightInput.MoveDashBackward => Speed * 2,
55  			FightInput.MoveDashForward => Speed * 2,
56  			_ => Speed,
57  		};
58  		
59  		if(fightInput != FightInput.Neutral)
60  			Velocity = (GlobalBasis * vector).Normalized() * speed;
61  	}
62  }