繁体   English   中英

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

[英]Help with moving PictureBox using keys and timers

我正在制作一款类似于太空入侵者的射击游戏。 我的 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);
        }

    }
}

}

oOo.... 从哪里开始? 好吧,一次做一件事。

首先,你有一个无限循环:

            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+ 上的这个FAQ。 多年前,它帮助我了解如何在 WinForm 中很好地绘图。 :)

简而言之:

  • 组织您的代码,为游戏的每一帧创建图像
  • 创建一个自定义控件(一个从 Control 继承的对象),然后将“当前”图像渲染到该控件的图形对象中(重写 OnPaint 方法来执行此操作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM