pathfinding: ziel kann nicht erreicht werden

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Baschdi

Betreff: pathfinding: ziel kann nicht erreicht werden

BeitragSo, Jan 13, 2008 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Wenn man einen Zielort hat, der nicht erreichbar ist, wie bringe ich nun die unit dazu ohne FPS Abfall (bei mir von 60 auf 40 wenn ich wie ich es programmiert habe der Unit befehle stehen zu bleiben.) einfach stehen zu bleiben oder, dass die unit versucht so nahe an den Ort hinzulaufen wie es nur geht.
danke im vorraus

Code: [AUSKLAPPEN]

;Konstante
Const Width=800
Const Height=Width*0.75
Const tile=32

;Grafische Auflösung
AppTitle"* RTS 1 *"
Graphics width,height,0,2
SetBuffer BackBuffer()

;Allgemein
Global xback,yback
Global gfx$="gfx\",sfx$="sfx\"

;Hintergrund
Global mapX=64,mapY=64,feld=1
Global tileset=LoadAnimImage(gfx$+"tileset.bmp",tile,tile,0,2) : MidHandle tileset
Dim stat(mapX,mapY)
Dim map(mapX,mapY)
   map(5,1)=1:map(6,1)=1:map(7,1)=1
   map(5,2)=1:map(6,2)=0:map(7,2)=1
   map(5,3)=1:map(6,3)=0:map(7,3)=0
   map(5,4)=1:map(6,4)=1:map(7,4)=1   
         
;Pathfinding
Global PfadBank=CreateBank(2),Bsize
Global mapwidth=mapX,mapheight=mapY,fightstep,schalter

Dim MapData$(50),Fighter(72)

Dim sqrmap(mapX,mapY),nodemap(0,0),dirx(7),diry(7),dirz(7)
For i=0 To 7:Read dirx(i):Read diry(i):Read dirz(i):Next
Type node
Field parent.node,cost,x,y
End Type

Type open
Field node.node
End Type

Type path
Field node.node
End Type
Data 0,-1,0,  -1,0,0,  1,0,0,  0,1,0
Data -1,-1,1,  1,-1,1,  -1,1,1,  1,1,1

;Maus
Global mx,my,pmx,pmy,m2
Global maus=LoadImage(gfx$+"maus.bmp")
Global Imaus=LoadImage(gfx$+"Imaus.bmp")

;Rand
Global Bhigh=150
Global border=LoadImage(gfx$+"border.bmp")

;Einheiten
Global unitMax=1
Global unit=LoadAnimImage(gfx$+"unit.bmp",tile,tile,0,4) : MidHandle unit

Dim IMAunit(7)
For i=0 To 7 : IMAunit(i)=CopyImage(unit)   : RotateImage IMAunit(i),i*45 : Next

Type unit
Field x,y,xx,yy,xZ,yZ,xEnd,yEnd,AZx,AZy,px,py
Field winkel,AttX,AttY,buuf,FolX,FolY,verfolgen,verfolger
Field sel,team,typ,action,fightstep,uPfad
Field leben,sicht,angriff,dauer,gesch,reich
End Type

;Schuss
Global treffer=LoadAnimImage(gfx$+"treffer.bmp", 12, 12, 0, 10) : MidHandle treffer
Type treffer
Field x,y,st
End Type
   
;###### Hauptschleife ######;
NewUnit(3*tile,6*tile,1,2)
NewUnit(3*tile,7*tile,1,2)
;NewUnit(3*tile,8*tile,1,2)
;NewUnit(3*tile,9*tile,1,2)
;NewUnit(3*tile,10*tile,1,2)
;NewUnit(3*tile,11*tile,1,2)
;NewUnit(3*tile,12*tile,1,2)
;NewUnit(3*tile,13*tile,1,2)
;NewUnit(3*tile,14*tile,1,2)
;NewUnit(3*tile,15*tile,1,2)
;NewUnit(3*tile,16*tile,1,2)
;NewUnit(3*tile,17*tile,1,2)
;NewUnit(3*tile,18*tile,1,2)
;NewUnit(3*tile,19*tile,1,2)
;NewUnit(3*tile,20*tile,1,2)
;NewUnit(3*tile,21*tile,1,2)


