Javascript 向动画添加重力

Javascript 向动画添加重力,javascript,game-physics,Javascript,Game Physics,我试图理解如何在我的动画中加入一些物理元素,比如重力和风。我不知道如何让这个球像有重力一样反弹。。。每次更新我都会累积力,将其应用于速度,然后清除力。但我能想到的唯一方法是改变Y方向,让它反弹回来,但它会一直跳到顶部。我有什么明显的遗漏吗?任何建议都将不胜感激。谢谢你的阅读 var C,canvas,context=null; 变量重力={x:0,y:1}; var wind={x:0.4,y:0}; var高度=140; var宽度=300; 功能球(x、y、w、h){ var ball=这

我试图理解如何在我的动画中加入一些物理元素,比如重力和风。我不知道如何让这个球像有重力一样反弹。。。每次更新我都会累积力,将其应用于速度,然后清除力。但我能想到的唯一方法是改变Y方向,让它反弹回来,但它会一直跳到顶部。我有什么明显的遗漏吗?任何建议都将不胜感激。谢谢你的阅读

var C,canvas,context=null;
变量重力={x:0,y:1};
var wind={x:0.4,y:0};
var高度=140;
var宽度=300;
功能球(x、y、w、h){
var ball=这个;
这个.x=x;
这个。y=y;
这个.w=w;
这个,h=h;
这是0.x速度=0;
此值为0.yVelocity;
此.xDirection=1;
this.yDirection=1;
this.update=函数(){
球。施加力(重力);
//球。施加力(风);
ball.x+=(ball.x速度*ball.x方向);
ball.y+=(ball.yVelocity*ball.yDirection);
如果((球x+球w)>=宽度){
//ball.xDirection=-1;
ball.x=宽度-ball.w/2;
ball.x速度=-ball.x速度
}else if(ball.x=高度){
//ball.yDirection=-1;
ball.y=高度-ball.w;
ball.yVelocity=-ball.yVelocity

}否则,如果(ball.y在运动学中,简单运动有时可以表示为
v(t)=aΔt
,其中
v
t
秒的速度,
aΔt
是加速度乘以间隔
Δt

模拟这种情况的一种方法可以是将
ball.yVelocity
组件计算为
(-someAcceleration)*someTimeIndex
,或者执行如下函数
var ball.yVelocity=ball.yVelocity-someFactor
每个循环

编辑1:我还将设置一个单独的变量,如
yVelocityAbs
,以处理
球的大小。yVelocity
以免每次球反弹时都会扭曲方向。祝你好运

编辑2:尝试更新clearForces()函数,如下所示:

this.clearForces = function(force) {
         ball.xVelocity = 0;
        //ball.yVelocity = 0;
  }

它应该可以工作!虽然是一个相当简陋的表示,但模拟应该更适合。不过,我建议添加一些重置球的功能。

当你落地时,不要改变方向,而是否定速度:
ball.yVelocity=-ball.yVelocity
@Matt L。谢谢,但我在这方面运气不好。是吗我这样做的顺序是什么?我编辑了片段并尝试了。我应该指出我确实尝试了反转速度。我得到的最好结果是球被卡在地上,但它从来没有反弹回来。现在请看片段,球一直在运动。抱歉,这没有直接帮助,但它看起来很相关t、 (它与10年前编写的IE6一起工作)尝试将球的位置重新设置到地板上,同时抵消速度。在翻转速度后的画面上,你仍然低于地面threshold@MattL.谢谢Matt,我在代码片段中添加了这个,但是它粘在了底部,而不是向上反弹。虽然看起来是朝着正确的方向迈出的一步。听起来是正确的,你可以用任何方法修复它他的代码段使用“将代码段复制到我的答案”按钮?@JuanMendes当然!我会在一点时间后发布一个更新的代码段,一旦我知道如何附加它。@Nick,谢谢你,Nick,但是如果我说实话,你说的话有点让我不知所措……我不确定如何在代码中实现它。