2014-02-19 3 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(); 
     } 
    } 
} 

편집 : 여기

그것을 작성하는 데 사용 코드의 조각이다 나는 당신이 게시 사분 후 알아 냈어. 나는 어색한 튀는 문제와 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 –