NewUnit(6*tile,6*tile,1,1)
NewUnit(6*tile,7*tile,1,1)
;NewUnit(6*tile,8*tile,1,1)
;NewUnit(6*tile,9*tile,1,1)
;NewUnit(6*tile,10*tile,1,1)
;NewUnit(6*tile,11*tile,1,1)
;NewUnit(6*tile,12*tile,1,1)
;NewUnit(6*tile,13*tile,1,1)
;NewUnit(6*tile,14*tile,1,1)
;NewUnit(6*tile,15*tile,1,1)
;NewUnit(6*tile,16*tile,1,1)
;NewUnit(6*tile,17*tile,1,1)
;NewUnit(6*tile,18*tile,1,1)
;NewUnit(6*tile,19*tile,1,1)
;NewUnit(6*tile,20*tile,1,1)
;NewUnit(6*tile,21*tile,1,1)

Repeat
Cls
   ;Hintergrund malen
   For x=0 To mapX
   For y=0 To mapY
      DrawImage tileset,x*tile-xback,y*tile-yback,map(x,y)
   
         If map(x,y)>=feld Then: stat(x,y)=1
            ElseIf map(x,y)<feld Then: stat(x,y)=0
         EndIf
         For u.unit=Each unit
            stat(u\xx/tile,u\yy/tile)=u\team
         Next
      ;Text x*tile,y*tile,map(x,y)
      ;00 = frei
      ;01 = team 1
      ;02 = team 2
      ;03 = team 3
      ;04 = team 4
      ;09 = hinderniss
      ;10 = Wasser
   Next
   Next   
   
   ;Units
   UpdateUnit()
   
   ;Treffer
   UpdateTreffer()
   
   ;Border
   DrawImage border,0,height-Bhigh
   
   ;Maus & Scrollen
   UpdateMaus()

   ms=MilliSecs():Text 0,0,fps
    If ms>mt mt=ms+502:fps=frame:frame=0 Else frame=frame+2   

Flip
Until KeyHit(1)
End

;###### Funktionen ######;

Function UpdateMaus()
   
   ;Maus malen
   mx=MouseX()
   my=MouseY()
   pmx=(mx+xback+tile/2)/tile
   pmy=(my+yback+tile/2)/tile
   DrawImage maus,mx,my
   DrawImage Imaus,mx,my
   
   ;Scrollen
   If KeyDown(200) And MouseDown(1)=0 And yback>0 Then:
      yback=yback-4
   EndIf
   If KeyDown(208) And MouseDown(1)=0 And yback<mapY*tile-height+Bhigh Then:
      yback=yback+4
   EndIf
   If KeyDown(205) And MouseDown(1)=0 And xback<mapX*tile-weight Then:
      xback=xback+4
   EndIf
   If KeyDown(203) And MouseDown(1)=0 And xback>0 Then:
      xback=xback-4
   EndIf    
   
End Function

Function NewUnit(x,y,typ,team)
   
   u.unit=New unit
   u\xx=x
   u\yy=y
   u\xZ=u\xx
   u\yZ=u\yy
   u\xEnd=u\xx
   u\yEnd=u\yy
   u\px=u\xx/tile
   u\py=u\yy/tile
   u\AttX=-5
   u\AttY=-5   
   u\FolX=u\xx
   u\FolY=u\yy            
   u\team=team
   u\typ=typ
   u\dauer=400
   u\leben=45
   u\angriff=6
   u\reich=3
   u\gesch=4
   u\sicht=4
   u\uPfad=CreateBank(2)

End Function

