
Übersicht
Einleitung
1. Grundlagen
2. Variablen
3. Schleifen
4. Entscheidungen
5. Struktur
6. Eingabe
7. Gfx-Grundlagen
8. Bilder anzeigen
9. Kollision
10. Sound & Musik
11. Dateien
12. Multiplayer

Spiele
Grafik
Mathe
Netzwerk
String
Verschiedenes
|
Kollisionsabfrage
© Robert Gerlach 2001-2002
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:
Collide Demo - 209 KB.
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:

Einfach entpacken und mit BB starten (geht auch mit der Demo, sind .bmp Bilder).
Zusammenfassung
; Mit: ImagesCollide(bild1,
x1, y1, frame1, bild2, x2, y2, frame2)
; oder
ImagesOverlap(bild1, x1, y1, bild2, x2, y2)
; kann man pixelgenau oder einfach überprüfen ob 2
Bilder kollidieren.
; Mit: ImageRectCollide(bild,
x, y, frame, rechteck_x, rechteck_y, rechteck_breite, rechteck_hoehe)
; oder
ImageRectOverlap(bild, x, y, rechteck_x, rechteck_y,
rechteck_breite, rechteck_hoehe) ; ü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.
Druckversion
|
|