Visual c# - 如果用于碰撞检测,请避免大嵌套?

时间:2014-05-01 11:27:19

标签: c# nested collision

对不起,我是一个新手 - 我已经找到了答案,但没有什么能与我正在做的完全匹配。

我有一个基本的箭头控制迷宫游戏,带有“墙壁”标签,名为Label1,Label2等。

当我按下一个键时,它会检测角色和墙壁之间的交叉点。

我目前正在使用大型嵌套if,如下所示:

            if (PBoxPlayer.Bounds.IntersectsWith(LblWall1.Bounds))
            {
                PBoxPlayer.Location = new Point(CurrX - 10, CurrY);

            }

            else if (PBoxPlayer.Bounds.IntersectsWith(LblWall2.Bounds))
            {
                PBoxPlayer.Location = new Point(CurrX - 10, CurrY);

            }

            else if (PBoxPlayer.Bounds.IntersectsWith(LblWall3.Bounds))
            {
                PBoxPlayer.Location = new Point(CurrX - 10, CurrY);

            }

但这变得非常混乱。

有没有办法可以说 - 如果玩家击中'任意'墙,然后将其移回原位?

我意识到上面的代码可能是一种糟糕的方式,但我对屏幕上的操作感到满意,而不是背后的重复代码。

1 个答案:

答案 0 :(得分:1)

首先将所有“碰撞有趣”的对象放入集合中,例如:

var walls = new[] { LblWall1, LblWall2, LblWall3 };

一定有更好的方法来做到这一点,但这并不明显,因为没有这方面的背景。所以记住这一点,让我们继续。

拥有集合中的所有对象使您可以使用LINQ:

var collision = walls.Any(w => PBoxPlayer.Bounds.IntersectsWith(w.Bounds));
if (collision) {
    // adjust location
}

如果玩家碰撞的墙壁本身是一个有用的信息,您可以使用另一种变体:

var collidedWith = walls.FirstOrDefault(
    w => Bounds.IntersectsWith(w.Bounds));
if (collidedWith !== null) {
    // collidedWith is the wall we ran into
}