Ich versuche, ein Snake-Spiel neu zu streichen, das ich auf der neuen Spielaktion erstelle. Es funktioniert, aber es beseitigt nicht den alten Schlangenkörper oder Blöcke vom Bildschirm.Java Repaint gridlayout
public class View extends JFrame implements ActionListener {
private static final long serialVersionUID = -2542001418764869760L;
public static int viewWidth = 20;
public static int viewHeight = 20;
private SidePanel side;
private JMenuBar menuBar;
private JMenuItem newGameButton;
private JMenu menu, mode;
private SnakeController sController;
private GamePanel gamePanel;
/*
* Initialize the game's panels and add them to the window.
*/
public View() {
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
newGameButton = new JMenuItem("New Game");
menu.add(newGameButton);
newGameButton.addActionListener(this);
mode = new JMenu("Mode");
menuBar.add(mode);
this.setJMenuBar(menuBar);
this.gamePanel = new GamePanel(this);
this.side = new SidePanel(this);
this.add(gamePanel, BorderLayout.CENTER);
this.add(side, BorderLayout.EAST);
Tuple position = new Tuple(10, 10);
sController = new SnakeController(position, side, gamePanel);
this.addKeyListener((KeyListener) new Listener());
// this.requestFocus();
pack();
}
public static void main(String args[]) {
View window = new View();
window.setTitle("og-snake");
window.setSize(700, 400);
window.setVisible(true);
window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == newGameButton) {
System.out.println("clicked");
gamePanel.removeAll();
gamePanel.revalidate();
gamePanel.repaint();
Tuple position = new Tuple(10, 10);
sController = new SnakeController(position, side, gamePanel);
sController.start();
}
}
Das ist meine Hauptklasse, die im Grunde macht eine Ansicht eine Seitenwand und Board panel.The Aktion fügt auf die neue Spielaktion auf der Spielkonsole getan durchgeführt wird.
public class GamePanel extends JPanel {
public static ArrayList<ArrayList<ColorCell>> snakeGrid;
public static int viewWidth = 20;
public static int viewHeight = 20;
ArrayList<ColorCell> data;
SnakeController sc ;
private View game;
public GamePanel(View game) {
this.game = game;
this.snakeGrid = new ArrayList<ArrayList<ColorCell>>();
this.data = new ArrayList<ColorCell>();
for (int i = 0; i < viewWidth; i++) {
data = new ArrayList<ColorCell>();
for (int j = 0; j < viewHeight; j++) {
ColorCell c = new ColorCell(2);
data.add(c);
}
snakeGrid.add(data);
}
setLayout(new GridLayout(viewWidth, viewHeight, 0, 0));
setPreferredSize(new Dimension(400,400));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < viewWidth; i++) {
for (int j = 0; j < viewHeight; j++) {
add(snakeGrid.get(i).get(j).viewCell);
}
}
}
}
Okay, ich sehe jetzt, aber jetzt ist es nur neu laichen mehr nicht die alte Schlange zu entfernen. Ich habe versucht, das snakegrid-Objekt zu löschen und wieder aufzufüllen, aber wenn ich das Board jemals gelöscht habe, würde ich das erste Bild bekommen. Ich habe ein anderes Bild für mein Update hinzugefügt – 3rdeye7
Ein Bild hilft nicht. Du hast deine Logik geschrieben. Sie müssen Ihrem Code eine "Reset" -Logik hinzufügen, um die Platine zu löschen. Ich kann dir nicht sagen, wie das geht, weil ich nicht weiß, wie dein Spiel funktioniert. – camickr
Hey Ich habe den Code mit der ganzen Logik aktualisiert, wie für mein Problem Ich denke, es ist die Art und Weise, die ich initialisieren und zuweisen, um die SnakeGrid Array, wenn ich neu streichen. Ich habe versucht, die gesamte snakeGrid-Arraylist zu löschen, aber das hat auch nicht funktioniert. – 3rdeye7