Weg berechnung bei Tile Map?
Übersicht

blackmasterBetreff: Weg berechnung bei Tile Map? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() lg kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group