From 4c5f02b801b21b104d7a267749420c8c7a3dd60e Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 5 Feb 2010 22:20:51 +1300 Subject: [PATCH] Unfail dialog drawing --- OpenRa.Game/Chrome.cs | 117 +++++++++++++++--------------------------- chrome.xml | 29 +++++++---- dialog.png | Bin 0 -> 20091 bytes 3 files changed, 61 insertions(+), 85 deletions(-) create mode 100644 dialog.png diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index e4a2a97375..16f4155ede 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -29,9 +29,7 @@ namespace OpenRa // Options menu (to be refactored) bool optionsPressed = false; - readonly Sprite[] optionsSprites; - readonly Sprite[] panelSprites; - + // Buttons readonly Animation repairButton; readonly Animation sellButton; @@ -98,25 +96,6 @@ namespace OpenRa optionsButton = new Animation("tabs"); optionsButton.PlayRepeating("left-normal"); - optionsSprites = new[] - { - SpriteSheetBuilder.LoadAllSprites("dd-top")[0], - SpriteSheetBuilder.LoadAllSprites("dd-botm")[0], - - SpriteSheetBuilder.LoadAllSprites("dd-left")[0], - SpriteSheetBuilder.LoadAllSprites("dd-right")[0], - - SpriteSheetBuilder.LoadAllSprites("dd-crnr")[0], - SpriteSheetBuilder.LoadAllSprites("dd-crnr")[1], - SpriteSheetBuilder.LoadAllSprites("dd-crnr")[2], - SpriteSheetBuilder.LoadAllSprites("dd-crnr")[3], - - SpriteSheetBuilder.LoadAllSprites("dd-bkgnd")[0], - }; - - panelSprites = Graphics.Util.MakeArray(8, - n => ChromeProvider.GetImage(renderer, "panel", n.ToString())); - tabSprites = Rules.Info.Values .Where(u => u.Traits.Contains()) .ToDictionary( @@ -211,7 +190,7 @@ namespace OpenRa return; var r = new Rectangle((Game.viewport.Width - 400) / 2, Game.viewport.Height - 110, 400, 100); - DrawDialogBackground(r, optionsSprites, true); + DrawDialogBackground(r, "dialog"); DrawCentered("Downloading: {0} (+{1} more)".F( PackageDownloader.CurrentPackage.Split(':')[0], @@ -220,7 +199,7 @@ namespace OpenRa Color.White); DrawDialogBackground(new Rectangle(r.Left + 30, r.Top + 50, r.Width - 60, 20), - panelSprites, false); + "panel"); var x1 = r.Left + 35; var x2 = r.Right - 35; @@ -240,7 +219,7 @@ namespace OpenRa var w = renderer.MeasureText(text).X + 120; var h = 100; var r = new Rectangle((Game.viewport.Width - w) / 2, (Game.viewport.Height - h) / 2, w, h); - DrawDialogBackground(r, optionsSprites, true); + DrawDialogBackground(r, "dialog"); DrawCentered(text, new int2(Game.viewport.Width / 2, Game.viewport.Height / 2 - 8), Color.White); // don't allow clicks through the dialog @@ -274,7 +253,7 @@ namespace OpenRa void AddUiButton(int2 pos, string text, Action a) { var rect = new Rectangle(pos.X - 160 / 2, pos.Y - 4, 160, 24); - DrawDialogBackground( rect, panelSprites, false ); + DrawDialogBackground( rect, "panel"); DrawCentered(text, new int2(pos.X, pos.Y), Color.White); AddButton(rect, a); } @@ -284,11 +263,11 @@ namespace OpenRa var w = 800; var h = 600; var r = new Rectangle( (Game.viewport.Width - w) / 2, (Game.viewport.Height - h) / 2, w, h ); - DrawDialogBackground(r, optionsSprites, true); + DrawDialogBackground(r, "dialog"); DrawCentered("Choose Map", new int2(r.Left + w / 2, r.Top + 20), Color.White); DrawDialogBackground(new Rectangle(r.Right - 200 - 160 / 2, - r.Bottom - 50 + 6, 160, 24), panelSprites, false); + r.Bottom - 50 + 6, 160, 24), "panel"); AddUiButton(new int2(r.Left + 200, r.Bottom - 40), "OK", _ => @@ -313,7 +292,7 @@ namespace OpenRa } var mapRect = new Rectangle(r.Right - 280, r.Top + 30, 256, 256); - DrawDialogBackground(mapRect, panelSprites, false); + DrawDialogBackground(mapRect, "panel"); rgbaRenderer.DrawSprite(mapChooserSprite, new float2(mapRect.Location) + new float2(4, 4), "chrome", @@ -326,7 +305,7 @@ namespace OpenRa { var itemRect = new Rectangle(r.Left + 50, y - 2, r.Width - 340, 20); if (map == currentMap) - DrawDialogBackground(itemRect, panelSprites, false); + DrawDialogBackground(itemRect, "panel"); renderer.DrawText(map.Map.Title, new int2(r.Left + 60, y), Color.White); var closureMap = map; @@ -390,16 +369,11 @@ namespace OpenRa var w = 800; var h = 600; var r = new Rectangle( (Game.viewport.Width - w) / 2, (Game.viewport.Height - h) / 2, w, h ); - DrawDialogBackground(r, optionsSprites, true); + DrawDialogBackground(r, "dialog"); DrawCentered("OpenRA Multiplayer Lobby", new int2(r.Left + w / 2, r.Top + 20), Color.White); - DrawDialogBackground(new Rectangle(r.Left + 20, r.Top + 40, r.Width - 357, r.Bottom - 273 - r.Top - 40), - panelSprites, false); - - DrawDialogBackground(new Rectangle(r.Right - 330, r.Top + 40, 310, r.Bottom - 273 - r.Top - 40), - panelSprites, false); - - var minimapRect = new Rectangle(r.Right - 325, r.Top + 45, 300, 240); + DrawDialogBackground(new Rectangle(r.Right - 324, r.Top + 43, 304, 244),"panel"); + var minimapRect = new Rectangle(r.Right - 322, r.Top + 45, 300, 240); world.Minimap.Update(); world.Minimap.Draw(minimapRect, true); @@ -407,23 +381,14 @@ namespace OpenRa if (Game.world.LocalPlayer.Index == 0) { // we are host - DrawDialogBackground(new Rectangle(minimapRect.Left + (minimapRect.Width - 160) / 2, - minimapRect.Bottom + 6, 160, 24), panelSprites, false); - - DrawCentered("Change Map...", new int2(minimapRect.Left + minimapRect.Width / 2, - minimapRect.Bottom + 10), Color.White); - - AddButton(new RectangleF(minimapRect.Left, minimapRect.Bottom, minimapRect.Width, 32), - isLmb => - { - if (isLmb) - { - showMapChooser = true; - currentMap = mapList.Value.Single( - m => m.Filename == Game.LobbyInfo.GlobalSettings.Map.ToLowerInvariant()); - mapPreviewDirty = true; - } - }); + AddUiButton(new int2(r.Right - 100, r.Top + 300), "Change Map", + _ => + { + showMapChooser = true; + currentMap = mapList.Value.Single( + m => m.Filename == Game.LobbyInfo.GlobalSettings.Map.ToLowerInvariant()); + mapPreviewDirty = true; + }); } renderer.DrawText2("Name", new int2(r.Left + 40, r.Top + 50), Color.White); @@ -441,9 +406,9 @@ namespace OpenRa { // todo: name editing var nameRect = new Rectangle(r.Left + 30, y - 2, 185, 22); - DrawDialogBackground(nameRect, panelSprites, false); + DrawDialogBackground(nameRect, "panel"); - DrawDialogBackground(paletteRect, panelSprites, false); + DrawDialogBackground(paletteRect, "panel"); AddButton(paletteRect, CyclePalette); // TODO: Render using the System.Drawing.Color (Player.PlayerColors[client.PaletteIndex].c) @@ -451,11 +416,11 @@ namespace OpenRa Player.PlayerColors[client.PaletteIndex].a); var raceRect = new Rectangle(r.Left + 290, y - 2, 65, 22); - DrawDialogBackground(raceRect, panelSprites, false); + DrawDialogBackground(raceRect, "panel"); AddButton(raceRect, CycleRace); var readyRect = new Rectangle(r.Left + 360, y - 2, 95, 22); - DrawDialogBackground(readyRect, panelSprites, false); + DrawDialogBackground(readyRect, "panel"); AddButton(readyRect, CycleReady); } @@ -475,8 +440,8 @@ namespace OpenRa var typingBox = new Rectangle(r.Left + 20, r.Bottom - 47, r.Width - 40, 27); var chatBox = new Rectangle(r.Left + 20, r.Bottom - 269, r.Width - 40, 220); - DrawDialogBackground(typingBox, panelSprites, false); - DrawDialogBackground(chatBox, panelSprites, false); + DrawDialogBackground(typingBox, "panel"); + DrawDialogBackground(chatBox, "panel"); DrawChat(typingBox, chatBox); @@ -728,39 +693,39 @@ namespace OpenRa var height = 300; DrawDialogBackground(new Rectangle((Game.viewport.Width - width)/ 2, (Game.viewport.Height-height) / 2, - width, height), optionsSprites, true); + width, height), "dialog"); } } - void DrawDialogBackground(Rectangle r, Sprite[] ss, bool isShp) + void DrawDialogBackground(Rectangle r, string collection) { renderer.Device.EnableScissor(r.Left, r.Top, r.Width, r.Height); - var sr = isShp ? shpRenderer : rgbaRenderer; - - if (ss.Length > 8) + string[] images = { "border-t", "border-b", "border-l", "border-r", "corner-tl", "corner-tr", "corner-bl", "corner-br", "background" }; + var ss = Graphics.Util.MakeArray(9, n => ChromeProvider.GetImage(renderer, collection,images[n])); + for( var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[8].size.X ) for( var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[8].size.Y ) - sr.DrawSprite(ss[8], new float2(x, y), "chrome"); + rgbaRenderer.DrawSprite(ss[8], new float2(x, y), "chrome"); //draw borders for (var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[2].size.Y) { - sr.DrawSprite(ss[2], new float2(r.Left, y), "chrome"); - sr.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), "chrome"); + rgbaRenderer.DrawSprite(ss[2], new float2(r.Left, y), "chrome"); + rgbaRenderer.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), "chrome"); } for (var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[0].size.X) { - sr.DrawSprite(ss[0], new float2(x, r.Top), "chrome"); - sr.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), "chrome"); + rgbaRenderer.DrawSprite(ss[0], new float2(x, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), "chrome"); } - sr.DrawSprite(ss[4], new float2(r.Left, r.Top), "chrome"); - sr.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), "chrome"); - sr.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), "chrome"); - sr.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), "chrome"); - sr.Flush(); + rgbaRenderer.DrawSprite(ss[4], new float2(r.Left, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), "chrome"); + rgbaRenderer.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), "chrome"); + rgbaRenderer.Flush(); renderer.Device.DisableScissor(); } diff --git a/chrome.xml b/chrome.xml index 4794b37fdb..6fb828115f 100644 --- a/chrome.xml +++ b/chrome.xml @@ -122,14 +122,25 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + - diff --git a/dialog.png b/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae3c0d7e4b77f54bc10a70b94fb4bb20c2d597e GIT binary patch literal 20091 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 literal 0 HcmV?d00001