Private Function Collide(A() As Vector, B() As Vector, Number_Of_VerticesA As Long, Number_Of_VerticesB As Long, Offset As Vector, N As Vector, T As Single) As Boolean
Dim Axis(64) As Vector
Dim TAxis(64) As Single
Dim Number_Of_Axes As Long: Number_Of_Axes = 0
Dim I As Long, J As Long
Dim E0 As Vector
Dim E1 As Vector
Dim E As Vector
J = Number_Of_VerticesA - 1
For I = 0 To J
E0 = A(J)
E1 = A(I)
E = Vector_Subtract(E1, E0)
Axis(Number_Of_Axes).X = -E.Y
Axis(Number_Of_Axes).Y = E.X
If (Interval_Intersect(A(), B(), Number_Of_VerticesA, Number_Of_VerticesB, Axis(Number_Of_Axes), Offset, TAxis(Number_Of_Axes))) = False Then
Collide = False
Exit Function
End If
Number_Of_Axes = Number_Of_Axes + 1
J = I
Next I
J = Number_Of_VerticesB - 1
For I = 0 To J
E0 = B(J)
E1 = B(I)
E = Vector_Subtract(E1, E0)
Axis(Number_Of_Axes).X = -E.Y
Axis(Number_Of_Axes).Y = E.X
If (Interval_Intersect(A(), B(), Number_Of_VerticesA, Number_Of_VerticesB, Axis(Number_Of_Axes), Offset, TAxis(Number_Of_Axes))) = False Then
Collide = False
Exit Function
End If
Number_Of_Axes = Number_Of_Axes + 1
J = I
Next I
If (Find_Minimum_Translation_Distance(Axis(), TAxis(), Number_Of_Axes, N, T)) = False Then
Collide = False
Exit Function
End If
If Vector_Multiply(N, Offset) < 0 Then
N.X = -N.X
N.Y = -N.Y
End If
Collide = True
End Function
Private Sub Get_Interval(Vertex_List() As Vector, Number_Of_Vertices As Long, Axis As Vector, Min As Single, Max As Single)
Min = Vector_Multiply(Vertex_List(0), Axis)
Max = Vector_Multiply(Vertex_List(0), Axis)
Dim I As Long
For I = 1 To Number_Of_Vertices - 1
Dim D As Single: D = Vector_Multiply(Vertex_List(I), Axis)
If (D < Min) Then
Min = D
ElseIf (D > Max) Then
Max = D
End If
Next I
End Sub
Private Function Interval_Intersect(A() As Vector, B() As Vector, Number_Of_VerticesA As Long, Number_Of_VerticesB As Long, Axis As Vector, Offset As Vector, TAxis As Single) As Boolean
Dim Min(1) As Single, Max(1) As Single
Get_Interval A(), Number_Of_VerticesA, Axis, Min(0), Max(0)
Get_Interval B(), Number_Of_VerticesB, Axis, Min(1), Max(1)
Dim H As Single: H = Vector_Multiply(Offset, Axis)
Min(0) = Min(0) + H
Max(0) = Max(0) + H
Dim D0 As Single: D0 = Min(0) - Max(1)
Dim D1 As Single: D1 = Min(1) - Max(0)
If ((D0 > 0) Or (D1 > 0)) Then
Interval_Intersect = False
Exit Function
Else
If D0 > D1 Then
TAxis = D0
Else
TAxis = D1
End If
Interval_Intersect = True
Exit Function
End If
End Function
Private Function Normalize(Vec As Vector) As Single
Dim Length As Single: Length = Sqr(Vec.X * Vec.X + Vec.Y * Vec.Y)
If (Length = 0) Then
Normalize = 0
Exit Function
End If
Vec = Vector_Multiply2(Vec, (1 / Length))
Normalize = Length
End Function
Private Function Find_Minimum_Translation_Distance(Axis() As Vector, TAxis() As Single, Number_Of_Axes As Long, N As Vector, T As Single) As Boolean
Dim Mini As Long: Mini = -1
T = 0
N = Vector_New(0, 0)
Dim I As Long
For I = 0 To Number_Of_Axes - 1
Dim N2 As Single: N2 = Normalize(Axis(I))
TAxis(I) = TAxis(I) / N2
If TAxis(I) > T Or Mini = -1 Then
Mini = I
T = TAxis(I)
N = Axis(I)
End If
Next I
Find_Minimum_Translation_Distance = (Mini <> -1)
End Function
Private Function Collision_Detection() As Boolean
Dim Vertex_List(4) As Vector
Dim Vertex_List2(4) As Vector
'Tile wall
Vertex_List(0) = Vector_New(0, 0)
Vertex_List(1) = Vector_New(Monster.Width, 0)
Vertex_List(2) = Vector_New(Monster.Width, Monster.Height)
Vertex_List(3) = Vector_New(0, Monster.Height)
'Player
Vertex_List2(0) = Vector_New(0, 0)
Vertex_List2(1) = Vector_New(Player.Width, 0)
Vertex_List2(2) = Vector_New(Player.Width, Player.Height)
Vertex_List2(3) = Vector_New(0, Player.Height)
With Player
.Collided = Collide(Vertex_List2(), Vertex_List(), 4, 4, Vector_Subtract(.Position, Monster.Position), .NColl, .DColl)
If .Collided = True Then
Collision_Detection = True
'Collision Response
.Position = Vector_Subtract(.Position, Vector_Multiply2(.NColl, (.DColl * 1.01)))
End If
End With
End Function