Rob´s BB-Kurs 2

Kollisionsabfrage


© Robert Gerlach 2001

www.robsite.de



Boom! Gerade ist ein 100 Tonnen-Panzer explodiert, er wurde von einem Asteroiden getroffen. Die Trümmer prallen vom Boden ab und treffen eine vorbeifliegende Ente. Diese fliegt brennend in eine Mauer und hinterlässt einen unschönen Abdruck.
Dies alles könnte nicht ohne Kollisionsabfrage ablaufen. Der Asteroid würde durch den Panzer durchgehn und die Ente könnte gemütlich weiterfliegen. Merke: Kollisionsabfrage ist mit das wichtigste in einem Spiel.



Und wie kann man nun überprüfen ob ein Bild mit einem anderen kollidiert? So:


If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2) Then Print "Pixelgenaue Kollision!!! (!)"

; oder

If ImagesOverlap(bild1, x1, y1, bild2, x2, y2) Then Print "Einfache Kollison!"


Wie man sieht, gibt es hier zwei Möglichkeiten. Bei ImagesCollide werden die Bilder pixelgenau überprüft, eine transparente Farbe wird nicht beachtet, da sie ja transparent --> nicht sichtbar ist...
ImagesOverlap dagegen prüft nur ob die beiden Bilder sich überlappen, die transparente Farbe wird nicht ausgelassen. Dadurch ist ImagesOverlap etwas schneller. Die Frames in ImagesCollide muss man mit angeben, wenn man ein animiertes Bild überprüfen will, sonst nicht.

Beispiel:






So kann man nun die Kollision zwischen zwei Bildern feststellen. Man kann aber auch ein beliebiges rechteckiges Feld auf Kollision mit einem Bild überprüfen:


If ImageRectCollide (bild, x, y, frame, rechteck_x, rechteck_y, rechteck_breite, rechteck_hoehe) Then Print "Pixelgenaue Kollision!"

; oder

If ImageRectOverlap (bild, x, y, rechteck_x, rechteck_y, rechteck_breite, rechteck_hoehe) Then Print "Normale Kollision..."


Die Parameter sind selbsterklärend, bei ImageRectCollide braucht man auch wieder das Frame, falls man mehr als eins hat. Mehr fertige Befehle gibts nicht, reicht ja auch aus ^_^.

Will man aber z.B. die Kollision von 2 Bällen berechnen ohne die Bilder direkt zu überprüfen (wenn man vielleicht keine Bilder hat sondern nur mit Oval gemalte Kreise), muss man das ganze selbst schreiben. Das ist garnicht mal so schwer, 9. Klasse Mathe reicht aus, oder besser gesagt --> Pythagoras. Man rechnet einfach nur den Abstand zwischen den beiden Mittelpunkten der Kreise aus, zieht den Radius jedes Kreises ab und wenn das Ergebnis unter 0 ist, überschneiden sich die beiden Kreise und kollidieren somit. Hier eine kleine Function die den Abstand zwischen 2 Punkten errechnet:


; Berechnet den Abstand zwischen 2 Punkten.
Function abstand#(x1#,y1#,x2#,y2#)
x_ab# = x1# - x2# ; x-Abstand
y_ab# = y1# - y2# ; y-Abstand

abstand# = Abs(Sqr((x_ab# ^ 2) + (y_ab# ^2))) ; Mittels Pythagoras den Abstand ausrechnen.
Return abstand#
End Function


Ein kleines Beispielprogramm zu ImagesCollide und anderen Grafikbefehlen findest du hier: http://www.robsite.de/bbkurs2/bbkurs-9-collidedemo.zip.
Man kann mit einem kleinen mausgesteuerten Raumschiff über eine Raumstation fliegen. Immer wenn sich die beiden berühren, gibts eine Kollisionsmeldung. Außerdem fliegen im Hintergrund noch die Sterne vorbei...

Bild:

Collide Demo


Einfach entpacken und mit BB starten (geht auch mit der Demo, sind .bmp Bilder).




Zusammenfassung


; Mit: If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2) Then Print "Pixelgenaue Kollision!!! (!)"

; oder

If ImagesOverlap(bild1, x1, y1, bild2, x2, y2) Then Print "Einfache Kollison!" ; kann man pixelgenau oder einfach überprüfen ob 2 Bilder kollidieren.


; Mit If ImageRectCollide (bild, x, y, frame, rechteck_x, rechteck_y, rechteck_breite, rechteck_hoehe) Then Print "Pixelgenaue Kollision!"

; oder

If ImageRectOverlap (bild, x, y, rechteck_x, rechteck_y, rechteck_breite, rechteck_hoehe) Then Print "Normale Kollision..." ; überprüft pixelgenau oder einfach man ob ein Bild mit einem Rechteck kollidiert.


; Alles was sonst noch überprüft werden soll, muss man per Hand machen.


Weiter mit Sound und Musik.