我正在尝试制作一个简单的破砖游戏。我拥有用碰撞和简单物理创造的一切。球从球拍和墙壁反弹,但我遇到了砖块问题。我可以让球从砖块上反弹,我只是没有足够的经验知道如何让砖块消失。砖块在一个阵列中。有没有办法删除数组的砖/特定索引?
这就是我创建块的方法
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;
}
}
}
答案 0 :(得分:2)
在你的brick元素中正确放置(如TyCobb建议的那样)并在collsion中将其设置为true,然后将其移除到循环外的某处。
bricks.removeAll(b =&gt;!(b.active))
根据不同的属性,你的砖可以拥有健康,可破坏的财产,砖块可以放下一些物品......
答案 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。