Question

So I'm trying to get this square to bounce off of the wall. I'm fairly new to coding, but I can't understand why this is happening. It seems to be bouncing very badly, as in it completely reverses the direction in which it hits, so it does not bounce logically.

The most frustrating problem though, is that it only bounces once. It bounces once off of the side and then when it encounters a second wall, it just goes off into the abyss.

Here is a snippet of code used to write it:

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

Edit: I figured out 4 minutes after you posted that. I fixed the awkward bouncing and the 1 bounce issue.

Here is the final product:

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


        }

    }
}
Was it helpful?

Solution

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

Refer the tutorial

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top