Vektororientiertes Pathfinding
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Vektororientiertes Pathfinding |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi hectic,
danke für den Code. Wandert direkt in meine Sammlung der nützlichen Codeschnipsel. ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich heiße nicht bob^^
Naja, thx, aber ich habe noch eine frage ![]() 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/ |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, Code wurde komplett neu und einfacher gemacht... | ||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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/ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group