Function UpdateUnit()
   
   For u.unit=Each unit   
      
      ;Bild malen
      u\x=u\xx-xback
      u\y=u\yy-yback
      u\px=(u\xx)/tile
      u\py=(u\yy)/tile         
      If u\sel=1 Then Color 0,255,0 : Rect u\x-tile/2,u\y-tile/2,tile,tile,0
      DrawImage IMAunit(u\winkel),u\x,u\y,u\typ
      
      ;map
      stat(u\xx/tile,u\yy/tile)=u\team
            
      ;Selektieren
      If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit(u\winkel),u\x,u\y,0)=1 Then u\sel=1
      If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit(u\winkel),u\x,u\y,0)=0 Then u\sel=0
      
      ;Zielsuche
      If MouseDown(2) And m2=0 And u\sel=1 And stat(pmx,pmy)=0 Then:
         m2=1
         u\action=1
         u\xEnd=Pmx*tile
         u\yEnd=Pmy*tile
            pathfinding(u\xx/tile,u\yy/tile,u\xEnd/tile,u\yEnd/tile):u\FightStep=PfadSpliner()
         Bsize=BankSize(PfadBank)
         ResizeBank(u\uPfad,Bsize)
         CopyBank PfadBank, 0, u\uPfad, 0, Bsize          
      EndIf
      If MouseDown(2)=0 Then m2=0
      
      ;Aktion
      If u\xx=u\xEnd And u\yy=u\yEnd Then u\action=3
      
      ;Pathfinding
      If u\fightstep<0 Then u\fightstep=0
      If u\fightstep<1 And u\xEnd<=u\xx+tile And u\xEnd>=u\xx-tile And u\yEnd<=u\yy+tile And u\yEnd>=u\yy-tile Then: u\xZ=u\xEnd:u\yZ=u\yEnd : u\FolX=u\xZ:u\FolY=u\yZ
      ;If u\fightstep<1 Then: u\xZ=u\xEnd:u\yZ=u\yEnd : u\FolX=u\xZ:u\FolY=u\yZ
         ElseIf u\fightstep>0 Then:
         u\xZ=(PeekShort(u\uPfad,u\FightStep))
         u\yZ=(PeekShort(u\uPfad,u\FightStep+2))
         u\FolX=u\xZ
         u\FolY=u\yZ
      EndIf
      If u\xx=u\xZ And u\yy=u\yZ And u\fightstep>0 Then u\fightstep=u\fightstep-44                  
      
      ;Aktionen
         If u\action=0 Then:         ;stehen bleiben
            
            u\xEnd=u\xZ:u\yEnd=u\yZ
            
         ElseIf u\action=1 Then:     ;bewegen nach ort
                  
            ;Oben -Rechts laufen
            If u\xZ > u\xx And u\yZ < u\yy Then: u\winkel=1 : u\xx=u\xx+u\gesch : u\yy=u\yy-u\gesch
            ;Unten-Rechts laufen
            ElseIf u\xZ > u\xx And u\yZ > u\yy Then: u\winkel=3 : u\xx=u\xx+u\gesch : u\yy=u\yy+u\gesch
            ;Unten-Links  laufen
            ElseIf u\xZ < u\xx And u\yZ > u\yy Then: u\winkel=5 : u\xx=u\xx-u\gesch : u\yy=u\yy+u\gesch
            ;Oben -Links  laufen
            ElseIf u\xZ < u\xx And u\yZ < u\yy Then: u\winkel=7 : u\xx=u\xx-u\gesch : u\yy=u\yy-u\gesch                            
            ;Oben   laufen
            ElseIf u\yZ < u\yy Then: u\winkel=0 : u\yy=u\yy-u\gesch         
            ;Unten  laufen
            ElseIf u\yZ > u\yy Then: u\winkel=4 : u\yy=u\yy+u\gesch         
            ;Rechts laufen
            ElseIf u\xZ > u\xx Then: u\winkel=2 : u\xx=u\xx+u\gesch         
            ;Links  laufen
            ElseIf u\xZ < u\xx Then: u\winkel=6 : u\xx=u\xx-u\gesch         
            EndIf

         ElseIf u\action=2 Then:     ;angreifen ohne folgen
            
            ;...Nexte Schleife   
                  
         ElseIf u\action=3 Then:     ;angreifen mit folgen
            
   For a.unit=Each unit
   For o.unit=Each unit
            
      If a\action=3 Then:   

         If a\FolX=a\xx And a\FolY=a\yy And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
            a\FolX=o\xx:a\FolY=o\yy ;: a\buuf=Rnd(1,50)
         ElseIf a\FolX<>a\xx And a\FolY<>a\yy And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
            a\FolX=a\FolX:a\FolY=a\FolY ;: a\buuf=Rnd(1,50) : Text 0,0,"1122112121212"
         Else:
            a\FolX=a\xx:a\FolY=a\yy   
         EndIf
         Text a\x,a\y,"("+a\FolX+"/"+a\FolY+")"   
      
         

























      
