Vektororientiertes Pathfinding

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Vektororientiertes Pathfinding

BeitragMi, Feb 01, 2006 3:43
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT: Komplett neu editiert!

Hier mal ein Beispiel wie man Vektororientiertes Pathfinding machen kann... Im Gegensatz zum bisherigem Code findet diese immer einen Weg, wenn sich sowohl der Suchende als auch das Zielobjekt auf 'gültigem' Terrain befinden. Die Mausposition demonstriert den Suchenden. Das Abtasten des Tarrains wurde hier unglüglicher weise per Readpixel durchgeführt! Wenn jemanden eine bessere Lösung dazu einfällt, bitte posten!..

Mit linker Maustaste kann man ein neues Ziel anklicken.

Code: [AUSKLAPPEN]
Graphics 400,400,32,2
SetBuffer BackBuffer()
HidePointer

;Map-Ersatz
Dim map(19,19)

;Map einlesen
For y=0 To 19
 For x=0 To 19
  Read map(x,y)
 Next
Next

;WegePunkte
Dim xw(9);X-Position für Wegepunkt
Dim yw(9);Y-Position für Wegepunkt
xw(0)=035:yw(0)=090
xw(1)=060:yw(1)=030
xw(2)=270:yw(2)=030
xw(3)=240:yw(3)=140
xw(4)=090:yw(4)=180
xw(5)=290:yw(5)=270
xw(6)=230:yw(6)=370
xw(7)=140:yw(7)=360
xw(8)=360:yw(8)=040
xw(9)=365:yw(9)=240

zx#=360;Ziel-X-Position
zy#=280;Ziel-Y-Position
mx#=0;Maus-X-Position
my#=0;Maus-Y-Position
wk#=0;Winkel (Richtung zum 'nächstem Ziel')
entf#=0;Zwischenvariable für Entfernung zum nächstem Wegepunkt

;Hauptschleife
While Not KeyHit(1)

 ;Mauskoordianten
 mx=MouseX()
 my=MouseY()

 ;Zeichne Map
 For y=0 To 19
  For x=0 To 19
   Color map(x,y)*255,0,0
   Rect x*20,y*20,20,20,1
  Next
 Next

 ;Zeige Wegepunkte
 For q=0 To 9
  Color 100,100,100:Text xw(q)-4,yw(q)-6,q
  Color 255,255,255:Plot xw(q),yw(q)
 Next

 ;>>>>PATHFINDING>>>>

 ;Nur wenn der Spieler (Maus) sich nicht
 ;nicht im undeffiniertem Land befindet
 If ReadPixel(mx,my)=-16777216
  ;Es kann nur noch besser werden
  entf=9999

  ;Wenn keine direkte Verbindung zum
  ;Ziel besteht dann einen Weg suchen
  If linecollided(mx,my,zx,zy,16)=1
   ;Alle Wegepunkte durchgehen
   For q=0 To 9
    ;Nächst besten Wegepunkt suchen
    If linecollided(mx,my,xw(q),yw(q),16)=0
     ;Prüfen ob ein neuer Wegepunkt besser ist
     If entf>Sqr((xw(q)-zx)^2+(yw(q)-zy)^2)
      ;Besseren Wegepunkt gefunden und zuordnen
      entf=Sqr((xw(q)-zx)^2+(yw(q)-zy)^2)
      ;Winkel zum besseren Wegepunkt richten
      wk=ATan2(yw(q)-my,xw(q)-mx)
     End If
    End If
   Next
  Else
   ;Direkte Verbindung möglich,
   ;den Winkel zum Ziel richten
   wk=ATan2(zy-my,zx-mx)
  End If
  ;Richtung zum nächstem Ziel anzeigen
  Color 255,255,255:Line mx,my,mx+Cos(wk)*20,my+Sin(wk)*20
  ;Neues Ziel mit der Maus deffinieren
  If MouseDown(1) zx=mx:zy=my
 End If

 ;<<<<PATHFINDING<<<<

 ;Maus/Ziel-Positionspunkte anzeigen
 Color 255,255,0
 Rect zx-3,zy-3,7,7,0
 Rect mx-3,my-3,7,7,0
 Flip
Wend
End




;Kollisionsprüfung zwischen zwei Punkten
Function linecollided(x1#,y1#,x2#,y2#,re%)
 ;Anzahl der Durchführungen
 For q=0 To re
  ;Prüfen ob Verbidnungs'linie' Kollidiert, wenn ja Return 1
  If ReadPixel(x1+((x2-x1)/re)*q,y1+((y2-y1)/re)*q)=-65536 Return 1
  ;Zeigt alle geprüften Verbindungs'linien' an (Recourcendisplay)
  ;Color 96,96,96:Plot x1+((x2-x1)/re)*q,y1+((y2-y1)/re)*q
 Next
End Function




;Map-Ersatz weil kein Webspace für Bild
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1
Data 1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
Data 1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
Data 1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
Data 1,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1
Data 1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,1
Data 1,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,1
Data 1,1,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,1
Data 1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1
Data 1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1
Data 1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1
Data 1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1
Data 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1
Data 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1
Data 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
Data 1,1,1,1,1,0,0,0,0,0,0,0,0,0,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
  • Zuletzt bearbeitet von hectic am Do, Apr 06, 2006 13:55, insgesamt 3-mal bearbeitet

Bob

BeitragFr, Feb 10, 2006 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi hectic,

danke für den Code.
Wandert direkt in meine Sammlung der nützlichen Codeschnipsel. Smile

Goodjee

BeitragDi, Feb 21, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
kannst du mal kurz erklären, was die funktion linecollided macht?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Kryan

BeitragDi, Feb 21, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
kann man auch irgendwie den weg anzeigen??
weil bei mir ist da immer eine gestrichelte linie direkt zum ziel?!
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 22, 2006 4:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@Goodjee, linecollided überprüft ob es eine mögliche durchgehende Linie zwischen zwei Punkten gibt. Also Sichtkontakt... Ist eine Kollision vorhanden, gibt die Funktion eine 1 zurrück, also kein möglicher Kontakt (die Funktion heisst ja auch linecollided)... Mit der letzten Variable re wird angegeben wie genau die Überprüfung durchgeführt werden soll. Die Zahl gibt an wieviele Punkte zwischen beiden Positionen überprüft werden sollen...

@Kryan, wie bei Dir wird immer nur eine durchgehende Linie dargestellt? Auch dann, wenn die Maus sich über einer schwarzen Stelle befindet? Wenn ja, dann kann es nur daran liegen, daß die Kollision hier im Beispiel per ReadPixel durchgeführt wird. Bei einige Blitzversionen ist das Ergebnis leider unterschiedlich... Habe selber mal ein Code geschrieben der jetzt genau aus diesem Grund nicht mehr funktioniert, weil die Ausgabewerte sich geändert haben und die Zahlenwerte hardcoded waren...

/EDIT: Namenskorrektur duchgeführt... Sorry...
  • Zuletzt bearbeitet von hectic am Mi, Feb 22, 2006 15:12, insgesamt einmal bearbeitet

Goodjee

BeitragMi, Feb 22, 2006 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ich heiße nicht bob^^

Naja, thx, aber ich habe noch eine frage Embarassed

was wird in den 4 letzten variablen gespeichert?
in den ersten sind die koordinaten von punkt und maus, aber die anderen??
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 23, 2006 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, Code wurde komplett neu und einfacher gemacht...

Goodjee

BeitragDo, Feb 23, 2006 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ahh, jetzt verstehe ich das alles.... es wird immer nur der winkel gesucht, um zum nächsten point zu kommen...
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group