我正在尝试用c#编写一个小游戏,游戏涉及移动敌人。 使用以下代码生成这些敌人,此代码多次使用以产生多个敌人。
private void EventHandler(Action<object, EventArgs> spawnBox)
{
Random randomPlek = new Random();
int xPlek;
xPlek = randomPlek.Next(1000, 1100);
int yPlek;
yPlek = (randomPlek.Next(0, 8)) * 100;
var picture = new PictureBox
{
Name = "pictureBoxLM",
Size = new Size(150, 100),
SizeMode = PictureBoxSizeMode.StretchImage,
BackColor = Color.Transparent,
Location = new Point(xPlek, yPlek),
Image = Leeuwenmier,
};
this.Controls.Add(picture);
}
问题是,当试图让它们移动或碰撞时,Visual Studio找不到名称并给出错误。这是我用于碰撞的代码:
if(PbMier.Bounds.IntersectsWith(pictureBoxLM.Bounds))
{
// some actions
}
如何在代码中调用衍生的图片框而不会出错?
答案 0 :(得分:1)
WinForms控件具有名称,但这并不意味着您可以使用该名称作为C#标识符来访问它们。
您的PictureBox在EventHandler()
中只有一个命名引用,即picture
,但是一旦控件离开该方法,引用就会超出范围。
您需要再次找到控件,或者找到另一种方法来引用生成的控件。
所以:
var allPictureBoxes = this.Controls.Find("PictureBoxLM");
foreach (var pictureBox in allPictureBoxes)
{
// ...
}
或者把它放在你的表格上:
List<PictureBox> pictureBoxList = new List<PictureBox>();
然后在EventHandler()
;
this.Controls.Add(picture);
pictureBoxList.Add(picture);
之后,您可以将其用于碰撞检测:
foreach (var pictureBox in pictureBoxList)
{
// ...
}