C#XNA阵列删除

时间:2015-02-15 23:57:33

标签: c# arrays methods xna

我正在尝试制作一个简单的破砖游戏。我拥有用碰撞和简单物理创造的一切。球从球拍和墙壁反弹,但我遇到了砖块问题。我可以让球从砖块上反弹,我只是没有足够的经验知道如何让砖块消失。砖块在一个阵列中。有没有办法删除数组的砖/特定索引?

这就是我创建块的方法

        int blockCount=0;

        for (int x = 0; x < 8; x++)
        {
            for (int y = 0; y < 5; y++)
            {
                blocks[blockCount] = Content.Load<Texture2D>("Block");
                blocksPosition[blockCount].X = 95 + (x * 75);
                blocksPosition[blockCount].Y = 20 + (y * 50);
                blockCount++;
            }
        }

这就是我如何进行碰撞以及如何实现拆除砖块

    public void DetectBlockBallCollision()
    {
        for (int i = 0; i<40; i++)
        {
            if ((ballPosition.Y + ball.Height) >= blocksPosition[i].Y &&
                (ballPosition.Y + ball.Height) < (blocksPosition[i].Y+75) &&
                (ballPosition.X + ball.Width) > blocksPosition[i].X &&
                ballPosition.X < (blocksPosition[i].X + blocks[i].Width))
            {
                movingUp = false;
                //whatever would get rid of block;
            }

        }

    }

2 个答案:

答案 0 :(得分:2)

  1. 不要在循环中加载纹理,只在LoadContent中加载一次。
  2. 在你的brick元素中正确放置(如TyCobb建议的那样)并在collsion中将其设置为true,然后将其移除到循环外的某处。

    bricks.removeAll(b =&gt;!(b.active))

  3. 根据不同的属性,你的砖可以拥有健康,可破坏的财产,砖块可以放下一些物品......

答案 1 :(得分:0)

二维数组可用于逐个网格对齐。块将通过网格单元坐标以X和Y中的固定像素步长排列,位置定义为(col * step_x,row * step_y)。然后,对于int值为0的数组意味着没有块,并且非零值意味着来自块寄存器的块ID。该寄存器应保持该块的所有单元共用数据(具有相同的ID)。此方法最适合可以通过一次命中销毁的块。对于更耐用的可以使用相同总块的几个变体,例如,如果砖块(1 HP)具有ID = 1,石块(2 HP)具有ID = 2用于未损坏且ID = 3用于损坏,铁具有3/2/1 HP的块具有ID = 4/5/6,依此类推。然后,您需要将数组中的单位集删除为0。

第二种方式是使用清单。块应以对象的形式呈现,每个对象都知道其坐标,最大和当前HP,特殊状态等。当你点击它时,你实际上可以从列表中删除块的好处是惠普成为0。