2014-02-19 29 views
0

所以我試圖讓這個廣場反彈離開牆壁。我對編碼相當陌生,但我不明白爲什麼會發生這種情況。它似乎在彈跳得非常厲害,因爲它完全顛倒了它擊中的方向,所以它不會在邏輯上反彈。如何讓這個廣場從牆壁上反彈?

雖然最令人沮喪的問題是它只反彈一次。它從側面反彈一次,然後當它遇到第二面牆時,它就會進入深淵。

這裏是用來寫的代碼片段:

void moveTheBox() { 

    while (inside == true) { 

     if ((bigBoxX <= 0) || (bigBoxY <= 0) || 
       (bigBoxX >= 600 - bigBoxSize) || 
       (bigBoxY >= 600 - bigBoxSize)) { 

      bigBoxDeltaX = bigBoxDeltaX * -1; 
      bigBoxDeltaY = bigBoxDeltaY * -1; 

      while ((bigBoxX >= 0) || (bigBoxY >= 0) || 
        (bigBoxX <= 600 - bigBoxSize) || 
        (bigBoxY <= 600 - bigBoxSize)) { 

       bigBoxX = bigBoxX + bigBoxDeltaX; 
       bigBoxY = bigBoxY + bigBoxDeltaY; 

       repaint(); 
       pause(); 
      } 

     } else { 

      bigBoxX = bigBoxX + bigBoxDeltaX; 
      bigBoxY = bigBoxY + bigBoxDeltaY; 

      repaint(); 
      pause(); 
     } 
    } 
} 

編輯:我想通了,你張貼4分鐘後。我解決了尷尬的彈跳和1反彈問題。

下面是最終產品:

void moveTheBox() { 

    int i = 0; 
    while(i == 0){ 
    if ((bigBoxX <= 0) || (bigBoxX >= 600-bigBoxSize)){ 
     bigBoxDeltaX = bigBoxDeltaX * -1; 



     while((bigBoxX >= 0) || (bigBoxY >=0) || (bigBoxX <= 600-bigBoxSize) || (bigBoxY <= 600 - bigBoxSize)){ 
      bigBoxX = bigBoxX + bigBoxDeltaX; 
      bigBoxY = bigBoxY + bigBoxDeltaY; 
      repaint(); 
      pause(); 
      break; 
     } 

     }else if ((bigBoxY <= 0) || (bigBoxY >= 600-bigBoxSize)){ 

      bigBoxDeltaY = bigBoxDeltaY * -1; 
      while((bigBoxX >= 0) || (bigBoxY >=0) || (bigBoxX <= 600-bigBoxSize) || (bigBoxY <= 600 - bigBoxSize)){ 
       bigBoxX = bigBoxX + bigBoxDeltaX; 
       bigBoxY = bigBoxY + bigBoxDeltaY; 
       repaint(); 
       pause(); 
       break; 
      }   
     }else{ 
      bigBoxX = bigBoxX + bigBoxDeltaX; 
      bigBoxY = bigBoxY + bigBoxDeltaY; 
      repaint(); 
      pause(); 


     } 

    } 
} 

回答

1
import java.awt.*; 
import java.util.Formatter; 
import javax.swing.*; 
/** 
* One ball bouncing inside a rectangular box. 
* All codes in one file. Poor design! 
*/ 
// Extends JPanel, so as to override the paintComponent() for custom rendering codes. 
public class BouncingBallSimple extends JPanel { 
    // Container box's width and height 
    private static final int BOX_WIDTH = 640; 
    private static final int BOX_HEIGHT = 480; 

    // Ball's properties 
    private float ballRadius = 200; // Ball's radius 
    private float ballX = ballRadius + 50; // Ball's center (x, y) 
    private float ballY = ballRadius + 20; 
    private float ballSpeedX = 3; // Ball's speed for x and y 
    private float ballSpeedY = 2; 

    private static final int UPDATE_RATE = 30; // Number of refresh per second 

    /** Constructor to create the UI components and init game objects. */ 
    public BouncingBallSimple() { 
     this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT)); 

     // Start the ball bouncing (in its own thread) 
     Thread gameThread = new Thread() { 
     public void run() { 
      while (true) { // Execute one update step 
       // Calculate the ball's new position 
       ballX += ballSpeedX; 
       ballY += ballSpeedY; 
       // Check if the ball moves over the bounds 
       // If so, adjust the position and speed. 
       if (ballX - ballRadius < 0) { 
        ballSpeedX = -ballSpeedX; // Reflect along normal 
        ballX = ballRadius; // Re-position the ball at the edge 
       } else if (ballX + ballRadius > BOX_WIDTH) { 
        ballSpeedX = -ballSpeedX; 
        ballX = BOX_WIDTH - ballRadius; 
       } 
       // May cross both x and y bounds 
       if (ballY - ballRadius < 0) { 
        ballSpeedY = -ballSpeedY; 
        ballY = ballRadius; 
       } else if (ballY + ballRadius > BOX_HEIGHT) { 
        ballSpeedY = -ballSpeedY; 
        ballY = BOX_HEIGHT - ballRadius; 
       } 
       // Refresh the display 
       repaint(); // Callback paintComponent() 
       // Delay for timing control and give other threads a chance 
       try { 
        Thread.sleep(1000/UPDATE_RATE); // milliseconds 
       } catch (InterruptedException ex) { } 
      } 
     } 
     }; 
     gameThread.start(); // Callback run() 
    } 

    /** Custom rendering codes for drawing the JPanel */ 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); // Paint background 

     // Draw the box 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, BOX_WIDTH, BOX_HEIGHT); 

     // Draw the ball 
     g.setColor(Color.BLUE); 
     g.fillOval((int) (ballX - ballRadius), (int) (ballY - ballRadius), 
      (int)(2 * ballRadius), (int)(2 * ballRadius)); 

     // Display the ball's information 
     g.setColor(Color.WHITE); 
     g.setFont(new Font("Courier New", Font.PLAIN, 12)); 
     StringBuilder sb = new StringBuilder(); 
     Formatter formatter = new Formatter(sb); 
     formatter.format("Ball @(%3.0f,%3.0f) Speed=(%2.0f,%2.0f)", ballX, ballY, 
      ballSpeedX, ballSpeedY); 
     g.drawString(sb.toString(), 20, 30); 
    } 

    /** main program (entry point) */ 
    public static void main(String[] args) { 
     // Run GUI in the Event Dispatcher Thread (EDT) instead of main thread. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      // Set up main window (using Swing's Jframe) 
      JFrame frame = new JFrame("A Bouncing Ball"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setContentPane(new BouncingBallSimple()); 
      frame.pack(); 
      frame.setVisible(true); 
     } 
     }); 
    } 
} 

請參考tutorial

+0

我剛剛找到了如何解決這兩個尷尬的彈跳和只有1反彈的問題。 –

+0

@ user3326720如果他的回答是令人滿意的,請選擇它作爲你的問題的答案 – diazazar

+0

所以你找到了你的答案..?。 @ user3326720 –