C#平台冲突不适用于多个平台

时间:2018-11-21 19:56:42

标签: c# game-physics collision

现在,我正在尝试使用C#创建一个简单的游戏编辑器,但是当用户向屏幕上添加多个平台时存在一个问题:

private void tmrRunGame_Tick(object sender, EventArgs e)
        {
            foreach(Platform plat in platList)
            {
                if (plat.getBounds().IntersectsWith(player.getBounds()))
                {
                    tmrGravity.Stop();
                    isColliding = true;
                }
                else
                {
                    isColliding = false; 
                }
            }

            if(player.getY() < 500 && !isJumping && !isColliding)
            {
                tmrGravity.Start();
            }
            else
            {
                tmrGravity.Stop();
            }
        }

此代码仅阻止用户进入上一个创建的平台,而在此之前,用户可以直接进入所有平台。更令人困惑的是,该程序正在检测所有平台的冲突,但仅对一个平台进行了预期的工作!非常令人沮丧,我们将不胜感激。

如果有任何帮助,这就是我添加平台的方式:

private void pbPlatformSelect_MouseClick(object sender, MouseEventArgs e)
        {
            Platform plat = new Platform(100, 10, 50, 50);
            plat.drawTo(this);
            platList.Add(plat);
        }

2 个答案:

答案 0 :(得分:2)

用以下代码替换foreach循环:

var playerBounds = player.GetBounds ();
isColliding = platList.Any (plat => plat.GetBounds ().IntersectsWith (playerBounds);
if (isColliding) tmrGravity.Stop ();

如果您不喜欢LINQ,则可以这样更改循环:

var playerBounds = player.GetBounds ();
isColliding = false;
foreach (var plat in platList) {
    if (plat.GetBounds ().IntersectsWith (playerBounds)) {
        isColliding = true;
        tmrGravity.Stop ();
        break;
    }
}

答案 1 :(得分:1)

我认为一旦确定发生了碰撞,您想突破foreach循环。如果您有3个平台,并且与第一个平台发生碰撞,则isColliding为true,但如果不与第二个平台发生碰撞,则会将isColliding切换为false。最后,列表中最后一个平台的相交结果是isColliding的值。

因此,请尝试放置“ break;”在'isColliding = true'之后;

这也是效率的提高,因为如果您有1000个平台,并且播放器与第一个平台发生冲突,那么我们就不在乎其他平台(据我所知),并且我们为自己节省了999次循环迭代。