C# XNA 阵列删除
C# XNA Array Removal
我正在尝试制作一款简单的打砖块游戏。我用碰撞和简单的物理学创造了一切。球从球拍和墙壁上弹回,但我在处理积木时遇到了麻烦。我可以让球从砖块上弹开,我只是经验不足,不知道如何让砖块消失。砖块排成一列。有什么方法可以删除数组的 brick/specific 索引吗?
这就是我创建块的方式
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;
}
}
}
- 不要在循环中加载纹理,在 LoadContent 中只加载一次。
在你的 brick 元素中正确放置 Active(如 TyCobb 建议的那样),并在 collsion 中将其设置为 true,然后将其删除到循环外的某处。
bricks.removeAll(b => !(b.active))
根据不同的属性,您的砖块可能具有生命值、可破坏性 属性、会掉落某些物品的砖块...
二维数组有助于按网格对齐块。块将按 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、特殊状态等。好处是当你击中它时你实际上可以从列表中删除块并且它的HP变为0.
我正在尝试制作一款简单的打砖块游戏。我用碰撞和简单的物理学创造了一切。球从球拍和墙壁上弹回,但我在处理积木时遇到了麻烦。我可以让球从砖块上弹开,我只是经验不足,不知道如何让砖块消失。砖块排成一列。有什么方法可以删除数组的 brick/specific 索引吗?
这就是我创建块的方式
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;
}
}
}
- 不要在循环中加载纹理,在 LoadContent 中只加载一次。
在你的 brick 元素中正确放置 Active(如 TyCobb 建议的那样),并在 collsion 中将其设置为 true,然后将其删除到循环外的某处。
bricks.removeAll(b => !(b.active))
根据不同的属性,您的砖块可能具有生命值、可破坏性 属性、会掉落某些物品的砖块...
二维数组有助于按网格对齐块。块将按 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、特殊状态等。好处是当你击中它时你实际上可以从列表中删除块并且它的HP变为0.