2017-05-16 9 views
0

私はピクチャーボックスを作っています。ムービーボックスをクラスで作成しました

public void create(Form1 u, int number, int x, int y) 
{ 
    pictureBox1 = new PictureBox(); 
    pictureBox1.Location = new Point(x, y); 
    pictureBox1.Name = "invader" + number; 
    pictureBox1.Size = new Size(60, 54); 
    pictureBox1.Image = Image.FromFile("../sprite.jpg"); 
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
    u.Controls.Add(pictureBox1); 
} 

20ミリ秒ごとに1ピクセルずつ移動するにはどうすればよいですか?私はタイマーを手に入れましたが、いくつかのことを試しましたが、このクラスが作った画像ボックスを正しく選択する方法がわからないので、移動することができます(すべてこのクラス内に書かなければなりません)。下に移動。 X座標は同じままでなければなりません。

private void timer1_Tick(object sender, EventArgs e) 
{ 

} 

私の超エキサイティングなタイマーコード。これはメインフォームコードにあります。

+0

タイマーコードがある?すべてpictureboxesを抽出でき、動的に追加1以上を移動する必要がある場合 – Steve

+0

は、タイマーコード – Chaoss1848

+0

を追加して、チックの位置を設定しましたか? 'System.Timers.Timer'を使うこともお勧めします。これは定義された' Interval'に対して 'Elapsed'イベントを提供します。 –

答えて

2

ピクチャボックスを動的に作成し、使用する変数がローカル変数であるため、作成コードを終了した後に、作成したピクチャボックスへの直接の参照がなくなりました。それでも、フォームのu

private void timer1_Tick(object sender, EventArgs e) 
{ 
    PictureBox pic = u.Controls.OfType<PictureBox>().FirstOrDefault(x => x.Name = "invader" + currentPicNumber; 
    if(pic != null) pic.Location = new Point(pic.Location.X, pic.Location.Y + 1); 
} 

のControlsコレクションからのPictureBoxを抽出する可能性を持っているしかし
は、今、私たちは二つの問題を解決する必要があります。
の現在の値の値は、PictureBoxを追加したForm1 uのインスタンスへの参照が必要です。

これらの問題は、Form1(既にこの参照があると仮定します)と移動する現在のピクチャボックスの番号を保持する別の変数を参照するクラスレベルの変数で解決できます。代わりに

あなたはピクチャボックスは、あなたがその名を始める「インベーダー」のテキストとループとのそれらの上

private void timer1_Tick(object sender, EventArgs e) 
{ 
    var picList = u.Controls.OfType<PictureBox>().FirstOrDefault(x => x.Name.StartsWith("invader"); 
    foreach(PictureBox pic in picList) 
     pic.Location = new Point(pic.Location.X, pic.Location.Y + 1); 
} 
+0

'pictureBox1 = new PictureBox();'は私にとってはクラスレベルの変数のようです –

関連する問題