public void PresentOne(VehicleInstance vi) { // if(_game.ShowVehicleProbes) // r.AddDrawable(_targetLine); var spr = _sprite.Add(); if((vi.Flags & Sim.VehicleStatePacket.HurtFlag) != 0) { vi.HurtTimer.Reset(); } spr.X = vi.Position.X; spr.Y = vi.Position.Y; spr.Angle = (ushort)((vi.Angle-1024) & 4095); if(vi.HurtTimer.Progress > 0.0f) { float flash = (float)Math.Pow(1.0f-vi.HurtTimer.Progress, 2.0f); float amount = (float)Math.Pow((1.0f-((float)vi.HitPoints)/vi.MaxHitPoints), 3.0f); amount = Util.Lerp(0.0f, 1.5f, amount); spr.Color = new Color4(1.0f * amount, flash * amount, flash * amount, 1.0f); } else { spr.Color = new Color4(0f,0f,0f,1f); } vi.HurtTimer.Tick(); }
public void Present(IEnumerable<ObjectStatePair> ous, float k) { foreach(var p in _presenters) { p.Value.BeginPresent(); } _healthBars.Clear(); foreach(var osp in ous) { var cur = (Sim.VehicleStatePacket)osp.Current; var prev = (Sim.VehicleStatePacket)osp.Previous; if(cur == null) { _instances.Remove(prev.Uid); continue; } VehicleInstance vi; if(!_instances.TryGetValue(cur.Uid, out vi)) { vi = new VehicleInstance() { Presenter = _presenters[cur.TypeId], HurtTimer = new Timer(TimerMode.CountDown, 5) }; _instances.Add(cur.Uid, vi); } if(prev == null) { vi.Position = cur.Position; vi.Angle = cur.Angle; vi.HitPoints = cur.HitPoints; vi.MaxHitPoints = cur.MaxHitPoints; } else { vi.Position = Vector2.Lerp(prev.Position, cur.Position, k); vi.Angle = Util.LerpAngle(prev.Angle, cur.Angle, k); vi.HitPoints = Util.Lerp(prev.HitPoints, cur.HitPoints, k); vi.MaxHitPoints = Util.Lerp(prev.MaxHitPoints, cur.MaxHitPoints, k); } vi.Presenter.PresentOne(vi); int hpFrame = (int)(29.0f * ((float)vi.HitPoints)/vi.MaxHitPoints); _healthBars.Add(vi.Position.X, vi.Position.Y-20, hpFrame); } _renderer.AddDrawable(_healthBars); foreach(var p in _presenters) { p.Value.EndPresent(); } }