sprite Collision mit zeit/frame factor ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

sprite Collision mit zeit/frame factor ?

Beitrag 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 ;)
i7,12gb ram , Windows 10 ,Purebasic 5.50
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: sprite Collision mit zeit/frame factor ?

Beitrag 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 )
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: sprite Collision mit zeit/frame factor ?

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
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

Re: sprite Collision mit zeit/frame factor ?

Beitrag 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.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: sprite Collision mit zeit/frame factor ?

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
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

Re: sprite Collision mit zeit/frame factor ?

Beitrag 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
Antworten