Weg berechnung bei Tile Map?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

blackmaster

Betreff: Weg berechnung bei Tile Map?

BeitragDi, Jun 17, 2008 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich möchte gerne den weg berechnen lassen vom Spieler zum Ziel.
Wenn ich mit der Maus auf einen der Felder halte, dann möchte ich den weg vom Spieler bis zu diesem Feld wo die Maus gerade ist anzeigen, es soll nur die Frame Nr 1 beachtet werden zum berechnen.
Der Weg soll dann im Spielfeld mit der Frame Nr 2 eingetragen werden.

Hier ist mal mein Code:
Code: [AUSKLAPPEN]
Graphics 1024,768,16,2
SetBuffer BackBuffer()

Dim Spielfeld(14,14)
Restore map_data
For y=0 To 14
  For x=0 To 14
    Read Spielfeld(x,y)
  Next
Next

;Spieler variablen definieren
Global spieler_x = 7*32+1+(7/1)*5
Global spieler_y = 12*32+1+(12/1)*5
Global spieler_feld_x = 7
Global spieler_feld_y = 12

ClsColor 127,127,127
Repeat
  Cls

  ;Spielfeld zeichnen
  Color 0,0,0
  For y=0 To 14
    For x=0 To 14
      If MouseX() > x*32+(x/1)*5 And MouseX() < x*32+(x/1)*5+32 Then
        If MouseY() > y*32+(y/1)*5 And MouseY() < y*32+(y/1)*5+32 Then
          Feld_x = x
          Feld_y = y
          If Spielfeld(x,y) = 1 Then
            Ziel_x = x
            Ziel_y = y
            move = True ;wird später noch über MauseHit ausgeführt... ist erst nur zum Testen
          EndIf
        EndIf
      EndIf
      If Spielfeld(x,y) > 0 Then
        Color 0,0,0
        Oval x*32+(x/1)*5,y*32+(y/1)*5,32,32,0
      EndIf
      If Spielfeld(x,y) = 2 Then
        Color 0,128,0
        Oval x*32+1+(x/1)*5,y*32+1+(y/1)*5,30,30,1
      EndIf
      ;Text x*32+10+(x/1)*5,y*32+10+(y/1)*5,Spielfeld(x,y)
    Next
  Next

  ;Spieler zeichnen
  Color 128,0,0
  Oval spieler_x,spieler_y,30,30,1

  ;Hier wird dann die bewegung vom Spieler zum Ziel ausgeführt
  If move = True Then
    Color 0,128,0
    Oval Ziel_x*32+1+(Ziel_x/1)*5,Ziel_y*32+1+(Ziel_y/1)*5,30,30,1
  EndIf

  Color 0,0,128
  Text 20,20,"Feld X: "+Feld_x
  Text 20,40,"Feld Y: "+Feld_y

  Flip
Until KeyHit(1)

End

.map_data
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
Data 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0
Data 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
Data 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0
Data 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0
Data 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0
Data 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
Data 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
Data 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


und hier ist mal ein Screen wie ich es gern machen möchte:
http://www.qpic.ws/viewimage.p...o58375.png

Rot = Spieler und Grün = Ziel

Ich wäre euch sehr dankbar, wenn mir da einer weiterhelfen könnte.

MfG

BladeRunner

Moderator

BeitragDi, Jun 17, 2008 1:40
Antworten mit Zitat
Benutzer-Profile anzeigen
guck mal per Suche nach A-Star, es gibt da einige Implemetationen hier.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

blackmaster

BeitragDi, Jun 17, 2008 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.

Ich habe die Suche benutzt aber ich verstehe das nicht mit den Pathfinding.

Könnte mir einer vieleicht ein beispiel posten oder gibt es vieleicht sehr gute Tutorials die das gut beschreiben?

Danke schonmal.

MfG

BladeRunner

Moderator

BeitragDi, Jun 17, 2008 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir vielleicht mal den Wikipedia-Eintrag dazu an.
Das Grund prinzip ist dass du vom Start bis zum Ziel immer die Wegekosten schätzt die nötig sind um das Ziel zu erreichen.
Dazu werden die reellen Kosten addiert die frü jedes geprüfte Feld nötig waren um es zu erreichen. Wenn ein Wert höher ist als die bislang günstigste Schätzung dann wird das Feld nicht weiter betrachtet. So arbeitet sich der Algo Schritt für Schritt zum Ziel vor.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

blackmaster

BeitragMi, Jun 18, 2008 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.

Es gab doch mal ein Tutoriel bei blitzbase.com, leider ist die Seite nicht mehr vorhanden.

Wo bekomme ich eventuell noch dieses Tutorial her?

MfG

kriD

BeitragMi, Jun 18, 2008 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ich finde dieses Tutorial SEHR gut, da man damit die funktionsweise ziemlich gut nachvollziehen kann.

und es ist glaubich sogar ein blitz basic tutorial dabei Wink

lg kriD
Wenn ich du wäre, wäre ich lieber ich!
 

blackmaster

BeitragDo, Jun 19, 2008 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@kriD danke, auf diese Seite war ich schon und alles durchgelesen, trotzdem danke.

Ich habe mir das anders überlegt und zwar habe ich eine Variable namens Wuerfel und diese Variable habe ich den Wert 5 gegeben.

Jetzt meine Frage und zwar, möchte ich ab dort wo der Spieler ist die mögliche Wege anzeigen lassen.

Beispiel Bild:
http://www.qpic.ws/viewimage.p...G31060.png

Könnte ich das auch ohne Pathfinding lösen, wenn ja, wie könnte ich das ambesten realisieren?

MfG

BladeRunner

Moderator

BeitragDo, Jun 19, 2008 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Könnte ich das auch ohne Pathfinding lösen, wenn ja, wie könnte ich das ambesten realisieren?

