我正在尝试编写一个简单的弹跳球程序。它有一个矩形和两个球。球必须从矩形的壁上弹开(我已经成功地编码了),并且它们还必须彼此弹开。这就是我需要你帮助的地方。当我给球提供相同的速度时,它们弹跳良好并且程序可以工作,但我必须给球随机的速度。当我这样做时,球将不再弹跳,只是相互移动。
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class BallApplet2 extends Applet implements Runnable
{
// Begin variabelen
int x_pos1 = 150;
int y_pos1 = 200;
int radius1 = 20;
int x_pos2 = 250;
int y_pos2 = 200;
int radius2 = 20;
private float ballspeedx1 = -3;
private float ballspeedy1 = 0;
private float ballspeedx2 = 3;
private float ballspeedy2 = 0;
public void init() {}
public void start() {
Thread th = new Thread (this);
th.start (); }
public void stop() {}
public void destroy() {}
public void run () {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true)
{
x_pos1 += ballspeedx1;
y_pos1 += ballspeedy1;
x_pos2 += ballspeedx2;
y_pos2 += ballspeedy2;
repaint();
// als x_pos < 100 is draait de richting van de bal om
if (x_pos1 < 100) {
ballspeedx1 = -ballspeedx1;
x_pos1 = 100;
}
if (x_pos2 < 100) {
ballspeedx2 = -ballspeedx2;
x_pos2 = 100;
}
// als x_pos > 300 is draait de richting van de bal om
if (x_pos1 > 300) {
ballspeedx1 = -ballspeedx1;
x_pos1 = 300;
}
if (x_pos2 > 300) {
ballspeedx2 = -ballspeedx2;
x_pos2 = 300;
}
// als de x van de rode bal gelijk is aan de x en twee keer de straal van de blauwe bal, draaien beide ballen om.
if (x_pos1 == x_pos2 + 40) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x van de blauwe bal gelijk is aan de x van de rode bal, draaien beide ballen om.
if (x_pos2 == x_pos1 ) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x en twee keer de straal van de rode bal gelijk is aan de x van de blauwe bal, draaien beide ballen om.
if (x_pos1 + 40 == x_pos2) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x en twee keer de straal
if (x_pos2 + 40 == x_pos1) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
try { Thread.sleep (20); }
catch (InterruptedException ex) {}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY); }}
public void paint (Graphics g) {
g.setColor (Color.red);
g.fillOval (x_pos1 - radius1, y_pos1 - radius1, 2 * radius1, 2 * radius1);
g.setColor (Color.blue);
g.fillOval (x_pos2 - radius2, y_pos2 - radius2, 2 * radius2, 2 * radius2);
g.setColor(Color.black);
g.drawLine(80,80,80,320); // lijn links
g.drawLine(320,80,320,320); // lijn rechts
g.drawLine(80,80,320,80); // lijn boven
g.drawLine(80,320,320,320); // lijn onder
}
// Einde eventmethoden
}
有人有解决办法吗?如果是这样,请尽量保持简单:)
最佳答案
这 4 个条件似乎与检测碰撞有关
if (x_pos1 == x_pos2 + 40) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos2 == x_pos1 ) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos1 + 40 == x_pos2) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos2 + 40 == x_pos1) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
但它们都询问对象是否处于相对于其他对象的精确位置而不是在某个范围内。请记住,因为这种程序在时间跳跃中运行,当发生碰撞时,一个对象可能部分位于另一个对象内,因此将所有 4 个条件更改为仅此一个条件可以解决问题
if (Math.abs(x_pos2-x_pos1)<radius1+radius2){
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
这不是询问彼此之间特定距离的球是否重叠,而是询问它们是否重叠,这提供了更安全的测试。
显然,您知道这些简单的反向速度碰撞在物理上并不正确,但需要注意的另一件事是,如果碰撞发生在重叠中,并且(无论出于何种原因)两个物体没有在下一个时间步,然后发生另一次碰撞,一旦发生这种情况,两个球似乎“粘在一起”。这可以通过物理移动对象使其脱离碰撞,然后应用速度变化来解决。此问题在非弹性碰撞中经常发生,但在多个物体同时碰撞时也会发生。
关于java - Java简单的弹跳球程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19588605/