【问题标题】:moving image behind another image with transparent holes在另一个带有透明孔的图像后面移动图像
【发布时间】:2016-04-04 08:44:12
【问题描述】:

`int[,] board = new int[6, 7]; 图片框板pb =新图片框(); 图片框[] pb = 新图片框[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 项目中制作一个 connect 4 游戏。在试图让棋子落入棋盘时,它们就像在棋盘图像下移动,将棋盘线隐藏在它们身后。 知道如何使棋子图像在板后面移动,但仍然可以通过板孔看到(如以下链接中的图片)? PS:板子和2张图片确实有透明背景。 提前谢谢^^ http://mathworld.wolfram.com/images/gifs/connect4.gif 更新:我添加了代码。 (表格,红色,蓝色是我资源中的 3 张图片) 如何编辑这段代码,让棋子落在棋盘后面而不是直接弹出?

【问题讨论】:

  • 请描述更多关于您解决问题的编码方法...thanx
  • 在我看来,您可能只需要 2 个动画,一个用于红色,一个用于黑色穿过一个单元格。
  • 您的问题解决了吗?
  • 你给我的解决方案听起来不错,但我没有尝试过,但我专注于项目中的其他功能,比这个动画更重要。非常感谢:D @TaW
  • 好吧,如果你回来有问题,一定要问!

标签: c# winforms


【解决方案1】:

你有两个选择:

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

我猜你正在尝试选择第二个选项。

但在 Winforms 中,只有 嵌套 控件才支持透明度。但是,直接方法会与控件重叠,因此不起作用。

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

这是可能的,但不是很自然,要实现这一点,您必须使该块足够大以容纳整个网格以及在动画期间它将占据的每个位置。因此,如果您在每次移动开始时设置它,则它必须是棋盘高度及其全宽的两倍。

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

最后把棋子画到板子PictureBoxImage。使BackgroundImage 显示相同的网格,这样您就可以在为下一步设置之前简单地隐藏该部分..

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

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

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

在 Tick 中,您将 pice doen 及其包含的网格向上移动:

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

我会去的;理解起来不太自然,移动的像素也少得多,所以它可能也更快..

【讨论】:

  • ...至少 2 个选项。如何在绿屏前录制通过 REAL connect 4 单元的光盘。这个片段可以根据需要多次使用...
  • 哈哈,是的,这听起来像是另一个不错的 ;-)
  • 这两个我都做不到。我的板子不是矩形的,它是一个图像。在第一个选项中,大尺寸的图片框仅适用于一个部分,因为它会隐藏其他部分。
  • 你的理由都不适用于这两种解决方案。如果你的板子不是矩形的,那是什么?你需要给我们看!只有一件可以随时移动对吗?因此,所有以前的部分都可以绘制成位图......并且因为它(几乎)完全透明,所以它什么都不会......
  • 查看您的代码我看不到动画。不过,你想要那个,对吧?在动画过程中,您可以在 PBox 顶部绘制网格的相关部分。如果您的电路板图像确实具有透明孔,则 DrawImage 重载可以帮助您。
【解决方案2】:

在棋子之后画棋盘。

如果您将图像用于板,请确保有透明通道。你可以找到更多解释on MSDN

如果你在板子上使用矢量线画,只要你在洞里不画任何东西就没有问题。

【讨论】:

  • 为了加快绘制过程,Tarek 可以只绘制一次棋盘,并将棋子的像素限制/屏蔽到棋盘图像透明的坐标。
  • 我无法在棋子之后绘制棋盘,因为当用户单击棋盘的一列时它们必须掉下来。我检查了 msdn 链接,它运行良好,但如果使用该代码,我无法将棋子从板的顶部移动到底部。这件作品应该在图片框内
  • 查看确切的分配可能对我们有所帮助,因为您可能受限于使用特定技术。但是,Axel 的意思是,当您绘制和重绘落下的圆盘时,您会通过重绘网格线来完成每次重绘。这样网格线将始终显示在前面。
【解决方案3】:

另一种选择:

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

  2. 在棋盘顶部适当地绘制每个棋子,但剪辑/遮盖/操作圆形棋子,以便只有正确的圆圈部分通过棋盘上的“孔”显示出来。您应该只需要知道棋盘图像中孔的位置来计算它,它会使棋子看起来好像它们在棋盘“内”,就像它们在现实中一样。

【讨论】:

  • 那太难了,因为我的板子有圆孔:/我只想把这块板移到板子后面
  • 然后你可以做相反的事情:首先画出所有的部分(作为正常的圆圈),然后覆盖板。我知道这是您最初的问题,但不知道该怎么做 - 似乎有一个可行的示例 here 使用父/子图片框来实现分层,尽管之前没有使用过这种特殊技术。跨度>
  • @TarekGhamrawi - 实际上,从板上排除区域似乎相当简单 - 在您的情况下,排除“孔”,使它们透明。您可能想查看this。我认为,如果您绘制剪切的图像或它的一些反转版本(“孔”未绘制),您可以获得您想要的。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2016-03-12
  • 2022-09-08
  • 2013-12-15
  • 2018-05-09
  • 2014-04-18
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多