使用按键和计时器帮助移动PictureBox

本文关键字:帮助 移动 PictureBox 计时器 | 更新日期: 2023-09-27 18:06:28

我正在制作一款像《太空入侵者》这样的射击游戏。我的PictureBox pb不会使用键移动,我在PictureBox pb1上有问题,空间盘在一秒钟后消失。它不会左右移动。

这是我到目前为止的代码。

namespace SpaceShoot
{
class Shoot
{
    private Form f;
    private Button bLeft, bRight;
    private PictureBox pb;
    private PictureBox pb1;
    private Boolean check = false;
    private int X, Y;
    Timer Clock = new Timer();
    private int k = 0;
    int x = 0;
    public Shoot()
    {
        f = new Form();
        bLeft = new Button();
        bRight = new Button();
        pb = new PictureBox();  //spaceship
        pb1 = new PictureBox(); //spacedisc
        Clock = new Timer();
    }
    public void Launch()
    {
        pb1.Image = new Bitmap("spacedisc.png");
        pb1.SetBounds(20, 20, 120, 70);
        pb1.SizeMode = PictureBoxSizeMode.StretchImage;
        f.BackColor = System.Drawing.Color.Black;
        f.Size = new Size(700, 700);
        f.StartPosition = FormStartPosition.CenterScreen;
        f.Controls.Add(pb);
        f.Controls.Add(pb1);
        bLeft.KeyDown += new KeyEventHandler(Space_KeyDown);
        bRight.KeyDown += new KeyEventHandler(Space_KeyDown);
        pb.SetBounds(300, 580, 60, 60);
        pb.Image = new Bitmap("spaceship.png");         
        pb.SizeMode = PictureBoxSizeMode.StretchImage;
        Clock = new Timer();
        Clock.Interval = 800;
        Clock.Tick += new EventHandler(Clock_Tick);
        Clock.Start();
        f.ShowDialog();
    }
    public void Clock_Tick(object sender, EventArgs e)
    {
        for (x = 0; x >= 0; x += 2)
        {
            pb1.Location = new Point(0 + x, 20);
        }
        for (x = 500; x >= 500; x -= 2)
        {
            pb1.Location = new Point(500 - x, 20);
        }
         f.Invalidate();           
    }
    public void Space_KeyDown(object sender, KeyEventArgs e)
    {
        int x = pb.Location.X;
        if (e.KeyCode == Keys.Right)
        {
            x += 5;
            pb.Location = new Point(300 + x, 580);
        }
        else if (e.KeyCode == Keys.Left)
        {
            x -= 5;
            pb.Location = new Point(300 + x, 580);
        }
    }
}

}

使用按键和计时器帮助移动PictureBox

0 0 ....从哪里开始呢?好吧,一件一件来。

第一个关闭,你有一个无限循环:

            for (x = 0; x >= 0; x += 2)
            {
                pb1.Location = new Point(0 + x, 20);
            }

所以应用程序永远不会运行超过一个刻度。

其次你正在运行一个对话框....我真的不建议这样做。替换:

f.ShowDialog();

:

Application.Run(f);

你的program.cs可能看起来像这样:

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Shoot shoot = new Shoot();
        shoot.Launch();

如果你已经在一个WinForm应用程序中,那么只需。show()窗体和。hide()任何先前的窗体。

第三…我很感激你可能只是在这里找乐子但无论如何,这是一种非常糟糕的使用WinForm制作游戏的方法。Windows控件不是为这种方式而设计的,你最终会遇到一些剪贴、透明度和其他渲染问题。我的建议是,让游戏更新绘制到整个窗体控制范围内的图像。这样,你就可以一次完成所有的渲染,而不必依赖于你正在使用的每个控件的许多单独的绘制方法。屏幕上的精灵越多,缩放效果越好(因为控件是相对较重的物体)。

我强烈推荐阅读GDI+的常见问题解答。多年前,它帮助我理解如何在WinForm中很好地绘图。:)

简而言之:

  • 组织你的代码为游戏的每一帧创建图像
  • 创建一个自定义控件(从control继承的对象),然后呈现"当前";