很长一段时间以来我一直在挑战这个问题。简而言之,我想避免两个图片框之间的冲突。当pictureBox1看到pictureBox2时,必须停止。但是,我确实通过Intersect做到了这一点。像下面的代码一样;
private void method(PictureBox b)
{
if (pictureBox1.Bounds.IntersectsWith(b.Bounds)) {
movement = false;}
}
问题是按键。我用KeyDown(W,A,S,D)移动pictureBox1,当我按住这些键时,相交代码可以很好地工作。但是,当我一键按下时,它只是滑入pictureBox2中。如何避免这种情况?我确实尝试用boolean来阻止它,但是没有用。我想我需要if语句,但我无法做出逻辑。寻找您的解决方案。预先感谢。
KeyDown事件;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (movement == true)
{
int x = pictureBox1.Location.X;
int y = pictureBox1.Location.Y;
if (e.KeyCode == Keys.W) y -= chrspeed;
else if (e.KeyCode == Keys.A) x -= chrspeed;
else if (e.KeyCode == Keys.D) x += chrspeed;
else if (e.KeyCode == Keys.S) y += chrspeed;
pictureBox1.Location = new Point(x, y);
method(pictureBox2);
}
}
chrspeed是20;
KeyUp事件;
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
movement = true;
}
答案 0 :(得分:0)
我将其放入KeyDown事件处理程序并删除KeyUp事件处理程序。代码的问题在于,每次释放密钥时, movement
标志都会重置为true。
这应该做您想要的:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x = pictureBox1.Location.X;
int y = pictureBox1.Location.Y;
if (e.KeyCode == Keys.W) y -= chrspeed;
else if (e.KeyCode == Keys.A) x -= chrspeed;
else if (e.KeyCode == Keys.D) x += chrspeed;
else if (e.KeyCode == Keys.S) y += chrspeed;
Rectangle newRect = new Rectangle(x, y, pictureBox1.Width, pictureBox1.Height);
if (!newRect.Bounds.IntersectsWith(pictureBox2.Bounds)) {
pictureBox1.Location = new Point(x, y);
}
}
}
不需要movement
标志。它的作用是,如果两个图片框不相交,它将设置新位置。
请注意,当图片框发生碰撞时,您仍然可以按另一个键再次移开。
Edit
:
您的评论绝对正确,对此表示抱歉。 我现在更改了代码,因此它使用新位置来计算它们是否相交。
答案 1 :(得分:0)
在您的代码中发生的事情“可行”了(没有,您很幸运)是,两个Picbox第一次相交,picbox1在picbox2中移动,method
返回了false
,下次它没有输入if
语句。
您需要先致电method()
,然后再移动picbox1,然后然后检查true or false
:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x = pictureBox1.Location.X;
int y = pictureBox1.Location.Y;
if (e.KeyCode == Keys.W) y -= chrspeed;
else if (e.KeyCode == Keys.A) x -= chrspeed;
else if (e.KeyCode == Keys.D) x += chrspeed;
else if (e.KeyCode == Keys.S) y += chrspeed;
method(new Rectangle(x, y, pictureBox1.Width, pictureBox1.Height), pictureBox2 );
if (movement == true)
{
pictureBox1.Location = new Point(x, y);
}
}
和
private void method(Rectangle rect, PictureBox b)
{
if (rect.IntersectsWith(b.Bounds)) {
movement = false;}
}