C# 如何使PictureBox反弹?

C# 如何使PictureBox反弹?,c#,winforms,C#,Winforms,对于我在C#WinForms中的太空入侵者游戏,我有以下代码,它根据玩家的箭头键输入移动玩家的大炮: void Game_Screen_KeyDown(object sender, KeyEventArgs e) { for (int i = 0; i < 100; i++) { if (Form1.lives != 0) { if (e.KeyCode == Keys.

对于我在C#WinForms中的太空入侵者游戏,我有以下代码,它根据玩家的箭头键输入移动玩家的大炮:

void Game_Screen_KeyDown(object sender, KeyEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            if (Form1.lives != 0)
            {
                if (e.KeyCode == Keys.Left)
                {
                    cannonBox.Location = new Point(cannonBox.Left -= 2, cannonBox.Top); //Changes location of cannonBox to a new location to the left
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(10);
                }

                else
                if (e.KeyCode == Keys.Right)
                {
                    cannonBox.Location = new Point(cannonBox.Left + 2, cannonBox.Top); //Changes location of cannonBox to a new location to the right
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(10); //Delays the movement by couple milliseconds to stop instant movement
                }
            }

        }
    }
void Game\u Screen\u KeyDown(对象发送器,KeyEventArgs e)
{
对于(int i=0;i<100;i++)
{
如果(Form1.lives!=0)
{
if(e.KeyCode==Keys.Left)
{
cannonBox.Location=新点(cannonBox.Left-=2,cannonBox.Top);//将cannonBox的位置更改为左侧的新位置
Application.DoEvents();
系统线程线程睡眠(10);
}
其他的
if(e.KeyCode==Keys.Right)
{
cannonBox.Location=新点(cannonBox.Left+2,cannonBox.Top);//将cannonBox的位置更改为右侧的新位置
Application.DoEvents();
System.Threading.Thread.Sleep(10);//将移动延迟几毫秒以停止即时移动
}
}
}
}
然而,当炮弹箱到达形态的边界时,它会继续前进,我想让它反弹并朝着另一个方向前进。我曾想过并尝试使用类似的东西,但要找到它与以下物体相交的精确位置确实很困难:

if (cannonBox.Location == new Point(763, 50))
{
     for (int i = 0; i < 50; i++)
            {
                cannonBox.Location = new Point(cannonBox.Left - 2, cannonBox.Top);
            }
     Application.DoEvents();
     System.Threading.Thread.Sleep(10);
}
if(cannonBox.Location==新点(763,50))
{
对于(int i=0;i<50;i++)
{
cannonBox.Location=新点(cannonBox.Left-2,cannonBox.Top);
}
Application.DoEvents();
系统线程线程睡眠(10);
}

对于您的请求,这里有一个示例,说明如何继续移动并使图片框从表单的另一侧出现。
另一件事是@S.Serp评论说,最好不要在该任务中使用for循环,但我想您的代码是为了学习。
另外:
1。最好不要使用
Application.DoEvents()
它可能会导致问题()。阅读C#中的
async
等待
关键字,并使用它代替
Application.DoEvents()

2.不要硬编码表单/屏幕在我的示例中使用变量-
screenSize

public Size screenSize;
private void Game_Screen_Load(object sender, EventArgs e)
{
    screenSize = this.Size;
}



private void Game_Screen_KeyDown(object sender, KeyEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {

        if (Form1.lives != 0)
        {
            if (e.KeyCode == Keys.Left)
            {

                if (cannonBox.Location.X < 0)
                {
                    cannonBox.Location = new Point(cannonBox.Left = this.Width, cannonBox.Top);
                }

                cannonBox.Location = new Point(cannonBox.Left -= 2, cannonBox.Top); //Changes location of cannonBox to a new location to the left
                Application.DoEvents();
                System.Threading.Thread.Sleep(10);
            }

            else
            if (e.KeyCode == Keys.Right)
            {

                if (cannonBox.Location.X + cannonBox.Width > screenSize.Width)
                {
                    cannonBox.Location = new Point(cannonBox.Left = 0 - cannonBox.Width, cannonBox.Top);
                }

                cannonBox.Location = new Point(cannonBox.Left + 2, cannonBox.Top); //Changes location of cannonBox to a new location to the right
                Application.DoEvents();
                System.Threading.Thread.Sleep(10); //Delays the movement by couple milliseconds to stop instant movement
            }
        }

    }
}
公共尺寸屏幕尺寸;
私有无效游戏\u屏幕\u加载(对象发送者,事件参数e)
{
screenSize=这个.Size;
}
私有无效游戏\u屏幕\u键关闭(对象发送器,KeyEventArgs e)
{
对于(int i=0;i<100;i++)
{
如果(Form1.lives!=0)
{
if(e.KeyCode==Keys.Left)
{
if(炮弹箱位置X<0)
{
cannonBox.Location=新点(cannonBox.Left=this.Width,cannonBox.Top);
}
cannonBox.Location=新点(cannonBox.Left-=2,cannonBox.Top);//将cannonBox的位置更改为左侧的新位置
Application.DoEvents();
系统线程线程睡眠(10);
}
其他的
if(e.KeyCode==Keys.Right)
{
if(cannonBox.Location.X+cannonBox.Width>screenSize.Width)
{
cannonBox.Location=新点(cannonBox.Left=0-cannonBox.Width,cannonBox.Top);
}
cannonBox.Location=新点(cannonBox.Left+2,cannonBox.Top);//将cannonBox的位置更改为右侧的新位置
Application.DoEvents();
System.Threading.Thread.Sleep(10);//将移动延迟几毫秒以停止即时移动
}
}
}
}

您的代码中有几个问题。您不应该像这样使用for循环来响应用户键输入,而应该使用键事件。第二,你所说的“当炮弹箱到达形态的边界时,它会继续前进,我想让它反弹并朝着另一个方向前进”到底是什么意思?若用户保留左键,通常可以将其保留在窗体的左侧(零x位置),而不是向右移动。是吗?@S.Serp但是当我不使用for循环时,运动就不是那么平稳了。此外,当炮弹箱到达表单的边界时,它就会爆炸,我不希望用户这样做that@wakiwaki为什么不继续移动,使图片框从窗体的另一侧出现?很多游戏都使用这种行为。@jonathana我怎么能做到?我对C#
if(picturebox.Left)是个新手