2009-08-25 21 views
2

Imは、プレイヤーがタンクをコントロールする場所で2Dゲームを行います。XNAタンクを正しく回転させる

私はタンクを作ることができますが、すべて、しかし私の心に本当に迷惑をかけるのは、それに応じて回転させる方法です。

私はWiiゲームのように振る舞いたいと思います。 方向が固定されていて、タンクには正面と背面がありません。

左折して左に回転させる必要があります。 運転するときは、それを回転させるべきではなく、ただ他の方向を運転するべきである。

私は赤のチュートリアルですが、180度の部分に度を分けることでこれを行う方法については戻っています。しかし、私は単にその気のきいたサイトを再び見つけることができませんでした。

皆さんは、私が何を言おうとしているのか理解できることを願っています。 ありがとうございます。

+0

上下で、前方と後方について話していますか? – Lazarus

+0

まさに:)前と後ろ – Moulde

+0

私はまだパラメータとして角度を取るいくつかの方法を使って、その例を使ってサイトを探して、それを2つの角度などに分けて返します。 – 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 
} 

正しい回転をさせるには、回転標識を使用する必要があります。また、私はあなたがあなたの回転角度を知っていると仮定しています。もしあなたがベクトルを持っているなら、比較のために角度の代わりに2つのベクトルの間にドット積を使うことによって少し簡単にすることができます。

4

私はあなたのタンクをスプライトとして描いていると仮定しますか?その場合は、SpriteBatch.Drawメソッドがオーバーロードされ、原点を中心に回転角度を指定できます。あなたはそれが唯一のキーボード入力に応じて回転しますので、いくつかのカスタム・ロジックを追加する必要がありますので、上記の、あなたのスプライトを回転させ続けるMSDN

から例を、それを使用する方法の

SpriteBatch.Draw overload

Here's an example。キーボード入力の確認方法については、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を使ってローテーションで描くことができます.Drawオーバーロード。 CosとSinのメソッドの回転はラジアンでなければなりませんが、正しく覚えていればDrawは度でなければならないと思います。 MathHelper.ToRadians(度)とMathHelper.ToDegrees(ラジアン)はそれを解決するはずです。

は、サイト上のXNAチュートリアルと例の多くはhttp://creators.xna.com/en-US/education/catalog/

+0

私の問題は、私がどこかへ行こうと言うとき、私のタンクができるだけ回転しないようにしたいということです。 – Moulde

関連する問題