Pathfinding zum 1000. Verständnisfrage

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Faenol

Betreff: Pathfinding zum 1000. Verständnisfrage

BeitragMi, Aug 24, 2005 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

; Bewungsabläufe.
; Figur läuft nach Unten
If diffy>0 Then
playerY=starty+1:Animfloat# = Animfloat# + (z#/FPS):Aniframe = 6 + (Animfloat#/4)

; Figur läuft nach oben
ElseIf diffy<0 Then
playerY=starty-1:Animfloat# = Animfloat# + (z#/FPS):Aniframe = 0 + (Animfloat#/4)

; Figur läuft nach rechts
ElseIf diffx>0 Then
playerX=startx+1:Animfloat# = Animfloat# + (z#/FPS): Aniframe = 3 + (Animfloat#/4)

; Figur läuft nach links
ElseIf diffx<0 Then
playerX=startx-1:Animfloat# = Animfloat# + (z#/FPS): Aniframe = 9 + (Animfloat#/4)


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

BeitragMi, Aug 24, 2005 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 24, 2005 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

Faenol

Betreff: So ganz noch net

BeitragDo, Aug 25, 2005 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

pathfinding0(startx,starty,endx,endy)

If(laufen=1) Then

path.node=First node

Rect path\x,path\y,15,15,1
nodes3=nodes3+1
Text 300+nodes3,0,path\x+\"x::y\"+path\y
Delete path



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

BeitragDo, Aug 25, 2005 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2005 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2005 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

Type Tnode
Field x
Field y
Field cost
Field parent.Tnode
End Type

Type Topenlist
Field node.Tnode
End Type

Type Tpath
Field node.Tnode
End Type

Function pathfinding1(startx,starty,endx,endy)
Delete Each Tpath
Delete Each Tnode
Delete Each Topenlist
Dim nodemap(maxx-1,maxy-1)

Vnode.Tnode=New Tnode
Vnode\x=startx
Vnode\y=starty
Vopenlist.Topenlist=New Topenlist
Vopenlist\node=Vnode
nodemap(startx,starty)=1

.again1
Vnode=Null
cost=2147483647
For Vopenlist=Each Topenlist
delta=Abs(Vopenlist\node\x-endx)+Abs(Vopenlist\node\y-endy)
If Vopenlist\node\cost+delta<cost Then
cost=Vopenlist\node\cost+delta
Vnode=Vopenlist\node
Vtempopenlist.Topenlist=Vopenlist
EndIf
Next
If Vnode=Null Then Return
Delete Vtempopenlist

For i=0 To 3
x=Vnode\x+dirx(i)
y=Vnode\y+diry(i)
If x=>0 And y=>0 And x<maxx And y<maxy Then
If movemap(x,y)<>0 And nodemap(x,y)=0 Then
If dirz(i)=1 Then
If movemap(x,Vnode\y)=0 And movemap(Vnode\x,y)=0 Then Goto jump1
EndIf
Vtempnode.Tnode=New Tnode
Vtempnode\parent=Vnode
Vtempnode\cost=Vnode\cost+1
Vtempnode\x=x
Vtempnode\y=y
Vopenlist.Topenlist=New Topenlist
Vopenlist\node=Vtempnode
nodemap(x,y)=1
If x=endx And y=endy Then finish=1:Exit
.jump1
EndIf
EndIf
Next
If finish=0 Then Goto again1
x=0
y=0
While Vtempnode\parent<>Null
Vpath.Tpath=New Tpath
Vpath\node=Vtempnode
Vtempnode=Vtempnode\parent
Wend
Vpath.Tpath=New Tpath
Vpath\node=Vtempnode
End Function


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

BeitragDo, Aug 25, 2005 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

Include \"pathfinding.bb\"

Graphics 640,480,16,2
AppTitle \"Pathfinding\"
SetBuffer BackBuffer()
ClsColor 255,255,255

