2012-06-17 12 views
5

Ich entwickle gerade ein Spiel für Android, und ich hätte gerne Ihre Expertise zu einem Thema, das ich habe.Android-Spielentwicklung: Kollisionserkennung fehlgeschlagen

Hintergrund:

  1. Mein Spiel beinhaltet unabhängige Bewegung Framerate, die in den Deltazeitwert berücksichtigt, bevor notwendig Geschwindigkeit Berechnungen.

  2. Das Spiel ist ein traditionelles 2D Platformer.

Das Problem:

Hier ist meine Frage (vereinfacht). Stellen wir uns vor, dass mein Charakter ein Quadrat ist, das auf einer Plattform steht (wobei "Gravitation" eine konstante Abwärtsgeschwindigkeit von characterVelocityDown ist).

I die Kollisionserkennung wie folgt (unter der Annahme, Y-Achse nach unten zeigt) definiert haben:

Gegeben characterFootY ist die y-Koordinate der Basis meiner quadratischen Charakter, platformSurfaceY ist die obere y -Koordinate meiner Plattform und platformBaseY ist die untere y-Koordinate meiner Plattform:

if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) { 

        //Collision Is True 
        characterFootY = platformSurfaceY; 
        characterVelocityDown = 0; 

       } else{ 
        characterVelocityDown = deltaTime * 6; 

Dieser Ansatz funktioniert p in Ordnung, wenn das Spiel mit normaler Geschwindigkeit läuft; Wenn jedoch das Spiel verlangsamt, das DELTA (die die verstrichene Zeit zwischen dem vorhergehenden Frame und dem aktuellen Frame) groß wird, und characterFootY + characterVelocityDown überschreiten die Grenzen, die die Kollisionserkennung und das Zeichen definieren fallen einfach geradeaus (als ob Teleportieren).

Wie sollte ich dieses Problem angehen, um dies zu verhindern?

Vielen Dank im Voraus für Ihre Hilfe und ich freue mich darauf, von Ihnen zu lernen!

+0

Wenn jemand anderes dieses Problem hat, besteht eine mögliche Lösung darin, den deltaTime-Wert so zu begrenzen, dass er, wenn er über einem bestimmten Wert liegt, gleich dem Cap gesetzt wird. Dies würde die Spielgeschwindigkeit inkonsistent machen, sollte aber in den meisten Fällen in Ordnung sein. – SeveN

+0

Haben Sie sowohl die Vorher-Nachher-Deltawerte, als auch den Vergleich dort? – cjk

Antwort

1

Was Sie tun müssen, ist Ihre Physik-Schleife mit konstanter Delta-Zeit zu laufen und es so oft wie nötig mit dem aktuellen Tick zu iterieren.

const float PHYSICS_TICK = 1/60.f; // 60 FPS 
void Update(float dt) 
{ 
    m_dt += dt; 
    while(m_dt > PHYSICS_TICK) 
    { 
     UpdatePhysics(PHYSICS_TICK); 
     m_dt -= PHYSICS_TICK; 
    } 
} 

Es gibt verschiedene Techniken verwendet, um die Zecke links (m_dt)
Caps für miniumum tick und maximalen tick zu handhaben ist auch ein Muss.

+0

Und für die meisten Spiele ist es am besten/einfachsten, nur den Zeitschritt für die gesamte Spiellogik (nicht nur für die Physik) festzulegen. –

1

Ich denke, das Problem hier ist, dass Verlangsamungen unvermeidlich sind. Sie können versuchen, den Code zu optimieren, aber Sie haben immer Benutzer mit langsamen Geräten oder belebten Bereichen Ihres Spiels, in denen es etwas länger als gewöhnlich dauert, um alles zu verarbeiten. Statt ein konsistentes Delta anzunehmen, nehmen Sie das Gegenteil an. Code unter der Erkenntnis, dass jemand versuchen könnte, es auf einem Abakus zu installieren.

Also im Grunde, wie SeveN sagt, machen Sie Ihre Spielschleife Verlangsamungen zu behandeln. Der einzige Weg, dies zu tun (in meiner zugegebenermaßen beschränkten Erfahrung), wäre, eine Grenze dafür zu setzen, wie groß Delta sein kann. Dies führt dazu, dass Ihre Uhr nicht genau pünktlich läuft, aber wenn Sie darüber nachdenken, behandeln die meisten Spiele die Verlangsamung. Sie starten StarCraft nicht auf Ihrem Pentium 66 und lassen es mit 5 FPS laufen, aber mit voller Geschwindigkeit, es verlangsamt und verarbeitet es normal, wenn auch bei einer Diashow.

Wenn Sie so etwas in Zeiten der Verlangsamung in Ihrem Spiel tun, würde es sichtbar langsamer werden ... aber die Berechnungen sollten immer noch alle genau sein.

edit: gerade realisiert du bist SeveN. Gut gemacht.

+0

[Profanität ist hier nicht willkommen] (http://meta.stackexchange.com/a/22233/142838). – meagar