2013-02-26 20 views
5

Sto provando a scrivere un clone di tetris, e dopo aver fatto qualche ricerca mi sono imbattuto in un esempio che utilizza piccoli controlli utente per formare il blocco e un controllo utente più grande che contiene la griglia.Spostare un controllo utente all'interno di un altro controllo utente

Tutto ciò che ho già scritto sembra funzionare bene (i blocchi vengono generati e posizionati sulla griglia, posso anche posizionarli da qualche altra parte se cambio il codice), ma non riesco a ottenere i blocchi per spostarsi mentre il programma è in esecuzione. L'esempio che uso lo fa modificando la proprietà control.left di ciascuno dei blocchi. Ho provato questo, il debug e mentre la proprietà cambia, il blocco non si muove.

Ho cercato in giro per circa 4 ore. Sono un programmatore alle prime armi, quindi so che probabilmente è qualcosa di stupido, ma non riesco a trovare quello che è.

Ecco i metodi che ho scritto:

//Class TetrisGame.cs 
public void MoveRight() 
     { 
      blok.MoveBlock("x", 1); 
     } 
//Class Shape.cs 
public void MoveBlock(string pos, int Amount) 
     { 
      if (pos == "x") 
      { 
       for (int i = 0; i < this.Shape().Count; i++) 
       { 
        ((Blokje)this.Shape()[i]).MoveSide(1); 
       } 
      } 
      if (pos == "y") 
      { 
       for (int i = 0; i < this.Shape().Count; i++) 
       { 
        ((Blokje)this.Shape()[i]).MoveDown(1); 
       } 
      } 
//And, the code that should actually move the block in Block.cs: 
     public void MoveSide(int Step) 
     { 
      this.Left += (Step * 20);//Blocks are 20*20 pixels so should move in steps of 20 pixels 
     } 

Shape è in realtà un ArrayList che contiene solo i 4 blocchi. Block.cs è una classe parziale dal momento che è il codice dietro l'UserControl che sono le piccole piazze, Shape.cs rende le forme dai blocchi e Tetrisgame è solo l'gamelogic

KeyPress:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      try 
      { 
       if (e.KeyChar == 'q')//left 
       { 
        if (!paused) 
        { 
         Game.MoveLeft(); 
        } 
       } 
       else if (e.KeyChar == 'd')//right 
       { 
        if (!paused) 
        { 
         Game.MoveRight(); 
        } 
       } 
       else if (e.KeyChar == 'p')//pause 
       { 
        if (paused) 
        { 
         tmrGame.Start(); 
        } 
        else 
        { 
         tmrGame.Stop(); 
        } 
       } 
       else if (e.KeyChar == 'z')//rotate 
       { 
        if (!paused) 
        { 
         Game.Rotate(); 
        } 
       } 
       else if (e.KeyChar == 'h')//help 
       { 
        Help.Show(); 
       } 
       else if (e.KeyChar == 'f')//save 
       { 

       } 
       else if (e.KeyChar == 's')//Drop 
       { 
        if (!paused) 
        { 
         Game.Drop(); 
        } 
       } 
      } 
      catch 
      { 
       //no error message has to be displayed, this is just to prevent runtime Errors when pressing keys before the game has started 
      } 
     } 
+0

Come stai ottenendo input? Tastiera, mouse? Immagino che il tuo approccio potrebbe funzionare quando hai solo pochi elementi. Stai usando WPF o Winforms? –

+0

Sto usando la tastiera con un evento di pressione tasti e winform. L'input da tastiera funziona, dal momento che lo uso anche per aprire il modulo di aiuto. – Frederik

+1

prova a impostare this.location = new point (x, y); –

risposta

0

Sembra che il "controllo utente più grande che contiene la griglia" con i suoi figli non venga ridisegnato. Cambio _MoveSide a:

public void MoveSide(int Step) 
    { 
     this.Left += (Step * 20); 
     Update(); 
    } 

quindi tutto viene ridisegnato in modo corretto.

Problemi correlati