Letzter Beitrag der vorhergehenden Seite:
Aber ersteinmal kurz zur Hauptengine zurück:Ich habe mir überlegt, dass ich folgende Milestones für den Anfang definiere:
1. Milestone: ein Raum mit einer Figurengrafik (statisch), die durch Mausklick an einen gültigen Ort bewegt werden kann auf einem gültigen Weg (ohne gültigen Weg code ich das in recht kurzer Zeit zusammen, daher diese Zusatzanforderung)
Wenn diese steht, kann Gu.Ro, der mir im Rahmen seiner Programmierkenntnisse in Visual Basic seine Unterstützung zugesagt hat, schon mal beginnen, an einem Leveleditor zu programmieren
2. Milestone: mehrere Leute in einem Raum, die herumlaufen können, gesteuert durch einen Server (hierbei ist eine besondere Anforderung, dass nichts passiert, wenn einer der Clients "abgeschossen" wird).
3. Milestone: In Abhängigkeit davon, ob der Leveleditor weit genug ist, wird die Engine entweder um einen Chat oder um volle Unterstützung zum Laden von Levels erweitert.
4. Milestone: der im 3. Milestone fehlende Punkt
5. Milestone: Wechseln von Räumen, rudimentärer Objektsupport (anschauen; nicht manipulieren)
das dürften für den Anfang genug Milestones sein
Ich bitte zu beachten, dass mit 99%iger Wahrscheinlichkeit die ersten beiden Milestones sehr lange dauern werden (Faustregel: für die ersten 10% des Codes braucht man 90% der Zeit, der Rest geht schnell und für das Debuggen am Ende braucht man wieder 90% der Zeit).
Für das Levelformat wird XML herhalten: das ist sehr universell und weit verbreitet (wenn auch nicht extrem schnell einzulesen). Es sei denn, jemand hat eine bessere Idee.
In C++ weiß ich, gibt es eine Lib zum Auslesen von XML-Dateien im Internet. Bei Visual Basic gibt es sicher auch eine, ich kenne aber keine, da ich nicht in VB code.
Für das Berechnen eines gültigen Ortes und Weges habe ich mir folgendes ausgedacht:
der Ort, in dem sich der Avatar aufhalten darf, ist durch das Innere eines sich nicht selbst schneidendes Polygon mit den Ecken p1 bis pn festgelegt.
Wenn man an eine Stelle klickt, wird der Avatar ersteinmal versuchen, an diesen Ort zu gelangen (vorausgesetzt, die angeklickte Koordinate liegt innerhalb des Polygons). Wenn er dabei jedoch eine der Kanten überschreiten müsste, dann ist dieser Weg ungültig. In diesem Fall werden im Polygon 3 Ecken mit der Eigenschaft gesucht, dass der Character innerhalb des durch diese 3 Ecken aufgespannten Dreiecks steht und sich keine sonstige Ecke des Polygons sich innerhalb dieses Dreiecks befindet (wenn dies der Fall ist, tauscht man eine der Ecken des Dreiecks so gegen die, welche sich innerhalb befindet aus, dass die Eigenschaft, dass sich der Character innerhalb des Dreiecks befindet, erhalten bleibt. Eine solche Ecke muss es immer geben).
Ebenso bildet man für die Stelle, wo hingeklickt wurde ebenso ein solches Dreieck.
Nun sucht man von jedem Eckpunkt des "Characterdreiecks" einen Weg zu einer der Ecken des "Zieldreiecks" (über die verschiedenen Eckpunkte, wobei man überprüft, ob man von einem Eckpunkt zu einem anderen gelangen kann, ohne eine Kante des Polygons zu kreuzen) und speichert den kürzesten Weg von einem Eckpunkt des "Characterdreiecks" zu einer der Ecken des "Zieldreiecks" ab. Anschließend lässt man den Character den folgenden Weg laufen:
Vom aktuellen Punkt zum Startpunkt des Weges.
Von dort den Weg ablaufen und bei einem der Knoten des Zieldreiecks landen.
Von dort zum Punkt laufen, an den geklickt wurde.
Nun fehlt noch der Fall, dass an einen Punkt geklickt wurde, der außerhalb des Polygons liegt, in dem sich der Character bewegen darf. In diesem Fall bestimmt man den Punkt innerhalb des Polygons, der am nächsten zur Mausklickposition liegt. Das ist einfacher als man denkt: Einfach den Abstand zu allen Kanten des Polygons berechnen und überprüfen, bei welcher Kante er mininmal ist und auf dieser Kante den Punkt finden, der am nächsten zum angeklickten Punkt liegt (vom per floating-point-operations berechneten Punkt ggf. in alle Richtungen um 1 bis 2 pixel schauen, dass es innerhalb des Polygons liegt).
Okay, ich weiß, das ist nicht einfach (insbesondere der Suchalgorithmus bereitet mir Kopfschmerzen): allein: hat jemand eine bessere Idee, wie man die Wegfindung implementieren könnte?