Ich arbeite an einem Spiel, das es Spielern ermöglicht, auf eine Karte zu klicken und sie in beliebiger Richtung über den Bildschirm zu ziehen. Es gibt insgesamt 64 überlappende 100x80-Karten auf einer 800x800-Leinwand zu jeder Zeit und jede ist eine prozedurale Zeichnung. Wie einige von euch wahrscheinlich vermuten, zieht es Canvas nicht vor, bei jeder Bewegung die gesamte Leinwand neu zu zeichnen. Um dies zu umgehen, benutze ich einen Buffer-Canvas, um die Karte zu zeichnen und dann zu versuchen, diesen Buffer-Canvas mit drawImage()
auf den Haupt-Canvas zu malen. Um sicherzustellen, dass keine Zeichnungsaufbauten vorhanden sind, lösche ich die Region der Arbeitsfläche, die mit der Stelle verknüpft ist, an der ich plane drawImage()
unter Verwendung einer clearRect()
.HTML-Canvas: Wie Latenz zwischen Benutzerinteraktion und Ereignisse zeichnen?
Das Problem, das ich erlebt habe, ist, dass, weil die verwendeten Koordinaten (x, y) für die clearRect()
und drawImage()
von der Position der Maus kommen, wenn der Benutzer zu schnell bewegt, werden die Koordinaten von der Zeit unterscheiden drawImage()
wurde zuletzt zu dem Zeitpunkt clearRect()
ausgeführt, wird während der nächsten Ziehfolge aufgerufen. Das Ergebnis ist ein Rest-Draw aus der letzten Sequenz - proportional dazu, wie schnell die Karte gezogen wird.
Ich versuchte, die (x, y) -Koordinaten von drawImage()
beizubehalten und diese (anstelle der aktuellen Mausposition) für die clearRect()
in der nächsten Sequenz zu verwenden. Jetzt, anstatt dass Residual Draw angezeigt wird, haben wir Residuum Clear (Löschen).
Gedanken darüber, wie ich das angehen kann?
HINWEIS: Meine Animationsrate wird mit RequestAnimationFrame
und nicht SetInterval()
behandelt.
Also so? 'MouseDown-Ereignis tritt auf:' Zeichnen Sie Canvas1 ohne Karte, Speichern Sie Canvas1 in Cache. 'MouseMove-Ereignis tritt auf:' Draw Card to Canvas2, Draw Canvas1 zu Canvas, Draw Canvas2 zu Canvas – chopperdave
Rock on - das hat es getan. Danke Kumpel. – chopperdave