我相信在使用画布时,您的位置变量应该是整数值,因为它们表示像素和浮点值没有意义。如果你打开控制台并输入sceneManager.currentScene.GameplayLayer.ball.position.x
,那么你会得到一个非常长的小数。我认为对OP的评论表明,有时球移动2px而不是1px可能会对某事产生影响。当你更新你的位置时,你最终得到一个浮点值。
我相信它有时会舍入到下一个最高像素位置,有时会下降。我会尝试采取在地面或天花板上,像这样:
this.position.x += Math.floor(this.speed * 100 * deltaTime * Math.cos(directionInRadians));
this.position.y += Math.floor(this.speed * 100 * deltaTime * Math.sin(directionInRadians));
我会做这些改变的,看看它是如何工作。
编辑:由于你编辑你的问题来简化逻辑。我可以建议一些尝试,即使用我创建的Clock对象,这是我一直使用的。它给了我流畅的动画,而且非常简单。它基于clock that Three.JS uses,因此您可能也想检查一下。即使你想使用你自己的代码,你至少可以尝试这个现成的解决方案,看看它是否给你相同的结果。它似乎对我来说工作得很好。另外,您尝试使用垫片,因此您在游戏功能中的呼叫应该是requestAnimFrame(game);
?
var Clock = function() {
/** Member startTime will remain fixed at its integer
millisecond value returned by Date.now(). Will always
be equal to the time the clock was started */
this.startTime = Date.now();
/** Member ms is updated by tick() to a integer value reprsenting
the number of milliseconds between the epoch (January 1, 1970)
and the current date and time of the system. */
this.ms = this.startTime;
this.last = this.startTime; /** millis at last call to tick() */
this.time = 0; /** ms in floating point seconds not millis */
/** Member dt is updated by tick() to an integer value representing
the number of milliseconds since the last call to tick(). */
this.dt = 0;
this.delta = 0; /** dt in floating point seconds not millis */
/** Member fps is updated by tick() to a floating point value representing
frames per second, updated and averaged approximately once per second */
this.fps = 0.0;
/** Member frameCount is updated to an integer value representing the
total number of calls to tick() since the clock was created. */
this.frameCount = 0;
/** The frameCounter member is a flag you can turn off if you don't need to
calculate the frameCount or do the average FPS calculation every second */
this.frameCounter = true;
/** Private globals needed to calculcate/average fps over eachs second */
var timeToUpdate = 0;
var framesToUpdate = 0;
/************************************************************************************
The tick() method updates ALL the Clock members, which should only
be read from and never written to manually. It is recommended that
tick() is called from a callback loop using requestAnimationFrame
Learn more: http://paulirish.com/2011/requestanimationframe-for-smart-animating/
*************************************************************************************/
this.tick = function() {
/** This is a new frame with it's very own unique number */
if (this.frameCounter) this.frameCount++;
/** Set the private currentTime variable */
this.ms = Date.now();
/** Update time delta and immediately set last time to
be as accurate as possible in our timings. */
this.dt = this.ms - this.last;
this.last = this.ms;
/** Calculate floating-point delta and increment time member */
this.delta = 0.001 * this.dt;
this.time += this.delta;
/** Calculate private temp variables for fps calculation */
if (this.frameCounter) {
timeToUpdate += this.dt;
framesToUpdate++;
if (timeToUpdate > 1000) {
this.fps = Math.round((framesToUpdate * 1000)/timeToUpdate);
framesToUpdate = 0;
timeToUpdate = 0;
}
}
}
}
如果你使用这个对象,那么所有你需要做在你的初始化函数创建一个新的时钟对象,像这样clock = new Clock();
。然后在每个动画调用中调用clock.tick()
。然后,您可以访问成员clock.delta
和clock.time
,它们会以秒为单位给出delta和time作为浮点值。 clock.dt
和clock.ms
会给你相同的毫秒整数。您也可以使用clock.fps
访问fps,或者通过设置clock.frameCounter = false
来禁用它。
我完全没有看到它,它也一直说'59'。那是fps吗? – Esailija 2012-08-05 20:38:09
嗯,是的59是我每秒显示更新次数的尝试。在我的Mac和Safari浏览器中,我看到桨和球向前跳一点,而不是平稳移动。我想我应该在其他一些电脑上检查它。 – Quantastical 2012-08-05 20:44:49
如果我仔细观察球的话,我猜球有点不舒服......这是因为在某些帧中,球一次移动超过1px。 – Esailija 2012-08-05 20:45:38