Я делаю небольшую программу, где некоторые шары подпрыгивают внутри коробки. Логика для этого уже была выполнена в классе Ball.java, и шары подпрыгивают и двигаются нормально.Я хотел бы знать, что они внутри прямоугольника в JPanel
Я хочу сделать еще один шаг и нарисовать прямоугольник внутри Jframe и заставить мяч действовать определенным образом, когда есть внутри. В границах прямоугольника должно быть только 2 шара. Другие шары, идущие в прямоугольник, должны замерзнуть, пока один из 2 в настоящее время перемещающихся шаров не покинет его. Перемещающийся мяч, выходящий из прямоугольника, должен замерзать, если в поле нет , что означает, что прямоугольник никогда не должен быть пустым.
Ниже приведена моя логика, где это должно быть реализовано. Я нарисовал прямоугольник с g.drawRect(75, 75, 200, 200);
в методе paincomponents(), у меня проблемы с тем, что шары знают, что они внутри этого прямоугольника.
package bouncingball;
import bouncingball.Ball;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
public class BallPanel extends JPanel {
private Ball ball;
private ArrayList<Ball> balls = new ArrayList();
private int ballsInside = 0;
public BallPanel() {
addMouseListener(new Mouse());
}
//method for creating a new ball
private void newBall(MouseEvent click) {
ball = new Ball(this);
balls.add(ball);
Thread t = new Thread(ball);
t.setPriority(Thread.NORM_PRIORITY);
t.start();
System.out.println("New ball created");
}
public void animate() {
while (true) {
repaint();
}
/* public synchronized void countIn() throws InterruptedException {
while (ballsInside < 2){
wait();
}
ballsInside++;
notifyAll();
}
public synchronized void countMaxIn() throws InterruptedException {
while (ballsInside == 2){
wait();
}
ballsInside--;
notifyAll();
}*/
private class Mouse extends MouseAdapter {
@Override
public void mousePressed(final MouseEvent event) {
newBall(event);
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(75, 75, 200, 200);
for (Ball ball : balls) {
if (ball != null) {
ball.draw(g);
}
}
}
}
и мой мяч класс
package bouncingball;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.util.Random;
import java.lang.Runnable;
import javax.swing.JPanel;
import java.util.ArrayList;
public class Ball implements Runnable {
public final static Random random = new Random();
final static int SIZE = 30;
final static int MAX_SPEED = 5;
BallPanel panel = new BallPanel();
private int x;
private int y;
private int dx;
private int dy;
private Color color = Color.BLUE;
//private ArrayList<Ball> balls ;
@Override
public void run() {
while (true) {
move();
try {
Thread.sleep(40); // wake up roughly 25 frames per second
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
}
public Ball(BallPanel panel) {
this.panel = panel;
x = random.nextInt(panel.getWidth());
y = random.nextInt(panel.getHeight());
dx = random.nextInt(2 * MAX_SPEED) - MAX_SPEED;
dy = random.nextInt(2 * MAX_SPEED) - MAX_SPEED;
}
public void draw(Graphics g) {
g.setColor(color);
g.fillOval(x, y, SIZE, SIZE);
}
public void move() {
// check for bounce and make the ball bounce if necessary
//
if (x < 0 && dx < 0) {
//bounce off the left wall
x = 0;
dx = -dx;
}
if (y < 0 && dy < 0) {
//bounce off the top wall
y = 0;
dy = -dy;
}
if (x > panel.getWidth() - SIZE && dx > 0) {
//bounce off the right wall
x = panel.getWidth() - SIZE;
dx = -dx;
}
if (y > panel.getHeight() - SIZE && dy > 0) {
//bounce off the bottom wall
y = panel.getHeight() - SIZE;
dy = -dy;
}
//make the ball move
x += dx;
y += dy;
}
}
Взгляните на ответ на [этот вопрос] (http://stackoverflow.com/questions/32746683/ball-sometimes-bounces-sometimes-doesnt/32748251 # 32748251) - это не совсем так, как ваша ситуация, но это может помочь вам разобраться. –