|
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
|
|
|
|
|
|
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: [ 1584
]
|
|
|