Ich habe ein Problem...
Sagen wirmal ich habe ein schwarzes Sprite.
Darauf ist eine LineXY in "nicht-schwarz"..
Jetzt kommt eine andere Linie die anhalten soll, sobald sie die erste Linie berührt.
Wie kann ich das machen??
mit Point geht es nicht, da pro frame mehrere Pixel übersprungen werden.
Danke im Voraus
Linien Kollision 2d [erledigt]
Linien Kollision 2d [erledigt]
Zuletzt geändert von a14xerus am 28.11.2007 07:48, insgesamt 1-mal geändert.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Das müsste eigentlich ganz einfach und exakt mit ein bisschen
Vektorrechnung gehen. Bin aber grad zu faul um mich da hinzusetzen.
Morgen vielleicht.
Ansonsten kann ich noch auf meine uralten Kollisionsroutinen verweisen:
Schnelle Kollisionsroutinen
Vektorrechnung gehen. Bin aber grad zu faul um mich da hinzusetzen.
Morgen vielleicht.
Ansonsten kann ich noch auf meine uralten Kollisionsroutinen verweisen:
Schnelle Kollisionsroutinen
Jup genau, entweder dieser LINK da, kannst aber auch meine benutzen, extra für Strecke-Strecke-Kollision:
Beispiel:
Code: Alles auswählen
;Vektorstruktur
Structure Vektor2D
x.f
y.f
EndStructure
;Strecke |--|
Structure Strecke
Position.Vektor2D
Richtung.Vektor2D ; WICHTIG, damit wird auch die exakte länge der Strecke festgelegt
EndStructure
;Punkt
Structure Punkt
Position.Vektor2D
EndStructure
Procedure ParameterStrecke(*Strecke.Strecke,x,y,xx,yy)
*Strecke\Position\x = x
*Strecke\Position\y = y
*Strecke\Richtung\x = xx
*Strecke\Richtung\y = yy
EndProcedure
Procedure SchnittpunktStreckeStrecke(*Strecke1.Strecke, *Strecke2.Strecke, *Punkt.Punkt)
u.f : o.f : i.f : j.f
u = *Strecke1\Richtung\x * *Strecke2\Richtung\y - *Strecke1\Richtung\y * *Strecke2\Richtung\x
If u
o = (*Strecke2\Position\x - *Strecke1\Position\x) * *Strecke2\Richtung\y + (*Strecke1\Position\y - *Strecke2\Position\y) * *Strecke2\Richtung\x
i = (o/u)
If i>=0 And i<=1
u = *Strecke2\Richtung\x * *Strecke1\Richtung\y - *Strecke2\Richtung\y * *Strecke1\Richtung\x
o = (*Strecke1\Position\x - *Strecke2\Position\x) * *Strecke1\Richtung\y + (*Strecke2\Position\y - *Strecke1\Position\y) * *Strecke1\Richtung\x
j = (o/u)
If j >= 0 And j<=1
*Punkt\Position\x = *Strecke1\Position\x + i * *Strecke1\Richtung\x
*Punkt\Position\y = *Strecke1\Position\y + i * *Strecke1\Richtung\y
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Code: Alles auswählen
Strecke1.Strecke
Strecke2.Strecke
ParameterStrecke(Strecke1, 0,0,100,100)
ParameterStrecke(Strecke2, 100,0,-100,100)
; Entspricht den Parametern von Line(x, y, Breite, Höhe [, Farbe]))
Punkt.Punkt
If SchnittpunktStreckeStrecke(Strecke1, Strecke2, Punkt)
Debug "KOLLISION"
Debug "bei ( "+StrF(Punkt\Position\x)+" | "+StrF(Punkt\Position\x)+" )"
Else
Debug "KEINE Kollision"
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr