z offsets
This commit is contained in:
17
OpenRa.Game/Traits/BelowUnits.cs
Normal file
17
OpenRa.Game/Traits/BelowUnits.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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() );
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user