Ich versuche, eine 2D-Spiel-Engine zu machen, aber ich kann nicht scheinen, Kollisionen zu bekommen, um die ganze Zeit zu arbeiten (Oftmals bleiben Dinge stecken oder passieren sich gegenseitig). Ohne zu sehr in den Code einzusteigen, hier ist die Reihenfolge, in der ich aktualisiere.Was ist die richtige Reihenfolge der Operationen für Kollisionserkennung und Reaktion?
- Benutzereingabe abrufen und aktualisieren die Spieler Geschwindigkeit
- Speichern Sie die Position für jede Entität, bewegen dann die Geschwindigkeit/Aktualisierungsintervall Einheiten
- überprüfen jede bewegliche Einheit für Kollisionen gegenüber allen anderen Einheiten. Wenn das Objekt mit einem Objekt kollidiert, wird es an seine alte Position verschoben, und die neuen Geschwindigkeiten werden für beide kollidierenden Objekte festgelegt.
Der Kollisionsimpuls wird in dieser Funktion berechnet:
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;
}
und dies ist die Funktion für die Kollisionen zu überprüfen:
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;
}
}
Ich habe ein um den Code zu optimieren versucht, einige Tage, aber ich kann nicht herausfinden, was falsch ist. Ich hatte gehofft, dass ein paar frische Augen ein wenig Licht in mein Dilemma bringen könnten.
Was ist der unerwünschte Effekt, den Sie beobachten? – heltonbiker
Es gab viele, als ich den Code geändert habe. Die erste ist, wenn A neben B steht und sie sich kaum berühren, und A sich nach links bewegt, B über A hinweg. Manchmal bleiben A und B aneinander haften. –