2013-10-25 120 views
1

我想编写一个简单的弹跳球程序。它有一个矩形和两个球。球必须从长方形的墙上反弹(我已经编码成功),他们也必须从彼此反弹。这是我需要你帮忙的地方。当我以相同的速度给球时,它们弹跳得很好,程序也能正常工作,但我必须随机给这些球。当我这样做时,球不会反弹,只是互相移动。Java中简单的弹跳球程序

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 


} 

有没有人有解决方案?如果是的话尽量保持尽可能简单,请:)

+0

这样的事情可能会很棘手,你是否可以在任何时候解决碰撞(物理移动碰撞球)或者只是解决速度 –

+0

我猜测速度/速度使得球的位置不匹配,即'x_pos2 == x_pos1'不能出现。也许试着用'Math.abs(x_pos2-x_pos1) JScoobyCed

+0

啊,是的,JScooby是对的,你正在比较他们的中心是否碰撞,你不要似乎没有使用半径1和半径2来进行碰撞检测 –

回答

2

这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; 
    } 

关心自己,但他们都问,如果对象是在准确位置相对于其他对象,而比范围内。请记住,因为这种方案在时间用完跳跃对象时发生碰撞时annother内可能部分,改变的只是这一个条件解决问题

if (Math.abs(x_pos2-x_pos1)<radius1+radius2){ 
    ballspeedx1 = -ballspeedx1; 
    ballspeedx2 = -ballspeedx2; 
    } 

这不是问如果球这些条件的所有4在彼此的特定距离处询问是否重叠,这提供了更安全的测试。

很明显,你知道这些简单的反向速度碰撞在物理上是不正确的,但需要注意的另外一点是如果碰撞发生在重叠和(无论什么原因)两个物体没有被带出碰撞在下一个时间步骤中,发生另一次碰撞,一旦发生这种情况,两个球似乎“粘在一起”。这可以通过将对象物理移出碰撞,然后应用速度变化来解决。这个问题在非弹性碰撞中发生很多,但也可能在多个物体同时碰撞时发生。

+0

谢谢你这个伟大的,简单的答案,理查德!我知道这个程序不是物理上正确的,但它不一定是。 – user2919717

+0

@ user2919717很高兴为您提供帮助。我有这样的感觉,我自己做过这些系列的程序,并经历了完全相同的步骤 –

+0

@ user2919717顺便说一句,我强烈推荐改变你的球位置为双倍(或浮动),因为如果你进行非常小的时间步骤,您将以position_int + = 0.01结束;这将不会改变position_int –