2

スペース インベーダーのようなミニ ゲームを C# (Windows フォーム) で作成しようとしています。宇宙船はうまく飛んでいますが、複数のショットが得られませんtimer_Tick。アニメーションを作成する方法があります。スペースを押して撮影すると、最初のショットはうまくいきますが、2 番目のショットです。このハーフポジションでの最初のショットは消えます。ショットはで、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;
      }

私は何を間違っていますか?

4

2 に答える 2

3

aliassce の回答のように、毎回新しいイメージを作成する必要があります。

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

リストをループするように画像を描画するコードを更新する必要がある場合もあります。次のようなもので:

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

最後に、画面上になく、更新や描画の必要がなくなったショットを削除するために、時々リストを一掃することをお勧めします。

于 2012-10-20T21:52:17.750 に答える
1

同じ PictureBox を追加しています。新しいものを作成してみることができます。このコーンを に追加しForm1_KeyDownます。

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

一方で、できるだけ早く OOP を使用する必要があります

于 2012-10-20T19:48:00.193 に答える