unsnarled the input a bit

This commit is contained in:
Chris Forbes
2009-10-06 22:03:24 +13:00
parent 924c515f57
commit 108d799b29
9 changed files with 92 additions and 30 deletions

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@ obj
*.ncb *.ncb
*.vcproj* *.vcproj*
*.suo *.suo
*.user
# Red Alert binary files # Red Alert binary files
*.[mM][iI][xX] *.[mM][iI][xX]

View File

@@ -36,5 +36,6 @@ namespace OpenRa
public static readonly int2 Zero = new int2(0, 0); public static readonly int2 Zero = new int2(0, 0);
public Point ToPoint() { return new Point(X, Y); } public Point ToPoint() { return new Point(X, Y); }
public PointF ToPointF() { return new PointF(X, Y); }
} }
} }

View File

@@ -17,12 +17,16 @@ namespace OpenRa.Game
this.game = game; this.game = game;
} }
public void WorldClicked(object sender, MouseEventArgs e) public void HandleMouseInput(MouseInput mi)
{ {
var xy = (1 / 24.0f) * (new float2(e.Location) + game.viewport.Location); if (mi.Button == MouseButtons.Left && mi.Event == MouseInputEvent.Down)
if (orderGenerator != null) {
orderGenerator.Order(game, new int2((int)xy.X, (int)xy.Y)).Apply(game); var xy = (1 / 24.0f) * (new float2(mi.Location.X, mi.Location.Y) + game.viewport.Location);
// todo: route all orders through netcode
if (orderGenerator != null)
orderGenerator.Order(game, new int2((int)xy.X, (int)xy.Y)).Apply(game);
// todo: route all orders through netcode
}
} }
} }
} }

View File

@@ -6,18 +6,18 @@ namespace OpenRa.Game.Graphics
{ {
class Region class Region
{ {
float2 location; int2 location;
Viewport viewport; Viewport viewport;
public float2 Location public int2 Location
{ {
get { return location + viewport.Location; } // WTF HACK HACK HACK get { return location + new int2( (int)viewport.Location.X, (int)viewport.Location.Y ); } // WTF HACK HACK HACK
} }
public readonly float2 Size; public readonly float2 Size;
Action drawFunction; Action drawFunction;
MouseEventHandler mouseHandler; Action<MouseInput> mouseHandler;
Rectangle rect; Rectangle rect;
static int2 MakeSize(Viewport v, DockStyle d, int size) static int2 MakeSize(Viewport v, DockStyle d, int size)
@@ -37,12 +37,19 @@ namespace OpenRa.Game.Graphics
} }
} }
public void Clicked(MouseEventArgs e) public bool HandleMouseInput(MouseInput mi)
{ {
mouseHandler(this, new MouseEventArgs(e.Button, e.Clicks, e.X - rect.Left, e.Y - rect.Top, e.Delta)); /* todo: route to the mousehandler once that's sorted */
} if (mouseHandler != null) mouseHandler(new MouseInput
{
Button = mi.Button,
Event = mi.Event,
Location = mi.Location - Location
});
return mouseHandler != null;
}
public static Region Create(Viewport v, DockStyle d, int size, Action f, MouseEventHandler m) public static Region Create(Viewport v, DockStyle d, int size, Action f, Action<MouseInput> m)
{ {
int2 s = MakeSize(v, d, size); int2 s = MakeSize(v, d, size);
@@ -61,7 +68,7 @@ namespace OpenRa.Game.Graphics
} }
} }
Region(int2 location, int2 size, Viewport viewport, Action drawFunction, MouseEventHandler mouseHandler) Region(int2 location, int2 size, Viewport viewport, Action drawFunction, Action<MouseInput> mouseHandler)
{ {
this.location = location; this.location = location;
this.Size = size; this.Size = size;

View File

@@ -20,7 +20,7 @@ namespace OpenRa.Game.Graphics
public TerrainRenderer(Renderer renderer, Map map, Viewport viewport) public TerrainRenderer(Renderer renderer, Map map, Viewport viewport)
{ {
this.renderer = renderer; this.renderer = renderer;
region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw, (_, e) => { } ); region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw, null );
viewport.AddRegion(region); viewport.AddRegion(region);
this.map = map; this.map = map;

View File

@@ -1,4 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System;
using System.Linq;
namespace OpenRa.Game.Graphics namespace OpenRa.Game.Graphics
{ {
@@ -44,6 +46,18 @@ namespace OpenRa.Game.Graphics
renderer.EndFrame(); renderer.EndFrame();
} }
public IEnumerable<Region> Regions { get { return regions; } } Region dragRegion = null;
public void DispatchMouseInput(MouseInput mi)
{
if (dragRegion != null) {
dragRegion.HandleMouseInput( mi );
if (mi.Event == MouseInputEvent.Up) dragRegion = null;
return;
}
dragRegion = regions.FirstOrDefault(r => r.Contains(mi.Location) && r.HandleMouseInput(mi));
if (mi.Event != MouseInputEvent.Down)
dragRegion = null;
}
} }
} }

