Pathfinding zum 1000. Verständnisfrage
Übersicht

FaenolBetreff: Pathfinding zum 1000. Verständnisfrage |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
Ich hoffe, ich werd bei meinem ersten Posting nicht sofort gegrillt ! *g* Hab standardmäßig Forensuche und google befragt. Thema: Pathfinding in 2D (wobei ich da eher pixel nehme) Zu meinen Programmierkenntnissen (da ihr ja net wisst, was ich kann und was net): einige Jahre VB + Java Kenntnisse Absoluter Neuling in BlitzBasic (aber die Befehle sind ja prinzipiell simpel) Types sind durch Java klar. So hab mir viel durchgelesen unter anderem: - Das Tutorial von "TheShadow" auf Blitzbase - *mist* Name vergessen: Diesen Astar Algo - 3dMaussteuerungRPG and pathfinding Tutorial hier im Forum unter FAQ Ich hab die Demoversion von BlitzBasic, daher funktioniert das dritte Beispiel schon mal net, da dieses in 3D. Nun gut, aber es geht ja auch um die Theorie. TheShadows Tutorial kann ich nachvollziehen. Ist ja dem Dijkstra Algo ähnlich und den hab ich mir schon öfters anhören müssen ! Mein Problem: Ich weiß einfach nicht, wie ich Figur nach dem gefundenen Pfad sich bewegen lasse. Ich mein, die Funktion pathfinding0 hat keinen Rückgabewert, sondern ändert globale Variabeln ! Wie muss der Ablauf in der Main Schleife sein ? Bis jetzt folgt meine Figur meiner Maus überall hin, Pathfinding wollte ich jetzt nur für kommende Hindernisse einbauen. Mein momentaner Bewegungscode ist grob: BlitzBasic: [AUSKLAPPEN]
Also nochmal meine direkte Frage: Ich rufe pathfinding mit den Parametern auf und die Funktion berechnet dann die Werte der Knotenpunkte usw. , aber wie geht es dann weiter ! Sorry, für die dumme Frage, ich hoffe, ich kann bald auch hier klügere stellen ! Gruß und Danke Faenôl |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich speichere mir immer alle koordinaten der knotenpunkte in eine reihe (bank). dann arbeite ich mich da langsam durch und lösche immer die abgearbeiteten orte. das ganze läuft so, dass ich schaue, ob die figur an ihrem zielpunkt (anfangs der startpunkt) angekommen ist. wenn ja, dann wird der in der liste nächste punkt zum zielpunkt erklärt. figuren bewegen sich immer automatisch auf ihre zielpunkte zu.
~VERSCHOBEN~ das gehört in ein anderes forum. *grill* |
||
MrKeks.net |
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich machs so ähnlich, du hast ja von dem a*r algo die berechneten nodes die den pfad angeben. alle diese nodes speicher ich mir in nem extra type, nennen wir ihn
type path field node.node end type dann nehm ich mir immer den nächsten path, also path=first path laufe dorthin und lösche den aus der liste. dann den nächsten, solange noch ein path da ist, gehe ich dorthin. vorher, also beim speichern der pathnodes hab ich noch ne funktion die nur die nodes speichert in denen sich x und y ändert... also wenn die figur von 1/1 zu 3/1 geht, dann wird 2/1 nicht drin gespeichert. das verringert die anzahl an gespeicherten nodes und ist evtl günstig wenn du mehrere sachen bewegen willst die alle in dem path type gespeichert werden... dann machst du einfach type path field node.node field figur.figur end type und gehst den path von vorne durch und sobald figur mit der aktuellen figur übereinstimmt, hast du den richtigen path.... comprende? |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
FaenolBetreff: So ganz noch net |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
@Inarie: Sorry,hab mir mein Löschen des anderen Beitrags (der im falschen Forum war) nichts böses bei gedacht ! @Alfadur (oder auch anderen) Da mir deine Erklärung ein wenig besser gelegen kommt, frag ich bei dir mal nach, da es noch net wirklich klar ist ! Lassen wir die Ergänzung, das net alle Nodes gespeichert werden, erstmal weg ! Ich fass mal die Vorgehensweise zusammen, so wie ich das verstanden hab: Also der A*r Algo wird ausgeführt und die Knotenpunkte sind nun alle als nodes (Objekte) abgespeichert und haben die lokalen Variabeln, wie sie definiert sind. Type node Field parent.node Field cost Field x Field y End Type Nun sorgt ein type path field node.node end type doch dafür, dass (nach der Erzeugung eines Objektes der Klasse (typ) path) eine Kollektion (bzw. Liste) der node Objekte erstellt wird. ---------------------------- |Node1| Node2|Node3| ---------------------------- Nun ist dein Vorgehen, den ersten auszulesen. Figur dorthinzubewegen. Listeneintrag (also den Verweis auf das Objekt Node1) löschen, bis keine mehr da sind ! So, wenn das richtig ist, dann ist mir die prinzipielle Vorgehensweise auch klar. Wenn nicht, könnte jemand es berichtigen ? Ich frag mich nun, wenn ich nun path.path=first path (Was ja das erste Listenelement aussucht) x=path\Node1\x (Pseudocode) Wo wäre hier nun der Unterschied zu path.node=first node x=path\x Ob ich über die Kollektion gehe oder nicht, ist das net egal ? Und die Hauptfrage Ich ruf zuerst pathfinding auf BlitzBasic: [AUSKLAPPEN]
Ich weiß, ich kann jetzt nicht fragen: Warum geht das nicht ?, da ich nur eingen Codeausschnitt gepostet habe, aber: Nach dem pathfinding ausgeführt wurde, sind die Knotenpunkte doch gespeichert und wären abrufbar. Wo liegt mein Denkfehler, weil klappen tut das net ! GRuß and nochmal Danke für eure Mühe ! Faenôl |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
ah, hm, das mit dem path war vielleicht etwas umständlich oder überflüssig für dein problem. das hab ich benutzt um mehrere figuren pathfinding machen zu lassen und mich dann noch mit den nodes zurechtzufinden ... wenn du nur eine figur bewegst, dann reichts auch wenn du die nodes auswertest... dann vergiß vorerst mal das mit dem path .-) geh einfach über die nodes...
was die hauptfrage angeht, was genau geht dann da jetzt nicht? was gibt er aus? wo gibts nen fehler? haste mal versucht nach dem pathfinding alle nodes ausgeben zu lassen ... for each? |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
Faenol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
Ah, dann ist das mit dem path geklärt ! Mit mehreren wag ich gar net dran zu denken, eine Figur reicht erstmal: Ja, mit foreach hab ich das mal versucht ! pathfinding0(16,16,16,17) m=0 For path.node=Each node ;path.node=First node m=m+1 Rect path\x*16,path\y*16,15,15,1 ;nodes3=nodes3+1 Text 300,m*16,path\x+"x::y"+path\y ; Delete path Next Ausgabe: 16x::y16 16x::y15 15x::y16 17x::y16 16x::y17 Was ja die nodes sind ! Sprich hier ein Kreuz ! In den Beispielen war der Pfad aber immer damit beschrieben und nicht alle Knotenpunkte ! Das verwirrt mich ! Denn wie komme ich denn nun an meinen Pfad ? Oder hab ich hier üble Denkfehler drin ? Was konkret nicht geht: Bevor ich dran denke, die Figur zu bewegen, wollte ich mit Kästchen den Weg zeichnen lassen (was ja möglich sein muss, da ich ja die Koordinanten haben sollte ! Aber das habe ich nicht, sondern ich habe ALLE und nicht nur die Wegkoords... Danke Faenôl |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
zeig mal spaßeshalber den pathfinding algo...haste den aus nem tutorial? poste mal den code... wenn du beim ziel angekommen bist, mußt du von der node ausgehend bis zurück zum ziel... immer über node\parent bis du wieder am ursprung bist. und da würde es sich wieder anbieten diese nodes, die richtigen in nem extra type zu speichern... also path oder so ... da hätteste wieder den path. gibmal code....
BlitzBasic: [AUSKLAPPEN]
das is meiner, movemap mußte noch an deine map anpassen und über path kannste dann die jeweiligen nodes ansprechen.... |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
Faenol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
Ich weiß jetzt net genau, was du meinst ! Ich geh mal davon aus, dass es irgendwie in die Richtung geht, dass es einen solchen Code nicht gibt, der sofort den richtigen Pfad ausgibt und damit hast du bestimmt Recht ! Meine Vermutung bezog sich hierauf: BlitzBasic: [AUSKLAPPEN]
Wobei die Datei pathfinding.bb folgend ist: BlitzBasic: [AUSKLAPPEN] Type node Ich hab da was auskommentiert und dann noch ne Ausgabe reingetan (Text.... nach den zwei Auskommentierungen). Und daher dachte ich das mein Vorgehen so möglich sei... weil ich dort sonst nichts sah, was rekursiv vorgeht.. Wohl net.. Faenôl Oh, dein Code hab ich gar net gesehen, werd ich mir mal anschauen.. Danke |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
du hast ja denselben code benutzt wie ich, und am ende werden dann ja die pathes angelegt, also arbeitest du ja auch schon mit dem path type, anders gehts ja nicht. wenn du also jetzt machst
for path.path=each path debuglog path\node\x+"/"+path\node\y next müßte er die korrekten nodes ausgeben.... versuchs mal... |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
Faenol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
Komisch, ich hatte den gleichen Code schon ausprobiert: For path.path=Each path m=m+1 Text 300,m*16,path\node\x+"x::y"+path\node\y Rect path\node\x*16,path\node\y*16,15,15,1 Next und er meckerte immer, dass path\node nicht existieren würde ! Und DAS hat mich am meisten verwirrt ! Versteh ich net ! Aber naja, jetzt scheint es plötzlich zu existieren ! Danke erstmal (so ganz trau ich dem Braten noch net) Faenôl |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
manchmal ist warten eben die beste lösung ... ![]() |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group