;         If a\FolX<>o\xx And a\FolY<>o\yy And o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then:
;            
;            a\FolX=o\xx
;            a\FolY=o\yy
;            ;o\verfolgen=1 And a\verfolger=1 And
;            If a\FolX=o\xx And a\FolY=o\yy Then:
;               If o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
;                  Text u\x,u\y,"angreifen "+u\FolX+"/"+u\FolY
;               Else:   
;                  Text u\x,u\y,"verfolgen "+u\FolX+"/"+u\FolY
;               a\xEnd=a\FolX
;               a\yEnd=a\FolY
;            pathfinding(a\xx/tile,a\yy/tile,a\xEnd/tile,a\yEnd/tile):a\FightStep=PfadSpliner()
;            Bsize=BankSize(PfadBank)
;            ResizeBank(a\uPfad,Bsize)
;            CopyBank PfadBank, 0, a\uPfad, 0, Bsize                   
;
;
;            ;Oben -Rechts laufen
;            If a\xZ > a\xx And a\yZ < a\yy Then: a\winkel=1 : a\xx=a\xx+a\gesch : a\yy=a\yy-a\gesch
;            ;Unten-Rechts laufen
;            ElseIf a\xZ > a\xx And a\yZ > a\yy Then: a\winkel=3 : a\xx=a\xx+a\gesch : a\yy=a\yy+a\gesch
;            ;Unten-Links  laufen
;            ElseIf a\xZ < a\xx And a\yZ > a\yy Then: a\winkel=5 : a\xx=a\xx-a\gesch : a\yy=a\yy+a\gesch
;            ;Oben -Links  laufen
;            ElseIf a\xZ < a\xx And a\yZ < a\yy Then: a\winkel=7 : a\xx=a\xx-a\gesch : a\yy=a\yy-a\gesch                            
;            ;Oben   laufen
;            ElseIf a\yZ < a\yy Then: a\winkel=0 : a\yy=a\yy-a\gesch         
;            ;Unten  laufen
;            ElseIf a\yZ > a\yy Then: a\winkel=4 : a\yy=a\yy+a\gesch         
;            ;Rechts laufen
;            ElseIf a\xZ > a\xx Then: a\winkel=2 : a\xx=a\xx+a\gesch         
            ;Links  laufen
;            ElseIf a\xZ < a\xx Then: a\winkel=6 : a\xx=a\xx-a\gesch         
;            EndIf
;            
;            a\FolX=a\xx:a\FolY=a\yy
;            
;               EndIf
;            EndIf    
;         
;         EndIf 
      
      
      
      
      
      
      
      
      
      ;   If o\verfolgen=0 And a\verfolger=0 And o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then:
      
      ;      o\verfolgen=1:a\verfolger=1
      ;   EndIf
      
      ;   If o\verfolgen=1 Then:
      ;      If o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
      ;         ;att
      ;         a\verfolger=0
      ;         o\verfolgen=0
      ;      Else:
      ;         a\action=1
      ;         a\xEnd=o\xx
      ;         a\yEnd=o\yy
      ;         pathfinding(a\xx/tile,a\yy/tile,a\xEnd/tile,a\yEnd/tile):a\FightStep=PfadSpliner()
      ;         Bsize=BankSize(PfadBank)
      ;         ResizeBank(a\uPfad,Bsize)
      ;         CopyBank PfadBank, 0, a\uPfad, 0, Bsize
      ;      EndIf
            
      ;   EndIf
      
      
      
      
      
      
      
      
      
