【发布时间】:2012-09-12 02:38:57
【问题描述】:
我正在使用 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
【问题讨论】:
-
我删除了我的答案,因为它显然不正确,看着小提琴。我不确定为什么这是不对的,但是,对不起。这可能是因为“物理”实现(例如,您实际上并没有使用运动学方程,AIUI)。
-
是的,这是一个粗略的实现。这是我第一次尝试玩模拟物理,所以它并不漂亮。无论如何,感谢您的帮助,我很感激。
标签: javascript physics game-engine game-physics