git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1337 993157c7-ee19-0410-b2c4-bb4e9862e678

This commit is contained in:
(no author)
2007-07-24 06:37:18 +00:00
parent 51bc9aa134
commit 2767794a89
8 changed files with 62 additions and 46 deletions

View File

@@ -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();
}

View File

@@ -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)

View File

@@ -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 );

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -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();
}

View File

@@ -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)
{