Seite 1 von 1
sprite Collision mit zeit/frame factor ?
Verfasst: 28.07.2013 15:47
von True29
Hallo und grüßt euch
folgende frage wie prüft man ob sich 2 sprites berührt haben wärend des letzten frames.
die ganze zeit habe ich die collision mit SpritePixelCollision() realisiert.
wie fügt man bei der collisionsüberprüfung nun noch den zeitfactor an.
beide sprites bewegen sich noch dazu.
folgende infos habe ich von den sprites.
anfangs position , endposition , geschwindigkeit und dazu die passenden formeln.
Grüße und danke für eure hilfe eventuell hat ja wer ein Beispiel.
in meinem fall is der eine sprite ein spieler und der andere ein ball

Re: sprite Collision mit zeit/frame factor ?
Verfasst: 28.07.2013 17:27
von Drago
Nun, indem du, nachdem du alle Objekte bewegt hast, eine Kollisionsprüfung vornimmst..

Unter Umständen sogar nach jeder Positionsveränderung, es kommt darauf an.
Um bei deinem Player/Ball Beispiel zu bleiben.
Es spielt auch eine Rolle, wie groß die Grafiken sind.
Wenn ich z.B. einen Ball habe, welcher 15 Pixel groß ist und der Spieler sich aber mit einer
Geschwindigkeit von 20 Pixel/Frame bewegt..... VERSTEHST ??

Wenn du also kleine Grafiken benutzt, solltest du nach JEDEM Neupositionieren des Spielers UND
nach JEDER Balllpositionsveränderung einen Check durchführen.
Ich hoffe ich habe es jetzt nicht zu kompliziert erklärt, ansonsten frag einfach nach.
Das hier ist nicht lauffähig, aber ich hoffe du verstehst die Vorgehensweise:
Code: Alles auswählen
Procedure CheckCollision()
ForEach Ball()
With Ball
If SpritePixelCollision( PlayerSprite, PlayerX, PlayerY, BallSprite, BallX, BallY )
; Was auch immer dann geschehen soll :-)
EndIf
EndWith
Next
EndProcedure
Procedure MovePlayer()
PlayerX + player_dx
PlayerY + player_dy
EndProcedure
Procedure MoveBall()
BallX + ball_dx
BallY + ball_dy
EndProcedure
Procedure DisplayAll()
ClearScreen( 0 )
; Alles anzeigen
FlipBuffers()
EndProcedure
Repeat
MovePlayer()
MoveBall()
CheckCollision()
DisplayAll()
ExamineKeyboard()
Until KeyboardPushed( #PB_Key_Escape )
Re: sprite Collision mit zeit/frame factor ?
Verfasst: 28.07.2013 17:47
von True29
ja , so is es halt sehr Fehleranfällig.
weil was is wenn das bild sich schneller bewegt wie der der einzelne frame also er das garnicht bemerkt ?
daher meine frage wie man das prüft abhängig von der zeit oder von frames.
Re: sprite Collision mit zeit/frame factor ?
Verfasst: 28.07.2013 17:52
von NicTheQuick
Bei einfachen Objekten wie Punkten, Linien und Kreise kann man mit ein bisschen Vektorrechnung leicht ausrechnen, wo sich zwei Objekte treffen werden, wenn sie eine bestimmte Geschwindigkeit und Richtung haben.
Für eine genaue SpritePixelCollision muss man allerdings jeden Zwischenschritt einzeln simulieren um ein genaues Ergebnis zu bekommen.
Re: sprite Collision mit zeit/frame factor ?
Verfasst: 28.07.2013 18:06
von True29
@NicTheQuick
"Bei einfachen Objekten wie Punkten, Linien und Kreise kann man mit ein bisschen Vektorrechnung leicht ausrechnen"
kannste mir da vielleicht ein beispiel machen. kenn mich leider mit vektorrechnung nicht aus.
Sie haben eine bestimmte richtung und geschwindigkeit.
wäre sehr nett von dir wenn du mir helfen würdest.
danke.
Re: sprite Collision mit zeit/frame factor ?
Verfasst: 30.07.2013 19:18
von NicTheQuick
Hier mal eine kleine Procedure für die Kollision von Bällen mit einem bestimmten Radius, Richtung und Geschwindigkeit.
Die Procedure gibt 1 zurück, wenn sich die Bälle treffen werden und 0, wenn nicht. Würden sie sich treffen, dann werden die Koordinaten der beiden Bälle bei ihrer Kollision gesetzt.
Ein kleines Beispiel ist dabei.
Code: Alles auswählen
Structure Point2f
x.f
y.f
EndStructure
Procedure.i simulateHit(*p1.Point2f, r1.f, *dir1.Point2f, *p2.Point2f, r2.f, *dir2.Point2f)
Protected a.Point2f, dir.Point2f, R.f = r1 + r2, ad.f, dirSqInv.f, aSq.f, det.f, t.f
a\x = *p1\x - *p2\x
a\y = *p1\y - *p2\y
dir\x = *dir1\x - *dir2\x
dir\y = *dir1\y - *dir2\y
ad = a\x * dir\x + a\y * dir\y
dirSq = dir\x * dir\x + dir\y * dir\y
dirSqInv = 1.0 / dirSq
aSq = a\x * a\x + a\y * a\y
det = ad * ad - dirSq * (aSq - R * R)
If (det < 0.0)
; Kugeln treffen sich NICHT!
ProcedureReturn #False
EndIf
det = dirSqInv * Sqr(det)
t = - dirSqInv * ad
If (t > det)
t - det
Else
t + det
EndIf
*p1\x + t * *dir1\x
*p1\y + t * *dir1\y
*p2\x + t * *dir2\x
*p2\y + t * *dir2\y
ProcedureReturn #True
EndProcedure
Define.Point2f ball1, ball2, speed1, speed2, radius1.f, radius2.f
ball1\x = 0
ball1\y = 0
speed1\x = 1
speed1\y = 0
radius1 = 1
ball2\x = 10
ball2\y = 10
speed2\x = -1
speed2\y = -2
radius2 = 1
If simulateHit(ball1, radius1, speed1, ball2, radius2, speed2)
Debug "Die Bällen berühren sich an Position (" + ball1\x + "," + ball1\y + ") bzw. (" + ball2\x + "," + ball2\y + ")."
Else
Debug "Die Bällen berühren sich niemals."
EndIf