我正在使用 Javascript (HTML5 Canvas) 开发游戏。我实现了一个简单的算法,它允许一个对象跟随另一个混合了基本物理的对象(一个力矢量以正确的方向驱动对象,速度叠加动量,但被恒定的阻力减慢)。目前,我将其设置为鼠标 (x, y) 坐标后的矩形。这是代码:
// rectangle x, y position
var x = 400; // starting x position
var y = 250; // starting y position
var FPS = 60; // frames per second of the screen
// physics variables:
var velX = 0; // initial velocity at 0 (not moving)
var velY = 0; // not moving
var drag = 0.92; // drag force reduces velocity by 8% per frame
var force = 0.35; // overall force applied to move the rectangle
var angle = 0; // angle in which to move
// called every frame (at 60 frames per second):
function update(){
// calculate distance between mouse and rectangle
var dx = mouseX - x;
var dy = mouseY - y;
// calculate angle between mouse and rectangle
var angle = Math.atan(dy/dx);
if(dx < 0)
angle += Math.PI;
else if(dy < 0)
angle += 2*Math.PI;
// calculate the force (on or off, depending on user input)
var curForce;
if(keys[32]) // SPACE bar
curForce = force; // if pressed, use 0.35 as force
else
curForce = 0; // otherwise, force is 0
// increment velocty by the force, and scaled by drag for x and y
velX += curForce * Math.cos(angle);
velX *= drag;
velY += curForce * Math.sin(angle);
velY *= drag;
// update x and y by their velocities
x += velX;
y += velY;
这在每秒 60 帧的情况下运行良好。现在,棘手的部分:我的问题是,如果我将其更改为不同的帧速率(例如,30 FPS),我如何修改力和拖动值以保持运动恒定?
也就是说,现在我的矩形(其位置由 x 和 y 变量决定)以大约每秒 4 个像素的最大速度移动,并在大约 1 秒内加速到其最大速度。但是,如果我改变帧速率,它会移动得更慢(例如 30 FPS 加速到每帧只有 2 个像素)。
那么,我如何创建一个以 FPS(每秒帧数)为输入的方程,并吐出正确的“拖动”和“力”值,它们的行为方式与实时相同?
我知道这是一个沉重的问题,但也许有游戏设计经验或编程物理知识的人可以提供帮助。感谢你付出的努力。
jsFiddle:http: //jsfiddle.net/BadDB