2015-10-02 5 views
1

Я делаю небольшую программу, где некоторые шары подпрыгивают внутри коробки. Логика для этого уже была выполнена в классе 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; 
} 
} 
+0

Взгляните на ответ на [этот вопрос] (http://stackoverflow.com/questions/32746683/ball-sometimes-bounces-sometimes-doesnt/32748251 # 32748251) - это не совсем так, как ваша ситуация, но это может помочь вам разобраться. –

ответ

2

Используйте один целое semaphore, позволяя 2 шара ввод до других шаров блок.

private final Semaphore entryTickets = new Semaphore(2, true); 

В шаре:

entryTickets.acquire(); // Enter 
... 
entryTickets.release(); // Leave 
Смежные вопросы