2017-10-14 11 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); 
    } 

スペースバーをクリックするたびに新しい箇条書きが作成されますが、既に画面上にある箇条書きが凍っていて、それらを両方の/もっと動かす方法はありますか?あなたが持っているもの同じ変数名で同時に複数のピクチャボックスを移動するC#

+0

?弾丸のコレクションをただ1つではなく保管することを意味しましたか? 'List 'のように? – David

+0

複数の弾丸を追跡したい場合は、コレクションが必要です。 'List 'を考えてみましょう。いくつか運があれば 'List 'に進化するだろう。 –

+0

ありがとうございます。「Public PictureBox bullet;」という手順の外で宣言されています。 – space482

答えて

0

PictureBoxです。あなたが欲しいのはList<PictureBox>です。たとえば:

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

(私はプライベートメンバ、あるいは財産をお勧めしますが、ちょうどあなたの現在のコードから最小限の変更を維持するために、これは問題ないはずです。)

まず、からあなたのタイマーのロジックを削除しますKeyDownイベントは、FormLoadなど、一度だけ実行される場所に配置します。あなたは1つのタイマーティッキングを必要とします。

次に、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); 
あなた `bullet`変数が実際に宣言されて
関連する問題