;         If a\xx=(a\xx/tile)*tile And a\yy=(a\yy/tile)*tile
;         If o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then:
;            a\FolX=o\xx:a\FolY=o\yy
;         ElseIf a\FolX<>a\xx And a\FolY<>a\yy Then:
;            a\FolX=a\FolX:a\FolY=a\FolY
;            a\action=1
;            a\xEnd=a\FolX
;            a\yEnd=a\FolY   
;            pathfinding(u\xx/tile,u\yy/tile,u\xEnd/tile,u\yEnd/tile):u\FightStep=PfadSpliner()
;            Bsize=BankSize(PfadBank)
;            ResizeBank(u\uPfad,Bsize)
;            CopyBank PfadBank, 0, u\uPfad, 0, Bsize               
;         Else:
;            If a\FolX<a\xx+a\reich*tile And a\FolX>a\xx-a\reich*tile And a\FolY<a\yy+a\reich*tile And a\FolY>a\yy-a\reich*tile And a\team<>o\team Then:
;            Text 0,100,"sssssssssssssssssssssssssssss"
;            Else:
;               a\FolX=a\xx:a\FolY=a\yy
;            EndIf             
;         EndIf 
;      EndIf
;
;         Text u\x,u\y,u\FolX+"/"+u\FolY+" - "+u\xx+"/"+u\yy


            ;Oben -Rechts laufen
;            If a\FolX > a\xx And a\FolY < a\yy Then: a\winkel=1 : a\xx=a\xx+a\gesch : a\yy=a\yy-a\gesch
;            ;Unten-Rechts laufen
;            ElseIf a\FolX > a\xx And a\FolY > a\yy Then: a\winkel=3 : a\xx=a\xx+a\gesch : a\yy=a\yy+a\gesch
;            ;Unten-Links  laufen
;            ElseIf a\FolX < a\xx And a\FolY > a\yy Then: a\winkel=5 : a\xx=a\xx-a\gesch : a\yy=a\yy+a\gesch
;            ;Oben -Links  laufen
;            ElseIf a\FolX < a\xx And a\FolY < a\yy Then: a\winkel=7 : a\xx=a\xx-a\gesch : a\yy=a\yy-a\gesch                            
;            ;Oben   laufen
;            ElseIf a\FolY < a\yy Then: a\winkel=0 : a\yy=a\yy-a\gesch         
;            ;Unten  laufen
;            ElseIf a\FolY > a\yy Then: a\winkel=4 : a\yy=a\yy+a\gesch         
;            ;Rechts laufen
;            ElseIf a\FolX > a\xx Then: a\winkel=2 : a\xx=a\xx+a\gesch         
;            ;Links  laufen
;            ElseIf a\FolX < a\xx Then: a\winkel=6 : a\xx=a\xx-a\gesch         
;            EndIf
         ;EndIf    
                     
       
      EndIf
         
   Next
   Next               
          EndIf
      ;Sterben
      If u\leben<1 Then:
         Delete u
      EndIf    
      
   Next
   
   For a.unit=Each unit
   For o.unit=Each unit         
      If a\action=2 Then:   
         If a\AttX=-5 And a\AttY=-5 And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
            a\AttX=o\xx:a\AttY=o\yy ;: a\buuf=Rnd(1,50)
         ElseIf a\AttX>-5 And a\AttY>-5 And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then:
            a\AttX=a\AttX:a\AttY=a\AttY ;: a\buuf=Rnd(1,50)
         Else:
            a\AttX=-5:a\AttY=-5   
         EndIf
         
         If o\xx=a\AttX And o\yy=a\AttY And a\team<>o\team Then:
            a\buuf=a\buuf+1 : Color 255,255,0
            If a\buuf=1 Then a\buuf=Rand(2,((2*a\dauer)/3)-2)
            If a\buuf>((5*a\dauer)/6) And a\buuf<a\dauer Then: Line a\x,a\y,o\x,o\y
            ElseIf a\buuf>a\dauer Then: a\buuf=0 : o\leben=o\leben-Rand(a\angriff-2,a\angriff+1) : a\AttX=o\xx : a\AttY=o\yy
               tr.treffer=New treffer
               tr\x=o\xx+Rand(-5,5)
               tr\y=o\yy+Rand(-5,5)
            EndIf
            If o\leben=0 Then a\AttX=-5 : a\AttY=-5 
         EndIf
         
         ;kein ziel            
         If a\AttX<0 And a\AttY<0 Then: a\winkel=a\winkel
         ;Oben -Rechts angreifen
         ElseIf a\AttX > a\xx And a\Atty < a\yy Then: a\winkel=1
         ;Unten-Rechts angreifen
         ElseIf a\AttX > a\xx And a\Atty > a\yy Then: a\winkel=3 
         ;Unten-Links  angreifen
         ElseIf a\AttX < a\xx And a\Atty > a\yy Then: a\winkel=5
         ;Oben -Links  angreifen
         ElseIf a\AttX < a\xx And a\Atty < a\yy Then: a\winkel=7                       
         ;Oben   angreifen
         ElseIf a\Atty < a\yy Then: a\winkel=0         
         ;Unten  angreifen
         ElseIf a\Atty > a\yy Then: a\winkel=4          
         ;Rechts angreifen
         ElseIf a\AttX > a\xx Then: a\winkel=2            
         ;Links  angreifen
         ElseIf a\AttX < a\xx Then: a\winkel=6    
         EndIf                  
      EndIf   
   Next
   Next   
   
