/// <summary> /// Erstellt einen neuen Bereich. /// </summary> /// <param name="horizontalePosition">Der horizontale Anfang des Bereichs.</param> /// <param name="vertikalePosition">Der vertikale Anfang des Bereichs.</param> /// <param name="breite">Die Breite des Bereichs.</param> /// <param name="höhe">Die Höhe des Bereichs.</param> private Bereich( GenaueZahl horizontalePosition, GenaueZahl vertikalePosition, GenaueZahl breite, GenaueZahl höhe ) { // Merken m_größteHorizontalePosition = horizontalePosition + breite; m_größteVertikalePosition = vertikalePosition + höhe; m_kleinsteHorizontalePosition = horizontalePosition; m_kleinsteVertikalePosition = vertikalePosition; }
/// <summary> /// Erstellt eine neue Geschwindigkeitsinformation. /// </summary> /// <param name="xGeschwidigkeit">Die horizontale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="yGeschwindigkeit">Die vertikale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="gueltigBis">Der Zeitpunkt, bis zu dem die Geschwindigkeit auf das zugehörige Element angewendet werden soll.</param> /// <returns>Die gewünschte Beschreibung der Geschwindigkeit.</returns> /// <exception cref="ArgumentOutOfRangeException">Mindestens ein Parameter ist ungültig.</exception> public static TemporaereGeschwindigkeit Erzeugen( GenaueZahl xGeschwidigkeit, GenaueZahl yGeschwindigkeit, TimeSpan gueltigBis ) { // Prüfen if (gueltigBis.Ticks < 0) throw new ArgumentOutOfRangeException( "gueltigBis" ); // Anlegen return new TemporaereGeschwindigkeit( xGeschwidigkeit, yGeschwindigkeit, gueltigBis ); }
/// <summary> /// Erzeugt eine neue Spielfigur. /// </summary> /// <param name="position">Die Position des Elementes auf dem Spielfeld.</param> /// <param name="ausdehnung">Die relative Größe des Elementes.</param> public Spieler( Position position, Ausdehnung ausdehnung ) : base(position, ausdehnung, false, null) { // Initialisierung beenden AktuelleGeschwindigkeit = Geschwindigkeit.Erzeugen( GenaueZahl.Null, GenaueZahl.Null ); m_sprungDauer = TimeSpan.FromMilliseconds( 100 ); m_einfacheGeschwindigkeit = GenaueZahl.Eins / 25; m_maximalerGeschwindigkeitsFaktor = 5; m_sprungStärke = GenaueZahl.Eins / 2; m_maximalerSprung = 3; m_aktuellerFaktor = 0; }
/// <summary> /// Erstellt eine neue Ausdehnung. /// </summary> /// <param name="breite">Die relative Breite.</param> /// <param name="höhe">Die relative Höhe.</param> /// <returns>Die gewünschte neue Ausdehnung.</returns> /// <exception cref="ArgumentOutOfRangeException">Die angegebene Ausdehung ist unzulässig.</exception> public static Ausdehnung Erzeugen( GenaueZahl breite, GenaueZahl höhe ) { // Prüfen if (breite < GenaueZahl.Null) throw new ArgumentOutOfRangeException( "breite" ); if (höhe < GenaueZahl.Null) throw new ArgumentOutOfRangeException( "höhe" ); if (breite > GenaueZahl.Eins) throw new ArgumentOutOfRangeException( "breite" ); if (höhe > GenaueZahl.Eins) throw new ArgumentOutOfRangeException( "höhe" ); // Merken return new Ausdehnung( breite, höhe ); }
/// <summary> /// Erstellt eine neue Position. /// </summary> /// <param name="horizontalePosition">Die horizontale Position.</param> /// <param name="vertikalePosition">Die vertikale Position.</param> /// <returns>Die gewünschte neue Position.</returns> /// <exception cref="ArgumentOutOfRangeException">Die Position ist ungültig.</exception> public static Position Erzeugen( GenaueZahl horizontalePosition, GenaueZahl vertikalePosition ) { // Prüfen if (horizontalePosition < GenaueZahl.Null) throw new ArgumentOutOfRangeException( "horizontalePosition" ); if (vertikalePosition < GenaueZahl.Null) throw new ArgumentOutOfRangeException( "vertikalePosition" ); if (horizontalePosition > GenaueZahl.Eins) throw new ArgumentOutOfRangeException( "horizontalePosition" ); if (vertikalePosition > GenaueZahl.Eins) throw new ArgumentOutOfRangeException( "vertikalePosition" ); // Anlegen return new Position( horizontalePosition, vertikalePosition ); }
/// <summary> /// Erzeugt eine neue Beschreibung. /// </summary> /// <param name="fläche">Die tatsächliche Position des Elementes.</param> /// <param name="horizontaleVerschiebung">Die Verschiebung in horizontale Richtung.</param> /// <param name="vertikaleVerschiebung">Die Verschiebung in vertikale Richtung.</param> private ElementInBewegung( Fläche fläche, GenaueZahl horizontaleVerschiebung, GenaueZahl vertikaleVerschiebung ) { // Alles merken HorizontaleVerschiebung = horizontaleVerschiebung; VertikaleVerschiebung = vertikaleVerschiebung; Fläche = fläche; // Breite und Höhe des Bewegungspfads ermitteln var breite = Fläche.Bereich.Breite + HorizontaleVerschiebung.Abs(); var höhe = Fläche.Bereich.Höhe + VertikaleVerschiebung.Abs(); // Ursprung bestimmen var links = Fläche.Bereich.KleinsteHorizontalePosition; var unten = Fläche.Bereich.KleinsteVertikalePosition; // Je nach Orientierung korrigieren if (HorizontaleVerschiebung < GenaueZahl.Null) links += HorizontaleVerschiebung; if (VertikaleVerschiebung < GenaueZahl.Null) unten += VertikaleVerschiebung; // Gesamtumfang ermitteln GesamterBereich = Bereich.Erzeugen( links, unten, breite, höhe ); }
/// <summary> /// Erzeugt eine neue Beschreibung. /// </summary> /// <param name="fläche">Die tatsächliche Position des Elementes.</param> /// <param name="horizontaleVerschiebung">Die Verschiebung in horizontale Richtung.</param> /// <param name="vertikaleVerschiebung">Die Verschiebung in vertikale Richtung.</param> /// <returns>Die gewünschte Beschreibung der Bewegung.</returns> public static ElementInBewegung Erzeugen( Fläche fläche, GenaueZahl horizontaleVerschiebung, GenaueZahl vertikaleVerschiebung ) { // Forward return new ElementInBewegung( fläche, horizontaleVerschiebung, vertikaleVerschiebung ); }
/// <summary> /// Erstellt einen neuen Bereich. /// </summary> /// <param name="horizontalePosition">Der horizontale Anfang des Bereichs.</param> /// <param name="vertikalePosition">Der vertikale Anfang des Bereichs.</param> /// <param name="breite">Die Breite des Bereichs.</param> /// <param name="höhe">Die Höhe des Bereichs.</param> /// <returns>Der gewünschte Bereich.</returns> public static Bereich Erzeugen( GenaueZahl horizontalePosition, GenaueZahl vertikalePosition, GenaueZahl breite, GenaueZahl höhe ) { // Erzeugen if (breite < GenaueZahl.Null) return Erzeugen( horizontalePosition + breite, vertikalePosition, -breite, höhe ); else if (höhe < GenaueZahl.Null) return Erzeugen( horizontalePosition, vertikalePosition + höhe, breite, -höhe ); else return new Bereich( horizontalePosition, vertikalePosition, breite, höhe ); }
/// <summary> /// Erstellt eine neue Geschwindigkeitsinformation. /// </summary> /// <param name="horizontaleGeschwindigkeit">Die horizontale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="vertikaleGeschwindigkeit">Die vertikale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <returns>Die gewünschte Beschreibung der Geschwindigkeit.</returns> /// <exception cref="ArgumentOutOfRangeException">Mindestens ein Parameter ist ungültig.</exception> public static Geschwindigkeit Erzeugen( GenaueZahl horizontaleGeschwindigkeit, GenaueZahl vertikaleGeschwindigkeit ) { // Anlegen return new Geschwindigkeit( horizontaleGeschwindigkeit, vertikaleGeschwindigkeit ); }
/// <summary> /// Erstellt eine neue Geschwindigkeitsinformation. /// </summary> /// <param name="horizontaleGeschwindigkeit">Die horizontale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="vertikaleGeschwindigkeit">Die vertikale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> protected Geschwindigkeit( GenaueZahl horizontaleGeschwindigkeit, GenaueZahl vertikaleGeschwindigkeit ) { // Merken m_horizontaleGeschwindigkeit = horizontaleGeschwindigkeit; m_vertikaleGeschwindigkeit = vertikaleGeschwindigkeit; }
/// <summary> /// Erstellt eine neue Ausdehung. /// </summary> /// <param name="breite">Die Breite der Fläche.</param> /// <param name="höhe">Die Höhe der Fläche.</param> private Ausdehnung( GenaueZahl breite, GenaueZahl höhe ) { // Merken m_breite = breite; m_hoehe = höhe; }
/// <summary> /// Erstellt eine neue Position. /// </summary> /// <param name="horizontalePosition">Die horizontale Position.</param> /// <param name="vertikalePosition">Die vertikale Position.</param> /// <returns>Die gewünschte neue Position.</returns> public static Position SicherErzeugen( GenaueZahl horizontalePosition, GenaueZahl vertikalePosition ) { // Anlegen return Erzeugen( horizontalePosition.ZwischenNullUndEins(), vertikalePosition.ZwischenNullUndEins() ); }
/// <summary> /// Erstellt eine neue Position auf dem Spielfeld. /// </summary> /// <param name="horizontalePosition">Die horizonatale Koordinate.</param> /// <param name="vertikalePosition">Die vertikale Koordinate.</param> private Position( GenaueZahl horizontalePosition, GenaueZahl vertikalePosition ) { // Merken m_horizontalePosition = horizontalePosition; m_vertikalePosition = vertikalePosition; }
/// <summary> /// Erstellt eine neue Geschwindigkeitsinformation. /// </summary> /// <param name="xGeschwidigkeit">Die horizontale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="yGeschwindigkeit">Die vertikale Geschwindigkeit, wobei <i>1</i> bedeutet, dass das gesamte Spielfeld in einer Sekunden abgelaufen wird.</param> /// <param name="gueltigBis">Der Zeitpunkt, bis zu dem die Geschwindigkeit auf das zugehörige Element angewendet werden soll.</param> protected TemporaereGeschwindigkeit( GenaueZahl xGeschwidigkeit, GenaueZahl yGeschwindigkeit, TimeSpan gueltigBis ) : base(xGeschwidigkeit, yGeschwindigkeit) { // Merken m_anwendenBis = gueltigBis; }
/// <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 ); }