collision line rect; kollision linie rechteck
Übersicht

BobbleboyBetreff: collision line rect; kollision linie rechteck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
was ist die effizienteste methode eine kollision zu prüfen zwischen einer linie und einem rechteck /quadrat?
bsp bei einer tile map. bisher verwende ich folgende funktion: hierzu benutze ich eine tilemap "map(x,y)" mit einer "1" für eine "mauer" Code: [AUSKLAPPEN] Function rectline(sx,sy,zx,zy)
;sx/sy = start x/y ;zx/zy = ziel x/y ;tx/ty = temp x/y ;w = winkel kollision = false w=ATan2((zy-sy),(zx-sx)) If w =<0 w=w+360 End If i=0 Repeat i=i+10 tx = sx+Cos(w)*i ty = sy+Sin(w)*i If map(Int(tx/32),Int(ty/32))=1 kollision=true End If Until(kollision=true Or i>=Sqr((sx-zx)^2+(sy-zy)^2)) Return sicht End Function aber ich denke das es eventuell bessere lösungen gibt. vorallem im bereich der performance, da ich bei einer entfernung von 500 pixel 50 schleifendurchgänge brauche trotz einer ungenauigkeit von 10 pixeln, was dazuführt, das die linie ecken schneidet. ich hoffe ihr habt noch einen trick auf lager ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es Dir in erster Linie um eine Tilemapkollision geht verwende ich diese Technik seit Jahren mit Erfolg:
BlitzBasic: [AUSKLAPPEN] u=map((p\x+16)/32,(p\y-2)/32,0) ; oben / up Das ist jetzt einfach aus einem Projekt rauskopiert, der Type beinhaltet die x, bzw. y-Koordinaten des Spielers. Die Tiles sind 32 x 32 Pixel, sowie auch der Spieler. Für andere Größen ist das anzupassen. Edit: Was vielleicht nicht auf den ersten Blick klar ist: Zurückgegeben wird die Nummer des Tiles mit welchem in entsprechender Richtung kollidiert wird und das Array ist dreidimensional, sprich ich arbeite mit 2 Layern. In Deinem Fall muß das ",0" bzw. ",1" einfach weg. |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Bobbleboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja das ist ein schöner code um tiles direkt neben dem player zu prüfen, aber er hilft mir leider nicht weiter.
denn ich will wissen, ob beispielsweise eine gerade linie vom player zum mauszeiger existiert, der weiter als nur ein tile entfernt sein kann. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier könnte dir der Linienalgorithmus nach Bresenham weiterhelfen. Ermittle Start und Enttile deiner Sichtlinie anhand ihrer Koordinaten und lasse den Linienalgo alle dazwischenliegenden Tiles ablaufen, bei der ersten '1' brichst du ab.
Sollte die flotteste Lösung sein. |
||
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 |
Bobbleboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
okay ich check ihn gleich mal sofort | ||
Bobbleboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BlitzBasic: [AUSKLAPPEN] Function rectline(sx#,sy#,zx#,zy#) so jetzt benutze ich das hier, verdammt schnelles ding. der erste code von einem freund von mir, benutzt lineae algebra, der zweite ist besenham algobresenham algo ist noch ein wenig verbuggt, aber er funktioniert ganz gut. wer spaß daran hat, kann es sich durchlesen |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group