2013-02-26 40 views
5

Tôi đang cố gắng viết một bản sao tetris và sau khi thực hiện một số nghiên cứu, tôi đã xem một ví dụ sử dụng các điều khiển người dùng nhỏ để tạo khối và điều khiển người dùng lớn hơn Cái lưới sắt.Di chuyển điều khiển người dùng xung quanh trong một điều khiển người dùng khác

Mọi thứ tôi đã viết dường như chỉ hoạt động tốt (các khối đang được tạo và đặt trên lưới, tôi thậm chí có thể đặt chúng ở nơi khác nếu tôi thay đổi mã), nhưng dường như tôi không nhận được các khối để di chuyển trong khi chương trình đang chạy. Ví dụ tôi sử dụng thực hiện việc này bằng cách thay đổi thuộc tính control.left của từng khối. Tôi đã thử điều này, gỡ lỗi nó và trong khi tài sản thay đổi, khối không di chuyển.

Tôi đã tìm kiếm khoảng 4 giờ. Tôi là một lập trình viên mới, vì vậy tôi biết nó có thể là một cái gì đó ngu ngốc, nhưng tôi không thể tìm thấy nó là gì.

Dưới đây là các phương pháp tôi đã viết:

//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 thực sự là một ArrayList mà chỉ chứa 4 Blocks. Block.cs là một lớp học phần vì nó là mã đằng sau usercontrol đó là các ô vuông nhỏ, Shape.cs làm cho hình dạng ra của các khối và tetrisgame chỉ là gamelogic

sự kiện 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

Bạn đạt được đầu vào như thế nào? Bàn phìm chuột? Tôi đoán cách tiếp cận của bạn có thể hoạt động khi bạn chỉ có một vài mục. Bạn đang sử dụng WPF hay Winforms? –

+0

Tôi đang sử dụng bàn phím với sự kiện nhấn phím và biểu tượng thắng. Đầu vào bàn phím hoạt động, vì tôi cũng sử dụng nó để mở biểu mẫu trợ giúp. – Frederik

+1

thử đặt this.location = điểm mới (x, y); –

Trả lời

0

Có vẻ như "điều khiển người dùng lớn hơn có chứa lưới" với con của nó không được vẽ lại. Thay đổi MoveSide thành:

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

để mọi thứ được vẽ lại chính xác.

Các vấn đề liên quan