Global font1 =LoadFont(\"Arial\",12)
Global font2 =LoadFont(\"Arial\",24)
Global font3 =LoadFont(\"Arial\",16)
Global startx =07
Global starty =14
Global endx =22
Global endy =14
Global pathmode=00

Dim setup(3)
setup(0)=1
setup(1)=1
setup(2)=1

createmap(30,30)

.start
drawmap1()

While Not KeyHit(57)
If KeyHit(1)=1 Then End
If KeyHit(2)=1 Then clearmap()
If KeyHit(3)=1 Then paintmap()
mouse_x=MouseX()/16
mouse_y=MouseY()/16
mouse_1=MouseDown(1)
mouse_2=MouseDown(2)
If mouse_x<=29 And mouse_y<=29 Then
If mouse_1=1 Then map(mouse_x,mouse_y)=1:drawmap1()
If mouse_2=1 Then map(mouse_x,mouse_y)=0:drawmap1()
EndIf
Wend

drawmap2()
MouseHit(1)
MouseHit(2)

While Not KeyHit(57)
If KeyHit(1)=1 Then End
mouse_xx=MouseX()
mouse_yy=MouseY()
mouse_x=mouse_xx/16
mouse_y=mouse_yy/16
mouse_1=MouseHit(1)
mouse_2=MouseHit(2)
If (mouse_1=1 Or mouse_2=1) And mouse_x<=29 And mouse_y<=29 Then
If mouse_1=1 Then startx=mouse_x:starty=mouse_y
If mouse_2=1 Then endx=mouse_x:endy=mouse_y
drawmap2()
EndIf
If mouse_1=1 And mouse_xx>=504 And mouse_yy=>48 And mouse_xx<=615 And mouse_yy<=106 Then
pathmode=(mouse_yy-48)/20
drawmap2()
EndIf
If mouse_1=1 And mouse_xx>=504 And mouse_yy=>328 And mouse_xx<=615 And mouse_yy<=406 Then
nr=(mouse_yy-328)/20
setup(nr)=1-setup(nr)
If setup(3)=1 Then
If nr=3 Then setup(0)=0:setup(2)=0
If setup(1)=1 Then setup(1)=0
EndIf
drawmap2()
EndIf
Wend
Goto start





;---------------------------------------------------------------------
Function drawmap1()
Cls
For y=0 To mapheight
For x=0 To mapwidth
If map(x,y)=0 Then Color 230,230,230 Else Color 0,0,0
Rect x*16,y*16,15,15,1
Next
Next

Color 0,255,0
Rect startx*16,starty*16,15,15,1

Color 100,200,255
Rect endx*16,endy*16,15,15,1

Color 0,0,0
SetFont font2
Text 560,20,\"Zeichnen\",1

SetFont font3
Text 560,50,\"Weiter mit Leertaste\",1
Text 560,70,\"Löschen mit 1\",1
Text 560,90,\"Vorlage mit 2\",1
Flip
End Function





;---------------------------------------------------------------------
Function drawmap2()
t1=MilliSecs()
If pathmode=0 Then pathfinding0(startx,starty,endx,endy)
If pathmode=1 Then pathfinding1(startx,starty,endx,endy)
If pathmode=2 Then pathfinding2(startx,starty,endx,endy)
t2=MilliSecs()-t1

ClsColor 255,255,255
Cls
For y=0 To mapheight
For x=0 To mapwidth
; If map(x,y)=0 Then Color 230,230,230 Else Color 0,0,0
; Rect x*16,y*16,15,15,1
Next
Next

Color 255,195,195
For node.node=Each node
;If setup(2)=1 Then Rect node\x*16,node\y*16,15,15,1
;nodes1=nodes1+1
Next

Color 240,220,220
For open.open=Each open
;If setup(2)=1 Then Rect open\node\x*16,open\node\y*16,15,15,1
;nodes2=nodes2+1
Next

Color 255,0,0
For path.path=Each path
If setup(3)=0 Then Rect path\node\x*16,path\node\y*16,15,15,1
nodes3=nodes3+1
Text 10,nodes3*16,\"Koords:\"+ path\node\x*16+\":::\"+path\node\y*16
Next

Color 0,255,0
Rect startx*16,starty*16,15,15,1

Color 100,200,255
Rect endx*16,endy*16,15,15,1

If setup(3)=1 Then
Color 200,0,0
For path.path=Each path
If path=Last path Then Exit
tmp.path=Before path
If tmp=Null Then
x0=path\node\x
y0=path\node\y
Else
x0=tmp\node\x
y0=tmp\node\y
EndIf
x1=path\node\x
y1=path\node\y
tmp.path=After path
x2=tmp\node\x
y2=tmp\node\y
tmp.path=After tmp
If tmp=Null Then
x3=x2
y3=y2
Else
x3=tmp\node\x
y3=tmp\node\y
EndIf
spline x0*16+7,y0*16+7 , x1*16+7,y1*16+7 , x2*16+7,y2*16+7 , x3*16+7,y3*16+7
Next
EndIf

If setup(1)=1 Then
Color 180,180,180
For node=Each node
If node\parent<>Null Then
Line node\x*16+7,node\y*16+7,node\parent\x*16+7,node\parent\y*16+7
EndIf
Next
EndIf

Color 255,255,0
Rect 504,48+pathmode*20,112,19,1

Color 0,0,0
If setup(0)=1 Then
SetFont font1
For node=Each node
Text node\x*16+7,node\y*16+7,Int(node\cost),1,1
Next
EndIf

SetFont font2
Text 560,20,\"Pathfinding\",1
Text 560,150,\"Information\",1
Text 560,300,\"Einstellungen\",1

SetFont font3
If nodes1>0 And nodes2>0 Then nodes2=nodes2-1
Text 515,50,\"A*Pathfinding 4\"
Text 515,70,\"A*Pathfinding 8\"
Text 515,90,\"A*Pathfinding 8+\"
Text 515,180,\"Zeit:\"
Text 515,200,\"Knoten:\"
Text 515,220,\"Zweige:\"
Text 515,240,\"Weg:\"
Text 570,180,t2+\" ms\"
Text 570,200,nodes1
Text 570,220,nodes2
Text 570,240,nodes3
Text 515,330,\"Wegkosten\"
Text 515,350,\"Zweige\"
Text 515,370,\"Flood\"
Text 515,390,\"Spline\"
For i=0 To 3
If setup(i)=0 Then Text 585,330+i*20,\"(aus)\"
If setup(i)=1 Then Text 585,330+i*20,\"(ein)\"
Next

Flip
End Function





;---------------------------------------------------------------------
Function clearmap()
For y=0 To mapwidth
For x=0 To mapheight
map(x,y)=0
Next
Next
drawmap1()
End Function





;---------------------------------------------------------------------
Function paintmap()
For y=0 To mapwidth
For x=0 To mapheight
map(x,y)=0
Next
Next
For x=0 To 10:map(x,2)=1:Next
For x=5 To 26:map(x,5)=1:Next
For x=5 To 26:map(x,26)=1:Next
For x=0 To 11:map(x,22)=1:Next
For x=19 To 29:map(x,22)=1:Next
For x=3 To 7:map(x,18)=1:Next
For x=16 To 19:map(x,18)=1:Next
For x=6 To 10:map(x,10)=1:Next
For y=2 To 18:map(2,y)=1:Next
For y=0 To 26:map(15,y)=1:Next
For y=0 To 2:map(19,y)=1:Next
For y=2 To 18:map(24,y)=1:Next
For y=10 To 22:map(11,y)=1:Next
For y=9 To 18:map(19,y)=1:Next
drawmap1()
End Function





;---------------------------------------------------------------------
Function spline(x1,y1,x2,y2,x3,y3,x4,y4)
For u#=0 To 1.1 Step .1
u2#=u#*u#
u3#=u#*u#*u#
f1#=-0.5*u3#+1.0*u2#-0.5*u#
f2#= 1.5*u3#-2.5*u2#+1.0
f3#=-1.5*u3#+2.0*u2#+0.5*u#
f4#= 0.5*u3#-0.5*u2#
x=x1*f1#+x2*f2#+x3*f3#+x4*f4#
y=y1*f1#+y2*f2#+y3*f3#+y4*f4#
If u#>0 Then Line ax,ay,x,y
ax=x
ay=y
Next
End Function


Wobei die Datei pathfinding.bb folgend ist:
BlitzBasic: [AUSKLAPPEN]
Type node
Field parent.node
Field cost
Field x
Field y
End Type

Type open
Field node.node
End Type

Type path
Field node.node
End Type

Dim map(0,0)
Dim sqrmap(0,0)
Dim nodemap(0,0)
Dim dirx(7)
Dim diry(7)
Dim dirz(7)

For i=0 To 7
Read dirx(i)
Read diry(i)
Read dirz(i)
Next

Global mapwidth
Global mapheight





;---------------------------------------------------------------------
Function createmap(width,height)
mapwidth=width-1
mapheight=height-1
Dim map(width-1,height-1)
Dim sqrmap(width-1,height-1)
For y=0 To mapheight
For x=0 To mapwidth
sqrmap(x,y)=Sqr(x*x+y*y)
Next
Next
End Function





;---------------------------------------------------------------------
;A*Pathfinding 4
;---------------------------------------------------------------------
Function pathfinding0(startx,starty,endx,endy)
Delete Each node
Delete Each open
Delete Each path
Dim nodemap(mapwidth,mapheight)
If startx=endx And starty=endy Then Return
node.node=New node
node\x=startx
node\y=starty
open.open=New open
open\node=node
nodemap(startx,starty)=1
.again0
node=Null
cost=2147483647
For open=Each open
delta=Abs(open\node\x-endx)+Abs(open\node\y-endy)
If open\node\cost+delta<cost Then
cost=open\node\cost+delta
node=open\node
tempopen.open=open
EndIf
Next
If node=Null Then Return
Delete tempopen

For i=0 To 3
x=node\x+dirx(i)
y=node\y+diry(i)
If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then
If map(x,y)=0 And nodemap(x,y)=0 Then
tempnode.node=New node
tempnode\parent=node
tempnode\cost=node\cost+1
tempnode\x=x
tempnode\y=y
open.open=New open
open\node=tempnode
nodemap(x,y)=1
If x=endx And y=endy Then finish=1:Exit
EndIf
EndIf
Next
If finish=0 Then Goto again0

While tempnode\parent<>Null
path.path=New path
path\node=tempnode
tempnode=tempnode\parent
Wend
path.path=New path
path\node=tempnode
End Function





;---------------------------------------------------------------------
;A*Pathfinding 8
;---------------------------------------------------------------------
Function pathfinding1(startx,starty,endx,endy)
Delete Each node
Delete Each open
Delete Each path
Dim nodemap(mapwidth,mapheight)
If startx=endx And starty=endy Then Return

node.node=New node
node\x=startx
node\y=starty
open.open=New open
open\node=node
nodemap(startx,starty)=1

.again1
node=Null
cost=2147483647
For open=Each open
delta=Abs(open\node\x-endx)+Abs(open\node\y-endy)
If open\node\cost+delta<cost Then
cost=open\node\cost+delta
node=open\node
tempopen.open=open
EndIf
Next
If node=Null Then Return
Delete tempopen

For i=0 To 7
x=node\x+dirx(i)
y=node\y+diry(i)
If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then
If map(x,y)=0 And nodemap(x,y)=0 Then
If dirz(i)=1 Then
If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump1
EndIf
tempnode.node=New node
tempnode\parent=node
tempnode\cost=node\cost+1
tempnode\x=x
tempnode\y=y
open.open=New open
open\node=tempnode
nodemap(x,y)=1
If x=endx And y=endy Then finish=1:Exit
.jump1
EndIf
EndIf
Next
If finish=0 Then Goto again1

While tempnode\parent<>Null
path.path=New path
path\node=tempnode
tempnode=tempnode\parent
Wend
path.path=New path
path\node=tempnode
End Function





;---------------------------------------------------------------------
;A*Pathfinding 8+
;---------------------------------------------------------------------
Function pathfinding2(startx,starty,endx,endy)
Delete Each node
Delete Each open
Delete Each path
Dim nodemap(mapwidth,mapheight)
If startx=endx And starty=endy Then Return

node.node=New node
node\x=startx
node\y=starty
open.open=New open
open\node=node
nodemap(startx,starty)=1

.again2
node=Null
cost=2147483647
For open=Each open
delta=sqrmap(Abs(open\node\x-endx),Abs(open\node\y-endy))
If open\node\cost+delta<cost Then
cost=open\node\cost+delta
node=open\node
tempopen.open=open
EndIf
Next
If node=Null Then Return
Delete tempopen

For i=0 To 7
x=node\x+dirx(i)
y=node\y+diry(i)
If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then
If map(x,y)=0 And nodemap(x,y)=0 Then
If dirz(i)=1 Then
If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump2
EndIf
tempnode.node=New node
tempnode\parent=node
tempnode\cost=node\cost+1+dirz(i)
tempnode\x=x
tempnode\y=y
open.open=New open
open\node=tempnode
nodemap(x,y)=1
If x=endx And y=endy Then finish=1:Exit
.jump2
EndIf
EndIf
Next
If finish=0 Then Goto again2

While tempnode\parent<>Null
path.path=New path
path\node=tempnode
tempnode=tempnode\parent
Wend
path.path=New path
path\node=tempnode
End Function

;---------------------------------------------------------------------
Data 0,-1,0, -1,0,0, 1,0,0, 0,1,0, -1,-1,1, 1,-1,1, -1,1,1, 1,1,1


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

BeitragDo, Aug 25, 2005 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2005 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2005 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
manchmal ist warten eben die beste lösung ... Smile
A Cray is the only computer that runs an endless loop in less than four hours.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group