-
3. 접촉면에 따른 파워 조절( SetPuckVector함수)C,C++로 만드는 간단한 프로젝트/에어 하키 - Cocos2D 활용 2021. 4. 8. 18:29
아래의 내용에 이어서 진행한다.
designatedroom87.tistory.com/433
2. 공과 라켓의 충돌 처리
아래의 내용에 이어서 진행 해보자. designatedroom87.tistory.com/432 1. 플레이어 라켓과 컴퓨터 라켓 만들기 개발환경 : Visual Studio 2008 과 cocos2d-1.0.0-x-0.9.0 Cocos2D는 Win API와는 좌표계가 다르다...
designatedroom87.tistory.com
이 부분은 내적의 개념을 이용할 것이다.
아래에서 내적에 대한 글을 보고 오도록 하자.
designatedroom87.tistory.com/434?category=887656
벡터의 내적(Dot product)
위의 [그림 1]과 같이 두개의 벡터가 있으며, 그 사이각이 있다. 저 사이의 각을 구하고 싶을 때, 벡터의 내적을 이용한다. 벡터의 내적식은 다음과 같다. 그리고 벡터a와 벡터b는 다음과 같이 쓸
designatedroom87.tistory.com
접촉면에 따른 파워 조절은 라켓의 어느 부위에 공이 닿았냐에 따라 공이 날아가는 파워는 다를 것이다.
이는 SetPuckVector함수 내에서 처리를 하면 된다.
라켓과 공이 충돌했을 때의 추가적인 과정이다.
다만, 어느부분에서 이 기능을 만들지 생각을 해보자.
[그림 1] 일반적으로 공이 굴러오다가, 라켓의 정중앙에 맞아으면, 파워가 최대치가 된다.
쉽게 표현하면 야구배트에 공이 정중앙에 맞으면, 멀리 나가는 경우와 흡사.
[그림 2] 공이 라켓의 정면이 아닌 곳에 부딪히면, 파워는 최대치보다 작다.
우선, 아래의 PlayerAction 함수를 수정하도록 하자.
기존의 방식은 키 입력에 따라서 플레이어의 좌표값을 바로 변경해주었는데,
기존에 클래스 멤버변수인 플레이어의 이동 방향 벡터 변수를 이용해서 수정하도록 하자.
이동 방향 벡터의 값이 0인 경우는 해당 방향으로의 움직임은 없다는 의미이다.
각 방향 키의 입력에 따라 방향에 대한 정보만 담고 있다.
그래서 1 혹은 -1의 값으로 두도록 한다.
아래의 함수에서 플레이어의 이동 벡터의 x와 y를 0으로 둔 이유는
만약에 키 입력이 들어오지 않는 상황을 생각해서 둔 것이다.
키 입력이 들어오지 않으면 플레이어의 이동 벡터의 x와 y가 0이 되어, pos의 값에는 변화가 없다.
아래는 SetPuckVector 함수에 공과 라켓이 충돌한 부분이다.
벡터의 내적을 이용해서 공의 속도를 높이거나 낮출 수 있다.
m_fPuck_Speed(공의 이동 속도) 를 구할 때, 절대값을 쓴 이유는
cosineTheta값이 음값이 나올수 있는데, 이를 막아주고자 쓴 것이다.
그리고 300을 더한 이유는 cos(90)는 0값인데, 90도 각도로 맞으면 공의 속도는 0이 된다.공의 이동 속도가 0이 되는 것을 막기 위해서 300정도의 값을 더한 것이다.
아래에 m_bComTouched 라는 변수가 있는데, 이는 밑에서 설명한다.
라켓의 이동 속도의 크기가 0이라는 의미는 움직이지 않고 가만히 있었다는 의미이다.
m_bComTouched 라는 변수의 선언 이유는 나중에 작업할 컴퓨터의 FSM과 연관이 있다.
FSM에 대해 간단히 설명하면, 컴퓨터 진영에 공이 넘어오면 공을 쫓아가는 추적 상태와
추적 상태에서 공을 친 이후에 원래 위치로 되돌아 오는 복귀 상태와
공이 플레이어 영역에 있으면 배회 상태를 만들 것이다.
m_bComTouched는 컴퓨터가 공을 쳤는지에 대한 여부를 판정하는 변수로 보도록 하자.
해당 변수가 존재하는 이유는 컴퓨터가 자기 진영으로 넘어온 공을 쫒아가서컴퓨터가 자기 진영에서 공을 여러 번 치는 상황을 막기 위해서 필요하다.
컴퓨터가 공을 치면 m_bComTouched는 true로 변경되고,나중에 컴퓨터가 공을 치고 원래 자리로 돌아와서 적정 시간(m_fDelay)이 흐르면
다시 false로 변경되어 공을 칠 준비를 한다.
위에서 적정 시간이 흐르는 것을 알아내기 위해서는 시간을 재는 변수(m_fCom_Time)가 필요하다.
아래는 초기화를 처리하는 함수이다.
프로그램 실행영상
헤더 파일과 소스 파일
'C,C++로 만드는 간단한 프로젝트 > 에어 하키 - Cocos2D 활용' 카테고리의 다른 글
4. 컴퓨터 AI만들기 (0) 2021.04.08 2. 공과 라켓의 충돌 처리 (0) 2021.04.08 1. 플레이어 라켓과 컴퓨터 라켓 만들기 (0) 2021.04.08