我会尽量保持这一点。
这是我的代码:
foreach (Control c in this.Controls)
{
if (c.Height > 25)
{
c.BackColor = Color.Red;
pictureBox1.Location = new Point(x1, y1);
if (pictureBox1.Bounds.IntersectsWith(c.Bounds))
{
isCollide = true;
label1.Text = "true";
c.BackColor = Color.Green;
}
else
{
isCollide = false;
label1.Text = "false";
}
}
}
我的目标是遍历表单上的所有控件,并检测所有高度超过25像素的控件,这决定了它们是否是我游戏中的墙。
“isCollide”变量被设置为“true”只会使它无法通过它。
问题是它只影响1个图片框(墙)。但是,我选择将所有选定控件的颜色更改为绿色作为检查以查看哪些控件受到循环影响,但这会影响所有墙,因为它应该...
我的问题是,为什么颜色会影响我的代码循环的所有控件,但碰撞检测对它们都不起作用?是因为“isCollide”变量同时设置为“false”和“true”,因为与一面墙碰撞并且同时不与另一面碰撞?
我该如何解决这个问题?
这是使用“isCollide”的代码:
public void move(string Direction)
{
if (Direction == "Up")
{
//b = x / a = y
reset();
x1 = x;
y1 = y - 5;
isCollided();
if (isCollide == false)
{
y -= 5;
}
}
*注意:不是代码的结尾,类似的代码已应用于所有方向(顶部,左侧,右侧,底部)
答案 0 :(得分:0)
这是因为isCollide
只是本地变量,而不是您的c.BackColor
所控制的属性。
您需要在Control类上定义isCollide
以保留Controls列表中每个控件对象的isCollide状态:
public class Control
{
public bool isCollide {get; set;}
public string BackColor {get; set;}
public int Height {get; set;}
}
foreach (Control c in this.Controls)
{
if (c.Height > 25)
{
c.BackColor = Color.Red;
pictureBox1.Location = new Point(x1, y1);
if (pictureBox1.Bounds.IntersectsWith(c.Bounds))
{
c.isCollide = true;
label1.Text = "true";
c.BackColor = Color.Green;
}
else
{
c.isCollide = false;
label1.Text = "false";
}
}
}
答案 1 :(得分:0)
另一个原因可能是表单上的控件嵌套在容器中(例如GroupBox
)。
在这种情况下,您还必须递归检查其 Control
属性中的元素。
答案 2 :(得分:0)
isCollide的最终值将基于foreach循环中迭代的最后一个控件的碰撞。如果您不关心碰撞发生在哪个对象上,我建议一旦发现碰撞就会断开循环。 这样的事情。
foreach (Control c in this.Controls)
{
if (c.Height > 25)
{
c.BackColor = Color.Red;
pictureBox1.Location = new Point(x1, y1);
if (pictureBox1.Bounds.IntersectsWith(c.Bounds))
{
isCollide = true;
label1.Text = "true";
c.BackColor = Color.Green;
break;
}
else
{
isCollide = false;
label1.Text = "false";
}
}
}