2012-10-20 50 views
2

我想在C#(窗体)中制作迷你游戏,就像太空侵略者一样。飞船飞得很好,但我没有得到多个镜头,我有一个方法timer_Tick来制作动画,当我按下空间拍摄时,第一个镜头工作正常,但第二个镜头。这一半位置的第一枪消失了。镜头是pictureBox,我试过列表pictureBox,但没有成功。迷你游戏形式

我有这样的事情:

public void Form1_Load(object sender, EventArgs e) 
    { 
     shootP = new PictureBox(); 
     shootP.Image = Properties.Resources.shoot_1; 
     shootP.SizeMode = PictureBoxSizeMode.Zoom; 
     shootP.Size = new Size(10, 72); 
     ListShoot = new List<PictureBox>();  
     int i = -1; 
    } 
    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 

     if (e.KeyCode == Keys.Space) 
     { 
     control = false; 
     i++; 
     ListShoot.Add(shootP); 
     timeShoot.Start(); 
    } 

     private void timeShoot_Tick(object sender, EventArgs e) 
     { 
     if (control == false) 
     { 
      ListShoot[i].Location = new Point(spacecraft._imageBox.Location.X + 50, spacecraft._imageBox.Location.Y - 55); // align the shoot with spacecraft 
      control = true;  
     } 

      ListShoot[i].Top -= 40; 
     } 

我在做什么错?

+1

我想你必须在ListShoot.Add(shootP)后面添加ListShoot [i] .Location = new ...并完全移除if(control == false)子句,因为它被调用一次 –

回答

1

您正在添加相同的PictureBox。你可以尝试创建一个新的。 将此锥体加入Form1_KeyDown

shootP = new PictureBox(); 
    shootP.Image = Properties.Resources.shoot_1; 
    shootP.SizeMode = PictureBoxSizeMode.Zoom; 
    shootP.Size = new Size(10, 72); 

在你应该尽快

+0

哦,上帝......工作,但在第二次拍摄,在途中停止第一站 – cesar

+0

? – aliassce

+0

由于@StefanGriffiths没有足够的代表发表评论我发布了他的问题作为他的评论: 我目前正在做这个项目现在在大学,我只是在上面显示的代码中徘徊什么是“shootp”。在你的空间入侵者游戏 – PiotrWolkowski

3

您需要创建一个新的形象每一次,像aliassce的答案中使用OOP另一方面。

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Space) 
    { 
     control = false; 
     shootP = new PictureBox(); 
     shootP.Image = Properties.Resources.shoot_1; 
     shootP.SizeMode = PictureBoxSizeMode.Zoom; 
     shootP.Size = new Size(10, 72); 
     ListShoot.Add(shootP); 
     timeShoot.Start(); 
    } 
} 

然后,您需要更新列表中所有图像的位置。使用foreach循环并抛弃int迭代器。

private void timeShoot_Tick(object sender, EventArgs e) 
    { 
    if (control == false) 
    { 
     foreach PictureBox shot in ListShot 
     { 
      shot.Location = new Point(spacecraft._imageBox.Location.X + 50, spacecraft._imageBox.Location.Y - 55); // align the shoot with spacecraft 
      shot.Top -= 40; 
     } 
     control = true; 
    } 
    } 

您可能需要更新代码以绘制图像以循环访问List。喜欢的东西:

foreach PictureBox shot in ListShoot 
{ 
    draw(shot); 
} 

最后,你可能会想清理名单飘飞摆脱不再在屏幕上,不需要再被更新或绘制的任何镜头。

+0

谢谢阁下......但是,Timer_tick方法重复了自己,shot.top - = 40;需要朗姆酒数次才能爆发。我做这个。 如果(e.KeyCode == Keys.Space) { tiroP.Location =新.... } 定时器... 的foreach(图片框拍在ListTiro) { shot.Top - = 40 ; Controls.Add(shot); } – cesar