用透明孔在另一个图像后面移动图像

时间:2015-12-30 11:15:37

标签: c# winforms

`int [,] board = new int [6,7];         PictureBox boardpb = new PictureBox();         PictureBox [] pb = new PictureBox [42];         图像表,红色,蓝色;         int c = 0;

    public Form1()
    {
        InitializeComponent();

        red = Properties.Resources.red; red = (Image)(new Bitmap(red, new Size(110, 110)));
        blue = Properties.Resources.blue; blue = (Image)(new Bitmap(blue, new Size(110, 110)));
        table = Properties.Resources.Board; table = (Image)(new Bitmap(table, new Size(700, 700)));

        boardpb.Location = new Point(0, 0);
        boardpb.Image = table;
        boardpb.Size = table.Size;
        boardpb.BackColor = Color.Transparent;
        boardpb.MouseClick += new MouseEventHandler(Human_Play);
        this.Controls.Add(boardpb);
    }

    void PlayCircle(int x, int y, Image im) //plays a red/blue circle in the corresponding (y,x) position
    {
        pb[c] = new PictureBox();
        pb[c].Location = new Point((int)(-2 + 98.8 * x), (int)(83 + 94.4 * y));
        pb[c].Image = im;
        pb[c].Size = im.Size - new Size(10, 10);
        pb[c].BackColor = Color.Transparent;
        pb[c].MouseClick += new MouseEventHandler(Human_Play);
        boardpb.Controls.Add(pb[c]);
        c++;
    }

    int Y(int x) // gives the lowest empty space in the column, or -1 if the column is full.
    {
        for (int y = 5; y >= 0; y--)
            if (board[y, x] == 0) return y;
        return -1;
    }

    void Human_Play(object sender, MouseEventArgs e)
    {
        int x, y;
        x = (Cursor.Position.X) / 99;
        if ((x <= 6) && (x >= 0))
        {
            y = Y(x);
            if (y != -1)
            {
                PlayCircle(x, y, red);
                board[y, x] = -1;
            }
        }
    }`

我正在使用WinForms C#为我的uni项目制作一个连接4游戏。当试图让这些碎片落入电路板时,它们就像在电路板下移动,隐藏在它们后面的电路板线条。 任何想法如何使片断图像在板后面移动,但仍然可以通过板孔看到(如下面链接中的图片)? PS:主板和2张图片确实有透明背景。 提前谢谢^^ http://mathworld.wolfram.com/images/gifs/connect4.gif 更新:我添加了代码。 (表格,红色,蓝色是我资源中的3张图片) 如何编辑这段代码,以便碎片落在棋盘后面,而不仅仅是弹出?

3 个答案:

答案 0 :(得分:1)

只需在棋子后画板。

如果您使用图像作为电路板,请确保存在透明通道。您可以找到更多解释on MSDN

如果你使用矢量线绘图,只要你在洞中没有画任何东西就没有问题。

答案 1 :(得分:0)

您有两种选择:

  • 使用GDI +命令FillRectangleFillEllipse绘制所有图形。
  • 使用包含网格和碎片位图的控件。

我猜你是想尝试第二种选择。

但是, Winforms 透明度仅支持嵌套控件。然而,直接方法将与控件重叠,因此无效。

相反,您需要嵌套游戏区域中的底部控件以及下面一层中的每一层。由于您只需要在该块上方的一个层(即网格),您必须将网格嵌套在该块中。

这是可能的,但是不太自然,因为要工作,你必须使这件作品足够大以容纳整个网格以及动画期间所需的每个位置。因此,如果您在每次移动开始时设置它,它必须是电路板高度的两倍及其全宽。

然后在Timer.Tick中,你将棋子向下移动,并将网格嵌套在其中,直到棋子找到它的位置。

最后将棋子画入棋盘Image PictureBox。使BackgroundImage显示相同的网格,这样您就可以在设置下一步之前隐藏该部分..

因此,您可以在尺寸为c, height * 2的位图中的位置(board.width, board.height*2)处绘制红色或黑色圆圈,然后将其指定给{{1} }。

您准备了一个包含网格的位图,并将其作为PictureBox movingPiece的图像进行分配。现在你嵌套三个控件:

PictureBox grid

在刻度线中移动pice doen及其包含的网格:

movingPiece.Parent = board;
grid.Parent = movingPiece;
  • 选项二更简单:在void timer1_Tick(object sender, EventArgs e) { movingPiece.Top++; grid.Top--; // if finalposition etc.. } 中创建网格。将设定的部分绘制到BackgroundImage中。并通过在重叠位置填充一个圆和一个矩形来在Image事件中设置动画。

我会这样做;理解并不是更自然,更少的像素被移动,所以它也可能更快......

答案 2 :(得分:0)

另一种选择:

  1. 使用OR无透明度绘制板(或从图像加载)。 WinForms中的大多数控件(窗体,面板,图片框等)都支持BackgroundImage或其他一些批量图像加载作为基础层。

  2. 在板的顶部适当地绘制每个部件,但是夹子/掩模/操纵圆形部件,以便只有圆的正确部分通过板中的“孔”显示。您只需要知道板图像中孔的位置来计算这一点,它就会使这些块看起来好像它们在板内“,就像它们实际上一样。”