2013-10-25 157 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 –