2017-11-29 12 views
0

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); 
     } 
    } 
} 

} 

Update: spawning two at a time

Antwort

2
gamePanel.removeAll(); 
    gamePanel.fillGrid(); 
    gamePanel.revalidate(); 
    gamePanel.repaint(); 
    Tuple position = new Tuple(10, 10); 
    this.gamePanel = new GamePanel(this); 
    this.add(gamePanel,BorderLayout.CENTER); 

Dieser Code wirklich nichts tun. Wenn Sie dem CENTER des BorderLayout eine Komponente hinzufügen, ersetzt es die ursprüngliche Komponente nicht.

Die Art, wie Swing painting funktioniert, ist, dass die letzte hinzugefügte Komponente zuerst gemalt wird. Dies bedeutet, dass das neu hinzugefügte Panel gestrichen wird und dann das Originalpanel über das neu hinzugefügte Panel gemalt wird.

Also, da Sie Logik haben, um alle Komponenten aus dem ursprünglichen gamePanel zu entfernen, ist es nicht notwendig, ein neues gamePanel zu erstellen. Setze einfach den Status des Spielfeldes zurück.

+0

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

+0

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

+0

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