簡體   English   中英

我如何使這個正方形從牆壁彈起?

[英]How do I get this square to bounce off of the walls?

所以我想讓這個正方形從牆上彈開。 我對編碼還很陌生,但是我不明白為什么會這樣。 它似乎彈跳得很厲害,因為它完全顛倒了擊球的方向,因此它在邏輯上不會彈跳。

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

以下是用於編寫代碼的代碼段:

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();


        }

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

參考教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM