diff --git a/Assets/Scripts/GameCamera.cs b/Assets/Scripts/GameCamera.cs index b6082697e..e81377fa4 100644 --- a/Assets/Scripts/GameCamera.cs +++ b/Assets/Scripts/GameCamera.cs @@ -15,6 +15,7 @@ namespace HeavenStudio private List positionEvents = new List(); private List rotationEvents = new List(); private List scaleEvents = new List(); + private List shakeEvents = new List(); /** default cam position, for quick-resetting @@ -30,6 +31,7 @@ namespace HeavenStudio private static Vector3 position; private static Vector3 rotEluer; private static Vector3 scale; + private static Vector3 shakeResult; /** camera's last transformation @@ -38,6 +40,7 @@ namespace HeavenStudio private static Vector3 positionLast; private static Vector3 rotEluerLast; private static Vector3 scaleLast; + private static Vector3 shakeLast; /** transformations to apply *after* the global transform, @@ -89,20 +92,27 @@ namespace HeavenStudio rotationEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "rotate camera" }); positionEvents.AddRange(EventCaller.GetAllInGameManagerList("gameManager", new string[] { "rotate camera" })); + //screen shake time baybee + + shakeEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "screen shake" }); + + //scale (TODO) // scaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale camera" }); UpdateCameraTranslate(); UpdateCameraRotate(); + SetShakeIntensity(); } private void Update() { UpdateCameraTranslate(); UpdateCameraRotate(); + SetShakeIntensity(); Camera cam = GetCamera(); - cam.transform.localPosition = position + additionalPosition; + cam.transform.localPosition = position + additionalPosition + shakeResult; cam.transform.eulerAngles = rotEluer + additionalRotEluer; cam.transform.localScale = Vector3.Scale(scale, additionalScale); } @@ -147,6 +157,26 @@ namespace HeavenStudio } } + //scren shake spaghetti + private void SetShakeIntensity() + { + foreach (var e in shakeEvents) + { + float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length); + if (prog >= 0f) + { + EasingFunction.Function func = EasingFunction.GetEasingFunction(e.ease); + float dx = func(positionLast.x, e.valA, Mathf.Min(prog, 1f)); + float dy = func(positionLast.y, e.valA, Mathf.Min(prog, 1f)); + shakeResult = new Vector3(dx, dy); + } + if (prog > 1f) + { + shakeLast = new Vector3(e.valA, e.valA); + } + } + } + public static void ResetTransforms() { position = defaultPosition; diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs index cdb9132ef..08d3ecda1 100644 --- a/Assets/Scripts/Minigames.cs +++ b/Assets/Scripts/Minigames.cs @@ -332,6 +332,14 @@ namespace HeavenStudio new Param("ease", EasingFunction.Ease.Linear, "Ease") }, hidden: false ), + new GameAction("screen shake", delegate + { + //TODO: move cam + }, 1f, true, new List() + { + new Param("valA", new EntityTypes.Float(0, 50, 10), "Intensity") + } ), + new GameAction("move camera", delegate { //TODO: move cam