End Function


Function pathfinding(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 stat(x,y)=0 And nodemap(x,y)=0 Then
        If dirz(i)=1 Then
          If stat(x,node\y)<>0 And stat(node\x,y)<>0 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


Function PfadSpliner()
FreeBank(PfadBank):PfadBank=CreateBank(4)

    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,Y0,X1,Y1,X2,Y2,X3,Y3)
   Next
Return BankSize(PfadBank)-4

End Function


Function spline(x1,y1,x2,y2,x3,y3,x4,y4)
Ras=32
x1=x1*Ras:y1=y1*Ras
x2=x2*Ras:y2=y2*Ras
x3=x3*Ras:y3=y3*Ras
x4=x4*Ras:y4=y4*Ras

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 ax<>x Or ay<>y Then
   Pos=BankSize(PfadBank):ResizeBank(PfadBank,Pos+4)
   PokeShort(PfadBank,Pos,x)
   PokeShort(PfadBank,Pos+2,y)
   EndIf
   
   ax=x:ay=y
Next
End Function


Function UpdateTreffer()
   For tr.treffer=Each treffer
      f=tr\st/3
      If f=9
         Delete tr
      Else
         DrawImage treffer,tr\x-xback,tr\y-yback,f
         tr\st=tr\st+1
      EndIf
   Next
End Function
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden

BladeRunner

Moderator

BeitragSo, Jan 13, 2008 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fall das ein Ort nicht erreichbar ist ist der Worst Case für ein Pathfinding wie A*, denn hier muss der Algo erst mal alle Felder Ablaufen bevor er feststellt dass es kein Ziel gibt. Aufgrund der Arbeitsweise solcher lgos kannst Du das nicht verhindern. Was Du jedoch tun kannst - falls dein Spiel das zulässt, hier kommt es auf die Mechanik an, waäre die einzelnen, voneinander getrennten Bereiche in einem Layer deiner Map auch als getrennt zu kennzeichnen. Wenn dann eine Wegfindeanfrage kommt die in unterschiedlichen Zonen liegt kennt der Algo schon vorher das Ergebnis. So lassen sich auch Türen realisieren, indem Du eine liste anlegst die für jede Zonennummer die Türkoordinaten zu anderen Zonen enthält, kommt dann eine Suchanfrage wird der Zielpunkt auf die Tür gesetzt.

Was das laufen zum nächsten Punkt angeht ist das so dass Du in der Liste der bearbeiteten Knoten den mit der Geringsten Wegkostenschätzung nehmen kannst. Bessere Alternativen gibt es da nicht.

Ich habe für BMax einen a* geschrieben, schau mal dort ins Codearchiv. Vielleicht bringt er dir was.
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

Baschdi

BeitragSo, Jan 13, 2008 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
thx ich habe zwar B3d aber ich schau ihn mir mal an. Das mit den türen klingt nach viel Arbeit für wenig Leistung, ich werde eine Alternative suchen...
danke für deine ideen
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden

BladeRunner

Moderator

BeitragSo, Jan 13, 2008 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es dir den worst case (kein Weg gefunden) im vorneherein erspart wird es unter Umständen massig Leistung bringen.
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group