如何使透明面板的图片框出现?
How make pictureboxes of a transparent Panel to appear?
我正在制作 windows 形式的 2D 游戏,但我遇到了问题...
所以,我有一个面板,其中所有 "Ground" Tiles (PictureBox[]) 都是...但是我需要在 "Ground Tiles" 上面有另一个面板,而不是仅仅设置 PictureBox.Image ,所以它看起来像是玩家在某物后面......但是那个面板需要是透明的,并且它的图片框需要出现才能产生效果,但它没有......我放置瓷砖(PictureBox)的原因在 Panel 内部,这是因为我想制造一种错觉,即相机聚焦在玩家身上(意味着玩家并没有真正移动,是 Panels 在移动)。
有人能帮帮我吗?我知道它看起来很复杂...抱歉...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using World;
namespace World
{
public partial class LoadWorld : Form
{
public int TileSizeX = 30;
public int TileSizeY = 30;
public int TileT = 2500;
public int TileX = 49;
public int TileY = 49
//Here's the problematic panel
public Panel PropPanel = new Panel();
public PictureBox[] WorldTile = new PictureBox[2500];
public PictureBox[] PropTile = new PictureBox[2500];
public static Dictionary<PictureBox, int[]> tileProp = new Dictionary<PictureBox, int[]>();
public LoadWorld()
{
InitializeComponent();
}
private void LoadWorld_Load(object sender, EventArgs e)
{
//settings of the PropPanel
PropPanel.BorderStyle = BorderStyle.None;
PropPanel.BringToFront();
PropPanel.BackColor = Color.Transparent;
PropPanel.Visible = true;
PropPanel.Name = "PropPanel";
PropPanel.TabIndex = 0;
int valueA = 0;
int valueX = 0;
int valueY = 0;
foreach (PictureBox pictureBoxValue in WorldTile)
{
if(valueY < TileY)
{
if(valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueX = valueX + 1;
}
else if(valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueY = valueY + 1;
valueX = 0;
}
}
else if(valueY == TileY)
{
if (valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueX = valueX + 1;
valueA = valueA + 1;
}
else if (valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
}
}
}
SetGroundTiles();
SetPropTiles();
}
public void SetGroundTiles()
{
SGT(1, "grass");
SGT(2, "DirtPathVSideL");
SGT(3, "DirtPathCenter");
SGT(4, "DirtPathVSideR");
//Road
SGT(9, "SidewalkMiddle");
SGT(10, "Asphalt");
SGT(11, "Asphalt");
SGT(12, "Asphalt2YL");
SGT(13, "Asphalt");
SGT(14, "Asphalt");
SGT(15, "GrassConcreteHL");
SGT(59, "SidewalkMiddle");
SGT(60, "Asphalt");
SGT(61, "Asphalt");
SGT(62, "Asphalt2YL");
SGT(63, "Asphalt");
SGT(64, "Asphalt");
SGT(65, "GrassConcreteHL");
SGT(109, "SidewalkMiddle");
SGT(110, "Asphalt");
SGT(111, "Asphalt");
SGT(112, "Asphalt2YL");
SGT(113, "Asphalt");
SGT(114, "Asphalt");
SGT(115, "GrassConcreteHL");
}
public void SetPropTiles()
{
SPT(9, "SmallTree2", true, false);
SPT(60, "SmallTree1", false, true);
}
public void SGT (int valueA, string texture)
{
WorldTile[valueA].BackgroundImage = new Bitmap("Sprites/" + texture + ".png");
}
public void SPT(int valueA, string texture, bool Collide, bool IsOverlaying)
{
PropTile[valueA] = new PictureBox
{
Name = "Panel" + valueA,
Image = new Bitmap("Sprites/" + texture + ".png"),
Location = WorldTile[valueA].Location,
Size = WorldTile[valueA].Size,
Visible = true,
BackColor = Color.Transparent,
};
//Where PropPanel is being used
PropTile[valueA].BorderStyle = BorderStyle.None;
PropPanel.BringToFront();
PropPanel.Controls.Add(PropTile[valueA]);
WorldMap.Controls.Add(PropPanel);
}
}
}
这就像在另一个面板上叠加一个透明面板...
我试图将第二个面板设置为透明,但它的图像没有出现。
view of the tiles
This may help you to understand
我想做的基本上是3层面板...
PropTextures(比如玩家是否在某物后面)
Player Texture / PropTextures(与物体碰撞)
地面纹理(玩家可以或不能行走的地方)
PictureBox 控件未提供您尝试使用的透明度。如果您继续当前的方法,我认为您不会有太多运气。
这里有一个替代方法的提示。如果您在使用 PictureBox 控件等时遇到困难,那么您可以自己进行渲染。创建一个 DoubleBuffered 的 UserControl,并在 Paint 事件中,为每个精灵调用 Graphics.DrawImage 以将每个图像渲染到正确的位置。这种技术的好处在于,以这种方式绘制精灵时,您将获得正确的 alpha-correct 合成。请务必对它们进行排序,以便从后向前绘制它们,"paint over" 背景精灵使用前景精灵。
我正在制作 windows 形式的 2D 游戏,但我遇到了问题... 所以,我有一个面板,其中所有 "Ground" Tiles (PictureBox[]) 都是...但是我需要在 "Ground Tiles" 上面有另一个面板,而不是仅仅设置 PictureBox.Image ,所以它看起来像是玩家在某物后面......但是那个面板需要是透明的,并且它的图片框需要出现才能产生效果,但它没有......我放置瓷砖(PictureBox)的原因在 Panel 内部,这是因为我想制造一种错觉,即相机聚焦在玩家身上(意味着玩家并没有真正移动,是 Panels 在移动)。
有人能帮帮我吗?我知道它看起来很复杂...抱歉...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using World;
namespace World
{
public partial class LoadWorld : Form
{
public int TileSizeX = 30;
public int TileSizeY = 30;
public int TileT = 2500;
public int TileX = 49;
public int TileY = 49
//Here's the problematic panel
public Panel PropPanel = new Panel();
public PictureBox[] WorldTile = new PictureBox[2500];
public PictureBox[] PropTile = new PictureBox[2500];
public static Dictionary<PictureBox, int[]> tileProp = new Dictionary<PictureBox, int[]>();
public LoadWorld()
{
InitializeComponent();
}
private void LoadWorld_Load(object sender, EventArgs e)
{
//settings of the PropPanel
PropPanel.BorderStyle = BorderStyle.None;
PropPanel.BringToFront();
PropPanel.BackColor = Color.Transparent;
PropPanel.Visible = true;
PropPanel.Name = "PropPanel";
PropPanel.TabIndex = 0;
int valueA = 0;
int valueX = 0;
int valueY = 0;
foreach (PictureBox pictureBoxValue in WorldTile)
{
if(valueY < TileY)
{
if(valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueX = valueX + 1;
}
else if(valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueY = valueY + 1;
valueX = 0;
}
}
else if(valueY == TileY)
{
if (valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueX = valueX + 1;
valueA = valueA + 1;
}
else if (valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
}
}
}
SetGroundTiles();
SetPropTiles();
}
public void SetGroundTiles()
{
SGT(1, "grass");
SGT(2, "DirtPathVSideL");
SGT(3, "DirtPathCenter");
SGT(4, "DirtPathVSideR");
//Road
SGT(9, "SidewalkMiddle");
SGT(10, "Asphalt");
SGT(11, "Asphalt");
SGT(12, "Asphalt2YL");
SGT(13, "Asphalt");
SGT(14, "Asphalt");
SGT(15, "GrassConcreteHL");
SGT(59, "SidewalkMiddle");
SGT(60, "Asphalt");
SGT(61, "Asphalt");
SGT(62, "Asphalt2YL");
SGT(63, "Asphalt");
SGT(64, "Asphalt");
SGT(65, "GrassConcreteHL");
SGT(109, "SidewalkMiddle");
SGT(110, "Asphalt");
SGT(111, "Asphalt");
SGT(112, "Asphalt2YL");
SGT(113, "Asphalt");
SGT(114, "Asphalt");
SGT(115, "GrassConcreteHL");
}
public void SetPropTiles()
{
SPT(9, "SmallTree2", true, false);
SPT(60, "SmallTree1", false, true);
}
public void SGT (int valueA, string texture)
{
WorldTile[valueA].BackgroundImage = new Bitmap("Sprites/" + texture + ".png");
}
public void SPT(int valueA, string texture, bool Collide, bool IsOverlaying)
{
PropTile[valueA] = new PictureBox
{
Name = "Panel" + valueA,
Image = new Bitmap("Sprites/" + texture + ".png"),
Location = WorldTile[valueA].Location,
Size = WorldTile[valueA].Size,
Visible = true,
BackColor = Color.Transparent,
};
//Where PropPanel is being used
PropTile[valueA].BorderStyle = BorderStyle.None;
PropPanel.BringToFront();
PropPanel.Controls.Add(PropTile[valueA]);
WorldMap.Controls.Add(PropPanel);
}
}
}
这就像在另一个面板上叠加一个透明面板... 我试图将第二个面板设置为透明,但它的图像没有出现。
view of the tiles
This may help you to understand
我想做的基本上是3层面板...
PropTextures(比如玩家是否在某物后面)
Player Texture / PropTextures(与物体碰撞)
地面纹理(玩家可以或不能行走的地方)
PictureBox 控件未提供您尝试使用的透明度。如果您继续当前的方法,我认为您不会有太多运气。
这里有一个替代方法的提示。如果您在使用 PictureBox 控件等时遇到困难,那么您可以自己进行渲染。创建一个 DoubleBuffered 的 UserControl,并在 Paint 事件中,为每个精灵调用 Graphics.DrawImage 以将每个图像渲染到正确的位置。这种技术的好处在于,以这种方式绘制精灵时,您将获得正确的 alpha-correct 合成。请务必对它们进行排序,以便从后向前绘制它们,"paint over" 背景精灵使用前景精灵。