Kreis Kollisionen Unverständnisse
Übersicht

![]() |
Raiden93Betreff: Kreis Kollisionen Unverständnisse |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey,
ich hätte da mal 2 Fragen. 1. Dort wo ich hingeschrieben habe "Kein Plan1" dort weis ich nicht genau was die Befehle wie (abs oder sqr) machen. 2. Beim "Kein Plan2" weis ich nicht genau was ich machen soll wenn meine Objekte nicht gleich Groß sind, Kollidieren sie nicht richtig. Eine Erklärung währe sicher Hilfreich, danke ![]() MFG: Raidenkk | Kevin.K Code: [AUSKLAPPEN] Graphics(800, 600)
Global timerFrameTick:TTimer = CreateTimer(60) Type Kreis Global x:Float = 350; Global y:Float = 250; Global size:Float = 100; End Type Global Kugel:Kreis = New Kreis Repeat Cls 'Steuerung If KeyDown(KEY_LEFT) Then Kugel.x:-5 Else If KeyDown(KEY_RIGHT) Then Kugel.x:+5 End If If KeyDown(KEY_UP) Then Kugel.y:-5 Else If KeyDown(KEY_DOWN) Then Kugel.y:+5 End If 'Zeichnen DrawOval(Kugel.x, Kugel.y, Kugel.size, Kugel.size) DrawOval(100, 100, 100, 100) ' Einfärben If KreisKollision(Kugel.x, Kugel.y, Kugel.size, 100, 100, 100) SetColor(255, 255, 255) Else SetColor(255, 0, 0) End If Flip 0 WaitTimer(timerFrameTick) Until KeyDown(KEY_ESCAPE) Or AppTerminate() Function KreisKollision:Int(newObj1X:Float, newObj1Y:Float, newObj1Size:Float, newObj2X:Float, newObj2Y:Float, newObj2Size:Float) 'Mitte der Kreise berechnen und dann den abstand messen Local tempXab:Float = (newObj1X / 2) - (newObj2X / 2) Local tempYab:Float = (newObj1Y / 2) - (newObj2Y / 2) 'Kein Plan1 Local tempAbstand = Abs(Sqr((tempXab ^ 2) + (tempYab ^ 2))) 'Kein Plan2 If(tempAbstand > newObj1Size / 2) Then Return 1 Else Return 0 End If End Function |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mathematic,
Satz des Phytagoras: a^2+b^2=c^2 Also, der Abstand, in 2D, ist die Hypothenuse. (c) c= wurzel(a^2+b^2) c=sqr(a^2+b^2) ABS=absolut Beispiel: abs(-5)=5 abs(-3)=3 abs(9)=9 abs(12)=12 abs(5)=5 Kein Plan2: wenn Abstand der Objekte kleiner ist, als der radius (Raduis=Durchmesser/2) Dann Kollision! Jedoch, wird nur die Größe eines Objektes angenommen, das 2. ist ein Punkt-Objekt Wenn das nicht so sein sollte: (tempAbstand > (newObj1Size / 2+ newObj2Size / 2)) |
||
between angels and insects |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich danke dir für die lehrreiche Hilfe.
Wenn ich folgendes mache: Code: [AUSKLAPPEN] If(tempAbstand > (newObj1Size / 2 + newObj2Size / 2)) Then
Return 1 Else Return 0 End If Wird der Abstand um das doppelte erhöht und ist nicht mehr richtig |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das kommt drauf an, was du als size verwendest.
Oder du hast die kleine aber feine 1 und 2 übersehen ![]() Grundsätzlich gilt: Bei kreisen wird vom zentrum geprüft. Dh da muss auch deine prüf-xy koordinate liegen. Andernfalls musst du, um den abstand zu ermitteln, ersteinmal radius auf x und y rechnen, wenn der koordinatenursprung des kreises oben-links liegt. 2 Kreise überschneiden sind, wenn die distanz ihrer mittelpunkte kleiner als der radius beider kreise zusammen ist. Dabei ist es egal, ob ein kreis 1000meter durchmesser und der andere nur 1meter durchmesser hat - die logik geht immer auf. Um den abstand zu errechnen, wie bereichts erwähnt: Frag den guten alten pythagoras. Schau am besten mal in deiner Draw-Funktion nach, wo du den koordinaten ursprung hingesetzt hast, das ist ziemlich wichtig. Im idealfall sieht die zeichnung so aus: BlitzMax: [AUSKLAPPEN] DrawOval ( Self.x - Self.radius , Self.y - Self.radius , Self.radius*2, Self.radius*2) Dh du geht von der x und y koordinate ersteinmal RADIUS nach "oben links", danach zeichnest du mit radius * 2 (aka Durchmesser) den kreis. Falls du ein bild verwendest, sollte der handle mittig liegen - hat etwa den selben effekt. Zum Distanz prüfen dann einfach eine kleine hilfsfunktion: BlitzMax: [AUSKLAPPEN]
Diese rufst du dann mit den beiden koordinatenpäärchen auf, dessen distanz du ermitteln möchtest. Ich gehe einfach mal davon aus, du hast ein Type "TKreis", welches x,y, und radius als fields kennt. Alle daten sind float und der mittelpunkt des kreises wird durch x,y definiert: BlitzMax: [AUSKLAPPEN]
Alles hier ist reiner pseudocode. Aber die logik dahinter sollte begreifbar werden: Gibt es ein problem mit den abfragen, gibt es ein problem mit deiner struktur ![]() Vergiss nicht die beschaffenheit und die namensgebung in sachen kreise: Radius ist der HALBE durchmesser. Er kann durch eine linie vom zentrum zum rand dargestellt werden. Durchmesser ist simpel ausgedrückt der doppelte radius. Alle mathematischen rechnungen die du tätigen kannst, gehen am einfachsten, wenn dein objekt in der mitte seinen 0-punkt hat. Ergo: x,y würde auf dem papier dort liegen, wo du mit dem zirkel reinstichst ![]() |
||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich danke dir für die Erklärung.
Gruß |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group