我的程序中有以下方法可以使球持续弹跳。我尝试过修改,但似乎无法让球停在我的GUI底部。我的主要目标是让这些方法模仿你正在弹跳一个真正的球。
private void updateDelta() {
final int minimumMovement = 5;
final int maxExtra = 10;
deltaY = minimumMovement + (int) (Math.random() * maxExtra);
}
public void verticalBounce(Container container) {
// controls vertical ball motion
if (upDown) {
y += deltaY;
if (y >= getHeight()) {
upDown = false;
updateDelta();
}
} else {
y += -deltaY;
if (y <= 0) {
upDown = true;
updateDelta();
}
}
}
更新:
球弹回并停在gui的底部。
public void verticalBounce(Container container) {
deltaY = deltaY - gravity;
y = y + deltaY;
if (y > getHeight()) {
y = getHeight(); // reset location
deltaY = (int) (deltaY * -0.9); // slows down ball
}
}
答案 0 :(得分:2)
这些代码看起来都不正确。你需要实现直线运动的方程:
http://en.wikipedia.org/wiki/Linear_motion
您需要的是s = ut + 0.5 * a * t * t
,其中
s = distance
u = an initial velocity - regard as the speed at which it hits the ground
a = acceleration due to gravity (you can probably have this pretty arbitrary)
t = time
你在前进的路上反转a
的标志。
要模拟有损弹跳,请通过从系统中取出一定比例的能量E来减少u
:
new_u * new_u = (1 - E)u * u
。
(这来自移动体的动能的公式)。
我可以从你的问题中看出你有能力实现这个,所以我不会提供代码;只是物理学。
答案 1 :(得分:2)
首先,弹跳球中没有随机元素。这一切都取决于作用在球上的力以及球的速度和方向。如果你添加一点随机性,它可能会使它看起来更逼真,因为球的风和不平衡但很少。
要编程,假设球以某种速度从地面射出。你需要存储:
Y
=位于地面以上的位置。从0开始。deltaY
=每个时间间隔的单位速度。负面是下降。积极向上。从10开始。gravity
=每个时间间隔的变化单位加速度。重力总是负的和恒定的。从-2开始并尝试一些值。除非您希望球在到达弹跳顶部时从屏幕上消失,否则您需要选择天花板高度。比如说100.(最好选择最适合你的图形区域的高度。)
因此,对于每个时间间隔/刻度/循环,您执行以下操作:
然后你必须检查:球是否击中地面或天花板? Y大于天花板值或小于地面值(0)。
如果是这样,你必须通过以下方式反弹:
这就是它的全部内容。你必须摆弄这些数字才能让它以合理的速度起飞。你必须调整时间间隔。你不必与现实生活相匹配。做好看的事。
随着时间的推移,速度将降低到0。
(尽管我之前说过,添加或减去一小部分随机量实际上看起来很酷。)
答案 2 :(得分:0)
你的球随机弹跳而不是慢慢减速。你需要每次弹跳都降低你的速度,直到速度低于最小值,然后使速度为0并停止弹跳。