1

私は C# でゲーム Knights Tour の単純な C# プログラムを実行していますが、C# のすべてを学ぶのは難しい方法です。ボードと騎士の駒があり、騎士は騎士の絵が描かれたカスタム パネルです。

私がやろうとしているのは、ユーザーが実行時に騎士の駒コントロールをクリックしてドラッグできるようにすることです (設計時にコントロールを移動して配置する方法とまったく同じです) が、何らかの理由で非常に望ましくない結果が得られます。

    private void KTmain_Load(object sender, EventArgs e)
    {
        boolKnightmoves = false;
    }

    private void kpcKnight_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        switch (e.Button)
        {
            case MouseButtons.Left:
                boolKnightmoves = true;

                intCurMouseX = e.X;
                intCurMouseY = e.Y;

                break;
            case MouseButtons.Right:

            case MouseButtons.Middle:

            case MouseButtons.XButton1:

            case MouseButtons.XButton2:

            case MouseButtons.None:
            default:
                boolKnightmoves = false;
                break;
        }
    }

    private void kpcKnight_MouseUp(object sender, MouseEventArgs e)
    {
        switch (e.Button)
        {
            case MouseButtons.Left:
                boolKnightmoves = false;
                break;
            case MouseButtons.Right:

            case MouseButtons.Middle:

            case MouseButtons.XButton1:

            case MouseButtons.XButton2:

            case MouseButtons.None:
            default:
                boolKnightmoves = false;
                break;
        }
    }

    private void kpcKnight_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (boolKnightmoves)
        {                
            txtTest.Text = e.X + ", " + e.Y;
            txtTest.Text += Environment.NewLine + kpcKnight.Location;

            int i = e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1;
            int j = e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1;

            txtTest.Text += Environment.NewLine + i.ToString() + ", " + j.ToString();

            kpcKnight.Location = new Point(
                 kpcKnight.Location.X + i,
                 kpcKnight.Location.Y + j);//e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1);
                                            //e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1,
            intCurMouseX = e.X;
            intCurMouseY = e.Y;
        }
    }

    private void kpcKnight_MouseLeave(object sender, EventArgs e)
    {
        boolKnightmoves = false;
    }

    private void kpcKnight_LocationChanged(object sender, EventArgs e)
    {
        kpcKnight.Refresh();
    }

このコードが同じことをしない本当の理由はわかりませんが、明らかに何かが欠けています。騎士をクリックして動かすと、マウスと同じ速度ではなく、はるかに遅く動きます。また、見えない場所に移動するとフェードします。

フォーム デザイナーと同じように騎士の駒を動かし、チェスの駒をチェス盤上で動かすにはどうすればよいですか?

任意の支援をいただければ幸いです。


私はコードを少し更新しましたが、それは役に立ちますが、アニメーションの側面はまだかなり途切れ途切れで、パネルが移動して配置されると背景が少し拾われます.

フォーム デザイナーでどのようにスムーズに行うのですか?

    private void kpcKnight_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (boolKnightmoves)
        {                
            txtTest.Text = e.X + ", " + e.Y;
            txtTest.Text += Environment.NewLine + kpcKnight.Location;

            int x = kpcKnight.Location.X + e.X - intCurMouseX;
            int y = kpcKnight.Location.Y + e.Y - intCurMouseY;

            kpcKnight.Location = new Point(x, y);
            kpcKnight.Refresh();
            /*
            int i = e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1;
            int j = e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1;

            txtTest.Text += Environment.NewLine + i.ToString() + ", " + j.ToString();

            kpcKnight.Location = new Point(
                 kpcKnight.Location.X + i,
                 kpcKnight.Location.Y + j);//e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1);
                                            //e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1,
            intCurMouseX = e.X;
            intCurMouseY = e.Y;*/
        }
    }
4

4 に答える 4

0

.Net の透過性は、少し誤解されています。背景は単に親コンテナの色になります。コントロールがボード上でドラッグされる場合のように、コントロールがそれぞれに重なる場合、コントロールは長方形であるため、ピースの「背景」が表示されます。1 つのオプションは、PictureBox を実際にクリップして、不規則な形状にすることです。これは、GraphicsPath() から Region() を作成し、それを PictureBox の Region() プロパティに割り当てることで実現できます。単純なアプローチは、画像の左上にある色を使用し、それを「マスク」色として使用することです。次に、画像全体をウォークし、ピクセルがマスク カラーではない場所のみを GraphicsPath() に追加します。これは、Image() が割り当てられた後、PictureBox で 1 回だけ実行する必要があります。繰り返しますが、このアプローチでは、画像の「背景」(保持したくない部分) がすべて同じ色である必要があり、また、保持したい画像の一部としてこの色がどこにも存在しない必要があります。次に例を示します。

    private void Form1_Load(object sender, EventArgs e)
    {
        // perform this for all your PictureBox pieces:
        this.ClipPictureBoxPiece(this.kpcKnight);
        // ...
        // ...
    }

    private void ClipPictureBoxPiece(PictureBox pb)
    {
        if (pb != null && pb.Image != null)
        {
            System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
            using (Bitmap bmp = new Bitmap(pb.Image))
            {
                Color mask = bmp.GetPixel(0, 0);
                for (int x = 0; x < bmp.Width; x++)
                {
                    for (int y = 0; y < bmp.Height; y++)
                    {
                        if (!bmp.GetPixel(x, y).Equals(mask))
                        {
                            gp.AddRectangle(new Rectangle(x, y, 1, 1));
                        }
                    }
                }
            }
            pb.Region = new Region(gp);
        }
    }
于 2013-05-04T15:05:38.367 に答える