- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个简单的重力动画(http://jsfiddle.net/2pcr9/4/ 在 chrome 和 firefox 中测试)。我正在使用 Canvas 在 Javascript 中执行此操作。使用 (:46) 的可变时间步长计算重力和速度:
this.realDelta = (now - this.prevTime) / 1000;
this.realTime += this.realDelta;
每个球都有用于计算速度和位置的代码 (:148):
this.vy += this.gravity * time.delta;
this.x += this.vx * time.delta;
this.y += this.vy * time.delta;
现在,当您查看窗口时,此原型(prototype)可以正常工作。
但是如果您隐藏当前窗口(切换到浏览器的另一个选项卡),window.requestAnimationFrame 将停止。如果您等待 5 秒,然后打开窗口,window.requestAnimationFrame 将恢复。问题是 realDelta 现在是 5 秒并且使速度太大。
我可以添加一个检查以不允许 realDelta 大于一秒 (:46):
this.realDelta = (now - this.prevTime) / 1000;
if (this.realDelta > 1) {
this.realDelta = 1;
}
this.realTime += this.realDelta;
但这并不能真正解决问题。
现在我不明白如何真正解决这个问题。我是否应该检查窗口是否被隐藏并暂停计时器(并在窗口再次可见时恢复计时器)。还是我计算的速度有误?其他 html5 游戏如何解决“dt”太大的问题?
谢谢
最佳答案
在您的绘图函数中,您可以通过多次运行您的函数来弥补丢失的帧:
var TIME_INTERVAL = 1000/60;
var timeElapsed = 0;
requestAnimFrame(draw, TIME_INTERVAL);
function draw() {
timeElapsed += now - this.prevTime;
this.prevTime = now;
while(timeElapsed > TIME_INTERVAL)
{
timeElapsed -= TIME_INTERVAL;
// Run Draw
}
requestAnimFrame(draw, TIME_INTERVAL);
}
当然,如果用户按 Tab 键的时间过长,他们可能会返回进行大量计算。您还可以考虑运行备份以防 RequestAnimFrame 不可用:
var TIME_INTERVAL = 1000/60;
var timeElapsed = 0;
var backup = setInterval(draw, TIME_INTERVAL*5);
requestAnimFrame(draw, TIME_INTERVAL);
function draw() {
clearInterval(backup);
timeElapsed += now - this.prevTime;
this.prevTime = now;
while(timeElapsed > TIME_INTERVAL)
{
timeElapsed -= TIME_INTERVAL;
// Run Draw
}
backup = setInterval(draw, TIME_INTERVAL*5);
requestAnimFrame(draw, TIME_INTERVAL);
}
关于javascript - 具有长时间步长的重力(使用 javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880213/
我想计算一个圆上的所有点。我已经知道我可以使用 x = r * cos(theta) + x0, y = r * sin(theta) + y0 来计算点 - 但是我想知道是否有是根据我的像素 Can
我正在 pyqt 中构建一个工具,它有一个 slider 可以对几何区域进行排序。在某些情况下,数据的平均值或最小面积值与最大值之间可能存在极大差距。 让它像:面积 = [0.5、1.0、1.3、1.
我使用基本的指数移动平均线对一些数据进行平滑处理 filter : int main () { double a0 = 0.1; double input = 8.0; dou
给定一个整数列表是否存在找到值之间最大距离的默认方法? 所以如果我有这个数组 [1, 3, 5, 9, 15, 30] 值之间的最大步长是 15。列表对象是否有这样做的方法? 最佳答案 不,list
我试图通过每张幻灯片上 10 的幂来更改 slider 步长,但它无法正常工作。我不确定是应该使用 stepUp() 还是直接更改 step 的值。 这就是我如何增加 10 的幂: var incre
我有一个 python 函数,它接受一堆(1 个或 2 个)参数并返回一个二维数组。我一直在尝试使用 scipy curve_fit 和 least_squares 来优化输入参数,以便生成的二维数组
是否可以让 step 忽略 min 属性? 现在,它的步骤如下:2, 7, 12, 17, ... 相反,我希望它是:2, 5, 10, 15, 20, ... 我的真实代码实际上使用了这样的动态值
是否可以在纯css中设置一些宽度变化的步骤? 假设我的 div 宽度为 100%,因此当容器为 30px 时,它的宽度将为 30px。但是是否可以将一些“跳转”设置为 20px,以便当容器为 30px
抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。 要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容: 1. for ( auto & elem
我正在使用 Matlab 求解微分方程。我想强制 ode45 采取恒定步长,因此它在求解方程时总是在 T 轴上递增 0.01。我该怎么做? ode45 始终采取优化的随机步骤,我似乎无法弄清楚如何使其
我是一名优秀的程序员,十分优秀!