본문 바로가기

게임개발/시행착오

무기 회전 조이스틱_시도는 좋지만 굳이 지금 시도할 필요가 없었던 것.

무기 회전 조이스틱.

 

0~360도 각도를 추출

조이스틱 핸들의 각도 - 무기의 각도 = 회전할 각도

회전할 각도 * 초당 회전 속도 = 실제 초당 회전 속도

 

[문제]

시계 방향인지 반시계 방향인지 알 수 없다.

시계 반시계 방향 거리를 구하고 가까운 쪽으로 회전하도록 할 경우

180도 이상 회전할 경우 의도한 방향과 반대로 회전한다.

 

[해결]

조이스틱의 핸들 좌표를 ++, +-, --, -+로 구분.

각 영역 별로 이동이 가지는 의미 부여.

A = 시계 방향 / B = 반시계 방향

 

++ : 오른쪽 = A / 왼쪽 = B / 위 = B / 아래 = A

+- : 오른쪽 = B / 왼쪽 = A / 위 = B / 아래 = A

-- : 오른쪽 = B / 왼쪽 = A / 위 = A / 아래 = B

-+ : 오른쪽 = A / 왼쪽 = B / 위 = A / 아래 = B

 

		if (stick.Direction.x > 0)
			if (stick.Direction.y > 0) blow = 1;//++
			else blow = 2;//+-
		else
			if (stick.Direction.y > 0) blow = 3;//--
			else blow = 4;//-+

 

 

조이스틱 핸들은 상하좌우 이동이 동시에 일어나는데

이 때 x, y 축이 서로 상반된 방향을 가리킬 수 있다.

이 경우 x와 y 중 절대값이 더 큰 쪽을 따르면 된다.

 

1프레임 단위로 핸들의 위치 정보를 저장하고 현재 위치와의 차이를 계산해 이동 방향을 특정할 수 있다.

 

이동 방향에서 회전 방향을 추출하고, 그 값이 A라면 시계 방향으로, B라면 반시계 방향으로 회전한다.

 

이렇게 하면 거리와 무관하게 의도한 방향으로 회전 시킬 수 있다.

 

[장애물]

하지만 A 였다가 B가 되는 경우도 자주 발생할거다.

A로 190도 이동하고 B로 10도 이동하면 B로 회전하는 문제가 생긴다.

 

딜레이를 더 주면 된다.

핸들을 따라오는 핀을 사용하자.

그리고 핸들 대신 그 핀의 이동 방향을 사용하면 된다.

그거라면 어차피 핸들이 움직여도 그걸 추적하는 핀을 참조하기 때문에 이 문제를 해결할 수 있다.

 

물리적인 추적에서 생기는 소소한 오차는 일정 수준 이하의 값을 무시하면 된다.\

 

 

 

 

각도의 차이.

그 차이를 시계 방향 반시계 방향 별도로 구분짓는다.

그리고 더한다.

 

 

매 프레임 핸들 각도를 계산

모든 프레임의 각도를 비교해 회전 방향 특정.

시계 / 반시계 방향을 구분해 서로 더해주면 이동할 방향 특정 가능.

 

 

직선으로 생각해 보면 쉽다.

현재 무기의 각도가 시작점이고, 핸들의 각도가 도착점이다.

두개의 점이 직선상에 위치한다고 했을 때.

 

도착점에 시계 / 반시계 방향이 있고

 

 

결국 회전은 2중 하나의 방향을 가진다.

시계 방향, 반시계 방향.

 

회전은 서서히 이루어지기 때문에 조이스틱 핸들과 딜레이가 있다.

 

하지만 각도 차이를 계산해 속도를 조절한다면 그 딜레이를 일정하게 조절할 수 있다.

 

...

 

라는 모든 고민이 굳이 지금 시점에서 해야하는 고민인지 의문이 들어서 드랍하기로 했다.

누중에 필요하겠다 싶으면 다시 꺼내자.