视觉避免巨大嵌套if用于碰撞检测

本文关键字:if 用于 碰撞检测 嵌套 巨大 视觉 | 更新日期: 2023-09-27 18:01:00

对不起,我是个新手——我已经搜索了这个问题的答案,但没有什么能与我所做的完全匹配。

我有一个基本的箭头控制迷宫游戏,有"墙"的标签,名为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);
            }

但这正变得非常混乱。

有没有一种方法我可以说——如果玩家撞到了"任何"墙,然后把它移回以前的位置?

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

视觉避免巨大嵌套if用于碰撞检测

首先将所有"感兴趣的碰撞"对象放入一个集合中,例如:

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
}