2016-09-05 3 views
1

Das ist mein Pseudo-Code:Verhindern, dass Elemente abrupt in die Leinwand springen?

when move button is pressed: 
    currentCirclePos = circleX; 
    moveTimer = setInterval(move, 10); 

My Move-Funktion wie folgt aussieht:

var move = function() { 
    circleX += move a bit; 
}; 

In einigen Fällen wird das Element nicht bewegen. Für jene Situationen habe ich den folgenden Code:

while(Math.abs(circleX - currentCirclePos) < some distance away){ 
    drawCircle(circleX, circleY); 
    circleX += gradual shift; 
} 

Dadurch wird die Position meines Kreises nicht allmählich ändern, sondern zieht sie abrupt some distance away. Ich verstehe nicht, warum das passiert. Könnte mir jemand helfen, das Problem zu debuggen? Lass mich wissen, wenn ich mehr Code posten muss.

Das ist mein requestAnimationFrame Code:

requestAnimationFrame(animate); 

function animate(){ 
    ctx.clearRect(0,0,cw,ch); 
    ctx.rect(0, 0, cw, ch); 
    ctx.fillStyle = 'white'; 
    ctx.fill(); 
    drawCircle(circleX, circleY); 
    requestAnimationFrame(animate); 
} 

UPDATE: Die while-Schleife nicht in der Animationsfunktion war, aber jetzt ist es. Es machte jedoch keinen Unterschied.

+0

Diese "while" -Schleife sieht aus, als könnte sie ein "springender" Bösewicht sein, aber ohne mehr Code ist es schwer zu sagen. Versuchen Sie, Ihren Kreis über einen bestimmten Zeitraum an einen bestimmten Ort zu verschieben? Wenn ja, verwenden Sie den Zeitstempel, der automatisch in den requestAnimationFrame-Callback eingegeben wird, um die verstrichene Zeit zu berechnen. Bewegen Sie Ihren Kreis von Start zu Ziel, basierend auf dem Prozentsatz der Zeit, die in der Dauer verstrichen ist: circleX = startingCircleX + (endingCircleX-startingCircleX) * elapsedTime/totalTimeDuration' – markE

+0

@markE Ja, ich denke auch, dass der Sprung aufgrund der while-Schleife erfolgt aber ich habe den Zeichenkreiscode hinzugefügt, um sicherzustellen, dass er nach jedem Inkrement von 'circleX' neu gezeichnet wird. Ich kann das Element mit der obigen "while" -Schleife an die gewünschte Stelle verschieben. Mein Problem ist, dass der Kreis direkt am Punkt B gezogen wird, anstatt sich allmählich von Punkt A zu Punkt B zu bewegen. –

+0

Hier ist ein [Q & A] (http://stackoverflow.com/questions/39172583/how-to-move-a- rectangle-to-xy-coordinates-in-js/39193754 # 39193754) zeigt, wie der Zeitstempel verwendet wird, um von A nach B zu ziehen. – markE

Antwort

0

Das Problem ist, dass Sie setInterval anstelle von requestAnimationFrame verwenden - es ist eine zuverlässigere Möglichkeit, diese Art von Operationen auf Leinwand zu tun.

Bitte überprüfen Sie this tutorial - Autor löst dieses Problem ziemlich direkt am Beispiel.

+1

Außerdem ist es wichtig, die Bewegung basierend auf der verstrichenen Zeit auszuführen und nicht "Increase" zu sagen X um 10 Pixel pro Bild ". Weil das auf langsamen und schnellen Geräten unterschiedliche Ergebnisse haben wird. – Christoph

+0

Eigentlich verwende ich requestAnimationFrame. Lass mich mehr Code hinzufügen. :) –

+0

Meine Animation ist immer glatt. Es ändert sich abrupt nur in Kantenfällen, in denen die bewegte Mindestentfernung kleiner ist als der Schwellenwert, und ich erhöhe sie mit einer while-Schleife. –

Verwandte Themen