-
2. 공과 라켓의 충돌 처리C,C++로 만드는 간단한 프로젝트/에어 하키 - Cocos2D 활용 2021. 4. 8. 12:11
아래의 내용에 이어서 진행 해보자.
designatedroom87.tistory.com/432
이번에는 공과 라켓의 충돌에 따른 공의 이동과 공이 경기장 벽에 닿았을 경우의 처리에 대해 알아보자.
라켓은 플레이어와 컴퓨터 이렇게 2종류로 존재한다.
그리고 공의 이동 방향은 플레이어 혹은 컴퓨터 라켓에 따라 다르다.
1. 공과 라켓의 충돌( SetPuckVector함수 )
공과 라켓의 충돌 처리를 알아보자.
이는 SetPuckVector 함수가 처리한다.
아래의 [그림 1] 과 같이 공과 라켓이 멀리 떨어져 있다고 가정하면
위 그림처럼 공이 라켓을 향해 이동하고 있다. 그런데 공과 라켓이 충돌을 한다.
아래의 [그림 2]를 보자.
그러면 공과 라켓이 충돌한 이후에 공의 이동방향은 아래와 같이 된다.
즉, 공의 이동벡터는 라켓과 공의 위치를 가지고 구할 수 있다.
( 공의 이동벡터는 반드시 단위벡터화 해주자. )
그리고, 공과 라켓이 충돌했냐 안했냐를 판단하는 기준은 [그림 2]를 보다시피
공과 라켓의 각 각의 반지름을 구해서 알아볼 수 있다.
충돌을 판단하는 그림을 좀더 자세히 그려보면
충돌판정은 다음과 같은 식이 만족함을 보일 수 있다.
위의 내용을 구현하면 아래와 같다.
2. 공과 벽에 대한 반사벡터( BlockBlockPuck함수 )
반사벡터에 대한 내용은 앞장의 반사벡터를 보면 알 수 있다.
아래에서 반사 벡터를 어떻게 구하는지 보고 와보자.
designatedroom87.tistory.com/132?category=887656
위는 API에서의 구현한 반사 벡터인데, API와 Cocos2D는 좌표계가 다르다고 앞에서 설명을 하였다.
이를 숙지하고 아래를 보자.
우리가 반사 벡터를 어떻게 구하느냐와 반사 벡터를 언제 쓰느냐 2가지를 생각해야 한다.
반사 벡터가 필요한 이유는 공이 움직이다가 경기장을 벗어날려고 할때, ( 공이 경기장 벽에 닿는 경우 )
공이 이동하는 방향을 다른쪽으로 이동시키기 위해서 필요하다.
즉, 공의 x좌표와 y좌표가 있다고 가정할 때,
공의 x좌표가 screenLeft보다 작아질 때와 공의 x좌표가 screenRight보다 커질 때
그리고 공의 y좌표가 screenTop보다 커질때, 공의 y좌표가 screenBottom보다 작아질 때
이렇게 4가지 경우에 각 각의 반사 벡터를 구해서, 공의 이동벡터에 넣어주면 된다.
그리고 맨 마지막의 내용은 공의 위치가 경기장을 벗어났는지를 체크해서 위치를 조절하는 내용으로
앞에서 한 내용이다.
SetPuckVector 함수와 BlockPuck 함수의 호출 Update함수에서 한다.
프로그램 실행영상
헤더 파일 및 소스 파일
'C,C++로 만드는 간단한 프로젝트 > 에어 하키 - Cocos2D 활용' 카테고리의 다른 글
4. 컴퓨터 AI만들기 (0) 2021.04.08 3. 접촉면에 따른 파워 조절( SetPuckVector함수) (0) 2021.04.08 1. 플레이어 라켓과 컴퓨터 라켓 만들기 (0) 2021.04.08