Merge pull request #149 from ThatZeoMan/screen-shake

Screen shake event (VFX)
This commit is contained in:
minenice55 2022-08-17 15:53:45 -04:00 committed by GitHub
commit c01798471f
2 changed files with 43 additions and 1 deletions

View File

@ -15,6 +15,7 @@ namespace HeavenStudio
private List<Beatmap.Entity> positionEvents = new List<Beatmap.Entity>(); private List<Beatmap.Entity> positionEvents = new List<Beatmap.Entity>();
private List<Beatmap.Entity> rotationEvents = new List<Beatmap.Entity>(); private List<Beatmap.Entity> rotationEvents = new List<Beatmap.Entity>();
private List<Beatmap.Entity> scaleEvents = new List<Beatmap.Entity>(); private List<Beatmap.Entity> scaleEvents = new List<Beatmap.Entity>();
private List<Beatmap.Entity> shakeEvents = new List<Beatmap.Entity>();
/** /**
default cam position, for quick-resetting default cam position, for quick-resetting
@ -22,6 +23,7 @@ namespace HeavenStudio
public static Vector3 defaultPosition = new Vector3(0, 0, -10); public static Vector3 defaultPosition = new Vector3(0, 0, -10);
public static Vector3 defaultRotEluer = new Vector3(0, 0, 0); public static Vector3 defaultRotEluer = new Vector3(0, 0, 0);
public static Vector3 defaultScale = new Vector3(16, 9, 1); public static Vector3 defaultScale = new Vector3(16, 9, 1);
public static Vector3 defaultShake = new Vector3(0, 0, 0);
/** /**
camera's current transformation camera's current transformation
@ -30,6 +32,7 @@ namespace HeavenStudio
private static Vector3 position; private static Vector3 position;
private static Vector3 rotEluer; private static Vector3 rotEluer;
private static Vector3 scale; private static Vector3 scale;
private static Vector3 shakeResult;
/** /**
camera's last transformation camera's last transformation
@ -38,6 +41,7 @@ namespace HeavenStudio
private static Vector3 positionLast; private static Vector3 positionLast;
private static Vector3 rotEluerLast; private static Vector3 rotEluerLast;
private static Vector3 scaleLast; private static Vector3 scaleLast;
private static Vector3 shakeLast;
/** /**
transformations to apply *after* the global transform, transformations to apply *after* the global transform,
@ -89,20 +93,27 @@ namespace HeavenStudio
rotationEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "rotate camera" }); rotationEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "rotate camera" });
positionEvents.AddRange(EventCaller.GetAllInGameManagerList("gameManager", 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) //scale (TODO)
// scaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale camera" }); // scaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale camera" });
UpdateCameraTranslate(); UpdateCameraTranslate();
UpdateCameraRotate(); UpdateCameraRotate();
SetShakeIntensity();
} }
private void Update() private void Update()
{ {
UpdateCameraTranslate(); UpdateCameraTranslate();
UpdateCameraRotate(); UpdateCameraRotate();
SetShakeIntensity();
Camera cam = GetCamera(); Camera cam = GetCamera();
cam.transform.localPosition = position + additionalPosition; cam.transform.localPosition = position + additionalPosition + shakeResult;
cam.transform.eulerAngles = rotEluer + additionalRotEluer; cam.transform.eulerAngles = rotEluer + additionalRotEluer;
cam.transform.localScale = Vector3.Scale(scale, additionalScale); cam.transform.localScale = Vector3.Scale(scale, additionalScale);
} }
@ -139,6 +150,7 @@ namespace HeavenStudio
float dy = func(rotEluerLast.y, e.valB, Mathf.Min(prog, 1f)); float dy = func(rotEluerLast.y, e.valB, Mathf.Min(prog, 1f));
float dz = func(rotEluerLast.z, e.valC, Mathf.Min(prog, 1f)); float dz = func(rotEluerLast.z, e.valC, Mathf.Min(prog, 1f));
rotEluer = new Vector3(dx, dy, dz); rotEluer = new Vector3(dx, dy, dz);
} }
if (prog > 1f) if (prog > 1f)
{ {
@ -147,11 +159,33 @@ 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(Mathf.Cos(dx * e.length * 20f) * (e.valA / 2), Mathf.Cos(dy * e.length * 30f) * (e.valA / 2));
}
if (prog > 1f)
{
shakeResult = new Vector3(0, 0);
}
}
}
public static void ResetTransforms() public static void ResetTransforms()
{ {
position = defaultPosition; position = defaultPosition;
rotEluer = defaultRotEluer; rotEluer = defaultRotEluer;
scale = defaultScale; scale = defaultScale;
shakeResult = defaultShake;
} }
public static void ResetAdditionalTransforms() public static void ResetAdditionalTransforms()

View File

@ -332,6 +332,14 @@ namespace HeavenStudio
new Param("ease", EasingFunction.Ease.Linear, "Ease") new Param("ease", EasingFunction.Ease.Linear, "Ease")
}, hidden: false ), }, hidden: false ),
new GameAction("screen shake", delegate
{
//TODO: move cam
}, 1f, true, new List<Param>()
{
new Param("valA", new EntityTypes.Float(0, 10, 2), "Intensity")
} ),
new GameAction("move camera", delegate new GameAction("move camera", delegate
{ {
//TODO: move cam //TODO: move cam