2013-02-26 11 views
5

テトリスクローンを作成しようとしていますが、いくつかの調査を行った後、小さなユーザーコントロールを使用してブロックを作成し、グリッド。ユーザーコントロールを別のユーザーコントロール内に移動する

私が書いたものはすべて、すでにコードが変更されているとブロックが生成されてグリッドに配置されていて、他の場所に配置することもできます。プログラムの実行中に移動する。私が使用する例では、ブロックのそれぞれの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 
     } 

形状が実際にわずか4つのブロックが含まれていArrayListのです。 Block.csは部分クラスである、それは小さな正方形で、ユーザーコントロールの背後にあるコードなので、Shape.csはブロックとtetrisgameの外形状を作るだけでgamelogic

キー押下イベントです:

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 = new point(x、y)を設定してみてください。 –

答えて

0

"グリッドを含む大きなユーザーコントロール"は子で再描画されないようです。 変更MoveSideに:

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

ので、すべてが正しく再描画されます。

関連する問題