본문 바로가기
스크래치/스크래치 물리강좌

스크래치 물리강좌. 충돌처리 만들기

by 할거없네 2018. 4. 20.

1. 충돌 개체 만들어 주기


게임을 만들 때 많이 사용하게 되는 '충돌처리'에 대해서 알아봅니다. 충돌처리는 어떤 개체와 개체사이가 서로 닿았는지 확인하는 방법입니다. 여러가지의 방법이 있지만 여기서는 간단한 시스템으로 이해해볼까 합니다. 충돌하는 개체의 모양은 계산의 단순화를 위해 사각형 충돌처리를 만들어 봅니다.






▲ 서로 충돌하는지 확인하는 가장 간단한 방법은 네모를 그려서 확인하는 것이다.


사각형에 충돌을 위한 연산으로 위치(x,y)와 가로, 세로길이입니다. 사각형은 여러개를 취급해야 하므로 하나하나의 변수보다는 리스트를 사용하는 것이 더욱 간단합니다. 각 변수만큼 리스트로 만들고, 첫번째 두번째... 등을 리스트의 번호순으로 사용하기로 합니다.




▲ 미리 리스트로 만들어야 n개의 충돌처리를 할 수 있다.



리스트를 만들고 난 후에는 리스트의 갯수도 미리 만들어 주어야 합니다. 일단 맨 처음에 테스트용으로 2개를 만드는 것으로 시작하겠습니다. 2개의 상자는 (0,0)의 위치에 가로세로 10의 크기를 가진 상자로 데이터상 만들어줍니다.



리스트를 사용하기 위해서 초기 개수를 만들어 준다. 2개를 만들 예정이므로 2번반복하여 리스트를 미리 만든다.


위와 같은 방법을 사용해야 나중에 10개나 100개나 만들 때는 '반복하기'의 횟수를 늘려주는 것으로 쉽게 구현이 가능합니다.




첫번째 블록은 사람이 움직이게 할 목적으로 마우스의 좌표로 이동시킨다.



우리가 자유롭게 이동할 수 있는 블록은 첫번째 블록으로 정하고, 위치를 마우스위치로 정하기로 합니다.





중심좌표를 기준으로 상자를 순서대로 그려준다.


이제 리스트의 위치에 상자를 그려주기로 합니다. 위와 같이 중심으로부터 가로세로의 크기만큼 이동시키면서 펜으로 그려주기로 합니다.






그리기를 수행하면 처음에 지운 후 리스트의 순번대로 네모칸을 그려줍니다.









첫번째 상자는 마우스에 따라 아주 잘 움직입니다. 두번째 상자는 첫번째 상자에 의해 충돌 여부를 확인하도록 만들 예정입니다.




2. 충돌 조건 만들어주기



충돌하는 조건을 만들어 줍니다. 먼저 충돌이 일어나는 경우는 개체와 개체가 겹쳐야 합니다. 네모의 상자의 경우 겹쳐진 조건은 각각의 중심 좌표가 서로의 경계 안에 있는지 확인하면 됩니다. 단순히 두개의 상자의 x, y좌표 차이의 크기가 자신의 가로 세로의 합보다  작은지 확인하는 과정을 거치면 됩니다.



1) 먼저 x좌표 확인을 먼저 합니다. 자신을 제외한 모든 박스와의 x좌표의 거리를 확인합니다.

2) 거리가 가로길이의 합보다 작은지 확인합니다.

3) 만약에 작다면 y좌표를 확인합니다.

4) 자신을 제외한 모든 박스와의 y좌표의 거리 세로 길이의 합보다 작은지 확인합니다.








이제 자신(m)이 상대(n)와 충돌하는지 확인을 하는 블록을 만들어 줍니다. 자신의 좌표와 상대의 좌표의 차이가 경계안에 드는지 확인을 하고, x, y모두 만족하면 충돌로 인식합니다.








충돌확인이 잘 되는 것을 확인할 수 있습니다.




3. 여러개의 물체의 충돌확인하기


이제 여러개로 확장을 해봅니다. 2개가 아닌 10개로 늘려보도록 합니다.

먼저 충돌을 확인할 개체수를 위해 리스트의 개수를 늘려줍니다. 그리고 충돌이 난 개체를 확인하는 것으로 '상태'리스트를 만들어 0이면 비충돌, 1이면 충돌로 처리하기 위해 추가적으로 '상태' 리스트를 만들었습니다.





이제 '말하기'가 아닌 자신의 상태리스트를 충돌이면 상태가 1, 비충돌이면 0되도록 합니다.




자신의 상태값에 따라서 펜으로 찍을 때 색깔로 표시하기로 합니다.







예제: https://scratch.mit.edu/projects/217529383/




이제 사용자의 블록이 닿으면 색이 변합니다.

다음에는 충돌을 일어났을 때 상자가 움직이도록 하는 물리적인 성질을 넣어볼까 합니다.

댓글