Kollisionsklasse

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Hangman

Betreff: Kollisionsklasse

BeitragDi, Jan 08, 2013 6:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Bietet folgende Kollisionsüberprüfungen:
- Rechteck - Rechteck (nur für Rotation=0)
- Linie - Punkt
- Rechteck - Punkt
- Linie - Rechteck

BlitzMax: [AUSKLAPPEN]
Rem
bbdoc:Prüft auf Kollisionen verschiedener Geometrien.
End Rem

Type CollisionUtil Abstract
Rem
bbdoc:Prüft auf Kollision zweier Rechtecke.
returns:True oder False.
End Rem

Function rectInRect:Byte(rect1X:Int, rect1Y:Int, rect1Width:Int, rect1Height:Int, rect2X:Int, rect2Y:Int, rect2Width:Int, rect2Height:Int)
If rect1X + rect1Width > rect2X And rect1X < rect2X + rect2Width Then
If rect1Y + rect1Height > rect2Y And rect1Y < rect2Y + rect2Height Then
Return True
End If
End If
Return False
End Function


Rem
bbdoc:Prüft, ob sich ein Punkt auf einer Linie befindet.
End Rem

Function pointOnLine:Byte(lineX1:Int, lineY1:Int, lineX2:Int, lineY2:Int, pointX:Int, pointY:Int)
Local result:Int = lineX1 * lineY2 + lineY1 * pointX + lineX2 * pointY - lineX1 * pointY - lineY1 * lineX2 - lineY2 * pointX
If result = 0 Then
Return True
Else
Return False
End If
End Function



Rem
bbdoc:Prüft, ob ein Punkt in einem Rechteck liegt.
returns:True oder False.
End Rem

Function pointInRect:Byte(x:Int, y:Int, rectX:Int, rectY:Int, rectWidth:Int, rectHeight:Int)
If x >= rectX And x <= rectX + rectWidth Then
If y >= rectY And y <= rectY + rectHeight Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function


Rem
bbdoc:Prüft, ob eine Linie ein Rechteck schneidet.
returns:Den ersten gefundenen Schnittpunkt als String, falls vorhanden. Format: x;y
schnittpunkt:String = lineInRect(...)
schnittpunktX:Int = Int(schnittpunkt.Split(";")[0])
schnittpunktY:Int = Int(schnittpunkt.Split(";")[1])
__COMMENT1__
End Rem

Function lineInRect:String(lineX1:Int, lineY1:Int, lineX2:Int, lineY2:Int, rectX:Int, rectY:Int, rectWidth:Int, rectHeight:Int)
Local m:Double = 0
If (lineX2 - lineX1) <> 0 Then m = Double((lineY2 - lineY1)) / Double((lineX2 - lineX1))
Local c:Double = lineY2 - (m * lineX2)

If lineX1 < lineX2 Then
For Local x:Int = lineX1 To lineX2 Step 1
Local y:Int = Int(((m * Double(x)) + c))
If CollisionUtil.pointInRect(x, y, rectX, rectY, rectWidth, rectHeight) Then Return String(x) + ";" + String(y)
Next
End If

If lineX1 > lineX2 Then
For Local x:Int = lineX1 To lineX2 Step (-1)
Local y:Int = Int((m * Double(x)) + c)
If CollisionUtil.pointInRect(x, y, rectX, rectY, rectWidth, rectHeight) Then Return String(x) + ";" + String(y)
Next
End If

Return Null
End Function
End Type


Falls jemandem Fehler auffallen, bitte melden. Ich werde den Beitrag dann editieren.
Ich habe Berthold gebrochen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group