2013-02-26 9 views
5

Я пытаюсь написать клон tetris, и после некоторого исследования я столкнулся с примером, который использует небольшие пользовательские элементы управления для формирования блока и большего пользовательского элемента управления, который содержит сетки.Перемещение пользовательского элемента управления внутри другого пользовательского элемента управления

Все, что я написал, кажется, работает очень хорошо (блоки генерируются и помещаются в сетку, я могу даже разместить их где-нибудь еще, если я изменю код), но я не могу получить блоки для перемещения во время работы программы. Пример, который я использую, делает это, изменяя свойство control.left каждого из блоков. Я пробовал это, отлаживал его и, пока свойство изменяется, блок не перемещается.

Я искал около 4 часов. Я начинающий программист, поэтому я знаю, что это, наверное, что-то глупое, но я не могу найти, что это такое.

Вот методы я написал:

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

Форма фактически является ArrayList, который содержит только 4 блоков. Block.cs частичный класс, так как это код за UserControl, который небольшие квадраты, Shape.cs делает фигуры из блоков и tetrisgame это только 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

Как вы получаете ввод? Клавиатура, мышь? Я предполагаю, что ваш подход может работать, если у вас есть только несколько элементов. Вы используете WPF или Winforms? –

+0

Я использую клавиатуру с событием keypress и winforms. Работа с клавиатурой работает, так как я также использую ее для открытия формы справки. – Frederik

+1

попробуйте установить this.location = новая точка (x, y); –

ответ

0

Кажется, что «более крупный пользовательский элемент управления, содержащий сетку» с его дочерними элементами, не перерисовывается. Изменить MoveSide на:

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

так все перерисовывается правильно.

Смежные вопросы

 Смежные вопросы