Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA中地板上振动的物体_C#_Xna_Physics - Fatal编程技术网

C# XNA中地板上振动的物体

C# XNA中地板上振动的物体,c#,xna,physics,C#,Xna,Physics,我尝试创建一个简单的基于物理的游戏,在这个游戏中你可以生成球,然后它们会受到不同自然力的影响,比如重力 但我有一个问题,当球落地时,它不断受到重力的影响。它有点震动。这是一个简单的例子 这是碰撞检测和重力计算的代码 public void CheckBounds(int maxHeight, int maxWidth) { if (this.position.Y + (radius + radius) > maxHeight) this.velocity.Y = -

我尝试创建一个简单的基于物理的游戏,在这个游戏中你可以生成球,然后它们会受到不同自然力的影响,比如重力

但我有一个问题,当球落地时,它不断受到重力的影响。它有点震动。这是一个简单的例子

这是碰撞检测和重力计算的代码

public void CheckBounds(int maxHeight, int maxWidth)
{
    if (this.position.Y + (radius + radius) > maxHeight)
        this.velocity.Y = -Math.Abs(velocity.Y * 0.65f); // 0.65 is the "bouncyness"
}
这里是主要的更新部分

for (int i = 0; i < balls.Count; i++ )
{
    Ball b = balls[i];

    for (int k = 0; k < balls.Count; k++) // check for collision with other balls
    {
        if (balls[i] == balls[k])
            continue;

        if (balls[i].Colliding(balls[k]))
            balls[i].Collide(balls[k]);
    }

    b.velocity.Y += gravitationalPull; // a gravity constant
    b.CheckBounds();
    b.position = Vector2.Add(b.position, b.velocity);
}

有人知道如何修复振动吗?我尝试设置一个速度的最小值,如果速度为,重力将被计算。y<一些值然后不计算,但球在碰撞时甚至在繁殖时在空中停止。

有不同的方法,一种方法是在框下方设置一个边界框,以便在应用重力之前进行检查。否则,你必须只在循环结束时设置一次球的速度,当可以对它应用速度时,我认为你得到了一点浮点错误。您可能希望确保在检测到球已有效停止后,将球的速度和位置设置为0。换言之,确保一旦速度<某个阈值,例如0.01,然后将速度设置为0。几天前我同意jwir3。我回答了类似的问题。不同的问题见bullet 1。当我使用速度*0.96减慢宇宙飞船时,同样的情况也发生在我身上。因此,当速度接近0时,我将其设置为精确的0,否则它总是轻微移动。@DavorMlinaric问题是:有时一个球以低速与另一个球碰撞,这会使它在空气中冻结,特别是因为我跟踪了振动幅度,它们的范围在-2到2.5之间,这使得整个问题很难解决