Ситуация
В настоящее время я пытаюсь построить 2D-игру с помощью Java Swing.Для этого у меня есть основной класс Puzzle
, который является подклассом JFrame
.К моей рамке я добавляю свой основной JPanel
, который состоит из нескольких JPanel
, добавленных вместе (каждый из которых является новой частью).
РЕДАКТИРОВАТЬ 2: PlayingField
- это моймодель, которая будет хранить текущее местоположение каждого куска.Можно выделить кусок мышью (план состоит в том, чтобы выделить его) и перемещать его с помощью клавиш со стрелками, пока следующий шаг (полная ячейка, т.е. около 100 пикселей) не является местоположением одного из другихкуски.На данный момент PlayingField
не хранит никаких данных, так как части отсутствуют.
private void createAndShowGui() {
// The playing-field with a 4x6 grid.
PlayingField field = new PlayingField(4, 6);
JPanel mainPanel = new ComputerView(field);
setTitle("Puzzle");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 600);
add(mainPanel);
setVisible(true);
}
Приведенный выше метод создаст мой фрейм и добавит главную панель.Следующий метод - это моя основная панель, которая добавляет к себе несколько JPanel
.
public ComputerView(PlayingField field) {
this.field = field;
this.setLayout(null);
JPanel topLeft = new GamingPiece(PlayingField.TOP_LEFT);
add(topLeft);
JPanel topRight = new GamingPiece(PlayingField.TOP_RIGHT);
add(topRight);
JPanel bottomLeft = new GamingPiece(PlayingField.BOTTOM_LEFT);
add(bottomLeft);
}
Каждый GamingPiece
или, точнее, мои под JPanel
рисуют базовую часть (я рисую только одну ивращая остальные, так как все состоит из одной и той же произвольной формы).Класс GamingPiece
также является подклассом JPanel
и вызывает метод JPanel#paintComponent()
для рисования фигуры.
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.YELLOW);
g2.fillPolygon(pieceX, pieceY, pieceX.length);
}
Проблема и мои вопросы
Поскольку я довольно новичок в Java, ядействительно не знаю, как это сделать правильно.Если я добавлю свои части, создав новый объект и добавив его на главную панель, он не покажет все из них, только последний добавленный.Некоторые, кажется, даже не работают, даже если они добавлены единственными (чтобы объяснить мою ситуацию: у меня есть фигуры, которые имеют одинаковую произвольную форму, просто вращаются по-разному, но использование Graphics2D#rotate()
, похоже, не работает нормально).
Надеюсь, я объяснил свою ситуацию и мою проблему достаточно хорошо, чтобы вы, ребята, помогли мне.Заранее спасибо!
РЕДАКТИРОВАТЬ:
Мои коды
Puzzle.java
package programming.schimmler;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import programming.schimmler.model.PlayingField;
import programming.schimmler.view.ComputerView;
public class Puzzle extends JFrame {
...
Invoking the createAndShowGui()
...
private void createAndShowGui() {
// The playing-field with a 4x6 grid.
PlayingField field = new PlayingField(4, 6);
JPanel mainPanel = new ComputerView(field);
setTitle("Puzzle");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 600);
add(mainPanel);
setVisible(true);
}
}
ComputerView.java
package programming.schimmler.view;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JPanel;
import programming.schimmler.model.PlayingField;
public class ComputerView extends JPanel {
...
Instance variables
....
public ComputerView(PlayingField field) {
this.field = field;
this.setLayout(null);
JPanel topLeft = new GamingPiece(PlayingField.TOP_LEFT);
add(topLeft);
JPanel topRight = new GamingPiece(PlayingField.TOP_RIGHT);
add(topRight);
JPanel bottomLeft = new GamingPiece(PlayingField.BOTTOM_LEFT);
add(bottomLeft);
}
}
GamingPiece.java
package programming.schimmler.view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
import programming.schimmler.model.PlayingField;
/**
*
*/
public class GamingPiece extends JPanel {
...
public GamingPiece(int type) {
switch (type) {
// Need to draw each polygon from different coordinates since rotating did not work yet.
case PlayingField.TOP_LEFT:
pieceX = new int[] { 100, 100, 300, 300, 200, 200, 100 };
pieceY = new int[] { 100, 100, 100, 200, 200, 300, 300 };
break;
case PlayingField.TOP_RIGHT:
pieceX = new int[] { 400, 400, 300, 300, 200, 200 };
pieceY = new int[] { 0, 200, 200, 100, 100, 0 };
break;
case PlayingField.BOTTOM_LEFT:
pieceX = new int[] { 0, 200, 200, 100, 100, 0 };
pieceY = new int[] { 400, 400, 300, 300, 200, 200 };
break;
case PlayingField.BOTTOM_RIGHT:
pieceX = new int[] { 400, 400, 300, 300, 200, 200 };
pieceY = new int[] { 400, 200, 200, 300, 300, 400 };
break;
case PlayingField.SQUARE:
pieceX = new int[] { 100, 300, 300, 100 };
pieceY = new int[] { 100, 100, 300, 300 };
break;
}
setLayout(null);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.YELLOW);
g2.fillPolygon(pieceX, pieceY, pieceX.length);
}
}
Эти классы выше взаимодействуют только взаимодействующих классовс моим GUI другие классы не участвуют.