public override void Update() { foreach (PlayerAnimation player in WatchedComponents) { Physical physical = player.Owner.Components.Get <Physical>(); PlayerMovementComponent movement = player.Owner.Components.Get <PlayerMovementComponent>(); PlayerOrientation orientation = player.Owner.Components.Get <PlayerOrientation>(); PulseAbility pulse = player.Owner.Components.Get <PulseAbility>(); if (physical == null || movement == null || orientation == null) { continue; } if (pulse != null && pulse.EnergyMeter == 0) { player.WooferBlinkingTime += Owner.DeltaTime; if (player.WooferBlinkingTime >= 0.75) { player.WooferBlinkingTime -= 0.75; } } else { player.WooferBlinkingTime = 0; } if (!movement.OnGround || Math.Abs(physical.Velocity.X) <= 1e-2) { player.WalkAnimationProgress = 0; } else if (Math.Abs(physical.Velocity.X) > 1e-2) { //Console.WriteLine("frames: " + ((int)(Owner.DeltaTime/Owner.FixedDeltaTime))); if (orientation.Unit.X == 0 || orientation.Unit.X / Math.Abs(orientation.Unit.X) == physical.Velocity.X / Math.Abs(physical.Velocity.X)) { player.WalkAnimationProgress++; } else { player.WalkAnimationProgress--; } int frameDuration = 8; int animationFrames = 6; if (player.WalkAnimationProgress >= animationFrames * frameDuration) { player.WalkAnimationProgress = 0; } else if (player.WalkAnimationProgress <= 0) { player.WalkAnimationProgress = animationFrames * frameDuration - 1; } } } }
public override void Render <TSurface, TSource>(ScreenRenderer <TSurface, TSource> r) { foreach (PlayerAnimation player in WatchedComponents) { Renderable renderable = player.Owner.Components.Get <Renderable>(); Vector2D[] offsets = new Vector2D[4]; offsets[Head] = new Vector2D(0, Origins[Head]); offsets[Legs] = new Vector2D(0, Origins[Legs]); offsets[Woofer] = new Vector2D(0, Origins[Woofer]); offsets[Arms] = new Vector2D(0, Origins[Arms]); if (!player.Initialized) { renderable.Sprites = new Sprite[] { new Sprite(player.SpritesheetName, Destination, new Rectangle(offsets[Head], 32, 32)), new Sprite(player.SpritesheetName, Destination, new Rectangle(offsets[Legs], 32, 32)), new Sprite(player.SpritesheetName, Destination, new Rectangle(offsets[Woofer], 32, 32)), new Sprite(player.SpritesheetName, Destination, new Rectangle(offsets[Arms], 32, 32)) }; player.Initialized = true; } Physical physical = player.Owner.Components.Get <Physical>(); PlayerOrientation orientation = player.Owner.Components.Get <PlayerOrientation>(); PulseAbility pulse = player.Owner.Components.Get <PulseAbility>(); if (orientation.Unit.X > 0 || player.LastLookedRight) { for (int i = Head; i <= Arms; i++) { offsets[i] += OrientationOffset; } } if (orientation.Unit.Y >= Math.Sin(Math.PI / 6)) { offsets[Head].X += 32; } else if (orientation.Unit.Y <= Math.Sin(-Math.PI / 6)) { offsets[Head].X += 64; } if (orientation.Unit.X != 0) { player.LastLookedRight = orientation.Unit.X > 0; } if (pulse != null) { offsets[Woofer].Y += 32 * 5 * (1 - (pulse.EnergyMeter / pulse.MaxEnergy)); } for (int i = Head; i <= Arms; i++) { renderable.Sprites[i].Source = new Rectangle(offsets[i], 32, 32); } } }
public override void Render <TSurface, TSource>(ScreenRenderer <TSurface, TSource> r) { foreach (PlayerAnimation player in WatchedComponents) { Renderable renderable = player.Owner.Components.Get <Renderable>(); Vector2D[] srcOffsets = new Vector2D[5]; srcOffsets[Legs] = new Vector2D(0, Origins[Legs]); srcOffsets[Torso] = new Vector2D(0, Origins[Torso]); srcOffsets[Head] = new Vector2D(0, Origins[Head]); srcOffsets[Woofer] = new Vector2D(0, Origins[Woofer]); srcOffsets[Arms] = new Vector2D(0, Origins[Arms]); Vector2D[] destOffsets = new Vector2D[5]; destOffsets[Legs] = destOffsets[Torso] = destOffsets[Head] = destOffsets[Woofer] = destOffsets[Arms] = Vector2D.Empty; if (!player.Initialized) { renderable.Sprites = new List <Sprite>() { new Sprite(player.SpritesheetName, Destination, new Rectangle(srcOffsets[Legs], 32, 32)), new Sprite(player.SpritesheetName, Destination, new Rectangle(srcOffsets[Torso], 32, 32)), new Sprite(player.SpritesheetName, Destination, new Rectangle(srcOffsets[Head], 32, 32)), new Sprite("woofer", Destination, new Rectangle(srcOffsets[Woofer], 0, 0)), new Sprite(player.SpritesheetName, Destination, new Rectangle(srcOffsets[Arms], 32, 32)) }; player.Initialized = true; } Physical physical = player.Owner.Components.Get <Physical>(); PlayerMovementComponent movement = player.Owner.Components.Get <PlayerMovementComponent>(); PlayerOrientation orientation = player.Owner.Components.Get <PlayerOrientation>(); if (physical == null || movement == null || orientation == null) { continue; } PulseAbility pulse = player.Owner.Components.Get <PulseAbility>(); bool handsFree = pulse == null; if (orientation.Unit.X > 0 || player.LastLookedRight) { for (int i = Legs; i <= Arms; i++) { srcOffsets[i] += OrientationOffset; } } bool forceLook = handsFree && !movement.OnGround; if (orientation.Unit.Y >= Math.Sin(Math.PI / 9)) { if (!forceLook) { srcOffsets[Head].X += 32; } srcOffsets[Woofer].X += 32; if (!handsFree) { srcOffsets[Arms].X += 32; } if (orientation.Unit.Y >= Math.Sin(2 * Math.PI / 6)) { srcOffsets[Woofer].X += 32; if (!handsFree) { srcOffsets[Arms].X += 32; } } } else if (orientation.Unit.Y <= Math.Sin(-Math.PI / 9)) { if (!forceLook) { srcOffsets[Head].X += 64; } srcOffsets[Woofer].X += 96; if (!handsFree) { srcOffsets[Arms].X += 96; } if (orientation.Unit.Y <= Math.Sin(-2 * Math.PI / 6)) { srcOffsets[Woofer].X += 32; destOffsets[Woofer] += new Vector2D(0, -3); //Offset woofer down since it goes out of the spritesheet grid if (!handsFree) { srcOffsets[Arms].X += 32; } } } if (forceLook) { srcOffsets[Head].X += physical.Velocity.Y <= 0 ? 64 : 32; } if (orientation.Unit.X != 0) { player.LastLookedRight = orientation.Unit.X > 0; } if (pulse != null) { srcOffsets[Woofer].Y = 256; srcOffsets[Woofer].Y -= 32 * Math.Round(pulse.EnergyMeter / 20); if (pulse.EnergyMeter == 0 && player.WooferBlinkingTime >= 0.375) { srcOffsets[Woofer].Y += 32; } } if (handsFree) { srcOffsets[Arms].Y += 32; } if (!movement.OnGround || Math.Abs(physical.Velocity.X) <= 1e-2) /*player.WalkAnimationProgress = 0;*/ } {