【问题标题】:C# Platform Collisions Not Working With Multiple PlatformsC# 平台冲突不适用于多个平台
【发布时间】:2019-04-24 11:15:21
【问题描述】:

现在我正在尝试用 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);
        }

【问题讨论】:

    标签: c# game-physics collision


    【解决方案1】:

    用以下代码替换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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我认为一旦确定与某物发生碰撞,就想跳出 foreach 循环。如果您有 3 个平台,并且您与第一个平台发生碰撞,isColliding 为 true,但如果它不与第二个平台发生碰撞,则会将 isColliding 切换为 false。最后,无论列表中最后一个平台的交集结果是什么,isColliding的值就是什么。

      所以试着把'break;'在'isColliding = true'之后;

      这也是一种效率改进,因为如果您有 1,000 个平台并且玩家与第一个平台发生碰撞,我们并不真正关心其他平台(据我所知),我们为自己节省了 999 次循环迭代。

      【讨论】:

        猜你喜欢
        • 2015-07-01
        • 2017-05-14
        • 2010-11-09
        • 2011-02-04
        • 1970-01-01
        • 2016-09-25
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多