2013-02-26 5 views
5

J'essaye d'écrire un clone tetris, et après avoir fait des recherches, j'ai trouvé un exemple qui utilise les petits contrôles utilisateur pour former le bloc et un plus grand contrôle utilisateur qui contient la grille. Tout ce que j'ai déjà écrit semble fonctionner correctement (les blocs sont générés et placés sur la grille, je peux même les placer ailleurs si je change le code), mais je n'arrive pas à obtenir les blocs pour bouger pendant que le programme fonctionne. L'exemple que j'utilise fait ceci en changeant la propriété control.left de chacun des blocs. J'ai essayé ceci, je l'ai débogué et pendant que la propriété change, le bloc ne bouge pas.Déplacement d'un contrôle utilisateur dans un autre contrôle utilisateur

J'ai cherché autour pour environ 4 heures maintenant. Je suis un programmeur novice, donc je sais que c'est probablement stupide, mais je ne peux pas trouver ce que c'est.

Voici les méthodes que j'ai écrit:

//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 
     } 

forme est en fait un ArrayList qui contient seulement les 4 blocs. Block.cs est une classe partielle car il est le code derrière le UserControl les petits carrés, Shape.cs fait les formes de blocs et tetrisgame est juste le GameLogic

l'événement 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

Comment gagnez-vous des idées? Clavier souris? Je suppose que votre approche pourrait fonctionner lorsque vous n'avez que quelques éléments. Utilisez-vous WPF ou Winforms? –

+0

J'utilise le clavier avec un événement keypress et des winforms. La saisie au clavier fonctionne, puisque je l'utilise aussi pour ouvrir le formulaire d'aide. – Frederik

+1

essayez de définir this.location = new point (x, y); –

Répondre

0

Il semble que le "plus grand contrôle utilisateur qui contient la grille" avec ses enfants ne soit pas redessiné. Changement MoveSide à:

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

donc tout est redessinée correctement.

Questions connexes