diff --git a/OpenRa.Game/Traits/Building.cs b/OpenRa.Game/Traits/Building.cs index cd11bd74f1..13805c908a 100644 --- a/OpenRa.Game/Traits/Building.cs +++ b/OpenRa.Game/Traits/Building.cs @@ -94,7 +94,7 @@ namespace OpenRa.Traits { if (e.DamageState == DamageState.Dead) { - ScreenShaker.RegisterShakeEffect(10, self.Location.ToFloat2()*new float2(24, 24), 3); + ScreenShaker.RegisterShakeEffect(10, self.CenterLocation, 1); Sound.Play("kaboom22.aud"); } } diff --git a/OpenRa.Game/Traits/World/ScreenShaker.cs b/OpenRa.Game/Traits/World/ScreenShaker.cs index 480ab33e6e..7ea8f3a72c 100644 --- a/OpenRa.Game/Traits/World/ScreenShaker.cs +++ b/OpenRa.Game/Traits/World/ScreenShaker.cs @@ -1,5 +1,6 @@ -using System; +using System; +using System.Linq; using OpenRa.Traits; using System.Collections.Generic; using OpenRa.FileFormats; @@ -13,8 +14,8 @@ namespace OpenRa.Traits public class ScreenShaker : ITick { - int ticks = 0; - private static List> shakeEffects = new List>(); + static int ticks = 0; + static List> shakeEffects = new List>(); public ScreenShaker (Actor self){} @@ -25,18 +26,10 @@ namespace OpenRa.Traits ticks++; } - private void UpdateList() + void UpdateList() { - var toRemove = new List>(); - - for (int i = 0; i < shakeEffects.Count; i++){ - var tuple = shakeEffects[i]; - tuple.a = tuple.a - 1; - shakeEffects[i] = tuple; - - if (tuple.a == 0) - toRemove.Add(tuple); - } + var toRemove = new List>(); + shakeEffects.RemoveAll(t => t.a == ticks); foreach(Tuple t in toRemove){ shakeEffects.Remove(t); @@ -45,7 +38,7 @@ namespace OpenRa.Traits public static void RegisterShakeEffect(int time, float2 position, int intensity) { - shakeEffects.Add(Tuple.New(time, position, intensity)); + shakeEffects.Add(Tuple.New(ticks + time, position, intensity)); } public float2 getScrollOffset() @@ -53,17 +46,19 @@ namespace OpenRa.Traits int xFreq = 4; int yFreq = 5; - return GetIntensity() * new float2( (float) Math.Sin((ticks*2*Math.PI)/xFreq) , (float) Math.Cos((ticks*2*Math.PI)/yFreq)); + return GetIntensity() * new float2( + (float) Math.Sin((ticks*2*Math.PI)/xFreq) , + (float) Math.Cos((ticks*2*Math.PI)/yFreq)); } public float GetIntensity() - { - float intensity = 0; - foreach(Tuple tuple in shakeEffects) - { - intensity += (24*24*100*tuple.c)/( (tuple.b.X - Game.viewport.Location.X) * (tuple.b.X - Game.viewport.Location.X) - + (tuple.b.Y - Game.viewport.Location.Y) * (tuple.b.Y - Game.viewport.Location.Y) ); - } + { + var cp = Game.viewport.Location + + .5f * new float2(Game.viewport.Width, Game.viewport.Height); + + var intensity = 24 * 24 * 100 * shakeEffects.Sum( + e => e.c / (e.b - cp).LengthSquared); + return Math.Min(intensity, 10); }