From c06b4b3c70d8b2d6a660b1aee19df5fef5b08981 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 23 Apr 2010 19:05:08 +1200 Subject: [PATCH] make radar bin into widgets --- OpenRA.Game/Chrome.cs | 147 +---------------------- OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Widgets/RadarBinWidget.cs | 164 ++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 146 deletions(-) create mode 100644 OpenRA.Game/Widgets/RadarBinWidget.cs diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index b525ec459f..17b0f70ff7 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -39,25 +39,9 @@ namespace OpenRA SpriteRenderer shpRenderer { get { return renderer.WorldSpriteRenderer; } } string chromeCollection; - string radarCollection; readonly List>> buttons = new List>>(); - // Radar - static float2 radarOpenOrigin = new float2(Game.viewport.Width - 215, 29); - static float2 radarClosedOrigin = new float2(Game.viewport.Width - 215, -166); - static float2 radarOrigin = radarClosedOrigin; - float radarMinimapHeight; - const int radarSlideAnimationLength = 15; - const int radarActivateAnimationLength = 5; - int radarAnimationFrame = 0; - bool radarAnimating = false; - bool hasRadar = false; - - // Power bar - static float2 powerOrigin = new float2(42, 205); // Relative to radarOrigin - static Size powerSize = new Size(138,5); - internal MapStub currentMap; public Chrome(Renderer r, Manifest m) @@ -87,23 +71,14 @@ namespace OpenRA if (worldTooltipTicks < worldTooltipDelay) ++worldTooltipTicks; - rootWidget.Tick(world); - - TickRadarAnimation(); + rootWidget.Tick(world); } public void Draw( World world ) { - radarCollection = "radar-" + world.LocalPlayer.Country.Race; - buttons.Clear(); - renderer.Device.DisableScissor(); - DrawRadar( world ); - DrawPower( world ); - rgbaRenderer.Flush(); - var typingArea = new Rectangle(240, Game.viewport.Height - 30, Game.viewport.Width - 420, 30); var chatLogArea = new Rectangle(240, Game.viewport.Height - 500, Game.viewport.Width - 420, 500 - 40); DrawChat(typingArea, chatLogArea); @@ -372,128 +347,8 @@ namespace OpenRA // block clicks `through` the dialog AddButton(r, _ => { }); } - - public void TickRadarAnimation() - { - if (!radarAnimating) - return; - - // Increment frame - if (hasRadar) - radarAnimationFrame++; - else - radarAnimationFrame--; - - // Calculate radar bin position - if (radarAnimationFrame <= radarSlideAnimationLength) - radarOrigin = float2.Lerp(radarClosedOrigin, radarOpenOrigin, radarAnimationFrame * 1.0f / radarSlideAnimationLength); - - var eva = Rules.Info["world"].Traits.Get(); - - // Play radar-on sound at the start of the activate anim (open) - if (radarAnimationFrame == radarSlideAnimationLength && hasRadar) - Sound.Play(eva.RadarUp); - - // Play radar-on sound at the start of the activate anim (close) - if (radarAnimationFrame == radarSlideAnimationLength + radarActivateAnimationLength - 1 && !hasRadar) - Sound.Play(eva.RadarDown); - - // Minimap height - if (radarAnimationFrame >= radarSlideAnimationLength) - radarMinimapHeight = float2.Lerp(0, 192, (radarAnimationFrame - radarSlideAnimationLength) * 1.0f / radarActivateAnimationLength); - - // Animation is complete - if ((radarAnimationFrame == 0 && !hasRadar) - || (radarAnimationFrame == radarSlideAnimationLength + radarActivateAnimationLength && hasRadar)) - { - radarAnimating = false; - } - } - - void DrawRadar( World world ) - { - var hasNewRadar = world.Queries.OwnedBy[world.LocalPlayer] - .WithTrait() - .Any(a => a.Trait.IsActive); - - if (hasNewRadar != hasRadar) - { - radarAnimating = true; - } - - hasRadar = hasNewRadar; - - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, "chrome"); - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), "chrome"); - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), "chrome"); - - if (radarAnimating) - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), "chrome"); - - rgbaRenderer.Flush(); - - if (radarAnimationFrame >= radarSlideAnimationLength) - { - RectangleF mapRect = new RectangleF(radarOrigin.X + 9, radarOrigin.Y+(192-radarMinimapHeight)/2, 192, radarMinimapHeight); - world.Minimap.Draw(mapRect, false); - } - } void AddButton(RectangleF r, Action b) { buttons.Add(Pair.New(r, b)); } - - float? lastPowerProvidedPos; - float? lastPowerDrainedPos; - - void DrawPower( World world ) - { - // Nothing to draw - if (world.LocalPlayer.PowerProvided == 0 && world.LocalPlayer.PowerDrained == 0) - return; - - // Draw bar horizontally - var barStart = powerOrigin + radarOrigin; - var barEnd = barStart + new float2(powerSize.Width, 0); - - float powerScaleBy = 100; - var maxPower = Math.Max(world.LocalPlayer.PowerProvided, world.LocalPlayer.PowerDrained); - while (maxPower >= powerScaleBy) powerScaleBy *= 2; - - // Current power supply - var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerProvided / powerScaleBy); - lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f); - float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); - - var color = Color.LimeGreen; - if (world.LocalPlayer.GetPowerState() == PowerState.Low) - color = Color.Orange; - if (world.LocalPlayer.GetPowerState() == PowerState.Critical) - color = Color.Red; - - var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black); - for (int i = 0; i < powerSize.Height; i++) - { - color = (i-1 < powerSize.Height/2) ? color : colorDark; - float2 leftOffset = new float2(0,i); - float2 rightOffset = new float2(0,i); - // Indent corners - if ((i == 0 || i == powerSize.Height - 1) && powerLevel.X - barStart.X > 1) - { - leftOffset.X += 1; - rightOffset.X -= 1; - } - lineRenderer.DrawLine(Game.viewport.Location + barStart + leftOffset, Game.viewport.Location + powerLevel + rightOffset, color, color); - } - lineRenderer.Flush(); - - // Power usage indicator - var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-indicator"); - var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerDrained / powerScaleBy); - lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); - float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1); - - rgbaRenderer.DrawSprite(indicator, powerDrainLevel, "chrome"); - rgbaRenderer.Flush(); - } void DrawDialogBackground(Rectangle r, string collection) { diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 574419dde8..e9cee78f9c 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -91,6 +91,7 @@ + diff --git a/OpenRA.Game/Widgets/RadarBinWidget.cs b/OpenRA.Game/Widgets/RadarBinWidget.cs new file mode 100644 index 0000000000..10910698c9 --- /dev/null +++ b/OpenRA.Game/Widgets/RadarBinWidget.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using OpenRA.Traits; +using OpenRA.Graphics; + +namespace OpenRA.Widgets +{ + public class RadarBinWidget : Widget + { + // Radar + static float2 radarOpenOrigin = new float2(Game.viewport.Width - 215, 29); + static float2 radarClosedOrigin = new float2(Game.viewport.Width - 215, -166); + static float2 radarOrigin = radarClosedOrigin; + float radarMinimapHeight; + const int radarSlideAnimationLength = 15; + const int radarActivateAnimationLength = 5; + int radarAnimationFrame = 0; + bool radarAnimating = false; + bool hasRadar = false; + + // Power bar + static float2 powerOrigin = new float2(42, 205); // Relative to radarOrigin + static Size powerSize = new Size(138, 5); + float? lastPowerProvidedPos; + float? lastPowerDrainedPos; + + string radarCollection; + + public override void Draw(World world) + { + DrawRadar(world); + DrawPower(world); + } + + public override void Tick(World world) + { + radarCollection = "radar-" + world.LocalPlayer.Country.Race; + + if (!radarAnimating) + return; + + // Increment frame + if (hasRadar) + radarAnimationFrame++; + else + radarAnimationFrame--; + + // Calculate radar bin position + if (radarAnimationFrame <= radarSlideAnimationLength) + radarOrigin = float2.Lerp(radarClosedOrigin, radarOpenOrigin, radarAnimationFrame * 1.0f / radarSlideAnimationLength); + + var eva = Rules.Info["world"].Traits.Get(); + + // Play radar-on sound at the start of the activate anim (open) + if (radarAnimationFrame == radarSlideAnimationLength && hasRadar) + Sound.Play(eva.RadarUp); + + // Play radar-on sound at the start of the activate anim (close) + if (radarAnimationFrame == radarSlideAnimationLength + radarActivateAnimationLength - 1 && !hasRadar) + Sound.Play(eva.RadarDown); + + // Minimap height + if (radarAnimationFrame >= radarSlideAnimationLength) + radarMinimapHeight = float2.Lerp(0, 192, (radarAnimationFrame - radarSlideAnimationLength) * 1.0f / radarActivateAnimationLength); + + // Animation is complete + if ((radarAnimationFrame == 0 && !hasRadar) + || (radarAnimationFrame == radarSlideAnimationLength + radarActivateAnimationLength && hasRadar)) + { + radarAnimating = false; + } + } + + void DrawRadar(World world) + { + var hasNewRadar = world.Queries.OwnedBy[world.LocalPlayer] + .WithTrait() + .Any(a => a.Trait.IsActive); + + if (hasNewRadar != hasRadar) + { + radarAnimating = true; + } + + hasRadar = hasNewRadar; + + var renderer = Game.chrome.renderer; + var rgbaRenderer = renderer.RgbaSpriteRenderer; + + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, "chrome"); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), "chrome"); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), "chrome"); + + if (radarAnimating) + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), "chrome"); + + rgbaRenderer.Flush(); + + if (radarAnimationFrame >= radarSlideAnimationLength) + { + RectangleF mapRect = new RectangleF(radarOrigin.X + 9, radarOrigin.Y + (192 - radarMinimapHeight) / 2, 192, radarMinimapHeight); + world.Minimap.Draw(mapRect, false); + } + } + + void DrawPower(World world) + { + // Nothing to draw + if (world.LocalPlayer.PowerProvided == 0 && world.LocalPlayer.PowerDrained == 0) + return; + + var renderer = Game.chrome.renderer; + var lineRenderer = Game.chrome.lineRenderer; + var rgbaRenderer = renderer.RgbaSpriteRenderer; + + // Draw bar horizontally + var barStart = powerOrigin + radarOrigin; + var barEnd = barStart + new float2(powerSize.Width, 0); + + float powerScaleBy = 100; + var maxPower = Math.Max(world.LocalPlayer.PowerProvided, world.LocalPlayer.PowerDrained); + while (maxPower >= powerScaleBy) powerScaleBy *= 2; + + // Current power supply + var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerProvided / powerScaleBy); + lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f); + float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); + + var color = Color.LimeGreen; + if (world.LocalPlayer.GetPowerState() == PowerState.Low) + color = Color.Orange; + if (world.LocalPlayer.GetPowerState() == PowerState.Critical) + color = Color.Red; + + var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black); + for (int i = 0; i < powerSize.Height; i++) + { + color = (i - 1 < powerSize.Height / 2) ? color : colorDark; + float2 leftOffset = new float2(0, i); + float2 rightOffset = new float2(0, i); + // Indent corners + if ((i == 0 || i == powerSize.Height - 1) && powerLevel.X - barStart.X > 1) + { + leftOffset.X += 1; + rightOffset.X -= 1; + } + lineRenderer.DrawLine(Game.viewport.Location + barStart + leftOffset, Game.viewport.Location + powerLevel + rightOffset, color, color); + } + lineRenderer.Flush(); + + // Power usage indicator + var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-indicator"); + var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerDrained / powerScaleBy); + lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); + float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value - indicator.size.X / 2, barStart.Y - 1); + + rgbaRenderer.DrawSprite(indicator, powerDrainLevel, "chrome"); + rgbaRenderer.Flush(); + } + } +}