git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1337 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -10,4 +10,5 @@ namespace OpenRa
|
||||
public delegate T Provider<T>();
|
||||
public delegate T Provider<T,U>( U u );
|
||||
public delegate T Provider<T,U,V>( U u, V v );
|
||||
public delegate void Action();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace OpenRa.Game
|
||||
viewport = new Viewport(clientSize, map.Size, renderer);
|
||||
|
||||
terrain = new TerrainRenderer(renderer, map, viewport);
|
||||
world = new World(renderer, viewport);
|
||||
world = new World(renderer, this);
|
||||
treeCache = new TreeCache(renderer.Device, map);
|
||||
|
||||
foreach (TreeReference treeReference in map.Trees)
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace OpenRa.Game
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
float2 point = new float2(e.Location) + game.viewport.Location;
|
||||
RectangleF rect = new RectangleF(sidebar.Location.ToPointF(), new SizeF(sidebar.Width, game.viewport.Height));
|
||||
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 );
|
||||
|
||||
@@ -8,57 +8,71 @@ namespace OpenRa.Game
|
||||
{
|
||||
class Region
|
||||
{
|
||||
Point location;
|
||||
Size size;
|
||||
Action<Game> drawFunction;
|
||||
float2 location;
|
||||
Viewport viewport;
|
||||
|
||||
static Size MakeSize(Viewport v, DockStyle d, int size)
|
||||
public float2 Location
|
||||
{
|
||||
get { return location + viewport.Location; }
|
||||
}
|
||||
|
||||
float2 size;
|
||||
|
||||
public float2 Size
|
||||
{
|
||||
get { return size; }
|
||||
}
|
||||
|
||||
Action drawFunction;
|
||||
|
||||
static float2 MakeSize(Viewport v, DockStyle d, float size)
|
||||
{
|
||||
switch (d)
|
||||
{
|
||||
case DockStyle.Top:
|
||||
case DockStyle.Bottom:
|
||||
return new Size(v.Width, size);
|
||||
return new float2(v.Width, size);
|
||||
|
||||
case DockStyle.Left:
|
||||
case DockStyle.Right:
|
||||
return new Size(size, v.Height);
|
||||
return new float2(size, v.Height);
|
||||
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public static Region Create(Viewport v, DockStyle d, int size, Action<Game> f)
|
||||
public static Region Create(Viewport v, DockStyle d, float size, Action f)
|
||||
{
|
||||
Size s = MakeSize(v, d, size);
|
||||
float2 s = MakeSize(v, d, size);
|
||||
|
||||
switch (d)
|
||||
{
|
||||
case DockStyle.Top:
|
||||
case DockStyle.Left:
|
||||
return new Region(new Point(0,0), s, f);
|
||||
return new Region(new float2(0,0), s, f, v);
|
||||
|
||||
case DockStyle.Right:
|
||||
case DockStyle.Bottom:
|
||||
return new Region(new Point( v.Width - s.Width, v.Height - s.Height ), s, f);
|
||||
return new Region(new float2( v.Width - s.X, v.Height - s.Y ), s, f, v);
|
||||
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
Region(Point location, Size size, Action<Game> drawFunction)
|
||||
Region(float2 location, float2 size, Action drawFunction, Viewport viewport)
|
||||
{
|
||||
this.location = location;
|
||||
this.size = size;
|
||||
this.drawFunction = drawFunction;
|
||||
this.viewport = viewport;
|
||||
}
|
||||
|
||||
public void Draw(Renderer renderer, Game game)
|
||||
public void Draw(Renderer renderer)
|
||||
{
|
||||
renderer.Device.EnableScissor(location.X, location.Y, size.Width, size.Height);
|
||||
drawFunction( game );
|
||||
renderer.Device.EnableScissor((int)location.X, (int)location.Y, (int)size.X, (int)size.Y);
|
||||
drawFunction();
|
||||
renderer.Device.DisableScissor();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,14 @@ namespace OpenRa.Game
|
||||
|
||||
SpriteRenderer spriteRenderer;
|
||||
Sprite blank;
|
||||
readonly Region region;
|
||||
|
||||
public Region Region
|
||||
{
|
||||
get { return region; }
|
||||
}
|
||||
|
||||
Dictionary<string, Sprite> sprites = new Dictionary<string,Sprite>();
|
||||
Viewport viewport;
|
||||
const float spriteWidth = 64, spriteHeight = 48;
|
||||
|
||||
public float Width
|
||||
@@ -30,8 +35,8 @@ namespace OpenRa.Game
|
||||
public Sidebar( TechTree.TechTree techTree, Race race, Renderer renderer, Viewport viewport )
|
||||
{
|
||||
this.techTree = techTree;
|
||||
this.viewport = viewport;
|
||||
viewport.AddRegion( Region.Create(viewport, DockStyle.Right, 128, Paint));
|
||||
region = Region.Create(viewport, DockStyle.Right, 128, Paint);
|
||||
viewport.AddRegion( region );
|
||||
techTree.CurrentRace = race;
|
||||
techTree.Build("FACT", true);
|
||||
spriteRenderer = new SpriteRenderer(renderer, false);
|
||||
@@ -68,17 +73,10 @@ namespace OpenRa.Game
|
||||
DrawSprite(blank, ref p);
|
||||
}
|
||||
|
||||
float2 location;
|
||||
|
||||
public float2 Location
|
||||
void Paint()
|
||||
{
|
||||
get { return location; }
|
||||
}
|
||||
|
||||
public void Paint( Game game )
|
||||
{
|
||||
float2 buildPos = location = viewport.Location + new float2(viewport.Size.X - spriteWidth * 2, 0);
|
||||
float2 unitPos = viewport.Location + new float2(viewport.Size.X - spriteWidth, 0);
|
||||
float2 buildPos = region.Location + new float2(region.Size.X - spriteWidth * 2, 0);
|
||||
float2 unitPos = region.Location + new float2(region.Size.X - spriteWidth, 0);
|
||||
|
||||
foreach (Item i in techTree.BuildableItems)
|
||||
{
|
||||
@@ -91,8 +89,8 @@ namespace OpenRa.Game
|
||||
DrawSprite( sprite, ref unitPos );
|
||||
}
|
||||
|
||||
Fill( viewport.Location.Y + viewport.Size.Y, buildPos );
|
||||
Fill( viewport.Location.Y + viewport.Size.Y, unitPos );
|
||||
Fill( region.Location.Y + region.Size.Y, buildPos );
|
||||
Fill( region.Location.Y + region.Size.Y, unitPos );
|
||||
|
||||
spriteRenderer.Flush();
|
||||
}
|
||||
@@ -105,12 +103,12 @@ namespace OpenRa.Game
|
||||
RectangleF rect;
|
||||
if (i.IsStructure)
|
||||
{
|
||||
rect = new RectangleF(location.X, location.Y + y1, spriteWidth, spriteHeight);
|
||||
rect = new RectangleF(region.Location.X, region.Location.Y + y1, spriteWidth, spriteHeight);
|
||||
y1 += 48;
|
||||
}
|
||||
else
|
||||
{
|
||||
rect = new RectangleF(location.X + spriteWidth, location.Y + y2, spriteWidth, spriteHeight);
|
||||
rect = new RectangleF(region.Location.X + spriteWidth, region.Location.Y + y2, spriteWidth, spriteHeight);
|
||||
y2 += 48;
|
||||
}
|
||||
if (rect.Contains(point.ToPointF())) return i.tag;
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace OpenRa.Game
|
||||
IndexBuffer indexBuffer;
|
||||
Sheet terrainSheet;
|
||||
public TileSet tileSet;
|
||||
Viewport viewport;
|
||||
Region region;
|
||||
|
||||
Renderer renderer;
|
||||
Map map;
|
||||
@@ -23,8 +23,8 @@ namespace OpenRa.Game
|
||||
public TerrainRenderer(Renderer renderer, Map map, Viewport viewport)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
this.viewport = viewport;
|
||||
viewport.AddRegion(Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw));
|
||||
region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw);
|
||||
viewport.AddRegion(region);
|
||||
this.map = map;
|
||||
|
||||
tileSet = new TileSet( map.TileSuffix );
|
||||
@@ -58,14 +58,14 @@ namespace OpenRa.Game
|
||||
indexBuffer.SetData( indices.ToArray() );
|
||||
}
|
||||
|
||||
void Draw( Game game )
|
||||
void Draw()
|
||||
{
|
||||
int indicesPerRow = map.Width * 6;
|
||||
int verticesPerRow = map.Width * 4;
|
||||
|
||||
int visibleRows = (int)(viewport.Size.Y / 24.0f + 2);
|
||||
int visibleRows = (int)(region.Size.Y / 24.0f + 2);
|
||||
|
||||
int firstRow = (int)(viewport.Location.Y / 24.0f);
|
||||
int firstRow = (int)(region.Location.Y / 24.0f);
|
||||
int lastRow = firstRow + visibleRows;
|
||||
|
||||
if (lastRow < 0 || firstRow > map.Height)
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace OpenRa.Game
|
||||
renderer.BeginFrame(r1, r2, scrollPosition);
|
||||
|
||||
foreach (Region region in regions)
|
||||
region.Draw(renderer, game);
|
||||
region.Draw(renderer);
|
||||
|
||||
renderer.EndFrame();
|
||||
}
|
||||
|
||||
@@ -13,13 +13,16 @@ namespace OpenRa.Game
|
||||
List<Actor> actors = new List<Actor>();
|
||||
List<Action<World>> frameEndActions = new List<Action<World>>();
|
||||
SpriteRenderer spriteRenderer;
|
||||
Viewport viewport;
|
||||
Game game;
|
||||
Region region;
|
||||
public IOrderGenerator orderGenerator;
|
||||
|
||||
public World(Renderer renderer, Viewport viewport)
|
||||
public World(Renderer renderer, Game game)
|
||||
{
|
||||
this.viewport = viewport;
|
||||
viewport.AddRegion(Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw));
|
||||
region = Region.Create(game.viewport, DockStyle.Left, game.viewport.Width - 128, Draw);
|
||||
this.game = game;
|
||||
game.viewport.AddRegion(region);
|
||||
|
||||
spriteRenderer = new SpriteRenderer(renderer, true);
|
||||
}
|
||||
|
||||
@@ -29,13 +32,13 @@ namespace OpenRa.Game
|
||||
|
||||
int lastTime = Environment.TickCount;
|
||||
|
||||
void Draw( Game game )
|
||||
void Draw()
|
||||
{
|
||||
int t = Environment.TickCount;
|
||||
int dt = t - lastTime;
|
||||
lastTime = t;
|
||||
|
||||
Range<float2> range = new Range<float2>(viewport.Location, viewport.Location + viewport.Size);
|
||||
Range<float2> range = new Range<float2>(region.Location, region.Location + region.Size);
|
||||
|
||||
foreach (Actor a in actors)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user