0

私はトップダウン シューティング ゲームに取り組んでおり、敵をあてもなくさまよわせたいと思っています。このコードでは、メイン クラスに random(rnd) を含むすべての変数 (回転、位置など) を持つ Enemy クラスがあります。

私の問題は、敵が画面の右上隅から左下に移動し続けることです。ですから、彼らはさまようのではなく、常に特定の方向を向いています。なぜそうなるのか知りたいです。

refresh += gameTime.ElapsedGameTime.TotalSeconds;

if (refresh >= 3)
{
    refresh -= 3;
    int rndDirection = rnd.Next(4);

    if (rndDirection == 1) vektor = new Vector2(0, -1);
    if (rndDirection == 2) vektor = new Vector2(0, 1);
    if (rndDirection == 3) vektor = new Vector2(1, 0);
    if (rndDirection == 4) vektor = new Vector2(-1, 0);

    foreach (Enemy enemy in enemies)
    {
        Vector2 rndDirVec = vektor;
        enemy.directionX = enemy.position.X - rndDirVec.X;
        enemy.directionY = enemy.position.Y + rndDirVec.Y;
        enemy.rotation = (float)Math.Atan2(enemy.directionY, enemy.directionX);
    }
}
foreach (Enemy enemy in enemies) 
    {
        enemy.position -= new Vector2((float)(enemy.speed/2 *   Math.Cos(enemy.rotation)), (float)(enemy.speed/2 * Math.Sin(enemy.rotation)));
    }

私はC#にかなり慣れていないので、C#でどのように機能するかについての知識が不足している可能性があります。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

5

の整数引数Random.Nextは排他的な上限であるため、rndDirection0、1、2、または 3 になります。X 座標を増やすことはないため、敵は常に左に移動します。

私は次のようにします (XNA を使用したことがなく、コードの詳細がわからないため、これが 100% 正しいかどうかはわかりません)。

foreach (Enemy enemy in enemies)
{
  enemy.direction.X = rnd.Next(3) - 1; // -1, 0, +1
  enemy.direction.Y = rnd.Next(3) - 1; // -1, 0, +1
  Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed);
  enemy.position = Vector2.Add(enemy.position, movement);
}

または、より細かい方向の変更が必要な場合:

const float rotationStep = 5.0f * Math.PI / 180.0f; // 5 degrees
foreach (Enemy enemy in enemies)
{
  enemy.rotation += (rnd.Next(3) - 1) * rotationStep;
  enemy.direction.X = Math.Cos(enemy.rotation);
  enemy.direction.Y = Math.Sin(enemy.rotation);
  Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed);
  enemy.position = Vector2.Add(enemy.position, movement);
}
于 2012-11-19T22:44:55.680 に答える
1

rand.next の引数は上限です。また、すべての敵を常に一緒に移動させたい場合を除き、敵の foreach ループ内でランダム ベクトルを再計算して、すべてが同じランダムを実行するのではなく、それぞれがランダムな動きをするようにします。動き(それがあなたが望むものでない限り)。

于 2012-11-19T22:51:18.217 に答える