스레드가있는 [1 명의 플레이어 대 PC] 게임을 만들고 싶습니다.자바 - SwingWorker를 사용하여 멀티 스레드 게임을 만드는 방법
우리는 다음과 같이 우리의 보드 10 개 * 10 두 색상 모양이 : 플레이어는 파란색 동그라미를 클릭 할 때
은, 그들의 색깔은 회색으로 변합니다.
반대쪽 PC는 모든 RED 사각형을 회색으로 바꿔야합니다.
승자가 누구입니까 더 이상 자신의 모든 셰이프를 지 웁니다.
플레이어에 대한 코드가 잘 작동하지만, 내 문제는 내가이 article에서 읽을 때 나는 GUI에서 스레딩을 구현하는 SwingWorker를 사용해야합니다, 게임의 PC 측의 구현입니다. SwingWorkers를 사용하는 것이 처음이고 제대로 작동하는 방법을 모르겠습니다. 여기
내 코드입니다 :메인 클래스
public class BubblePopGame {
public static final Color DEFAULT_COLOR1 = Color.BLUE;
public static final Color DEFAULT_COLOR2 = Color.RED;
public BubblePopGame() {
List<ShapeItem> shapes = new ArrayList<ShapeItem>();
int Total = 10;
for (int i = 1; i <= Total; i++) {
for (int j = 1; j <= Total; j++) {
if ((i + j) % 2 == 0) {
shapes.add(new ShapeItem(new Ellipse2D.Double(i * 25, j * 25, 20, 20),
DEFAULT_COLOR1));
} else {
shapes.add(new ShapeItem(new Rectangle2D.Double(i * 25, j * 25, 20, 20),
DEFAULT_COLOR2));
}
}
}
JFrame frame = new JFrame("Bubble Pop Quest!!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ShapesPanel panel = new ShapesPanel(shapes);
frame.add(panel);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new BubblePopGame();
}
});
}
}
형상 항목 클래스
public class ShapeItem {
private Shape shape;
private Color color;
public ShapeItem(Shape shape, Color color) {
super();
this.shape = shape;
this.color = color;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
ShapesPanel 클래스
public class ShapesPanel extends JPanel {
private List<ShapeItem> shapes;
private Random rand = new Random();
private SwingWorker<Boolean, Integer> worker;
public ShapesPanel(List<ShapeItem> shapesList) {
this.shapes = shapesList;
worker = new SwingWorker<Boolean, Integer>() {
@Override
protected Boolean doInBackground() throws Exception {
while (true) {
Thread.sleep(200);
int dim = rand.nextInt(300);
publish(dim);
return true;
}
}
@Override
protected void done() {
Boolean Status;
try {
Status = get();
System.out.println(Status);
super.done(); //To change body of generated methods, choose Tools | Templates.
} catch (InterruptedException ex) {
Logger.getLogger(ShapesPanel.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(ShapesPanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected void process(List<Integer> chunks) {
int mostRecentValue = chunks.get(chunks.size()-1);
System.out.println(mostRecentValue);
Color color2 = Color.LIGHT_GRAY;
ShapeItem tmpShape = shapes.get(mostRecentValue);
if(tmpShape.getColor()==Color.RED){
tmpShape.setColor(color2);
}
repaint();
}
};
worker.execute();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Color color1 = Color.LIGHT_GRAY;
for (ShapeItem item : shapes) {
if (item.getColor() == Color.BLUE) {
if (item.getShape().contains(e.getPoint())) {
item.setColor(color1);
}
}
}
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
for (ShapeItem item : shapes) {
g2.setColor(item.getColor());
g2.fill(item.getShape());
}
g2.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
private Color getRandomColor() {
return new Color(rand.nextFloat(), rand.nextFloat(),
rand.nextFloat());
}
}
그래서 ... 문제가 어디에 있습니까? – Coffee
작업자가 제대로 작동하지 않습니다. 스크린 샷에서 볼 수 있듯이 직사각형은 회색으로 바뀌지 않습니다 ... –
doInBackground()는 첫 번째 루프 반복 후에 끝납니다. – Durandal