fix viewport scroll limits

This commit is contained in:
Paul Chote
2011-07-22 22:27:13 +12:00
parent 0bfc9a957f
commit 8516fa8748

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Graphics
readonly int2 screenSize; readonly int2 screenSize;
int2 scrollPosition; int2 scrollPosition;
readonly Renderer renderer; readonly Renderer renderer;
readonly Rectangle adjustedMapBounds; readonly Rectangle scrollLimits;
// Top-left of the viewport, in world-px units // Top-left of the viewport, in world-px units
public float2 Location { get { return scrollPosition; } } public float2 Location { get { return scrollPosition; } }
@@ -77,16 +77,16 @@ namespace OpenRA.Graphics
int2 NormalizeScrollPosition(int2 newScrollPosition) int2 NormalizeScrollPosition(int2 newScrollPosition)
{ {
return newScrollPosition.Clamp(adjustedMapBounds); return newScrollPosition.Clamp(scrollLimits);
} }
public ScrollDirection GetBlockedDirections() public ScrollDirection GetBlockedDirections()
{ {
var ret = ScrollDirection.None; var ret = ScrollDirection.None;
if(scrollPosition.Y <= adjustedMapBounds.Top) ret |= ScrollDirection.Up; if(scrollPosition.Y <= scrollLimits.Top) ret |= ScrollDirection.Up;
if(scrollPosition.X <= adjustedMapBounds.Left) ret |= ScrollDirection.Left; if(scrollPosition.X <= scrollLimits.Left) ret |= ScrollDirection.Left;
if(scrollPosition.Y >= adjustedMapBounds.Bottom) ret |= ScrollDirection.Down; if(scrollPosition.Y >= scrollLimits.Bottom) ret |= ScrollDirection.Down;
if(scrollPosition.X >= adjustedMapBounds.Right) ret |= ScrollDirection.Right; if(scrollPosition.X >= scrollLimits.Right) ret |= ScrollDirection.Right;
return ret; return ret;
} }
@@ -94,11 +94,17 @@ namespace OpenRA.Graphics
{ {
this.screenSize = screenSize; this.screenSize = screenSize;
this.renderer = renderer; this.renderer = renderer;
adjustedMapBounds = new Rectangle(Game.CellSize*mapBounds.X - screenSize.X/2,
Game.CellSize*mapBounds.Y - screenSize.Y/2, var viewTL = (Game.CellSize*new float2(mapBounds.Left, mapBounds.Top)).ToInt2();
Game.CellSize*mapBounds.Width, var viewBR = (Game.CellSize*new float2(mapBounds.Right, mapBounds.Bottom)).ToInt2();
Game.CellSize*mapBounds.Height);
scrollPosition = new int2(adjustedMapBounds.Location) + new int2(adjustedMapBounds.Size)/2; var border = (.5f/Zoom * screenSize.ToFloat2()).ToInt2();
scrollLimits = Rectangle.FromLTRB(viewTL.X - border.X,
viewTL.Y - border.Y,
viewBR.X - border.X,
viewBR.Y - border.Y);
scrollPosition = new int2(scrollLimits.Location) + new int2(scrollLimits.Size)/2;
} }
public void DrawRegions( WorldRenderer wr, IInputHandler inputHandler ) public void DrawRegions( WorldRenderer wr, IInputHandler inputHandler )