some more locking into map borders

This commit is contained in:
Paolo Chiodi
2010-09-04 14:26:31 +02:00
committed by Paul Chote
parent 43aa8812b3
commit 2945838eef
3 changed files with 39 additions and 27 deletions

View File

@@ -35,7 +35,8 @@ namespace OpenRA.Graphics
public static int TicksSinceLastMove = 0; public static int TicksSinceLastMove = 0;
public static int2 LastMousePos; public static int2 LastMousePos;
public void Scroll(float2 delta){ public void Scroll(float2 delta)
{
this.Scroll(delta, false); this.Scroll(delta, false);
} }
@@ -43,22 +44,29 @@ namespace OpenRA.Graphics
{ {
float2 newScrollPosition = scrollPosition + delta; float2 newScrollPosition = scrollPosition + delta;
if(!ignoreBorders){ if(!ignoreBorders)
float2 topLeftBorder = (Game.CellSize* mapStart).ToFloat2(); newScrollPosition = this.NormalizeScrollPosition(newScrollPosition);
float2 bottomRightBorder = (Game.CellSize* mapEnd).ToFloat2();
if(newScrollPosition.Y < topLeftBorder.Y)
newScrollPosition.Y = topLeftBorder.Y;
if(newScrollPosition.X < topLeftBorder.X)
newScrollPosition.X = topLeftBorder.X;
if(newScrollPosition.Y > bottomRightBorder.Y-screenSize.Y)
newScrollPosition.Y = bottomRightBorder.Y-screenSize.Y;
if(newScrollPosition.X > bottomRightBorder.X-screenSize.X)
newScrollPosition.X = bottomRightBorder.X-screenSize.X;
}
scrollPosition = newScrollPosition; scrollPosition = newScrollPosition;
} }
private float2 NormalizeScrollPosition(float2 newScrollPosition)
{
float2 topLeftBorder = (Game.CellSize* mapStart).ToFloat2();
float2 bottomRightBorder = (Game.CellSize* mapEnd).ToFloat2();
if(newScrollPosition.Y < topLeftBorder.Y)
newScrollPosition.Y = topLeftBorder.Y;
if(newScrollPosition.X < topLeftBorder.X)
newScrollPosition.X = topLeftBorder.X;
if(newScrollPosition.Y > bottomRightBorder.Y-screenSize.Y)
newScrollPosition.Y = bottomRightBorder.Y-screenSize.Y;
if(newScrollPosition.X > bottomRightBorder.X-screenSize.X)
newScrollPosition.X = bottomRightBorder.X-screenSize.X;
return newScrollPosition;
}
public ScrollDirection GetBlockedDirections() public ScrollDirection GetBlockedDirections()
{ {
int2 topLeftBorder = (Game.CellSize* mapStart); int2 topLeftBorder = (Game.CellSize* mapStart);
@@ -129,7 +137,7 @@ namespace OpenRA.Graphics
public void Center(int2 loc) public void Center(int2 loc)
{ {
scrollPosition = (Game.CellSize*loc - .5f * new float2(Width, Height)); scrollPosition = this.NormalizeScrollPosition(Game.CellSize*loc - .5f * new float2(Width, Height));
} }
public void Center(IEnumerable<Actor> actors) public void Center(IEnumerable<Actor> actors)
@@ -140,7 +148,7 @@ namespace OpenRA.Graphics
.Select(a => a.CenterLocation) .Select(a => a.CenterLocation)
.Aggregate((a, b) => a + b); .Aggregate((a, b) => a + b);
scrollPosition = (avgPos - .5f * new float2(Width, Height)); scrollPosition = this.NormalizeScrollPosition((avgPos - .5f * new float2(Width, Height)));
} }
public Rectangle? ShroudBounds() public Rectangle? ShroudBounds()

View File

@@ -23,7 +23,8 @@ namespace OpenRA.Traits
public void Tick (Actor self) public void Tick (Actor self)
{ {
if(shakeEffects.Any()){ if(shakeEffects.Any())
{
Game.viewport.Scroll(GetScrollOffset(), true); Game.viewport.Scroll(GetScrollOffset(), true);
shakeEffects.RemoveAll(t => t.ExpiryTime == ticks); shakeEffects.RemoveAll(t => t.ExpiryTime == ticks);
} }

View File

@@ -137,17 +137,20 @@ namespace OpenRA.Widgets
if (Viewport.LastMousePos.Y >= Game.viewport.Height - EdgeScrollThreshold) if (Viewport.LastMousePos.Y >= Game.viewport.Height - EdgeScrollThreshold)
Edge = Edge.Set(ScrollDirection.Down, true); Edge = Edge.Set(ScrollDirection.Down, true);
} }
var scroll = new float2(0,0); if(Keyboard != ScrollDirection.None || Edge != ScrollDirection.None)
if (Keyboard.Includes(ScrollDirection.Up) || Edge.Includes(ScrollDirection.Up)) {
scroll += new float2(0, -10); var scroll = new float2(0,0);
if (Keyboard.Includes(ScrollDirection.Right) || Edge.Includes(ScrollDirection.Right)) if (Keyboard.Includes(ScrollDirection.Up) || Edge.Includes(ScrollDirection.Up))
scroll += new float2(10, 0); scroll += new float2(0, -10);
if (Keyboard.Includes(ScrollDirection.Down) || Edge.Includes(ScrollDirection.Down)) if (Keyboard.Includes(ScrollDirection.Right) || Edge.Includes(ScrollDirection.Right))
scroll += new float2(0, 10); scroll += new float2(10, 0);
if (Keyboard.Includes(ScrollDirection.Left) || Edge.Includes(ScrollDirection.Left)) if (Keyboard.Includes(ScrollDirection.Down) || Edge.Includes(ScrollDirection.Down))
scroll += new float2(-10, 0); scroll += new float2(0, 10);
if (Keyboard.Includes(ScrollDirection.Left) || Edge.Includes(ScrollDirection.Left))
scroll += new float2(-10, 0);
Game.viewport.Scroll(scroll); Game.viewport.Scroll(scroll);
}
} }
public override Widget Clone() { return new ViewportScrollControllerWidget(this); } public override Widget Clone() { return new ViewportScrollControllerWidget(this); }