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