视觉避免巨大嵌套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);
}
但这正变得非常混乱。
有没有一种方法我可以说——如果玩家撞到了"任何"墙,然后把它移回以前的位置?
我意识到以上可能是一种糟糕的编码方式,但我对屏幕上的操作感到满意,只是不喜欢它背后的重复代码。
首先将所有"感兴趣的碰撞"对象放入一个集合中,例如:
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
}