BSP Pathfinding
Übersicht

black_threatBetreff: BSP Pathfinding |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Suche ein simples Beispiel wo ein charakter über ein einfaches tileset läuft mit pathfinding (4 Richtungen sind völlig ausreichend)
ich hab schonmal gefragt aber anscheinend liest es keiner im anderen tread darum hab ich einen neuen eröffnet. ich hoffe ihr könnt mir helfen. black_threat |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jan schreib mal dein Beispiel für BB2D um und gib es Black, sonst wird das nix hier ![]() Coden soll man lernen und nicht auf einem Presentierteller vorgelegt bekommen... |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
black_threat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
TheShadow hat Folgendes geschrieben: Jan schreib mal dein Beispiel für BB2D um und gib es Black, sonst wird das nix hier
![]() Coden soll man lernen und nicht auf einem Presentierteller vorgelegt bekommen... Aus Beispielen lernt man ![]() |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eher weniger... aus selber probieren viel mehr ![]() |
||
![]() |
Tobchen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei 4 Richtungen ist es so einfach!
Code: [AUSKLAPPEN] If PlayerY < ZielY Then PlayerY = PlayerY + 1
If PlayerY > ZielY Then PlayerY = PlayerY - 1 If PlayerX < ZielX Then PlayerX = PlayerX + 1 If PlayerX > ZielX Then PlayerX = PlayerX - 1 Tadaa! |
||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tobi hat Folgendes geschrieben: Bei 4 Richtungen ist es so einfach!
Code: [AUSKLAPPEN] If PlayerY < ZielY Then PlayerY = PlayerY + 1
If PlayerY > ZielY Then PlayerY = PlayerY - 1 If PlayerX < ZielX Then PlayerX = PlayerX + 1 If PlayerX > ZielX Then PlayerX = PlayerX - 1 Tadaa! Ja und was macht man dann,wenn da Hindernisse sind?! ![]() Autsch ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
Tobchen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Davon steht da nix. Außerdem ist es simple. So wie er wollte. | ||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja ok,aber ich glaub nicht,das ihm das weiter helfen würde... ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Doch, da stehtZitat: mit pathfinding ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja, ok aber frühestens nächste Woche! | ||
between angels and insects |
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meinte jetzt speziell Tobi's Beispiel. | ||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
k, das is nen ganz simples beispiel für pathfinding mit waypoints ebn, schauts auch an, niks besondres, is auch nur ganz schnell gemacht :
hier FrEeMaN |
||
black_threat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Freeman hat Folgendes geschrieben: k, das is nen ganz simples beispiel für pathfinding mit waypoints ebn, schauts auch an, niks besondres, is auch nur ganz schnell gemacht :
hier FrEeMaN das hilft mir ja schon mal weiter, nur brauch ich jetzt noch das man den waypoint mit der maus setzten kann, und auch hindernisse zu umgehen. |
||
black_threat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nach einiger zeit des suchens hab ich ein ganz gutes beispiel an pathfinding gefunden so wie ich es mir vorstellen nur scheint das ganze etwas kompliezierter als ich erwartet hatte:
Code: [AUSKLAPPEN] Graphics 400,400,0,2 AppTitle "Example" Const TILE_WIDTH =10 Const TILE_HEIGHT =10 Const XTILES =40 Const YTILES =40 Global cursorX =0 Global cursorY =0 Global personX =120 Global personY =120 Global personMOVE =False Global personCOUNT=0 Global mouse =False Global grass=LoadImage("grass.bmp") Global road=LoadImage("road.bmp") Global sand=LoadImage("sand.bmp") Global wall=LoadImage("wall.bmp") Global person=LoadImage("person.bmp") MaskImage person,255,0,0 Global mapIMAGE=CreateImage(XTILES*TILE_WIDTH,YTILES*TILE_HEIGHT) ;0=grass (average movement) ;1=road (fast movement ) ;2=sand (slow movment ) ;3=wall (no movement ) Dim map(XTILES-1,YTILES-1) Dim mapCOST(2) mapCOST(0)=3 mapCOST(1)=1 mapCOST(2)=5 SetBuffer ImageBuffer(mapIMAGE) Restore LOADMAP For loadY=0 To YTILES-1 For loadX=0 To XTILES-1 Read map(loadX,loadY) Select map(loadX,loadY) Case 0 DrawImage grass,loadX*TILE_WIDTH,loadY*TILE_HEIGHT Case 1 DrawImage road,loadX*TILE_WIDTH,loadY*TILE_HEIGHT Case 2 DrawImage sand,loadX*TILE_WIDTH,loadY*TILE_HEIGHT Case 3 DrawImage wall,loadX*TILE_WIDTH,loadY*TILE_HEIGHT End Select Next Next .LOADMAP Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,0,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,2,2,2,0,0,2,2,0,0,0,2,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,2,2,0,2,2,2,0,0,2,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,2,2,0,0,2,2,0,0,2,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,0,0,2,2,0 Data 0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,2,2,2,0,0,2,2,2,2,2,2,0 Data 0,0,2,2,1,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,2,2,0,0,0,0 Data 2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 3,3,3,3,3,3,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,2,3,3,3,3,3,3,3 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,2,3,2,2,2,2,2,2 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,2,3,2,2,2,2,2,2 Data 2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,2,2,2,2,2,2,2,2 Data 2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,2,2,2,2,2,2,2,2 Data 2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,0,2,2,2,2,2,2,2 Data 2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,2,1,3,3,3,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,3,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,3,0,0,0,3,2,2,2,2,2,2 Data 2,2,2,1,3,3,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,3,0,0,0,3,2,2,2,2,2 Data 2,2,1,3,3,3,3,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,3,0,0,0,3,2,2,2,2,2 Data 2,1,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,3,0,0,0,3,2,2,2,2,2 Data 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,3,0,0,0,0,3,2,2,2,2 Data 2,1,3,3,3,1,3,3,3,3,1,3,3,3,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,3,0,0,0,3,2,2,2,2 Data 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,3,2,2 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,3,3 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0 Data 2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0 Data 2,2,2,2,2,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0 Data 2,2,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0 Data 2,2,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0 Dim Cpointers.close(XTILES-1,YTILES-1) Dim Opointers.open(XTILES-1,YTILES-1) Type close Field ID,X,Y,COST,F Field parentID,parentX,parentY End Type Type open Field ID,X,Y,COST,F Field parentID,parentX,parentY End Type Type path Field direction End Type While KeyDown(1)=False SetBuffer BackBuffer() Cls cursorX=(MouseX()/tile_WIDTH) cursorY=(MouseY()/tile_HEIGHT) renderscene() If mouse=False Then If MouseDown(1)=True Then mouse=True End If Else If MouseDown(1)=True Then mouse=True Else mouse=False End If If map(cursorX,cursorY)<>3 And personMOVE=False Then findpath(personX/TILE_WIDTH,personY/TILE_WIDTH,cursorX,cursorY) End If End If If personMOVE=True Then If personCOUNT=0 Then If First path = Null Then personMOVE=False Else Delete First path If First path = Null Then personMOVE=False Else p.path=First path If p\direction=1 Or p\direction=2 Then personCOUNT=TILE_HEIGHT Else personCOUNT=TILE_WIDTH End If End If End If Else p.path = First path If p\direction=1 Then personY=personY-2 ElseIf p\direction=2 personY=personY+2 ElseIf p\direction=3 personX=personX-2 ElseIf p\direction=4 personX=personX+2 EndIf personCOUNT=personCOUNT-2 End If End If Flip Wend Function findpath(startX,startY,endX,endY) Local IDcounter=1 Local currentX,currentY,current.open Local U,D,L,R,LOWEST Local scanopen=0,scan.open=Null Local scancount=4000 IDcounter=addnodeopen(True,IDcounter,startX,startY,0,findhcost(startX,startY,endX,endY),0,startX,startY) While First open <> Null current.open = First open If current\X=endX And current\Y=endY Then addnodeclosed(current\ID,current\X,current\Y,current\COST,current\F,current\parentID,current\parentX,current\parentY) childX=endX childY=endY Repeat parentX=Cpointers.close(childX,childY)\parentX parentY=Cpointers.close(childX,childY)\parentY Color 255,0,0 If showpath=True Then DrawImage tiles,childX*TILE_WIDTH,childY*TILE_HEIGHT,0 If mouse=False Then If childY<parentY Then p.path=New path p\direction=1 Insert p.path Before First path ElseIf childY>parentY p.path=New path p\direction=2 Insert p.path Before First path ElseIf childX<parentX p.path=New path p\direction=3 Insert p.path Before First path Else p.path=New path p\direction=4 Insert p.path Before First path End If personMOVE=True End If If childx=startX And childy=startY Then Exit childX=parentX childY=parentY Forever Exit End If U=current\COST+mapCOST(map(current\X,current\Y))+findhcost(current\X,current\Y-1,endX,endY) D=current\COST+mapCOST(map(current\X,current\Y))+findhcost(current\X,current\Y+1,endX,endY) L=current\COST+mapCOST(map(current\X,current\Y))+findhcost(current\X-1,current\Y,endX,endY) R=current\COST+mapCOST(map(current\X,current\Y))+findhcost(current\X+1,current\Y,endX,endY) If current\Y-1 >= 0 Then If map(current\X,current\Y-1)<>3 Then If Cpointers.close(current\X,current\Y-1)=Null Then If Opointers.open(current\X,current\Y-1)=Null Then IDcounter=addnodeopen(False,IDcounter,current\X,current\Y-1,current\COST+mapCOST(map(current\X,current\Y)),U,current\ID,current\X,current\Y) End If End If End If End If If current\Y+1 <= YTILES-1 Then If map(current\X,current\Y+1)<>3 Then If Cpointers.close(current\X,current\Y+1)=Null Then If Opointers.open(current\X,current\Y+1)=Null Then IDcounter=addnodeopen(False,IDcounter,current\X,current\Y+1,current\COST+mapCOST(map(current\X,current\Y)),D,current\ID,current\X,current\Y) End If End If End If End If If current\X-1 >= 0 Then If map(current\X-1,current\Y)<>3 Then If Cpointers.close(current\X-1,current\Y)=Null Then If Opointers.open(current\X-1,current\Y)=Null Then IDcounter=addnodeopen(False,IDcounter,current\X-1,current\Y,current\COST+mapCOST(map(current\X,current\Y)),L,current\ID,current\X,current\Y) End If End If End If End If If current\X+1 <= XTILES-1 Then If map(current\X+1,current\Y)<>3 Then If Cpointers.close(current\X+1,current\Y)=Null Then If Opointers.open(current\X+1,current\Y)=Null Then IDcounter=addnodeopen(False,IDcounter,current\X+1,current\Y,current\COST+mapCOST(map(current\X,current\Y)),R,current\ID,current\X,current\Y) End If End If End If End If addnodeclosed(current\ID,current\X,current\Y,current\COST,current\F,current\parentID,current\parentX,current\parentY) Delete current.open scanopen=XTILES*YTILES*(XTILES*YTILES) tempcount=0 tempflag=False For scan.open=Each open If scan\F < scanopen Then current.open=scan.open scanopen=scan\F tempflag=True End If tempcount=tempcount+1 If tempcount=scancount Then Exit Next If tempflag=True Then Insert current.open Before First open Wend Dim Cpointers.close(XTILES-1,YTILES-1) Dim Opointers.open(XTILES-1,YTILES-1) For oLIST.open = Each open Delete oLIST.open Next For cLIST.close = Each close Delete cLIST.close Next End Function Function FindHcost(findX,findY,findENDX,findENDY) Return Abs(findX-findENDX)+Abs(findY-findENDY) End Function Function AddNodeOpen(addWHERE,addID,addX,addY,addCOST,addF,addparentID,addparentX,addparentY) If showpath=True Then DrawImage tiles,addX*TILE_WIDTH,addY*TILE_HEIGHT,1 oLIST.open = New open oLIST\ID=addID oLIST\X=addX oLIST\Y=addY oLIST\COST=addCOST oLIST\F=addF oLIST\parentID=addparentID oLIST\parentX=addparentX oLIST\parentY=addparentY Opointers.open(addX,addY)=oLIST.open If addWHERE=True Then Insert oLIST.open Before First open End If Return addID+1 End Function Function AddNodeClosed(addID,addX,addY,addCOST,addF,addparentID,addparentX,addparentY) cLIST.close = New close cLIST\ID=addID cLIST\X=addX cLIST\Y=addY cLIST\COST=addCOST cLIST\F=addF cLIST\parentID=addparentID cLIST\parentX=addparentX cLIST\parentY=addparentY Cpointers.close(addX,addY)=cLIST.close Opointers.open(addX,addY)=Null End Function Function RenderScene() DrawBlock mapIMAGE,0,0 DrawImage person,personX-1,personY-5 If personMOVE=False Then Color 0,150,0 Else Color 255,0,0 End If If map(cursorX,cursorY)<>3 Then Rect cursorX*TILE_WIDTH,cursorY*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT,0 Rect cursorX*TILE_WIDTH-1,cursorY*TILE_HEIGHT-1,TILE_WIDTH+2,TILE_HEIGHT+2,0 End If End Function ist das wirklich wichtig das ich das alles verstehe, wenn ja könnte es mir jemand erklären? Ich meine jetzt speziell pathfinding. BITTE. |
||
woody |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich hab hier ein pathfindingprogramm geproggt, doch irgenwie funzt et nich so, wie ich es wollte.
Code: [AUSKLAPPEN] graphics 800,600,16,1 setbuffer backbuffer() spieler=loadimage("noob.bmp") clscolor 255,255,255 spielerx=390 spielery=290 repeat cls x=mousex() y=mousey() if mousehit(1) then zielx=mousex() ziely=mousey() end if drawimage spieler,spielerx,spielery if zielx>spielerx then spielerx=spielerx+1 if zielx<spielerx then spielerx=spielerx-1 if ziely>spielery then spielery=spielery+1 if ziely<spielery then spielery=spielery-1 flip until keyhit(1) |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Woody: Er läuft ja schon zu den Mauskoordinaten. Ist aber dennoch kein Pathfinding, da ja ein (wenn denn Vorhandener) Hintergrund nicht berücksichtigt wird. er würde durch mauern durchlaufen, nicht drumherum. | ||
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 |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
@black_threat: Wenn ich mir Deine Beiträge so ansehe (nicht nur in diesem Thread, überhaupt) bekomme ich das Gefühl Du übernimmst Dich etwas. Es gibt viele hier die meinen sie müssen als erstes Spiel gleich Command & Conquer 6 auf die Beine stellen und fallen damit spätestens nach zwei Wochen auf die Nase ![]() Das ist nicht böse oder belehrend gemeint, was Du machst ist Deine Sache ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
black_threat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja deswegen hab ich mir rene meyers buch gekauft, werd mal klein anfangen ![]() |
||
![]() |
Keimax |
![]() Antworten mit Zitat ![]() |
---|---|---|
http://www.blitzbase.de/artikel/path_1.htm
cu |
||
XP3000, FX6600, 1024DDR, BB2d @ W2k,
- > Diesen Text bitte nicht beachten <- |
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mir mal etwas Zeit genommen und auch mal versucht, soeinen Pathfinder zu machen, aber irgendwie ist der noch nicht so ganz ausgereift, wenn Wände zwischen dem Ziel und dem Start sind, schafft er es immer nur auf die richtige y-koordinate:
http://home.arcor.de/platzvers...finder.rar wüsste jemand, wie man da Abhilfe schaffen kann? |
||
<Wing Avenger Download> ◊◊◊ <Macrophage Download> |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group