1using System.Numerics;
2
3namespace Fjord.Scenes;
4
5public class SceneCamera
6{
7 public Entity? Target;
8 private Vector2 CoreOffset = new();
9 public Vector2 Offset = new();
10 public float Lag = 1;
11 public float CameraShakeIntensity = 1f;
12 public float CameraShakeLife = 0f;
13 public float CameraShakeLifeMax = 0f;
14 private Scene parentScene;
15
16 public SceneCamera(Scene parent)
17 {
18 this.parentScene = parent;
19 }
20
21 public void SetTarget(Entity target)
22 {
23 this.Target = target;
24 }
25
26 public void SetLag(float lag)
27 {
28 this.Lag = lag;
29 }
30
31 public void SetCameraShake(float life, float intensity)
32 {
33 this.CameraShakeLife = life;
34 this.CameraShakeLifeMax = life;
35 this.CameraShakeIntensity = intensity;
36 }
37
38 public void Update(Vector2 WindowSize)
39 {
40 if(Target != null)
41 {
42 CoreOffset += ((((Target.Get<Transform>().Position - WindowSize / 2) - CoreOffset) / Lag) * 500) * parentScene.DeltaTime;
43 }
44
45 if(CameraShakeLife > 0f)
46 {
47 Random random = new();
48 Offset = Vector2.Add(
49 CoreOffset,
50 new(
51 ((float)(random.NextDouble() - 0.5) * CameraShakeIntensity) * (CameraShakeLife / CameraShakeLifeMax),
52 ((float)(random.NextDouble() - 0.5) * CameraShakeIntensity) * (CameraShakeLife / CameraShakeLifeMax)
53 )
54 );
55 CameraShakeLife -= 100 * (float)Game.DeltaTime;
56 } else
57 {
58 Offset = CoreOffset;
59 }
60 }
61}