在具有透明孔的另一图像后面移动图像
本文关键字:图像 移动 透明 | 更新日期: 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+命令
FillRectangle
和FillEllipse
绘制所有图形 - 使用保持栅格和片段位图的控件
我想你是在尝试第二种选择。
但是,在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上找到更多解释。
如果你用矢量线绘制电路板,只要你在孔里什么都没画就没有问题。
另一个选项:
-
绘制板(或从图像加载),有或没有透明度。WinForms中的大多数控件(窗体、面板、picturebox等)都支持BackgroundImage或其他批量图像加载作为基本层。
-
在板的顶部适当地画出每一块,但要夹住/遮盖/操纵圆形的部分,使圆形的正确部分通过板上的"孔"显示出来。你只需要知道木板图像中孔的位置就可以计算出这一点,这会让这些碎片看起来像是"在"木板里,就像它们在现实中一样。