1

ランダムな角度 (0 から 360 または 0 から 2pi の間) を選択して、その方向にスプライトを移動できるようにしたいと考えています。これまでのところ、これを試してみましたが、常に下に移動し、角度の選択があまりきれいではないため、ほとんど効果がありませんでした.

Random rand = new Random();

//Chooses the Angle
rotation = (float)rand.NextDouble()*MathHelper.TwoPi; 

//Is supposed to get a normalized movement vector that moves in the direction of that angle.
moveVector = Vector2.Normalize(new Vector2(-(float)Math.Tan(rotation), 1)); 
4

2 に答える 2

6

あなたは三角法の少しが欠けているようです:

Y コンポーネントが常に 1 のベクトルを作成しています (2D XNA ではダウン)。したがって、ランダムな角度に関係なく、方向の水平部分にのみ影響します。

角度を (単位、つまり既に正規化された) 方向ベクトルに変換するには、sin と cos を使用できます (単位円を考えてください)。

var dir = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));

XNA は 2D の画面の左上に原点を置くため、y コンポーネントを逆にする必要があります。

var dir = new Vector2((float)Math.Cos(angle), -(float)Math.Sin(angle));

さらに、乱数の適切なシーケンスを確実に取得するには、ランダム オブジェクトを 1 回だけ作成し、毎回同じインスタンスを使用して次の乱数を取得する必要があります。

また、よりスムーズな動きを得るには、すでに進行中の方向を優先して方向を重み付けするか、ランダムな目的地を選択してそこに移動します (その後、別の目的地を選択するなど)。

于 2013-01-26T05:35:24.663 に答える
1

それを考え出した、これは正しい行です:

move = new Vector2((float)Math.Cos(rotation - MathHelper.PiOver2), (float)Math.Sin(rotation - MathHelper.PiOver2));
于 2013-01-26T05:34:53.213 に答える