아케이드(슈퍼마리오류) 충돌검사
일반적인 슈팅게임에서는 상자와 상자가 충돌했는가만 검사하면 되지만
아케이드 장르에서는 주인공이 상자의 윗면과 충돌했는가, 아랫면과 충돌했는가 등에 따라 행동이 달라진다.
1. 상자(네모) 2개 설정
박스1의 좌표 X1, Y1
박스1의 가로길이 W1, 박스1의 세로길이 H1
박스2는 X2, Y2, W2, H2
2. 일반적인 박스 2개 충돌
X1 – W2 < X2
X2 < X1 + W1
Y1 – H2 < Y2
Y2 < Y1 + H1
위 네가지 조건이 만족하면 충돌이다.
3. 아케이드에서 박스충돌
Function CkCrash(X1, Y1, W1, H1, X2, Y2, W2, H2) ‘충돌검사(Check Crash)
Crash = False
If X1 – W2 < X2 Then
If X2 < X1 + W1 Then
If Y1 – H2 < Y2 Then
If Y2 < Y1 + H1 Then
‘충돌했다
Crash = True
‘x차이값 산출
If X1 + W1 – X2 < X2 + W2 – X1 Then
CrashX = X1 + W1 – X2
CrashMX = 2 ‘왼면
Else
CrashX = X2 + W2 – X1
CrashMX = 1 ‘오른면
End If
‘y차이값 산출
If Y1 + H1 – Y2 < Y2 + H2 – Y1 Then
CrashY = Y1 + H1 – Y2
CrashMY = 4 ‘윗면
Else
CrashY = Y2 + H2 – Y1
CrashMY = 3 ‘아랫면
End If
‘어느면 충돌인지 산출
If CrashX < CrashY Then
CrashM = CrashMX
Else ‘CrashX > CrashY 또는 CrashX = CrashY
CrashM = CrashMY
End If
Exit Function
End If
End If
End If
End If
Crash = False
CrashM = “”
End Function
Crash의 값이 True면 충돌한 것이며,
CrashM의 값이 1이면 오른면 충돌, 2면 왼면 충돌, 3이면 아랫면 충돌, 4면 윗면 충돌이 된다.
4. 아케이드에서 박스 충돌(상자 2개가 동일한 정사각형일때)
HW에 한 변의 길이를 넣는다.
(예를 들어 40×40 정사각형이라면 HW=40을 미리 넣어둔다)
‘충돌체크(같은크기)
Function CkCrash2(X1, Y1, X2, Y2) ‘충돌검사(Check Crash)
Crash = False
If X1 – HW < X2 Then
If X2 < X1 + HW Then
If Y1 – HW < Y2 Then
If Y2 < Y1 + HW Then
‘충돌했다
Crash = True
‘x차이값 산출
If X1 + HW – X2 < X2 + HW – X1 Then
CrashX = X1 + HW – X2
CrashMX = 2
Else
CrashX = X2 + HW – X1
CrashMX = 1
End If
‘y차이값 산출
If Y1 + HW – Y2 < Y2 + HW – Y1 Then
CrashY = Y1 + HW – Y2
CrashMY = 4
Else
CrashY = Y2 + HW – Y1
CrashMY = 3
End If
‘어느면 충돌인지 산출
If CrashX < CrashY Then
CrashM = CrashMX
Else ‘CrashX > CrashY 또는 CrashX = CrashY
CrashM = CrashMY
End If
Exit Function
End If
End If
End If
End If
근본적으로 3번과 같은 소스이다.