Pathfinding(2D) Types after,last und before - Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

shootermaker

Betreff: Pathfinding(2D) Types after,last und before - Problem

BeitragFr, Jun 19, 2009 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Hab ein Problem mit diesen Pathfinding-Code.
Ich möchte das sich das Bild "spieler" stückweise zum Bild "ziel" beweget.
Die route wird durch den Pathfinding-Code, den ich hier im forum gefunden habe auch berechnet, aber er bewegt sich nicht. Ich weiß echt nicht weiter Sad

Achja, der Code ist natürlich sofort startbar, keine Bilder werden benötigt!

bei der TASTE "1" sollte er sich eigentlich bewegen.

Code: [AUSKLAPPEN]

;Vorbereitungen
Graphics 800,600,32,2
SetBuffer BackBuffer()

Global MapWidth%=20,MapHeight%=20
Dim MapData(MapWidth-1,MapHeight-1)
Dim Array(MapWidth-1,MapHeight-1)





Type TFeld
Field x%
Field y%
Field ch.TFeld
Field c%
Field movename$
End Type






;Mauer erstellen
MapData(7,5)=1
MapData(7,6)=1
MapData(7,7)=1

;Punkte festlegen
StartX%=2
StartY%=2
EndX%=8
EndY%=6

timer=CreateTimer(48)

;spieler = LoadImage("archer.bmp")
spieler = CreateImage(19,19)
;ziel = LoadImage("ziel.bmp")
ziel = CreateImage(19,19)
MaskImage spieler,255,0,255
MaskImage ziel,255,0,255







While Not KeyHit(1)
ams=MilliSecs()

;Funktionsaufruf
fp$=FindPath$(StartX,StartY,EndX,EndY)

ms=MilliSecs()
fps#=(1000.0/(ms-ams))*0.5+fps*0.5

;Grafische Darstellung
Cls
For y=0 To MapHeight-1
For x=0 To MapWidth-1
If MapData(x,y)=0 Then
Color 155,155,155
Rect x*20,y*20,19,19
Else
Color 255,255,255
Rect x*20,y*20,19,19
Color 55,55,55
Rect x*20+1,y*20+1,18,18
Color 88,88,88
Rect x*20+1,y*20+1,17,17
Color 55,55,55
Text x*20+5,y*20+3,"M"
EndIf
Next
Next
x=StartX
y=StartY
t$=fp
While t$<>""
nt$=Mid(t,1,1)
ax=x
ay=y
Select nt
Case 6
x=x+1
Case 2
y=y+1
Case 4
x=x-1
Case 8
y=y-1
Case 3
x=x+1
y=y+1
Case 1
x=x-1
y=y+1
Case 7
x=x-1
y=y-1
Case 9
x=x+1
y=y-1
End Select
Color 255,255,255
Rect x*20,y*20,19,19
Color 155,155,0
Line ax*20+10,ay*20+10,x*20+10,y*20+10
t=Mid(t,2)
Wend



;-----------------------------------------------------------------------------------Problem

DrawImage spieler,StartX*20,Starty*20


If KeyHit(2)
test.tfeld = First tfeld
test = After test
StartX = test\X
Starty = test\y
Text 400,400,"OK!"
End If

;-----------------------------------------------------------------------------------Problem ENDE


DrawImage ziel,endX*20,endy*20

Text 500,500,"startx: "+startx
Text 500,520,"starty: "+starty

Color 255,255,255
Text 0,220,"Weg: "+fp
t$=fps
If t="Infinity" Then
t=">1000"
fps=0
EndIf
Text 0,240,t+" FPS("+nms+"ms)"
Text 0,260,"LMT um den Startpunkt zu setzen"
Text 0,272,"RMT für den Endpunkt und MRT für Mauer;-)"
Flip 0
nms=(ms-ams)
mx=MouseX()-10
my=MouseY()-10
x=Int(mx/20.0)
y=Int(my/20.0)

;If MouseDown(1) Then
;StartX=x
;StartY=y
;EndIf

If MouseDown(2) Then
EndX=x
EndY=y
EndIf
If MouseHit(3) Then
If x<=MapWidth-1 And y<=MapHeight-1 Then
MapData(x,y)=1-MapData(x,y)
EndIf
EndIf
WaitTimer timer
Wend


End




;Funktionen & Types_________________________________________________________

Function FindPath$(StartX%,StartY%,EndX%,EndY%)



If StartX<0 Or StartY<0 Or EndX>MapWidth-1 Or EndY>MapHeight-1 Or StartX>MapWidth-1 Or StartY>MapHeight-1 Or EndX<0 Or EndY<0 Then Return ""
If MapData(StartX,StartY)>0 Or MapData(EndX,EndY)>0 Then Return ""
ClearAll()
TypeAdd EndX,EndY,Null,""
hz%=MapWidth*MapHeight
For z%=0 To hz
tw$=TypeWork$(StartX,StartY,EndX,EndY)
If tw<>"" Then Return tw
Next
Return ""
End Function

