2017-10-14 70 views
-1
private void ingame_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Space) 
     { 
      bullet = new PictureBox(); 
      bullet.Image = WindowsFormsApplication1.Properties.Resources.bullet; 
      bullet.Size = new Size(8, 30); 
      bullet.Location = new Point(246, 364); 
      bullet.SizeMode = PictureBoxSizeMode.StretchImage; 
      bullet.BackColor = Color.Transparent; 

      this.Controls.Add(bullet); 

      this.SuspendLayout(); 
      bullet.Location = new Point(bullet.Location.X, bullet.Location.Y - 10); 
      this.ResumeLayout(); 
      timer1.Interval = 10; 
      timer1.Start(); 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     bullet.Location = new Point(bullet.Location.X, bullet.Location.Y-1); 
    } 

每一次在一次空格鍵點擊一個新的子彈創建移動多個pictureboxes,但如果你有一顆子彈已經在屏幕上凍結,而新的移動。有沒有辦法讓他們兩個/更多的移動?在相同的變量名C#

+0

哪裏是你的'bullet'變量實際上宣告?你的意思是保留一堆子彈而不是一個?像「列表」一樣? – David

+0

如果你想跟蹤多顆子彈,那麼你需要一個集合。考慮一個'List '。有一些運氣會發展成一個名單。 –

+0

謝謝,它只是在程序外面聲明爲「public PictureBox bullet;」 – space482

回答

0

你有什麼是PictureBox。你想要的是一個List<PictureBox>。例如:

public List<PictureBox> bullets = new List<PictureBox>(); 

(我會建議一個私有成員,甚至是屬性,但只是爲了保持最小的變化,從當前的代碼,這應該是好的。)

首先,從刪除您的定時器邏輯KeyDown事件並將其放在只執行一次的地方,如FormLoad。你只需要一個計時器滴答。

然後在您的KeyDown事件中,向列表中添加新的「項目符號」。事情是這樣的:

if (e.KeyCode == Keys.Space) 
{ 
    // declare a local variable 
    var bullet = new PictureBox(); 

    // set the rest of the properties and add the control to the form like you normally do 

    // but also add it to the new class-level list: 
    bullets.Add(bullet); 
} 

然後在你的計時器滴答事件,只需通過列表循環:

foreach (var bullet in bullets) 
    bullet.Location = new Point(bullet.Location.X, bullet.Location.Y-1);