所以我只是想让一个球在屏幕周围反弹,这应该会因为重力而减速,并像普通球一样从墙上反射(弹跳)。 有人可以提供一些基础知识和非常简单的实现吗? 其他例子似乎有点“过头”,似乎超出了我想做的事情。 我试过这个:
public void updateLogic() {
if (x < -1) {
xPos += (-x * gravity);
} else if (x > 1) {
xPos -= (x * gravity);
}
if (y > 1) {
yPos += (y * gravity);
} else if (y < -1) {
yPos -= (-y * gravity);
}
}
这是我自己最接近的。 顺便说一句,x和y值来自加速度计。 非常感谢任何帮助,谢谢!
答案 0 :(得分:6)
我认为你需要3件事,力量(x和y,你有),速度(称为xVel和yVel)和位置(你也有xPos和yPos)。球的位置(以最简单的方式)更新:
xPos += dt*xVel;
yPos += dt*yVel;
xVel += dt*x;
yVel += dt*y;
变量'dt'是 timestep ,它控制球的移动速度。但是,如果设置得太大,程序将不稳定!尝试dt = 0.001左右开始并逐渐将其设置得更高。
然后,为了让球从墙上反射出来,只要它碰到墙壁就会翻转速度:
if (xPos > xMax) {
xPos = xMax;
xVel *= -1.0;
} else if (xPos < 0.0) {
xPos = 0.0;
xVel *= -1.0;
}
和y相同。 'xPos = ...'只是为了阻止球离开屏幕边缘。如果你想让球在每次击中墙壁时反弹少一点,将'-1.0'更改为'-0.9'或其他东西(这是coefficient of restitution)。
希望这应该是全部。祝你好运!
答案 1 :(得分:2)
Source code available at github
将其分解为几个阶段。首先,确保你能让球以恒定速度下落。
一旦你开始工作,就要担心引力会导致速度增加。
一旦你有了工作,就要担心与墙壁和速度变化的交叉点。用于弹跳墙的简单算法是当你撞到垂直墙时将x速度乘以-1,当你撞到水平墙时将y速度乘以-1。
答案 2 :(得分:2)
对您实际代码的一些评论:
这两行完全相同:
yPos -= (-y * gravity);
yPos += (y * gravity);
同样,这两行都做同样的事情:
xPos += (-x * gravity);
xPos -= (x * gravity);
您未处理案件-1 <= x <= 1
或-1 <= y <= 1
对概念的一些评论: