internal void Update() { var aWorld = this.World; var aNearest = aWorld.FrameInfo.NearestBumperIsDefined ? new CNearestObject(aWorld.FrameInfo.NearestAsteroid.DistanceToAvatar, aWorld.FrameInfo.NearestAsteroid.ObjectId, aWorld.GameTimeTotal) : default(CNearestObject) ; if (aNearest is object) { this.Sample(aNearest); } else { this.ResetSamples(); } var aQueuedHitpointNullable = this.QueuedHitpointNullable; if (aQueuedHitpointNullable is object) { var aStopped = this.PlayingHitpointNullable is object && !this.PlayingHitpointNullable.Item2.SoundBuffer.IsPlaying ; if (aStopped) { this.PlayingHitpointNullable = default; } var aYetPlaying = this.PlayingHitpointNullable is object && this.PlayingHitpointNullable.Item2.RefEquals <CSoundFile>(aQueuedHitpointNullable.Item2); if (!aYetPlaying) { aQueuedHitpointNullable.Item2.SoundBuffer.Play(); this.PlayingHitpointNullable = aQueuedHitpointNullable; this.QueuedHitpointNullable = default; } } }
private void RunBackgroundTask() { var aHitpoints = this.HitPoints; var aRandom = new Random((int)DateTime.Now.Ticks); var aIgnoreCollisionTendencyThisTime = new Func <int, bool>(idx => { var aCount2 = aHitpoints.Last().Item1.TotalMilliseconds / this.SampleIntervall.TotalMilliseconds; var aCount = (double)aHitpoints.Length; var aRnd = aRandom.NextDouble(); var cmp = ((double)idx * (this.SampleIntervall.TotalMilliseconds / aHitpoints.Last().Item1.TotalMilliseconds)); var aIgnore = aRnd > cmp * 0.07d; return(aIgnore); }); var aSamplePoints = new List <CNearestObject>(this.SampleCountMax); var aQueuedHitpoint = default(CQueuedHitpoint); var aPlayingHitpoint = default(CQueuedHitpoint); while (!this.BackgroundTaskCancelRequested) { if (aHitpoints.Length > 0) { aSamplePoints.Clear(); lock (this.SamplePoints) { aSamplePoints.AddRange(this.SamplePoints); } if (aSamplePoints.Count == SampleCountMax) { var aSamplePoints2 = (from aSamplePoint in aSamplePoints where aSamplePoint.Item2.IsEqual(aSamplePoints.Last().Item2) select aSamplePoint).ToArray(); // aSamplePoints.GroupBy(aSamplePoint => aSamplePoint.Item2).ToArray(); if (aSamplePoints2.Length > 0) { double aCurrentDistance = 0d; bool aGettingNearer = true; for (var i = 1; i < aSamplePoints2.Length && aGettingNearer; ++i) { var aPrevious = aSamplePoints2[i - 1].Item1; var aCurrent = aSamplePoints2[i].Item1; aCurrentDistance = aPrevious - aCurrent; if (aCurrentDistance < 0.0) { aGettingNearer = false; } } if (aGettingNearer) { var aFirst = aSamplePoints.First(); var aLast = aSamplePoints.Last(); var aFirstDist = aFirst.Item1; var aLastDist = aLast.Item1; var aLastTimeMs = aLast.Item3.TotalMilliseconds; var aFirstTimeMs = aFirst.Item3.TotalMilliseconds; var aDeltaTime = aLastTimeMs - aFirstTimeMs; // aLast.Item3.Subtract(aFirst.Item3); var aDeltaDistance = aFirstDist - aLastDist; if (aDeltaDistance > 0) { var aSpeed = aDeltaDistance / aDeltaTime; var aDistanceToGo = aLastDist; var aTimeUntilCollision = aSpeed == 0d ? double.NaN : aDistanceToGo / aSpeed; if (double.IsNaN(aTimeUntilCollision)) { this.QueuedHitpointNullable = default; } else if (aTimeUntilCollision > 0) { bool aIgnored = false; bool aHitpointQueued = false; for (var i = 0; i < aHitpoints.Length && !aHitpointQueued && !aIgnored; ++i) { var aHitpoint = aHitpoints[i]; if (aHitpoint.Item1.TotalMilliseconds > aTimeUntilCollision) { if (aIgnoreCollisionTendencyThisTime(i)) { aIgnored = true; } else { var i2 = i > 0 ? i - 1 : i; var aPreviousTime = aHitpoints[i2]; var aTimeToStartHitpoint = aTimeUntilCollision - aHitpoint.Item1.TotalMilliseconds; aQueuedHitpoint = new CQueuedHitpoint(aHitpoint.Item1, aHitpoint.Item2, TimeSpan.FromMilliseconds(aTimeToStartHitpoint)); this.QueuedHitpointNullable = aQueuedHitpoint; aPlayingHitpoint = aQueuedHitpoint; aHitpointQueued = true; } } } } } } } } } System.Threading.Thread.Sleep((int)this.SampleIntervall.TotalMilliseconds); } }