-
3. 접촉면에 따른 파워 조절( SetPuckVector함수)C,C++로 만드는 간단한 프로젝트/에어 하키 - Cocos2D 활용 2021. 4. 8. 18:29
아래의 내용에 이어서 진행한다.
designatedroom87.tistory.com/433
이 부분은 내적의 개념을 이용할 것이다.
아래에서 내적에 대한 글을 보고 오도록 하자.
designatedroom87.tistory.com/434?category=887656
접촉면에 따른 파워 조절은 라켓의 어느 부위에 공이 닿았냐에 따라 공이 날아가는 파워는 다를 것이다.
이는 SetPuckVector함수 내에서 처리를 하면 된다.
라켓과 공이 충돌했을 때의 추가적인 과정이다.
다만, 어느부분에서 이 기능을 만들지 생각을 해보자.
일반적으로 공이 굴러오다가, 라켓의 정중앙에 맞아으면, 파워가 최대치가 된다.
쉽게 표현하면 야구배트에 공이 정중앙에 맞으면, 멀리 나가는 경우와 흡사.
공이 라켓의 정면이 아닌 곳에 부딪히면, 파워는 최대치보다 작다.
우선, 아래의 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