git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1220 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -22,6 +22,7 @@ namespace OpenRa.Game
|
||||
TreeCache treeCache;
|
||||
TerrainRenderer terrain;
|
||||
Sidebar sidebar;
|
||||
Viewport viewport;
|
||||
|
||||
static Size GetResolution(Settings settings)
|
||||
{
|
||||
@@ -36,6 +37,7 @@ namespace OpenRa.Game
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
BackColor = Color.Black;
|
||||
renderer = new Renderer(this, GetResolution(settings), false);
|
||||
viewport = new Viewport(ClientSize);
|
||||
Visible = true;
|
||||
|
||||
SheetBuilder.Initialize(renderer.Device);
|
||||
@@ -71,7 +73,7 @@ namespace OpenRa.Game
|
||||
}
|
||||
}
|
||||
|
||||
PointF scrollPos;
|
||||
|
||||
int x1,y1;
|
||||
|
||||
protected override void OnMouseDown(MouseEventArgs e)
|
||||
@@ -88,6 +90,7 @@ namespace OpenRa.Game
|
||||
|
||||
if (e.Button != 0)
|
||||
{
|
||||
PointF scrollPos = viewport.ScrollPosition;
|
||||
scrollPos.X += x1 - e.X;
|
||||
scrollPos.Y += y1 - e.Y;
|
||||
|
||||
@@ -96,25 +99,24 @@ namespace OpenRa.Game
|
||||
|
||||
scrollPos.X = Util.Constrain(scrollPos.X, new Range<float>(0, map.Width * 24 - ClientSize.Width + 128));
|
||||
scrollPos.Y = Util.Constrain(scrollPos.Y, new Range<float>(0, map.Height * 24 - ClientSize.Height));
|
||||
viewport.ScrollPosition = scrollPos;
|
||||
}
|
||||
}
|
||||
|
||||
void Frame()
|
||||
{
|
||||
PointF r1 = new PointF(2.0f / ClientSize.Width, -2.0f / ClientSize.Height);
|
||||
PointF r1 = new PointF(2.0f / viewport.ClientSize.Width, -2.0f / viewport.ClientSize.Height);
|
||||
PointF r2 = new PointF(-1, 1);
|
||||
|
||||
renderer.BeginFrame(r1, r2, scrollPos);
|
||||
renderer.BeginFrame(r1, r2, viewport.ScrollPosition);
|
||||
|
||||
renderer.Device.EnableScissor(0, 0, ClientSize.Width - 128, ClientSize.Height);
|
||||
terrain.Draw( ClientSize, scrollPos );
|
||||
renderer.Device.EnableScissor(0, 0, viewport.ClientSize.Width - 128, viewport.ClientSize.Height);
|
||||
terrain.Draw(viewport);
|
||||
|
||||
world.Draw(renderer,
|
||||
new Range<float>(scrollPos.X, scrollPos.X + ClientSize.Width),
|
||||
new Range<float>(scrollPos.Y, scrollPos.Y + ClientSize.Height));
|
||||
world.Draw(renderer, viewport);
|
||||
|
||||
renderer.Device.DisableScissor();
|
||||
sidebar.Paint(ClientSize, scrollPos);
|
||||
sidebar.Paint(viewport);
|
||||
|
||||
renderer.EndFrame();
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
<Compile Include="UnitSheetBuilder.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<Compile Include="Vertex.cs" />
|
||||
<Compile Include="Viewport.cs" />
|
||||
<Compile Include="World.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -54,10 +54,10 @@ namespace OpenRa.Game
|
||||
DrawSprite(blank, ref p);
|
||||
}
|
||||
|
||||
public void Paint(Size clientSize, PointF scrollOffset)
|
||||
public void Paint(Viewport viewport)
|
||||
{
|
||||
PointF buildPos = new PointF(clientSize.Width - 128 + scrollOffset.X, scrollOffset.Y);
|
||||
PointF unitPos = new PointF(clientSize.Width - 64 + scrollOffset.X, scrollOffset.Y);
|
||||
PointF buildPos = new PointF(viewport.ClientSize.Width - 128 + viewport.ScrollPosition.X, viewport.ScrollPosition.Y);
|
||||
PointF unitPos = new PointF(viewport.ClientSize.Width - 64 + viewport.ScrollPosition.X, viewport.ScrollPosition.Y);
|
||||
|
||||
foreach (Item i in techTree.BuildableItems)
|
||||
{
|
||||
@@ -70,8 +70,8 @@ namespace OpenRa.Game
|
||||
DrawSprite( sprite, ref unitPos );
|
||||
}
|
||||
|
||||
Fill(clientSize, buildPos);
|
||||
Fill(clientSize, unitPos);
|
||||
Fill(viewport.ClientSize, buildPos);
|
||||
Fill(viewport.ClientSize, unitPos);
|
||||
|
||||
spriteRenderer.Flush();
|
||||
}
|
||||
|
||||
@@ -54,14 +54,14 @@ namespace OpenRa.Game
|
||||
indexBuffer.SetData(indices.ToArray());
|
||||
}
|
||||
|
||||
public void Draw( Size screenSize, PointF scrollPos )
|
||||
public void Draw( Viewport viewport )
|
||||
{
|
||||
int indicesPerRow = map.Width * 6;
|
||||
int verticesPerRow = map.Width * 4;
|
||||
|
||||
int visibleRows = (int)(screenSize.Height / 24.0f + 2);
|
||||
int visibleRows = (int)(viewport.ClientSize.Height / 24.0f + 2);
|
||||
|
||||
int firstRow = (int)(scrollPos.Y / 24.0f);
|
||||
int firstRow = (int)(viewport.ScrollPosition.Y / 24.0f);
|
||||
int lastRow = firstRow + visibleRows;
|
||||
|
||||
if (lastRow < 0 || firstRow > map.Height)
|
||||
|
||||
30
OpenRa.Game/Viewport.cs
Normal file
30
OpenRa.Game/Viewport.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
|
||||
namespace OpenRa.Game
|
||||
{
|
||||
class Viewport
|
||||
{
|
||||
readonly Size clientSize;
|
||||
PointF scrollPosition;
|
||||
|
||||
public PointF ScrollPosition
|
||||
{
|
||||
get { return scrollPosition; }
|
||||
set { scrollPosition = value; }
|
||||
}
|
||||
|
||||
public Size ClientSize
|
||||
{
|
||||
get { return clientSize; }
|
||||
}
|
||||
|
||||
|
||||
public Viewport(Size clientSize)
|
||||
{
|
||||
this.clientSize = clientSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,8 +19,10 @@ namespace OpenRa.Game
|
||||
|
||||
public void Add(Actor a) { actors.Add(a); }
|
||||
|
||||
public void Draw(Renderer renderer, Range<float> xr, Range<float> yr)
|
||||
public void Draw(Renderer renderer, Viewport viewport)
|
||||
{
|
||||
Range<float> xr = new Range<float>(viewport.ScrollPosition.X, viewport.ScrollPosition.X + viewport.ClientSize.Width);
|
||||
Range<float> yr = new Range<float>(viewport.ScrollPosition.Y, viewport.ScrollPosition.Y + viewport.ClientSize.Height);
|
||||
foreach (Actor a in actors)
|
||||
{
|
||||
Sprite[] images = a.CurrentImages;
|
||||
|
||||
Reference in New Issue
Block a user