/// <summary> /// Erzeugt eine neue Beschreibung. /// </summary> /// <param name="element">Das zugehörige Element.</param> /// <param name="spielZeit">Die bisher verstrichene Spielzeit.</param> /// <param name="sekunden">Die Anzahl der Sekunden seit der letzten Berechnung.</param> public BewegungsInformation( GrundElement element, TimeSpan spielZeit, decimal sekunden ) { // Nicht nutzbar if (element.IstDeaktiviert) return; // Merken m_verbleibendeSchritte = (int) Math.Round( 1000m * sekunden ); Element = element; // Geschwindigkeit auslesen var geschwindigkeit = element.GeschwindigkeitsRegel.AktuelleGeschwindigkeitBerechnen( spielZeit ); if (geschwindigkeit == null) return; // Anfangsposition auslesen var aktuellePosition = element.Position; // Endposition berechnen var xEnde = (aktuellePosition.HorizontalePosition + geschwindigkeit.HorizontaleGeschwindigkeit * sekunden).ZwischenNullUndEins(); var yEnde = (aktuellePosition.VertikalePosition + geschwindigkeit.VertikaleGeschwindigkeit * sekunden).ZwischenNullUndEins(); // Ziel und Geschwindigkeit merken Geschwindigkeit = geschwindigkeit; // Schrittweiten berechnen m_xSchritt = (xEnde - aktuellePosition.HorizontalePosition) / m_verbleibendeSchritte; m_ySchritt = (yEnde - aktuellePosition.VertikalePosition) / m_verbleibendeSchritte; // Es witd sich nichts verändern if (m_xSchritt == GenaueZahl.Null) if (m_ySchritt == GenaueZahl.Null) return; // Dem Element mitteilen, dass es nun losgeht element.Bewegen( aktuellePosition ); }
/// <summary> /// Entfernt eine einzelne Geschwindigkeitsregel. /// </summary> /// <param name="geschwindigkeit">Die zu entfernende Geschwindigkeitsregel.</param> public void GeschwindigkeitEntfernen( Geschwindigkeit geschwindigkeit ) { // Muss parallel ausführbar sein for (; ; ) { // Alte Liste var liste = m_liste; // Neue Liste ohne den angegebenen Eintrag var neu = new List<Geschwindigkeit>( liste.Where( bekannteGeschwindigkeit => !ReferenceEquals( bekannteGeschwindigkeit, geschwindigkeit ) ) ); // Sicher ersetzen if (neu.Count < liste.Count) #pragma warning disable 0420 if (ReferenceEquals( Interlocked.CompareExchange( ref m_liste, neu, liste ), liste )) #pragma warning restore 0420 break; } }
/// <summary> /// Ergänzt eine neue Geschwindigkeit. /// </summary> /// <param name="geschwindigkeit">Die neue Geschwindigkeit.</param> public void GeschwindigkeitErgänzen( Geschwindigkeit geschwindigkeit ) { // Muss parallel ausführbar sein for (; ; ) { // Alte Liste var liste = m_liste; // Neue Liste var neu = new List<Geschwindigkeit>( liste ) { geschwindigkeit }; // Sicher ersetzen #pragma warning disable 0420 if (ReferenceEquals( Interlocked.CompareExchange( ref m_liste, neu, liste ), liste )) #pragma warning restore 0420 break; } }