Tipp 0283 Kollisionserkennung (RECT)
Autor/Einsender:
Datum:
  Andreas ten Pas
01.11.2002
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Kollisionen stellen die wichtigste und bekannteste Möglichkeit in Spielen dar, die das Spiel selbst erst interessant und realistisch machen. Sie können auf viele unterschiedliche Arten genutzt werden. Eine Kollision kann beispielsweise eintreten, wenn ein Geschoss aus einer Waffe einen Gegner trifft oder wenn ein Raumschiff in einen Asteroiden hineinfliegt. Die wichtigste Anwendung von Kollisionen ist jedoch, dass Surfaces zu festen Objekten werden, denn ohne Kollisionen könnte sich die Spielfigur durch jedes - in der Realität festes - Objekt, wie beispielsweise eine Wand, hindurch bewegen.
Kollisionen müssen jedoch noch erkannt werden. Leider gibt es in DirectDraw keine direkte Möglichkeit, Kollisionen zu erkennen. Stattdessen bieten sich jedoch andere Wege an. Dieser Tipp behandelt eine sehr grobe Kollisionserkennung, die mit der Hilfe von RECT-Variablen durchgeführt wird und ist daher nicht Pixel-genau.
Bei der RECT-Kollisionserkennung wird überprüft, ob sich die Rahmen zweier Surfaces überschneiden. Die dafür benötigten Werte sind in den RECT-Variablen der betroffenen Surfaces gespeichert. Ein spezieller Algorithmus überprüft dann, ob sich die beiden Surfaces überschneiden.
Die Funktion GetOverlapRect nimmt die Koordinaten der oberen linken Ecken der zu überprüfenden Surfaces entgegen. Außerdem werden noch die beiden RECT-Variablen der überprüften Surfaces an die Funktion übergeben, den Rest erledigt sie praktisch ganz von alleine. Zuerst werden die Koordinaten der unteren rechten Ecken der beiden Surfaces berechnet. Dieser Schritt ist wichtig, damit die Kollisionserkennung auf allen Seiten der Surfaces funktionieren kann.
 
Option Explicit

Public Function GetOverlapRect(Sprite1_X, Sprite1_Y, Sprite2_X, _
    Sprite2_Y, Sprite1_Rect As RECT, Sprite2_Rect As RECT) As Byte

  Dim X1 As Integer, X2 As Integer
  Dim Y1 As Integer, Y2 As Integer
  Dim q1 As Integer, q2 As Integer
  Dim w1 As Integer, w2 As Integer

  X1 = Sprite1_X
  X2 = X1 + Sprite1_Rect.Right
  Y1 = Sprite1_Y
  Y2 = Y1 + Sprite1_Rect.Bottom
  q1 = Sprite2_X
  q2 = q1 + Sprite2_Rect.Right
  w1 = Sprite2_Y
  w2 = w1 + Sprite2_Rect.Bottom

  GetOverlapRect = 0

  If X1 < q2 And X2 > q1 And Y1 < w2 And Y2 > w1 Then
    GetOverlapRect = 1
  Else
    GetOverlapRect = 0
  End If
End Function
 
Weitere Links zum Thema
Kollisionserkennung (GetLockedPixel)
Kollisionserkennung (Pixel und Rechteck)
Kollisionserkennung (Distanz-Berechnung)
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 7 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (190 kB) Downloads bisher: [ 1333 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Freitag, 16. September 2011