【发布时间】:2016-06-20 21:22:23
【问题描述】:
我正在尝试制作一个 2D 游戏引擎,但我似乎无法始终让碰撞工作(通常情况下,事情会卡住或相互穿过)。无需过多介绍代码,这里是我更新的顺序。
- 获取用户输入并更新玩家速度
- 保存每个实体的位置,然后移动速度/更新间隔单位
- 检查每个可移动实体是否与所有其他实体发生碰撞。如果实体与某物发生碰撞,则会将其移至旧位置,并为两个碰撞实体设置新速度。
碰撞冲量在这个函数中计算:
private static void CollisionImpulse(PhysicsEntity a, PhysicsEntity b)
{
var relative = b.Velocity.Vector - a.Velocity.Vector;
var normal = Vector2.Normalize(relative);
var e = Math.Min(a.Material.Elasticity, b.Material.Elasticity);
var j = (-(1 + e) * Vector2.Dot(relative, normal)) /
(Vector2.Dot(normal, normal) * (a.InverseMass + b.InverseMass));
if (double.IsNaN(j)) return;
var velocityA = normal * (float) (j / a.Mass);
var velocityB = normal * (float) (j / b.Mass);
a.Velocity.X -= velocityA.X;
a.Velocity.Y -= velocityA.Y;
if (!b.Movable) return;
b.Velocity.X += velocityB.X;
b.Velocity.Y += velocityB.Y;
b.Position = b.OldPosition;
}
这是检查碰撞的函数:
public override void Update()
{
foreach (var entity in Universe.PhysicsEntities)
{
if (entity.Equals(this) || entity.Collided) continue;
CollisionResolution.ResolveCollision(this, entity);
if (!Collided) continue;
Position = OldPosition;
break;
}
}
几天来我一直在尝试调整代码,但我不知道出了什么问题。我希望一些新鲜的眼睛可以为我的困境提供一些启示。
【问题讨论】:
-
您观察到的不良影响是什么?
-
有很多,因为我一直在更改代码。第一个是如果 A 在 B 旁边,他们几乎没有接触,A 向左移动,B 越过 A。有时 A 和 B 会互相卡住。
标签: c# collision-detection game-engine collision