아케이드(슈퍼마리오류) 충돌검사

아케이드(슈퍼마리오류) 충돌검사 

 

일반적인 슈팅게임에서는 상자와 상자가 충돌했는가만 검사하면 되지만

아케이드 장르에서는 주인공이 상자의 윗면과 충돌했는가, 아랫면과 충돌했는가 등에 따라 행동이 달라진다.

 

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번과 같은 소스이다.