Android弹跳球

时间:2010-12-22 21:26:21

标签: java android accelerometer

所以我只是想让一个球在屏幕周围反弹,这应该会因为重力而减速,并像普通球一样从墙上反射(弹跳)。 有人可以提供一些基础知识和非常简单的实现吗? 其他例子似乎有点“过头”,似乎超出了我想做的事情。 我试过这个:

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值来自加速度计。 非常感谢任何帮助,谢谢!

3 个答案:

答案 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)

Youtube video

Source code available at github

  1. 您的x坐标不应受重力影响。
  2. 我建议不要使用加速度计,直到你理解物理学如何适用于简单的情况。
  3. 将其分解为几个阶段。首先,确保你能让球以恒定速度下落。

    一旦你开始工作,就要担心引力会导致速度增加。

    一旦你有了工作,就要担心与墙壁和速度变化的交叉点。用于弹跳墙的简单算法是当你撞到垂直墙时将x速度乘以-1,当你撞到水平墙时将y速度乘以-1。

答案 2 :(得分:2)

对您实际代码的一些评论:

  • 这两行完全相同:

    yPos -= (-y * gravity);
    yPos += (y * gravity);
    

    同样,这两行都做同样的事情:

    xPos += (-x * gravity);
    xPos -= (x * gravity);
    
  • 您未处理案件-1 <= x <= 1-1 <= y <= 1

对概念的一些评论:

  • 从一个球开始。
  • 您希望球具有两个单独的速度(正或负),一个在x方向,一个在y方向。每一帧,将这些速度加到球的位置。
  • 然后添加碰撞检测。如果球的中心位于屏幕之外,请检查每个帧。如果是的话,让它反弹(这样做最简单的方法就是当球在屏幕上显示的最负的y值消失时使球的y速度为正;并且对于其他屏幕也是如此 - 边缘)
  • 改善碰撞检测:看看你是否可以弄清楚如何检查屏幕外的球的任何部分(提示:检查球是否在左侧 - 屏幕的一侧,你只需要检查球的最左侧坐标
  • 然后考虑重力 - 重力将是每帧从y速度中减去的常数,直到y速度达到0。