z offsets

This commit is contained in:
Chris Forbes
2009-12-22 19:13:30 +13:00
parent 3c1ead59fd
commit 3bc97ac0b9
21 changed files with 134 additions and 83 deletions

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OpenRa.Game.Traits
{
class BelowUnits : IRenderModifier
{
public BelowUnits(Actor self) { }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
return r.Select(a => a.WithZOffset(-1));
}
}
}

View File

@@ -18,16 +18,16 @@ namespace OpenRa.Game.Traits
remainingUncloakTime = (int)(Rules.General.SubmergeDelay * 60 * 25);
}
public IEnumerable<Tuple<Sprite, float2, int>>
ModifyRender(Actor self, IEnumerable<Tuple<Sprite, float2, int>> rs)
public IEnumerable<Renderable>
ModifyRender(Actor self, IEnumerable<Renderable> rs)
{
if (remainingUncloakTime > 0)
return rs;
if (self.Owner == Game.LocalPlayer)
return rs.Select(a => Tuple.New(a.a, a.b, 8));
return rs.Select(a => a.WithPalette(8));
else
return new Tuple<Sprite, float2, int>[] { };
return new Renderable[] { };
}
public void Tick(Actor self)

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Game.Traits
anim.PlayRepeating("idle");
}
public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
public IEnumerable<Renderable> Render(Actor self)
{
var uog = Game.controller.orderGenerator as UnitOrderGenerator;
if (uog != null && self.Owner == Game.LocalPlayer && uog.selection.Contains(self))

View File

@@ -3,7 +3,7 @@ using OpenRa.Game.Graphics;
namespace OpenRa.Game.Traits
{
class RenderWarFactory : RenderBuilding, INotifyBuildComplete
class RenderWarFactory : IRender, INotifyBuildComplete, INotifyDamage, ITick
{
public Animation roof;
bool doneBuilding;
@@ -12,7 +12,6 @@ namespace OpenRa.Game.Traits
string prefix = "";
public RenderWarFactory(Actor self)
: base(self)
{
this.self = self;
roof = new Animation(self.Info.Image ?? self.Info.Name);
@@ -21,22 +20,19 @@ namespace OpenRa.Game.Traits
public void BuildingComplete( Actor self )
{
doneBuilding = true;
anim.Play( "idle" );
roof.Play( prefix + "idle-top" );
}
public IEnumerable<Tuple<Sprite, float2, int>> RenderRoof(Actor self)
public IEnumerable<Renderable> Render(Actor self)
{
if (doneBuilding)
yield return Tuple.New(roof.Image,
24f * (float2)self.Location, self.Owner.Palette);
yield return new Renderable(roof.Image,
24f * (float2)self.Location, self.Owner.Palette, 2);
}
public override void Tick(Actor self)
public void Tick(Actor self)
{
base.Tick(self);
if (doneBuilding)
roof.Tick();
if (doneBuilding) roof.Tick();
var b = self.Bounds;
if (isOpen && null == Game.UnitInfluence.GetUnitAt(((1/24f) * self.CenterLocation).ToInt2()))
@@ -51,10 +47,8 @@ namespace OpenRa.Game.Traits
roof.PlayThen(prefix + "build-top", () => isOpen = true);
}
public override void Damaged(Actor self, AttackInfo e)
public void Damaged(Actor self, AttackInfo e)
{
base.Damaged(self, e);
if (!e.DamageStateChanged) return;
switch (e.DamageState)
{

View File

@@ -15,7 +15,7 @@ namespace OpenRa.Game.Traits
anims.Add( "", new Animation( self.Info.Image ?? self.Info.Name ) );
}
public virtual IEnumerable<Tuple<Sprite, float2, int>> Render( Actor self )
public virtual IEnumerable<Renderable> Render( Actor self )
{
foreach( var a in anims.Values )
if( a.DisableFunc == null || !a.DisableFunc() )
@@ -46,7 +46,7 @@ namespace OpenRa.Game.Traits
this.DisableFunc = d;
}
public Tuple<Sprite, float2, int> Image( Actor self )
public Renderable Image( Actor self )
{
if( OffsetFunc != null )
return Util.Centered( self, Animation.Image, self.CenterLocation + OffsetFunc() );

View File

@@ -21,16 +21,16 @@ namespace OpenRa.Game.Traits
public void Attacking(Actor self) { DoSurface(); }
public void Damaged(Actor self, AttackInfo e) { DoSurface(); }
public IEnumerable<Tuple<Sprite, float2, int>>
ModifyRender(Actor self, IEnumerable<Tuple<Sprite, float2, int>> rs)
public IEnumerable<Renderable>
ModifyRender(Actor self, IEnumerable<Renderable> rs)
{
if (remainingSurfaceTime > 0)
return rs;
if (self.Owner == Game.LocalPlayer)
return rs.Select(a => Tuple.New(a.a, a.b, 8));
else
return new Tuple<Sprite, float2, int>[] { };
if (self.Owner == Game.LocalPlayer)
return rs.Select(a => a.WithPalette(8));
else
return new Renderable[] { };
}
public void Tick(Actor self)

View File

@@ -10,9 +10,32 @@ namespace OpenRa.Game.Traits
// depends on the order of pips in WorldRenderer.cs!
enum PipType { Transparent, Green, Yellow, Red, Gray };
enum TagType { None, Fake, Primary };
struct Renderable
{
public readonly Sprite Sprite;
public readonly float2 Pos;
public readonly int Palette;
public readonly int ZOffset;
public Renderable(Sprite sprite, float2 pos, int palette, int zOffset)
{
Sprite = sprite;
Pos = pos;
Palette = palette;
ZOffset = zOffset;
}
public Renderable(Sprite sprite, float2 pos, int palette)
: this(sprite, pos, palette, 0) { }
public Renderable WithPalette(int newPalette) { return new Renderable(Sprite, Pos, newPalette, ZOffset); }
public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, newOffset); }
public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, ZOffset); }
}
interface ITick { void Tick(Actor self); }
interface IRender { IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self); }
interface IRender { IEnumerable<Renderable> Render(Actor self); }
interface INotifyDamage { void Damaged(Actor self, AttackInfo e); }
interface INotifyBuildComplete { void BuildingComplete (Actor self); }
interface IOrder
@@ -23,8 +46,7 @@ namespace OpenRa.Game.Traits
interface IProducer { bool Produce( Actor self, UnitInfo producee ); }
interface IOccupySpace { IEnumerable<int2> OccupiedCells(); }
interface INotifyAttack { void Attacking(Actor self); }
interface IRenderModifier { IEnumerable<Tuple<Sprite, float2, int>>
ModifyRender( Actor self, IEnumerable<Tuple<Sprite, float2, int>> r ); }
interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r); }
interface IDamageModifier { float GetDamageModifier(); }
interface ISpeedModifier { float GetSpeedModifier(); }
interface IPips { IEnumerable<PipType> GetPips(); }

View File

@@ -12,9 +12,9 @@ namespace OpenRa.Game.Traits
Image = treeImage;
}
public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
public IEnumerable<Renderable> Render(Actor self)
{
yield return Tuple.New(Image, Game.CellSize * (float2)self.Location, 0);
yield return new Renderable(Image, Game.CellSize * (float2)self.Location, 0);
}
}
}

View File

@@ -117,17 +117,11 @@ namespace OpenRa.Game.Traits
public static float2 RelOffset(this int[] offset) { return new float2(offset[0], offset[1]); }
public static float2 AbsOffset(this int[] offset) { return new float2(offset.ElementAtOrDefault(2), offset.ElementAtOrDefault(3)); }
public static Tuple<Sprite, float2, int> Centered(Actor self, Sprite s, float2 location)
public static Renderable Centered(Actor self, Sprite s, float2 location)
{
var pal = self.Owner == null ? 0 : self.Owner.Palette;
var loc = location - 0.5f * s.size;
return Tuple.New(s, loc.Round(), pal);
}
public static Tuple<Sprite, float2, int> CenteredShadow(Actor self, Sprite s, float2 location)
{
var loc = location - 0.5f * s.size;
return Tuple.New(s, loc.Round(), 8);
return new Renderable(s, loc.Round(), pal);
}
public static float GetEffectiveSpeed(Actor self)

View File

@@ -10,11 +10,14 @@ namespace OpenRa.Game.Traits
{
public WithShadow(Actor self) {}
public IEnumerable<Tuple<Sprite, float2, int>> ModifyRender(Actor self, IEnumerable<Tuple<Sprite, float2, int>> r)
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
var unit = self.traits.Get<Unit>();
var shadowSprites = r.Select( a => Tuple.New( a.a, a.b, 8 ));
var flyingSprites = r.Select( a => Tuple.New( a.a, a.b - new float2( 0, unit.Altitude ), a.c ));
var shadowSprites = r.Select(a => a.WithPalette(8));
var flyingSprites = (unit.Altitude <= 0) ? r
: r.Select(a => a.WithPos(a.Pos - new float2(0, unit.Altitude)).WithZOffset(3));
return shadowSprites.Concat(flyingSprites);
}
}