From 7e40835c5e5891f670fb5a81d56c62fa85c06b63 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@993157c7-ee19-0410-b2c4-bb4e9862e678> Date: Tue, 24 Jul 2007 07:32:01 +0000 Subject: [PATCH] git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1338 993157c7-ee19-0410-b2c4-bb4e9862e678 --- OpenRa.Game/MainWindow.cs | 20 ++++---------------- OpenRa.Game/Region.cs | 22 ++++++++++++++++++---- OpenRa.Game/Sidebar.cs | 19 ++++++++++++++----- OpenRa.Game/TerrainRenderer.cs | 2 +- OpenRa.Game/Viewport.cs | 5 +++++ OpenRa.Game/World.cs | 12 +++++++++++- 6 files changed, 53 insertions(+), 27 deletions(-) diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index b867ca4829..911263ad76 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -52,7 +52,7 @@ namespace OpenRa.Game game.world.Add( mcv ); game.world.Add( new Refinery( new int2( 7, 5 ), 2 ) ); - sidebar = new Sidebar(game.techTree, Race.Soviet, renderer, game.viewport); + sidebar = new Sidebar(Race.Soviet, renderer, game); renderer.SetPalette( new HardwarePalette( renderer, game.map ) ); } @@ -74,21 +74,9 @@ namespace OpenRa.Game lastPos = new float2(e.Location); if (e.Button == MouseButtons.Left) - { - float2 point = new float2(e.Location) + game.viewport.Location; - RectangleF rect = new RectangleF(sidebar.Region.Location.ToPointF(), new SizeF(sidebar.Width, game.viewport.Height)); - if (rect.Contains(point.ToPointF())) - { - sidebar.Build( sidebar.FindSpriteAtPoint( point ), game ); - return; - } - float2 xy = (1 / 24.0f) * point; - if( game.world.orderGenerator != null ) - { - IOrder order = game.world.orderGenerator.Order( new int2( (int)xy.X, (int)xy.Y ) ); - game.Issue( order ); - } - } + foreach (Region region in game.viewport.Regions) + if (region.Contains(lastPos)) + region.Clicked(e); } protected override void OnMouseMove(MouseEventArgs e) diff --git a/OpenRa.Game/Region.cs b/OpenRa.Game/Region.cs index 6699acb9a1..de40eabb3f 100644 --- a/OpenRa.Game/Region.cs +++ b/OpenRa.Game/Region.cs @@ -24,6 +24,8 @@ namespace OpenRa.Game } Action drawFunction; + MouseEventHandler mouseHandler; + RectangleF rect; static float2 MakeSize(Viewport v, DockStyle d, float size) { @@ -42,7 +44,12 @@ namespace OpenRa.Game } } - public static Region Create(Viewport v, DockStyle d, float size, Action f) + public void Clicked(MouseEventArgs e) + { + mouseHandler(this, e); + } + + public static Region Create(Viewport v, DockStyle d, float size, Action f, MouseEventHandler m) { float2 s = MakeSize(v, d, size); @@ -50,23 +57,30 @@ namespace OpenRa.Game { case DockStyle.Top: case DockStyle.Left: - return new Region(new float2(0,0), s, f, v); + return new Region(new float2(0,0), s, v, f, m); case DockStyle.Right: case DockStyle.Bottom: - return new Region(new float2( v.Width - s.X, v.Height - s.Y ), s, f, v); + return new Region(new float2( v.Width - s.X, v.Height - s.Y ), s, v, f, m); default: throw new NotImplementedException(); } } - Region(float2 location, float2 size, Action drawFunction, Viewport viewport) + Region(float2 location, float2 size, Viewport viewport, Action drawFunction, MouseEventHandler mouseHandler) { this.location = location; this.size = size; this.drawFunction = drawFunction; this.viewport = viewport; + this.mouseHandler = mouseHandler; + rect = new RectangleF(location.ToPointF(), new SizeF(size.ToPointF())); + } + + public bool Contains(float2 point) + { + return rect.Contains(point.ToPointF()); } public void Draw(Renderer renderer) diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index c9fc028353..647d5d456d 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -16,6 +16,7 @@ namespace OpenRa.Game SpriteRenderer spriteRenderer; Sprite blank; + Game game; readonly Region region; public Region Region @@ -32,11 +33,12 @@ namespace OpenRa.Game } - public Sidebar( TechTree.TechTree techTree, Race race, Renderer renderer, Viewport viewport ) + public Sidebar( Race race, Renderer renderer, Game game ) { - this.techTree = techTree; - region = Region.Create(viewport, DockStyle.Right, 128, Paint); - viewport.AddRegion( region ); + this.techTree = game.techTree; + this.game = game; + region = Region.Create(game.viewport, DockStyle.Right, 128, Paint, MouseHandler); + game.viewport.AddRegion( region ); techTree.CurrentRace = race; techTree.Build("FACT", true); spriteRenderer = new SpriteRenderer(renderer, false); @@ -47,8 +49,9 @@ namespace OpenRa.Game blank = SheetBuilder.Add(new Size((int)spriteWidth, (int)spriteHeight), 16); } - public void Build(string key, Game game ) + public void Build(string key) { + if (string.IsNullOrEmpty(key)) return; game.world.orderGenerator = new PlaceBuilding( 1, key.ToLowerInvariant() ); } @@ -115,6 +118,12 @@ namespace OpenRa.Game } return null; } + + void MouseHandler(object sender, MouseEventArgs e) + { + float2 point = new float2(e.Location); + Build(FindSpriteAtPoint(point)); + } } class PlaceBuilding : IOrderGenerator diff --git a/OpenRa.Game/TerrainRenderer.cs b/OpenRa.Game/TerrainRenderer.cs index 7e8fc5ec49..9a6ef5889a 100644 --- a/OpenRa.Game/TerrainRenderer.cs +++ b/OpenRa.Game/TerrainRenderer.cs @@ -23,7 +23,7 @@ namespace OpenRa.Game public TerrainRenderer(Renderer renderer, Map map, Viewport viewport) { this.renderer = renderer; - region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw); + region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw, delegate { }); viewport.AddRegion(region); this.map = map; diff --git a/OpenRa.Game/Viewport.cs b/OpenRa.Game/Viewport.cs index 29f70099af..062a487c0a 100644 --- a/OpenRa.Game/Viewport.cs +++ b/OpenRa.Game/Viewport.cs @@ -49,5 +49,10 @@ namespace OpenRa.Game renderer.EndFrame(); } + + public IEnumerable Regions + { + get { return regions; } + } } } diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 6304d12869..f6a2087692 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -19,7 +19,7 @@ namespace OpenRa.Game public World(Renderer renderer, Game game) { - region = Region.Create(game.viewport, DockStyle.Left, game.viewport.Width - 128, Draw); + region = Region.Create(game.viewport, DockStyle.Left, game.viewport.Width - 128, Draw, WorldClicked); this.game = game; game.viewport.AddRegion(region); @@ -32,6 +32,16 @@ namespace OpenRa.Game int lastTime = Environment.TickCount; + void WorldClicked(object sender, MouseEventArgs e) + { + float2 xy = (1 / 24.0f) * (new float2(e.Location) + game.viewport.Location); + if (orderGenerator != null) + { + IOrder order = orderGenerator.Order(new int2((int)xy.X, (int)xy.Y)); + game.Issue(order); + } + } + void Draw() { int t = Environment.TickCount;