View File

@@ -15,7 +15,9 @@ namespace OpenRa.Game.Graphics
// TODO: this is layout policy. it belongs at a higher level than this. // TODO: this is layout policy. it belongs at a higher level than this.
region = Region.Create(world.game.viewport, DockStyle.Left, region = Region.Create(world.game.viewport, DockStyle.Left,
world.game.viewport.Width - 128, Draw, world.game.controller.WorldClicked); // TODO: world.WorldClicked is part of the CONTROLLER world.game.viewport.Width - 128, Draw,
world.game.controller.HandleMouseInput);
world.game.viewport.AddRegion(region); world.game.viewport.AddRegion(region);
spriteRenderer = new SpriteRenderer(renderer, true); spriteRenderer = new SpriteRenderer(renderer, true);

View File

@@ -66,16 +66,18 @@ namespace OpenRa.Game
int2 lastPos; int2 lastPos;
protected override void OnMouseDown(MouseEventArgs e) protected override void OnMouseDown(MouseEventArgs e)
{ {
base.OnMouseDown(e); base.OnMouseDown(e);
lastPos = new int2(e.Location); lastPos = new int2(e.Location);
if (e.Button == MouseButtons.Left) game.viewport.DispatchMouseInput(new MouseInput
foreach (var region in game.viewport.Regions) {
if (region.Contains(lastPos)) Button = e.Button,
region.Clicked(e); Event = MouseInputEvent.Down,
} Location = new int2(e.Location)
});
}
protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseMove(MouseEventArgs e)
{ {
@@ -88,9 +90,37 @@ namespace OpenRa.Game
lastPos = p; lastPos = p;
} }
game.viewport.DispatchMouseInput(new MouseInput
{
Button = e.Button,
Event = MouseInputEvent.Move,
Location = new int2(e.Location)
});
if (game.controller.orderGenerator != null) if (game.controller.orderGenerator != null)
game.controller.orderGenerator.PrepareOverlay(game, game.controller.orderGenerator.PrepareOverlay(game,
new int2(e.Location.X / 24, e.Location.Y / 24)); new int2(e.Location.X / 24, e.Location.Y / 24));
} }
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
game.viewport.DispatchMouseInput(new MouseInput
{
Button = e.Button,
Event = MouseInputEvent.Up,
Location = new int2(e.Location)
});
}
} }
struct MouseInput
{
public MouseInputEvent Event;
public int2 Location;
public MouseButtons Button;
}
enum MouseInputEvent { Down, Move, Up };
} }

View File

@@ -123,10 +123,13 @@ namespace OpenRa.Game
return null; return null;
} }
void MouseHandler(object sender, MouseEventArgs e) void MouseHandler(MouseInput mi)
{ {
float2 point = new float2(e.Location); if (mi.Button == MouseButtons.Left && mi.Event == MouseInputEvent.Down)
Build(GetItem(point)); {
var point = new float2(mi.Location.X, mi.Location.Y);
Build(GetItem(point));
}
} }
} }