1

そのため、学校向けの XNA ゲームを開発する必要があり、スペース インベーダーは素晴らしいものだと思いました。しかし今、私は問題で立ち往生しています。私はList別のクラスの「エイリアン」でいっぱいです。そして、毎秒20ピクセル右に移動し、画面の右側に触れたときに下降させたい(問題ではない)。しかし、壁に触れるとすぐに反対方向(左)に移動したい. ここに問題があります。壁に触れるとすぐに、20 ピクセル移動して方向を変え、20 ピクセル戻って再び方向を変えます。これが繰り返され続けます。では、問題はどこにあるのでしょうか。エイリアンの 1 人が画面に触れたかどうかを事前に確認する必要があると思いますが、それを達成する方法がわかりません。非常にイライラするので、あなたの 1 人が私を助けてくれると思いました!

更新方法を含めました

if (xPos % step == 0)
{
   if (!isDescending)
   {
      for (int k = 0; k < sprites.Count; k++)
      {
         Sprite sprite = sprites[k];

         if (touchedRight) sprite.position.X += step;
         else sprite.position.X -= step;
      }

      for (int k = 0; k < sprites.Count; k++)
      {
         Sprite sprite = sprites[k];
         bool hitLeft = sprite.position.X == 0;
         bool hitRight = sprite.rect.Right == screenWidth;
         if ((hitLeft) || (hitRight))
         {
            touchedRight = !touchedRight;
            isDescending = true;
         }
      }
   }

   else
   {
      isDescending = false;
      for (int k = 0; k < sprites.Count; k++)
      {
         sprites[k].position.Y += sprites[k].rect.Height;
      }
   }
}
// CheckCollision(alienBounds, k-1);
// sprite.rect = new Rectangle((int)sprite.position.X, (int)sprite.position.Y, 20, 20);
// alienBounds = sprite.rect;
xPos += 1;
4

3 に答える 3

0

そこで、エイリアンと同じ幅で、エイリアンと同じように動く「境界」と呼ばれる新しい長方形を作成しました。そして、それが機能しました!(半分)。右側に触れるまで右に移動し、次に左に移動しますが、左に移動し続け、右に戻ることはありません。では、今回はどこが間違っているのでしょうか。

if (xPos % step == 0)
            {
                if (!isDescending)
                {

                    for (int k = 0; k < sprites.Count; k++)
                    {
                        Sprite sprite = sprites[k];
                        sprite.position.X += step;
                    }

                    if (bounds.Right == screenWidth || bounds.Left == 0)
                    {
                        touchedRight = !touchedRight;
                        step *= -1;
                    }

                    if (!touchedRight) bounds.X += step;
                    if (touchedRight) bounds.X -= step;

                    // for (int k = 0; k < sprites.Count; k++)
                    // {
                    //    Sprite sprite = sprites[k];

                    //    bool hitLeft = sprite.position.X == 0;
                    //    bool hitRight = sprite.rect.Right == screenWidth;
                    //    if ((hitLeft) || (hitRight))
                    //    {
                    //        touchedRight = !touchedRight;
                    //        isDescending = true;
                    //    }
                    // }
                }
于 2013-04-14T09:27:01.507 に答える
0

よくわかりませんが、スペースインベーダーを信じています。最も左側の列を除いてすべての列を殺した場合、方向を切り替える前に画面の右側に完全に移動しません。

したがって、私が提案するのは、インベーダーと呼ばれるスプライトの派生物を作成することです。

class Invader : Sprite
{
    readonly float distanceFromCenterHorizontal;

    public Invader(float distanceFromCenterHorizontal)
    {
        this.distanceFromCenterHorizontal= distanceFromCenterHorizontal;
    }

    public void UpdatePosition(Point center)
    {
        this.Position.X = center.X + distanceFromCenterHorizontal;
        this.Position.Y = center.Y;
    }
}



// global variables:
Point center = ....
bool moveLeft = false;

void createInvaders()
{
    int invaderWidth = 20; // whatever your value is
    float columnCenter = ((float) columnMax) / 2 * invaderWidth;

    for(var column = 0; column < columnMax ; column++)
    {
        float invaderX = (column * invaderWidth);

        float distanceFromCenterHorizontal = invaderX - columnCenter;

        for(var row = 0; row < rowMax; row ++)
        {
            Invader invader = new Invader(distanceFromCenterHorizontal);
            invader.Position.Y = row * invaderHeight // Needs adjustment here!
        }
    }
}

void update()
{
    if(center.X == screenWidth) moveLeft = true;
    else if(center.X <= 0) moveLeft = false;

    center.X += moveLeft? -step : step;

    foreach(var invader in invaders) invader.UpdatePosition(center);
}

「centerPoint」を移動し、すべてのインベーダーを新しいセンターに従って更新します。

XNA が double 値と float 値のどちらを使用するかはわからないので、これを調整する必要があるかもしれません。

これを簡単に拡張して、上下の揺れを作成できます。

于 2013-04-13T17:39:01.640 に答える