问题描述
我要在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
的文章。