magony.org
http://forum.magony.org/

Figurenbewegung und Sichtfeld
http://forum.magony.org/viewtopic.php?f=2&t=1311
Seite 1 von 1

Autor:  Magony [ Do 10. Okt 2013, 18:37 ]
Betreff des Beitrags:  Figurenbewegung und Sichtfeld

Hallo Leute!

Neben der Möglichkeit dass sich nun seit einiger Zeit die Figuren auf dem Spielfeld bewegen können, habe ich nun auch das letzte Puzzleteil für den Sichtbereich hinzugefügt. Hier nun die neuesten Errungenschaften und zum Schluß, ein Ausblick zum nächsten
Schritt.


Animation
Ein großes Problem bei der Bewegung der Figuen war die Animation, die ich nun auf Weiteres zunächst einmal übersprungen habe, um mal endlich wieder weiter zu kommen. Jetzt skaten die Figuren zwar wieder über den Bildschirm, aber immerhin tun sie nun endlich mal was. Die Sache mit der Animation wird auch deshalb so schwierig, weil für jede Bewegungsrichtung eigene Skripte geschrieben werden müssen und die sind recht aufwendig - zumindest wenn man das so haben will wie ich ;)


Bewegung
Es gibt ein paar Punkte auf die ich bei der Bewegung achten musste:
  • Die Bewegungsbefehle werden in einer Liste gespeichert und dann nacheinander abgearbeitet.
  • Die Figur soll nicht in ungültige Bereiche sich bewegen können:
    1. Felder am Kartenrand und unbetretbare Felder;
    2. Felder zu denen das Team der Figur kein Zutritt hat;
    3. Felder, die von dieser Richtung aus nicht betreten werden können;
    4. Felder, auf die bereits eine Figur steht (dann wird das Feld nicht gewechselt und die Figur steht zwischen den beiden Feldern, bereit zum Wechseln des Feldes - die Figur hat also das Feld für sich reserviert);
    5. Felder, die bereits von einer anderen Figur reserviert worden sind.
  • Es darf kein Zirkelbezug auftreten, was zu einer Blockade führen würde (Dead-Lock = Figur A wartet, dass Figur B sich bewegt und Figur B wartet, dass sich Figur A bewegt).
  • Die Bewegung muss zurückgesetzt werden können.
  • Der Sichtbereich muss nach einem Feldwechsel aktualisiert werden.


Sichtfeld
Das Sichtfeld wird immer nur dann neu berechnet, wenn eine Figur bewegt oder gedreht wurde. Es gibt zwei Formen von Sichtfeldern: "Kegel" und Radius. Beim Radius ist es recht einfach: Es gibt ein Feld in der Mitte und in einen Radius um das Feld herum werden die Felder ebenfalls ausgewählt.

Beim "Kegel" gibt es zwei Zahlen: Front und Flanke. Die erste Zahl gibt die Reichweite des Sichtbereichs in Blickrichtung der Figur an und die zweite Zahl die Reichweite des Sichtfeldes an den zwei, an der Blickrichtung der Figur anliegenden, Sichtrichtungen.

Ein Beispiel: Eine Figur hat die Reichweite 4 und 2
Bild
Übrigens: Die roten Zahlen sind noch für das Debuggen (auch wenn gerade eher überflüssig). X-Y: ID -> Das heißt: Die X- und Y-Koordinate des Sektors und die ID des Feldes.


Der neueste Code ist die Rückgabe einer Liste mit Feldern für einen Sichtbereich mit Radius:
Code:
 
internal static IEnumerable<Hexagon> GetHexagonKreis(Hexagon zentrum, int radius)
{
        List<Hexagon> result = new List<Hexagon>(radius * 12 + 1);
        result.Add(zentrum);
        for (; radius > 0; radius--)
        {
                List<Hexagon> ring = new List<Hexagon>(12);
                for (int ix = 0; ix < result.Count; ix++)
                        foreach (Hexagon hex in result[ix].Nachbar.Values)
                                if (hex != null &amp;&amp; hex.IsBetretbar &amp;&amp; !ring.Contains(hex) &amp;&amp; !result.Contains(hex))
                                        ring.Add(hex);
                result.AddRange(ring);
        }
        return result;
}
 

Dies ist eine statische Methode in der Klasse Hexagon. Diese Klasse beschreibt ein Feld. Die Kombination von Deutsch und Englisch bitte ich zu entschuldigen, jedoch liegt das einfach daran, dass auch der Code (z.B. Schlüsselwörter) zwangsweiße teils Englisch, teils Deutsch ist. Die überflüssigen Scopes (Bereiche die mit { anfangen und mit } enden) habe ich nachträglich entfernt. Btw. es sind Und-Zeichen.

Besonders stolz bin ich auf dem Code wegen der Tatsache, dass ich mir diesen Code schon Tage vorher als Lösung ausgedacht hatte und er auf Anhieb funktionierte :D


Nächster Punkt:
Als Nächstes werde ich mich an das Pathfinding machen. Dabei schwebt mir ein statisches Konstrukt, das sich mit Informationen füllt sobald die Map geladen wurde, vor und einer situationsbedingten Prüfroutine, die dann auf Grundlage dieser Informationen feststellt, welche Felder betreten werden müssen, um das Ziel erreichen zu können.

Da ich Pathfinding schon einmal erfolgreich gemacht habe - allerdings auf einer "Schachbrett-Karte" und da nur als statische Version bei der nach jeder Bewegung die Grundlage für das Pathfinding erneut berechnet werden musste - denke ich, dass das durchaus bis nächsten Dienstag laufen könnte :shifty: . Evtl. sogar mit einem Karteneditor damit ich die erste Mission gestalten kann. :lol:

Mal sehen, was sich dann wirklich machen lässt - das weiß man vorher ja nie so genau ;)


Schöne Grüße,
Magony

Autor:  Magony [ So 13. Okt 2013, 21:10 ]
Betreff des Beitrags:  Umrahmung

Hallo Leute!

Mittlerweile funktioniert auch die Umrahmung von bestimmten Fehldern. So kann zum Beispiel der Sichtbereich der jeweils ausgewählten Einheit hervorgehoben werden. Technisch gesehen muss ich der Methode, die diese Umrahmung umsetzt, nur eine beliebige Liste von Feldern übergeben. Damit ist sie universell einsetzbar - selbst wenn die Felder Lücken zueinander haben.

Hier ein paar Screenshots von einer Einzelumrahmung, einer Kombination und einer Teamumrahmung:
Bild Bild Bild

Schöne Grüße,
Magony

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/