2015-12-30 31 views
2

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#制作连接4游戏到我的uni项目。当试图让棋子落入棋盘时,他们就像在隐藏桌子后面的棋盘线下移动棋盘一样。 任何想法如何使碎片图像移动到电路板后面,但仍然能够通过电路板孔看到(如以下链接中的图片)? PS:董事会和2件图片确实有透明背景。 在此先感谢^^ http://mathworld.wolfram.com/images/gifs/connect4.gif 更新:我添加了代码。 (表格,红色,蓝色在我的资源中是3张图片) 如何编辑此代码,以便将这些代码放在主板后面而不是弹出?

+1

请描述你的编码方法来解决这个问题更多的东西......感谢名单 –

+1

它发生,我认为你可能只需要2动画一个红色和一个黑白通过细胞。 –

+0

你解决了你的问题吗? – TaW

回答

0

你有两个选择:

  • 绘制使用GDI +命令FillRectangleFillEllipse的所有图形。
  • 使用控件可以保存网格和图块的位图。

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

但是,在Winforms透明度仅支持嵌套控件。然而,直接方法会重叠控制,因此无法工作。

相反,您需要nest底部控制在游戏区域和上面的每一层在下面的一个。既然你只需要在一块以上的一层,即网格,你就必须将网格嵌套在一块。

这是可能的,但不是很自然,至于这个工作,你必须让这块作品足够大,以保持整个网格,并在动画过程中的每个位置。因此,如果您在每次移动开始时设置它,它必须是电路板高度的两倍和全宽。

然后在Timer.Tick中,您将该部分向下移动,并将网格嵌套在其中,直到该部分找到它的位置。

最后将棋子划分成PictureBox板的Image。使BackgroundImage显示相同的网格,以便您可以在为下一步移动设置之前隐藏该部分。

所以,你将开始在c列中移动位置(c, height * 2)的位置(board.width, board.height*2)的位图上的红色或黑色圆圈,并将其分配给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.. 
} 
  • 方案二是简单IMO:在BackgroundImage创建网格,将套件画成Image。在Tick&Paint事件中通过在重叠位置填充一个Circle和一个Rectangle来生成动画。

我会为此而去;它是不是更自然的理解和少得多的像素得到移动,以便它可能更快太..

+0

...至少2个选项。如何在绿色屏幕前录制通过REAL连接4单元的光盘。这个片段可以被使用很多次,因为有必要... –

+0

大声笑,是的,这听起来像另一个不错的;-) – TaW

+0

我不能做这些。我的板子不是长方形的,它是一个图像。而在第一种选择中,大尺寸的电影盒只能用于一件作品,它会隐藏其他作品。 –

1

只需在棋子后画棋盘。

如果您使用板子的图像,只要确保存在透明度通道即可。你可以找到更多的解释on MSDN

如果您使用矢量线画图板,只要您不在孔中画任何东西,就不会出现问题。

+0

为了加快绘图过程,Tarek可以仅绘制一次棋盘,并将棋子的像素限制/遮蔽到棋盘图像透明的坐标处。 –

+0

我不能画出棋盘后,他们必须摔倒,当用户点击董事会的一列。 我检查了msdn链接,它运行的很好,但如果使用该代码,我无法将板块从顶部移动到底部。 这件作品应该放在一个picturebox里面 –

+1

因为你可能会被限制使用特定的技术,所以我们可能会看到确切的作业。但是,Axel的意思是,当您绘制并重绘光盘时,您可以通过重绘网格线来完成每次重绘。这样网格线总是显示在前面。 –

0

另一种选择:

  1. 绘制电路板(或负载从图像),伴或不透明度。 WinForms中的大多数控件(窗体,面板,picturebox等)都支持BackgroundImage或一些其他大容量图像加载作为基础层。

  2. 在棋盘上正确绘制每个棋子的顶部,但是剪裁/遮罩/操作圆形棋子,以便只有正确的圆形部分通过棋盘上的“洞”显示出来。你只需要知道棋盘图像中洞的位置就可以计算出来,并且它会使棋子看起来好像它们在棋盘内“一样”,就像它们在现实中一样。

+0

因为我的板子有圆形孔,所以会很困难:/我只是想把棋子放在棋盘后面 –

+0

然后你可以做相反的事情:首先画出所有棋子(和正常的圆圈一样),然后覆盖棋盘。我知道这是你的原始问题,但不知道如何去做 - 似乎有一个可行的例子[这里](http://lextendo.blogspot.com/2012/10/transparent-picturebox-overlay-in .html)使用父/子pictureboxes来实现分层,尽管之前没有使用过这种特殊的技术。 – SlimsGhost

+0

@TarekGhamrawi - 实际上,从董事会中排除区域似乎相当直接 - 在您的情况下,排除“漏洞”,使其透明。你可能想看看[this](http://stackoverflow.com/questions/13039699/system-drawing-invert-region-build-out-of-path)。我认为,如果您绘制修剪过的图像或其反转版本(“孔”未被绘制),您可以获得所需的图像。 – SlimsGhost