模拟弹丸速度

问题描述

我要在Monogame / XNA中制作一个自上而下的2D射击游戏,我想准确地模拟弹丸随时间的运动(每帧),并在与另一物体或物体碰撞时检测其速度。地面(考虑弹丸的角度,初始速度,质量和阻力)。

我找到了一些看似正确的方程式,但就实际实现而言,它们基本上超出了我的视线。

有什么想法吗?

解决方法

首先为游戏对象创建界面,例如

public abstract class PhyObj
{
    Vector2 v;//Velocity
    Vector2 x;//Position
    float Mass; //If mass is going to be constant,you can make this readonly
    float Drag; //The Drag/friction
    Rectangle Dest;// The position of this Object in the game screen
    Texture2D texture;// The image/sprite for this object

    void Update(Vector2 acc)//acc is the acceleration inputted at a given time
    {
        a=a-(v*Drag); //Adjust actual acceleration with the drag involved
        v+=a;// dv/dt = a
        x+=v;// dx/dt = v

        //Adjust the position of the rectangle
        Dest.X=(int)x.X;
        Dest.Y=(int)x.Y;
    }
    void Draw(SpriteBatch s)
    {
        s.Draw(texture,Dest,Color.White);
    }
}

接下来,列出要维护的IPhyObj。

LinkedList<IPhyObj> Components;

您的Draw游戏类方法将具有类似的内容

protected override void Draw(GameTime gt)
{
    spritebatch.Begin();
    foreach(var item in Components)item.Draw(spritebatch);
    spritebatch.End();
}

游戏类的Update方法将与实现碰撞检测和处理的方法类似。

protected override void Update(GameTime gt)
{
    //Update every object's position
    foreach(var item in Components)
    {
        Vector2 accinput=Vector2.Zero
        //Do something to compute the Acceleration vector
        item.Update(accinput);
    }


    //Collision management
    foreach(var item1 in Components)
    {
        foreach(var item2 in Components)
        {
            if(item1!=item2 && item1.Dest.Intersects(item2.Dest))//Collision deteted!
            {
                //Handle Collision. I am treating it as an elastic collision here

                var v1 = (((item1.Mass-item2.Mass)/(item1.Mass+item2.Mass))*item1.v) + (((2*item2.Mass)/(item1.Mass+item2.Mass))*item2.v);

                var v2 = v1 + item1.v - item2.v;

                item1.v= v1;
                item2.v= v2;

            }
        }
    }
}

这是一个非常基本的实现。我在没有测试的情况下输入了此字,所以让我知道它是否有效。

我已经实现了Rectangle之间的碰撞,因为它很容易处理。如果您需要圆之间的碰撞,建议您阅读一些有关弹性碰撞及其所需的二维方程https://en.wikipedia.org/wiki/Elastic_collision

的文章。