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
        }

Shape は、実際には 4 つのブロックのみを含む配列リストです。Block.cs は、ユーザー コントロールの背後にある小さな四角形のコードであるため、部分クラスです。Shape.cs はブロックから形状を作成し、tetrisgame は単なるゲームロジックです。

キープレス イベント:

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

1 に答える 1

1

子を持つ「グリッドを含むより大きなユーザーコントロール」は再描画されないようです。MoveSide を次のように変更します。

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

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

于 2013-02-28T15:31:00.793 に答える