我试过寻找答案,但我没有找到任何答案。我正在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
{
}
}
答案 0 :(得分:0)
我不确定您要尝试编程的平台,无论是Console,Winforms,XNA还是其他任何平台,但是,我会尽力帮助您。
我注意到您有两个值可用于比较,这些值为NowX
和NowY
。我还注意到你正在转换为十进制,然后回到Int32。
所以我的第一个建议是你检查的是你碰撞的对象不是以某种方式设置为decimal,float或double值。因为如果它们是,那么你的碰撞很可能永远不会成真,从而获得无限循环。
我的第二个想法是,我在你的if语句中注意到你有代码Player.y += 1
,但是你没有任何东西可以使y值减小,所以也许代码循环正在破坏,只是因为y值总是被提升,循环总是提高它,因为第一次块y值可能是1,而player.y是2,然后第二次围绕Blocks仍然是1而player.y是7或类似于这一点。
您可以编辑问题并在问题中添加更多代码,例如可能启动或调用PhysicsLoop
或Collides
方法代码。
如果我需要在某种游戏中跳过物理学,我会遵循用于良好的'Mario'的相同类型的代码,并且有一个常量的枚举来管理跳跃物理
enum JumpValues
{
float StartingVelocity = 1.0F;
float StartingToSlow = 0.5F;
float PeakOfJump = 0.0F;
float StartingToFall = -0.5F;
float MaxFallSpeed = -1.0F;
}
然后使用一个单独的线程来管理玩家的y值并运行枚举JumpValues的动作。
我不知道这是否对您有所帮助,甚至可以让您看到从哪里开始寻找错误,但我希望它有所帮助。好运编码:)