Stand Dezember 2010: Flottenbewegungen

Bevor ich es vor Weihnachten doch noch komplett vergesse hier der versprochene Post ^^.

Wie bereits geschrieben habe ich vor kurzem wieder verstärkt an Nouron gearbeitet. Vor allem noch am neuen Galaxiesystem und den Flottenbewegungen.

Ich habe dabei ein paar Entscheidungen getroffen: um in etwas schneller voran zu kommen habe ich ein paar geplante Features in beiden Systemen erstmal auf Eis gelegt. Es handelt sich dabei um die Handelsrouten und Sternstraßen sowie der damit verbundenen komplizierten Wegberechnung bei Flottenbewegungen. Diese Features werden also vorerst nicht implementiert – ich behalte sie jedoch im Hinterkopf und werde sie noch in Angriff nehmen, sobald eine halbwegs ausgereifte, spielbare Spielversion fertiggestellt ist.Wie laufen nun die Flottenbewegungen?

Der Spielmechanismus ist in etwa wie folgt:

  1. Systemkarte aufrufen
  2. eigene Flotte aus Liste durch anklicken auswählen
  3. Zielpunkt auf der Karte anklicken (sollte es mehrere Ziele auf der Koordinate x,y geben: Auswahl per Dropdown)
  4. Befehl geben (Bewegen, Transportieren, Angreifen, etc..).

Dann wird im Hintergrund der Pfad berechnet und in die Db gespeichert. Bei der Tickberechnung wird dann der Befehl für den aktuellen Tick ausgeführt.

Wie wird der Pfad berechnet?

Wichtig ist es mir, dass die Flotten immer eine richtige Position in der Galaxie haben. Bei vielen Browsergames ist es so, dass man Flotten zwischen Start und Ziel nicht verfolgen kann. Man kann sie nicht auf der Karte sehen und man sie nicht von der aktuellen Position aus einen neuen Befehl geben oder als gegnerischer Spieler abfangen oder ähnliches..
Wie erreiche ich das nun? Die Pfadberechnung berechnet momentan nur eine Linie von A nach B. Jeder Punkt der Linie entspricht einem Punkt im Koordinatensystem der Galaxie. Es gibt dabei ein Problem: wenn der Flug von A nach B mehrere Ticks dauert, wo steht dann die Flotte nach 1,2 oder 3 Ticks genau? Also auf welcher Koordinate. Und wie genau ist das bei schrägen Linien? Ich habe mich bei der Lösung dieses Problem einem Algorithmus aus der Computergrafik bedient: dem Bresenham-Algorithmus (den ich jetzt hier aber nicht erkläre ^^).

Der Algorithmus berechnet die Punkte um eine Linie als Rastergrafik darstellen zu können. Jetzt habe ich aber das Problem, dass ich gar nicht jeden Punkt brauche und aus Speicher- und Performancegründen auf unnötige Punkte verzichten will. Hierfür habe ich den Algorithmus modifiziert und nur die Pfad-Punkte gespeichert wo die Flotte quasi zwischen zwei Ticks „parkt“. Lol, ich glaube das hat man jetzt nicht so richtig verstanden.

Also Beispiel: Wenn ich von Punkt (0,0) nach Punkt (100,100) fliege und der Flug drei Ticks braucht aber die Linienalgorithmus mir 100 Pfadpunkte berechnet, dann speichere ich nur die Punkte, wo die Flotte bei Tick 0,1,2 und 3 steht:

Tick Koordinaten
12345 (0,0)
12346 (33,33)
12347 (66,66)
12348 (100,100)

Das funktioniert soweit ganz gut. Ein Problem gibt es noch: Bislang bin ich von einer Standardgeschwindigkeit ausgegangen. Flotten haben aber nicht immer die gleiche Geschwindigkeit.
Die Lösung hierfür ist aber relativ einfach:
Die Flottengeschwindigkeit ist gleich der Geschwindigkeit des langsamsten Schiffstyps in der Flotte.
Und diese errechnete Geschwindigkeit wird dann als Parameter an die getPath()-Funktion mit dem modifizierten Bresenham-Algorithmus übergeben und fertig.

So ich hoffe der Artikel hat mal wieder ein paar interessante Einblicke in die Entwicklung von Nouron gewährt.

Bleibt mir nur jedem der das hier liest ein frohes Weihnachtsfest und einen guten Rutsch ins Jahr 2011 zu wünschen!

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s