2017-01-07 2 views
0

Ich erstelle ein klassisches Snake-Spiel, bei dem ich das Board von der Originalgröße verkleinern muss, da der Level steigt, was ich zur Zeit hatte war, dass ich die Größe der Karte aber die unbenutzte PictureBox änderte sind immer noch da und können sie nicht löschen. Ich habe Probleme beim Löschen und Abrufen der Methode, um die PictureBox mit neuer Variable neu zu erstellen.Löschen aller PictureBox in C#

Wirklich zu schätzen, wenn es jemanden gibt, der mir helfen kann, mein Problem in Bezug auf PictureBox Löschen/Entfernen in C# zu lösen. Hier sind einige Teile des Quellcodes für mein Projekt. Zum Anzeigen des gesamten Quellcodes kann direkt bei mir nachgefragt werden.

Hier wurde mein Code für die Platine neu erstellt/aktualisiert.

private void gotoNextLevel(int nextLevel) 
    { 
     mode = "REST"; 
     mySnake = new Snake(mainBoard); //Brand new snake with length 1 
     apples = new Rewards(nextLevel, mainBoard); //<--- Generate 5 apples 
    } 

Hier ist, wie ich mein Board für das Spiel erstellen.

int maxRow = 10, maxCol = 20;  //Max 10 rows, and 20 columns in the board 
    int squareSize = 30;    //Each square is 30px by 30px 

    PictureBox[,] squares; 

    public Board(Form mainForm) 
    { 
     squares = new PictureBox[maxRow, maxCol]; 
     for (int row = 0; row < maxRow; row++) 
     { 
      for (int col = 0; col < maxCol; col++) 
      { 
       squares[row, col] = new PictureBox(); 
       squares[row, col].Location = new Point(col * squareSize, row * squareSize); 
       squares[row, col].Height = squareSize; 
       squares[row, col].Width = squareSize; 
       squares[row, col].SizeMode = PictureBoxSizeMode.StretchImage; 
       squares[row, col].BackColor = Color.DarkGray; 
       squares[row, col].BorderStyle = BorderStyle.FixedSingle; 

       mainForm.Controls["boardPanel"].Controls.Add(squares[row, col]); 
      } 
     } 
     mainForm.Controls["controlPanel"].Location = new Point(mainForm.Controls["boardPanel"].Location.X, mainForm.Controls["boardPanel"].Location.Y + mainForm.Controls["boardPanel"].Height + 20); 
    } 

Hier ist die Aktualisierungsmethode.

private void refresh(Object myObject, EventArgs myEventArgs) 
    { 
     mySnake.move(mode); //Move the snake based on mode 
     modeLBL.Text = mode; 

     mainBoard.draw(); 
     apples.draw(); //<----- draw apples 
     mySnake.draw(); 

     //increment the duration by amount of time that has passed 
     //this method is called every speed millisecond 
     duration += speed; 
     timerLBL.Text = Convert.ToString(duration/1000); //Show time passed 


     //Check if snke is biting itself. If so, call GameOver. 
     if (mySnake.checkEatItself() == true) 
     { 
      GameOver(); 
     } 
     else if (apples.checkIFSnakeHeadEatApple(mySnake.getHeadPosition()) == true) 
     { 
      score += apples.eatAppleAtPostion(mySnake.getHeadPosition()); 

      scoreLBL.Text = Convert.ToString(score); 


      if (apples.noMoreApples() == true) 
      { 
       clock.Stop(); 
       level++; 
       levelLBL.Text = Convert.ToString(level); 
       gotoNextLevel(level); 
       MessageBox.Show("Press the start button to go to Level " + level, "Congrats"); 
      } 
      else 
      { 
       //Length the snake and continue with the Game 
       mySnake.extendBody(); 
      } 
     } 
    } 
+0

klar, dass die 'Controls' Sammlung des boardPanel:' boardPanel.Controls, wenn Sie andere Steuerelemente als PictureBox haben, aber Sie wollen nur PictureBox entfernen Sie diese verwenden könnten. Clear(); 'löscht alle Bildfelder. – dlatikay

+0

Sie machen einen häufigen Fehler mit Ereignissen. Anstatt die Argumente in der Ereignisaktualisierung zu verwenden, greifen Sie direkt auf die Objekte in der Ansicht zu. Sie sollten MyObject verwenden. Ist es nicht besser, die Größe der aktuellen Picture Boxes zu verkleinern als neue zu erstellen? – jdweng

+0

nachdem ich "boardPanel.Controls.Clear();" suggetiert von dlatikay, hat das board alles richtig gemacht, aber leider hat es mein board nicht mit neuen werten neu gezeichnet. – Jatiz

Antwort

0

Zunächst einmal: ist die Signatur von Refresh() von Visual Studio selbst generiert? Wenn ja, warum kopierst du den Körper nicht und lege ihn ohne Parameter in eine neue Methode, weil du anscheinend nicht einmal die in deiner aktuellen refresh() -Methode verwendest.

Zweitens: Wenn Sie diese neue Methode erstellen, können Sie eine Methode erstellen, bei der Sie zuerst die Steuerelemente löschen und dann das Neuzeichnen aufrufen. Ich denke, es wird nicht neu gezeichnet, weil es ein Ereignis von einem Steuerelement war, das nie wieder aufgerufen wird, weil Sie gerade alle Kontrollen gelöscht haben.

Und last but not least:

foreach (Control control in this.Controls) 
{ 
    if (control is PictureBox) 
    { 
     this.Controls.Remove(control); 
    } 
}