1

所以我必须为学校开发一款 XNA 游戏,我认为制作 Space Invaders 是件好事。但现在我遇到了一个问题。我有一个List来自另一个班级的“外星人”。每秒它向右移动 20 像素,我希望它在触摸屏幕右侧时下降(不是问题)。但我希望它一碰到墙就向相反的方向(向左)移动。问题就在这里。一旦它接触到墙壁,它仍然移动 20px 一次,改变方向,向后移动 20px 并再次改变方向。这不断重复。那么问题出在哪里。我认为它必须更早地检查是否有一个外星人触摸了屏幕,但不知道如何做到这一点,并认为也许你们中的一个可以帮助我,因为这非常令人沮丧!

我包括了更新方法

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

1

好吧,这是错误的:

if ((hitLeft) || (hitRight))

向右移动时,您只关心hitRight. 向左移动时,您只关心hitLeft.

所以试试

if (touchedRight? hitLeft: hitRight)

这也将解决多个外星人可以同时撞墙的问题。

于 2013-04-13T17:41:24.893 回答
0

我不确定,但我相信太空入侵者,如果你杀死除了最左边的所有列,它在切换方向之前不会完全移动到屏幕的右侧。

所以我建议你创建一个名为 Invader 的 Sprite 的衍生物:

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 是使用双精度值还是浮点值,所以你可能需要调整它。

然后,您可以轻松扩展它以创建一些向上/向下摆动。

于 2013-04-13T17:39:01.640 回答
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 回答