我很简单的问题是:我将如何实现摩擦? 没有我尝试似乎工作。
哦, speedX
= 1。
这里是我的代码:
public void update() {
x += velocityX;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_RIGHT)
vx = xSpeed;
if (key == KeyEvent.VK_LEFT)
vx = -xSpeed;
}
public void KeyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_RIGHT)
vx = 0;
if (key == KeyEvent.VK_LEFT)
vx = 0;
}
编辑:
现在,一旦球员停止,他减慢(这是好的),但他并没有完全停止。
if (key == KeyEvent.VK_RIGHT) {
vx = 0.20 * vx;
if (vx < 0.2)
vx = 0;
playerAction = "still";
}
摩擦是相反的速度的力。 如果你有力量,在所有交易,重力或电场或火箭发动机或一些更神秘的,只是增加计算速度次一些系数的总兵力多一个。 你可以得到看中,并其大小与转速成正比平方或立方,不同的效果。 然后计算速度和位置如常。
如果你不与部队和F = MA处理,但使用仅基于速度的简单的一种物理,这是在视频游戏中常见的,你需要逐渐降低该速度。 对于每个时间步长,计算new_velocity = 0.99 * current_velocity。 无论使用哪种系数给出放缓适量。 同样,你可以让幻想和涉及某种方式改变对象的减速的感觉平方速度。
经常摩擦被认为是恒定的力量,考虑到两个表面之间的摩擦以恒定的法向力 ,这将减缓你的对象速度线性。 其他摩擦力如空气阻力往往也有线性和二次项。 如果你想两个表面之间的摩擦使用你可以做这样的:
if (vx > 0) vx += -friction / mass;
if (vx < 0) vx += friction / mass;
我还包括质量就够F = m * a
为加速度。 如果也有作用在物体上的其他力量这将是一个更复杂一点,因为如果物体已经停止移动它只会再次开始转动,如果剩余的力量超过了摩擦力。
顺便说一句,如果你想使之更正确的数字,你可以添加一个时间步长到模拟: vX += accelerationX * timeStep;
和x += vX * timeStep;
。
如果u
, m
和g
在Ff=umg
为公式表面摩擦力是恒定的,然后在一个F=ma
也将是常数。 还因为a = deltaV/s
那意味着速度等于加速度乘以时间( as=deltaV
)。 这意味着,每一个时间间隔deltaV
保持不变,如果Ff
是一样的。 在速度的变化,只有当它是不动的(停止v=0
)。 所以我认为要做到这一点的最好办法是,以检测是否它的移动或不和应用的不断deltaV
(在相反的方向)时,不适用其v
达到零。
摩擦是减慢您有任何移动物体上的力。 所以,你需要有一些像一个后台线程不断着眼于所有对象的速度,慢慢递减每个速度趋向于零。