2009-08-25 3 views
2

플레이어가 탱크를 제어하는 ​​곳에서 2D 게임을합니다.XNA 탱크를 올바르게 회전

나는 탱크를 만들 수 있습니다.하지만 모든 것은,하지만 내 마음에 정말 엉망으로 만드는 것은 어떻게 적절하게 회전하게하는지입니다.

Wii 게임처럼 행동하고 싶습니다. 탱크. 방향이 고정되어 있으며 탱크에 실제 앞뒤가 없습니다.

운전 후 왼쪽으로 돌리면 왼쪽으로 회전해야합니다. 운전하다가 내려서 회전시키지 말고 그냥 다른 방향으로 운전하십시오.

나는 두 개의 180도 부분으로 학위를 나눔으로써 그것을하는 방법에 대해 잠시 후에 다시 설명한다. 하지만 그 빌어 먹을 사이트를 다시 찾을 수 없었습니다.

나는 너희들이 무슨 말하려고하는지 이해할 수 있기를 바랍니다. 미리 감사드립니다 :)

+0

위아래로 앞뒤로 말하고 있습니까? – Lazarus

+0

정확히 :) 전진 및 후진 – Moulde

+0

Im은 매개 변수로 각도를 사용하는 몇 가지 방법을 사용하여 회전시 해당 예제가있는 사이트를 찾고 두 각도 나 그와 비슷한 것으로 나누어 반환합니다. – Moulde

답변

2

내가 당신을 위해 무엇을 찾고있는 것은 단순히 탱크, 모듈로 180도 회전을 최소화하는 가장 좋은 방법이라고 생각이있다.

저는 원하는 이동 방향과 탱크의 현재 방향 사이의 각도를 사용합니다. 최소 각도인지 확인한 다음 탱크의 현재 방향 + 180도 사이의 각도와 비교하십시오. 다음과 같이하십시오 :

// smallest angle between the current direction and the desired direction 
minAngle1 = Math.Abs(Math.Min(tankAngle - desiredAngle, desiredAngle - tankAngle)); 

// smallest angle between the opposite direction and the desired direction 
oppositeAngle = (tankAngle + 180) % 360; 
minAngle2 = Math.Abs(Math.Min(oppositeAngle - desiredAngle, desiredAngle - oppositeAngle)); 

// get the smaller of two to rotate to 
if (minAngle1 < minAngle2) { 
    // we know that we should rotate the current direction to the desired direction 
} else { 
    // rotate the opposing direction to the desired direction 
} 

정확한 회전을 위해서는 회전 표지판을 사용해야합니다. 또한 회전 각도를 알고 있다고 가정했습니다. 벡터가있는 경우에는 비교할 각도 대신 두 벡터 사이의 내적을 사용하여 조금 단순화 할 수 있습니다.

4

당신은 스프라이트로 탱크를 그렸다고 가정합니까? 이 경우 SpriteBatch.Draw 메서드가 오버로드되어 원본 주위의 회전 각도를 지정할 수 있습니다. 당신이 키보드 입력에 따라 회전에만 있도록 일부 사용자 지정 논리를 추가 할 필요가 있으므로, 위의 예제는 스프라이트를 회전 유지합니다 MSDN

에서 그것을 사용하는 방법에 대한

Here's an example

SpriteBatch.Draw overload

. 키보드 입력 확인 방법은 Here's a simple example입니다. 오른쪽 또는 왼쪽 버튼이 눌려 졌는지 확인하는 로직을 추가하고 회전 각도를 업데이트하십시오. 그것이 위 또는 아래 버튼을 누르면 단순히 스프라이트의 위치를 ​​수정합니다.

나는 이것이 의미가 있기를 바랍니다. 그렇지 않으면 그냥 알려주세요.

+0

그래, 그게 다있어 :) 내가 원하는 것은 탱크가 움직이기를 원할 때 탱크가 회전하는 방향을 결정하는 것이다. – Moulde

0

회전 한 각도에 따라 이동 방향에 문제가 있습니까?

Vector2 moveDir = new Vector2(Math.Cos(rotation), Math.Sin(rotation)); 
position += (moveDir * speed); 

여기서 속도는 얼마나 빨리 그 방향으로 이동하고 싶은지 나타냅니다. position은 스프라이트의 위치를 ​​나타내는 또 다른 Vector2입니다. Tchami가 SpriteBatch를 사용하여 회전으로 그릴 수 있다고 말합니다. 오버로드를 해결하십시오. Cos와 Sin 메서드에 대한 회전은 라디안이어야하지만 올바르게 기억한다면 Draw가 있어야한다고 생각합니다. MathHelper.ToRadians (도) 및 MathHelper.ToDegrees (라디안)는이를 해결해야합니다.

사이트에 XNA 자습서 및 예제가 많이 http://creators.xna.com/en-US/education/catalog/

+0

제 문제는 제가 어딘가로 가라고 말할 때 탱크를 가능한 한 최소한으로 돌리고 싶습니다. – Moulde