Function ClearAll()
For Feld.TFeld=Each TFeld
Delete Feld.TFeld
Next
For y=0 To MapHeight-1
For x=0 To MapWidth-1
Array(x,y)=0
Next
Next
End Function

Function TypeAdd(x%,y%,ch.TFeld,name$)
If x<0 Or y<0 Or x>MapWidth-1 Or y>MapHeight-1 Then Return
If MapData(x,y)<>0 Or Array(x,y)<>0 Then Return
Feld.TFeld=New TFeld
Feld\x=x
Feld\y=y
Feld\ch=ch
Feld\c=0
Feld\movename=name
Array(x,y)=1
Return
End Function

Function TypeWork$(sx%,sy%,zx%,zy%)
For Feld.TFeld=Each TFeld
If Feld\x=sx And Feld\y=sy Then
t$=""
Feld2.TFeld=Feld.TFeld
While Feld2.TFeld<>Null
t$=t$+Feld2\movename
Feld2.TFeld=Feld2\ch.TFeld
Wend
Return t
ElseIf Feld\c=0 Then
TypeAdd Feld\x+1,Feld\y,Feld.TFeld,4
TypeAdd Feld\x,Feld\y+1,Feld.TFeld,8
TypeAdd Feld\x-1,Feld\y,Feld.TFeld,6
TypeAdd Feld\x,Feld\y-1,Feld.TFeld,2
TypeAdd Feld\x+1,Feld\y+1,Feld.TFeld,7
TypeAdd Feld\x+1,Feld\y-1,Feld.TFeld,1
TypeAdd Feld\x-1,Feld\y+1,Feld.TFeld,9
TypeAdd Feld\x-1,Feld\y-1,Feld.TFeld,3
Feld\c=1
EndIf
Next
End Function
  • Zuletzt bearbeitet von shootermaker am Fr, Jun 19, 2009 16:39, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Jun 19, 2009 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;-----------------------------------------------------------------------------------Problem

DrawImage spieler,StartX*20,Starty*20

For test.tfeld = Each tfeld
If KeyHit(2)
test.tfeld = First tfeld
If test\x = startx And test\y = starty Then
startx = test\x
starty = test\y
test = After test
End If

;-----------------------------------------------------------------------------------Problem ENDE
End If
Next

Wozu soll die For...Each Schleife gut sein, wenn du die Type Einträge sowieso mit first und after verwaltest?
Wenn der Befehl zum loslaufen kommt, muss 1x das erste feld ausgewählt werden und dann immer nur noch mit After eins weiter geschaltet werden. Oder du löschst den ersten Eintrag nach Benutzung.

Und die Bedingung da ist auch ziemlich seltsam... wenn die Koordinaten schon gleich sind, muss man sie auch nicht nochmal zuordnen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

shootermaker

BeitragFr, Jun 19, 2009 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für deine antwort.
hab den code jetzt abgeändert, aber er springt dann immer nur ein feld rechts neben dem "zielfeld" hin.

Weißt du warum?
ich sag ihm hier ja das er mit dem zweiten feld anfagen soll (zuerst first und dann after= zweiter type-eintrag, oder?)

Code: [AUSKLAPPEN]

If KeyHit(2)
test.tfeld = First tfeld
test = After test
StartX = test\X
Starty = test\y
Text 400,400,"OK!"
End If

Xeres

Moderator

BeitragFr, Jun 19, 2009 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wundert mich nicht: Erst wählst du das erste Feld mit First aus und dann das folgende mit After - das ist in jedem Schleifendurchlauf das selbe und nichts ändert sich.
Wenn die Felder sonst nicht mehr gebraucht werden, kannst du sie der Reihe nach abarbeiten und nach gebraucht löschen ->
Code: [AUSKLAPPEN]
If KeyHit(2)
   test.tfeld = First tfeld
   StartX = test\X
   Starty = test\y
   Delete test
End If
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

shootermaker

BeitragSa, Jun 20, 2009 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, Smile
hab den Code auch schon so abgeändert, aber dann springt das "spieler-bild" auf die position des "ziel-bildes".
Weißt du warum?

Xeres

Moderator

BeitragSa, Jun 20, 2009 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Es könnte daran liegen, dass du den Pfad offenbar jeden Schleifendurchlauf berechnest und den alten nicht löschst... Zähl mal die Type-Einträge:
Code: [AUSKLAPPEN]
Local num=0
   For Feld.TFeld=Each TFeld
      num=num+1
   Next
   Color(255,0,0)
   Text(10,10,"Einträge: "+num)


Edit: Mein Fehler, die alten werden gelöscht... Trotzdem; es gibt 234 Einträge, also enthält die Typeliste die ganze Karte und nicht nur die Wegpunkte zum ziel und man kann sie nicht einfach alle abklappern...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group