Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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);
            }
        }