在具有透明孔的另一图像后面移动图像

本文关键字:图像 移动 透明 | 更新日期: 2023-09-27 18:28:26

`int[,]board=new int[6,7];PictureBox boardpb=新建PictureBox();PictureBox[]pb=新的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#制作一个连接4游戏到我的uni项目。当试图让碎片落入木板时,它们就像在木板图像下移动,隐藏了身后的木板线。你知道如何让这些碎片的图像在木板后面移动,但仍然可以通过木板孔看到吗(就像下面链接中的图片)?附言:图板和两张图片的背景是透明的。提前感谢^^http://mathworld.wolfram.com/images/gifs/connect4.gif更新:我添加了代码。(表,红色,蓝色是我的资源中的3个图像)如何编辑这些代码,使碎片落在板后面,而不是突然出现?

在具有透明孔的另一图像后面移动图像

您有两个选项:

  • 使用GDI+命令FillRectangleFillEllipse绘制所有图形
  • 使用保持栅格和片段位图的控件

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

但是,在Winforms中,透明度仅支持嵌套控件。然而,直接方法将与控制重叠,因此不起作用。

相反,您需要将底部控件嵌套在游戏场中,并将上面的每一层嵌套在下面的一层中。由于您只需要在工件上方的一层,即网格,因此您必须将网格嵌套在工件中。

这是可能的,但不是很自然,因为要做到这一点,必须使工件足够大,以容纳整个网格以及动画过程中的每个位置。因此,如果你在每次移动开始时设置它,它必须是棋盘高度和全宽的两倍。

然后在Timer.Tick中,向下移动工件,并向上移动嵌套在其中的网格,直到工件找到位置。

最后将该片拉入PictureBox板的Image中。使BackgroundImage显示相同的网格,以便在设置下一步之前可以简单地隐藏工件。。

因此,您可以通过在大小为(board.width, board.height*2)的位图中的位置(c, height * 2)处绘制一个红色或黑色圆圈来开始在列c中移动,并将其指定给PictureBox movingPiece

您已经准备了一个包含网格的位图,并将其分类为PictureBox grid的图像。现在你嵌套三个控件:

movingPiece.Parent = board;
grid.Parent = movingPiece;

在勾选中,你移动pice doen和它包含的网格:

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

我会选择这个;理解起来并不自然,移动的像素也少得多,所以可能也更快。。

只需在棋子之后绘制棋盘即可。

如果你使用的是一个图板,只需确保有透明通道。您可以在MSDN上找到更多解释。

如果你用矢量线绘制电路板,只要你在孔里什么都没画就没有问题。

另一个选项:

  1. 绘制板(或从图像加载),有或没有透明度。WinForms中的大多数控件(窗体、面板、picturebox等)都支持BackgroundImage或其他批量图像加载作为基本层。

  2. 在板的顶部适当地画出每一块,但要夹住/遮盖/操纵圆形的部分,使圆形的正确部分通过板上的"孔"显示出来。你只需要知道木板图像中孔的位置就可以计算出这一点,这会让这些碎片看起来像是"在"木板里,就像它们在现实中一样。