Einfache Frage, einfache Antwort: nein.
Woher soll der Computer denn wissen welche Felder in Frage kommen? Du wirst irgendeinen Algo darauf ansetzen müssen.
Einzige Ausnahme die mir einfiele und die -da es sich um ein begrenztes Spielfeld handelt- auch noch reasisierbar wäre ist: speichere für jedes Spielfeld in einem Array die Positionen der Spielfelder die mit den möglichen Würfelwürfen drin sind.
Das ist von der Datenmenge ineffizient (Du musst ein array anlegen welches für *nachzähl*: 79 Felder *6 Würfelpositionen * ~6 Endpositionen Platz hat) aber es würde dir rasch Ergebnisse liefern.
Nachteil davon: für das Laufen des Steines zur gewählten Zielposition ist eh wieder ne Wegfindung von nöten, also kann man sich den Mist sparen. Ab davon kann das array nicht erkenne nob einzelne Wege blockiert sind. Also: studier weiter A*.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Omenaton_2

BeitragDo, Jun 19, 2008 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt keine Zeit genauer auf diese Sache einzugehen, aber trotzdem paar Anmerkungen.
Den schon merhmals erwähnten A* Wegfinde-Algorythmus solltest du auf jeden Fall beachten, weil damit man immer schnell einen Weg finden kann, allerdings das ist für feldbasierte Systeme gedacht. Man kann natürlich mehr oder weniger gut über fast alle Spielbereiche ein Gitternetz legen um die Felder zu haben. Früher oder später solltest du dir dein eigens A* programmieren, wenn du es mit dem Spielemachen ernst meinst.

In deinem Fall aber, könnte es eine "vielleicht" etwas (für dich) einfacheren Weg geben. (aber auch nicht ganz einfach !) Mit Wegpunkten. Du setzt "per Hand" an allen Ecken und Kreuzungen (und nur dort) Wegpunkte, die dann in einem Type gespeichert werden. (Wegpunkte Editor oder wenn nur 1-3 Spielfelder gibt, reicht ein Textdatei in Wordpad).
Du mußt dann auch per Hand jedem Wegpunkt seine gültigen Verbindungen zuweisen (0 bis 4 ) mit Richtungsangabe (codiert als Zahl 0,1-4). Geht gut bei rechteckigen Anordnungen und maximal 4 mögliche Wege.
Dann brauchst du einen ganz simplen Wegsuchalgorythmus um den Weg zwischen den einzelnen Wegpunkten zu finden, die Felder zwischen den Wegpunkten kannst du erstmal ignorieren.
Du verschiebst simuliert eine Art "Sonde" von Start Richtung Ziel. Du mußt temporär ablegen können, welche Wegpunkte schon überflogen sind und diese als "halb gesperrt" markieren, damit deine Sonde nicht zurückfliegt sondern schön geradelinig vorankommt.
Beim Start entscheidest du dich für eine der möglichen Verbindungswege und fliegst los. Diese Entscheidung kann Zufall bedingt sein, aber besser ist es, wenn du auch einfache Berechnungen machst um zu sehen, welche Startrichtung am Günstigsten wäre, durch Vergleich der Lage (Himmelsrichtung) des Zieles zum Start.
Dann bei jedem neuen Wegpunkt angekommen (wenn es von dort mehr als nur 1 momentan freie, also auch noch bisher nicht überflogene Verbindungsweg zum Nachbarwegpunkt gibt) triffst du eine Entscheidung wie weiter fliegen. Du kannst einfach den Weg nehmen, der dich mehr in Richtung Ziel bringt, aber das ist nicht optimal. Besser ist es alle Wege kurz auszuprobieren, die Weglängen abzuspeichern und dann den Weg wählen, der dich an deinem Ziel am nächsten ranbringt.

Wenn du am Start mehr als nur 1 Möglichkeit hast loszufliegen, dann solltest du alle anderen Wege genauso simuliert abfliegen. Am Ende jedes "Fluges" die Gesamtlänge des Weges und ob ein Weg überhaupt so gefunden wurde abspeichern. Dann ganz Am Ende entscheidest du dich für den Gesamt-Weg, der am Kürzesten ist und auch zum Ziel führt. Danach erst speicherst du den so gefundenen Weg Schritt für Schritt in einem DIM Feld oder wo aucuh immer ab und wenn das Spiel dann weiterläuft, gehst du mti der Figur von Schritt zu Schritt (von Wegpuntk zu Wegpunkt).

Noch was. Bevor das alles beginnt, solltest du deine "Spielfigur" und dein Ziel einem der Wegpunkten zuweisen. Der Wegpunkt, der zu deiner Spielfigur am Nächsten ist und zu dem Line of Sight besteht wird der "Home" Wegpunkt. Du suchst also eigentlich einen möglichst kurzen Weg zwischen den 2 Home-Wegpunkten. Am Ende liegt dann dein bewegliche (Ziel suchende) Spielfigur auf einem Wegpunkt, der mit dem Wegpunkt des Zieles auf einer Linie und benachbart liegt. Von dort mußt du dann eventuell noch ein Stück eifnach geradeaus weiterfliegen, um an dem Ziel ganz nahe zu kommen. Das ist aber schon ganz simpel.

Ich spreche deswegen von "Sonde" und "Abfliegen", weil ich vor Kurzem so ähnlich ein Wegpunktesystem für mein kleines Weltraumrollenspiel gemacht habe. Die Logik dahinter ist nicht schwer, aber das Ganze dann doch konkret in Code umzusetzen hat es schon in sich. Ich habe dafür weit länger gebraucht, als ich gedacht habe, aber es funktioniert jetzt.
Eine so einfache Lösung wie du das gerne hättest gibt es nicht.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group