2011-08-24 55 views
0

我正在制作像太空侵略者一样的射击游戏。我的PictureBox pb不会使用按键移动,并且在PictureBox pb1上有问题,空间光盘在一秒钟后消失。它不会左右移动。使用按键和定时器移动PictureBox的帮助

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

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); 
     } 

    } 
} 

}

回答

1

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 +上的this FAQ。这也是帮助我欣赏多年前在WinForm中很好地绘制的同一个例子。 :)

简而言之:

  • 调整代码为游戏
  • 创建自定义控制然后渲染“当前”图像(即从Control继承的对象)的各帧的图像创建插入到控件的图形对象中(重写OnPaint方法来完成此操作)。