【问题标题】:controlling a spawned picturebox控制生成的图片框
【发布时间】:2018-06-18 18:58:51
【问题描述】:

我正在尝试用 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
            }

如何在代码中调用生成的图片框而不报错?

【问题讨论】:

    标签: c# winforms


    【解决方案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)
    {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多