【问题标题】:Code will not stop when the for loop is broken当 for 循环被破坏时,代码不会停止
【发布时间】:2017-12-04 19:45:43
【问题描述】:

我已经尝试寻找答案,但我没有找到任何东西。我正在用 c# 制作这个 2d 游戏,我希望玩家被每次调用函数时(在 while 循环内)通过重力增加的力拉下。由于某种原因,当 for 循环中断时,代码不会停止。

private void PhysicsLoop()
{
    NowX = Convert.ToInt32(Math.Floor(Convert.ToDecimal(Player.x / 32)));
    NowY = Convert.ToInt32(Math.Floor(Convert.ToDecimal(Player.y / 32)));

    if (Block[NowX,NowY + 2].Collides == false)
    {
        Falling = true;
    }

    if (Falling == true)
    {
        force += Gravity;
        for (int i = 0; i <= force; i++)
        {
            if (Block[NowX, NowY + 2].Collides == true)
            {
                Falling = false;
                break;
            }
            else
            {
                Player.y += 1;
            }
        }
    } 
    else
    {

    }
}

【问题讨论】:

  • force += Gravity; 这应该在你的 for 循环中吗?我建议首先设置断点并使用调试器..
  • 你说的“代码不会停止”是什么意思?您提到此方法是在 while 循环内调用的。听起来这就是问题所在,因为您上面显示的代码看起来不错(除了不必要的空 else 块)。

标签: c# game-physics


【解决方案1】:

我不确定您要在哪个平台上编程,无论是控制台、Winforms、XNA 还是其他任何平台,但是,我会尽力帮助您。

我注意到您设置了两个值进行比较,它们是 NowXNowY。我还注意到您正在转换为小数,然后再转换回 Int32。

所以我的第一个建议是,您要检查的对象不是以某种方式设置为小数、浮点或双精度值。因为如果它们是,那么你的 Collision 很可能永远不会是真的,从而得到无限循环。

我的第二个想法是,我在您的 if 语句中注意到您有代码 Player.y += 1,但是您没有任何地方可以使 y 值减小,所以代码循环可能正在中断,因为 y 值是总是提高,循环总是提高它,因为第一次 Blocks y 值可能是 1,而 player.y 是 2,然后第二次围绕 Blocks 仍然是 1,而 player.y 是 7 或类似的东西。

您可以编辑您的问题并向问题添加更多代码,例如启动或调用PhysicsLoopCollides 方法代码。

如果我需要在某种游戏中跳跃物理,我会遵循用于优秀马里奥的相同类型的代码,并有一个带有常量的枚举来管理跳跃物理

enum JumpValues
{
    float StartingVelocity = 1.0F;
    float StartingToSlow = 0.5F;
    float PeakOfJump = 0.0F;
    float StartingToFall = -0.5F;
    float MaxFallSpeed = -1.0F;
}

然后使用单独的线程来管理玩家的 y 值并运行枚举 JumpValues 的动作。

我不知道这是否对您有所帮助,甚至可以让您了解从哪里开始查找错误,但我希望它有所帮助。祝你编码好运:)

【讨论】:

  • 您好,感谢您的回复。首先,我使用的是 Windows 窗体应用程序。为了澄清一些事情,重力是一个常数,碰撞是一个布尔值,我不是试图让 Y 减小而是让循环停止。循环所做的是力每次都会增加重力(2)。 for 循环运行强制次数,它将在 y 位置添加 1。所以在第一个游戏循环中,玩家 y 将增加 2,在第二个游戏循环中它将增加 4,依此类推。
  • 它处于循环中的原因是我可以检查它是否已达到地板水平,但由于某种原因,它不会停止,直到添加了全部力量。然后玩家将落入地面,在图形方法中处理。如果您需要更多信息,请询问,但我怀疑您是否真的需要更多代码。
  • 好吧,我只是自己进行了一些测试(当然是在一个稍微独立的环境中),并且我能够在我测试的每个场景中让它崩溃。你说 Collides 是一个布尔值,所以我敢打赌,它与地面碰撞的一些数学上的复杂性是有问题的,所以 Block[NowX, NowY + 2].Collides 永远不会等于真的。虽然很烦人,但我会让程序将玩家 X 和 Y 值输出到日志或消息框,以准确查看玩家经过的值。另一种方法是逐行运行程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多