Picturebox.bounds.intersects с не работает - PullRequest
0 голосов
/ 21 марта 2020

Я пишу игру, похожую на BattleCity. Я сделал свой танк способным стрелять ракетами, используя Picturebox. Однако, когда я проверяю это на Вражеском танке, он не будет работать, продолжая проходить сквозь друг друга. Как я могу это исправить?

 public void MissileCollision()
    {
        foreach (var EnemyTank in EnemyTankArray)
        {
            foreach(var Missile in missilesArray)
            {
                if (EnemyTank.Bounds.IntersectsWith(Missile.Bounds))
                {
                    EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
                }
            }
        }
    }

Этот код объясняет, что когда я ударю по Вражескому танку, он будет go возвращаться к вершине, и его позиция будет случайным образом появляться в координате X.

На самом деле это полный код.

 Boolean moveLeft = false;
    Boolean moveRight = false;
    List<PictureBox> missilesArray = new List<PictureBox>();
    List<PictureBox> EnemyTankArray = new List<PictureBox>();
    Boolean shoots = true;
    Random rand = new Random();
    int Position = 0;
    public Game()
    {
        InitializeComponent();
    }
    public void enemyTank()
    {
        var EnemyTank = new PictureBox();
        this.Controls.Add(EnemyTank);
        EnemyTank.Width = 24;
        EnemyTank.Height = 31;
        Position = rand.Next(0, 286);
        EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
        EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_DOWN_v_1;
        EnemyTank.BackgroundImageLayout = ImageLayout.Stretch;
        EnemyTankArray.Add(EnemyTank);
        EnemyTank.BringToFront();
    }
    public void createMissile()
    {
            var Missile = new PictureBox();
            this.Controls.Add(Missile);
            Missile.Width = 10;
            Missile.Height = 10;
            Missile.Top = MainTank.Top + MainTank.Height / 2 - Missile.Height / 2;
            Missile.Left = MainTank.Left + MainTank.Width / 2 - Missile.Width / 2;
            Missile.BackColor = Color.Black;
            missilesArray.Add(Missile);
            Missile.BringToFront();
    }
    public void MissileCollision()
    {
        foreach (var EnemyTank in EnemyTankArray)
        {
            foreach(var Missile in missilesArray)
            {
                if (EnemyTank.Bounds.IntersectsWith(Missile.Bounds))
                {
                    EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
                }
            }
        }
    }
    private void MoveMainTank(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Space)
        {
            if (shoots == true)
            {
                createMissile();
            }
        }
       if(e.KeyData == Keys.Left)
        {
            moveLeft = true;
        }
       if(e.KeyData == Keys.Right)
        {
            moveRight = true;
        }
    }

    private void MoveSide(object sender, EventArgs e)
    {
        if(moveLeft == true)
        {
            shoots = false;
            MainTank.Left -= 10;
            MainTank.BackgroundImage = Properties.Resources.Tank_LEFT_v_1;
        }
        if (moveRight == true)
        {
            shoots = false;
            MainTank.Left += 10;
            MainTank.BackgroundImage = Properties.Resources.Tank_RIGHT_v_2;

        }
    }

    private void StopMainTank(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Left)
        {
            shoots = true;
            moveLeft = false;
            MainTank.BackgroundImage = Properties.Resources.Tank_TOP_v_1;
        }
        if (e.KeyData == Keys.Right)
        {
            shoots = true;
            moveRight = false;
            MainTank.BackgroundImage = Properties.Resources.Tank_TOP_v_1;
        }
    }

    private void Game_Load(object sender, EventArgs e)
    {
        enemyTank();
        MainTankMoveLeftRight.Start();
        shoot.Start();
        MoveEnemyTank.Start();
        MissileCollision();
    }

    private void ShootMissile(object sender, EventArgs e)
    {
        foreach(var Missile in missilesArray)
        {
            Missile.Top -= 10;
        }
    }

    private void EnemyTankForward(object sender, EventArgs e)
    {
        foreach(var EnemyTank in EnemyTankArray)
        {
            EnemyTank.Top += 10;
        }
    }
}

}

Для foreach На самом деле я делаю это, чтобы вызывать больше EnemyTank с задержками, поэтому я разбираюсь с этим позже, что Я хочу сосредоточиться на том, что ничего не происходит, когда я так кодирую, пожалуйста, помогите мне исправить это.

1 Ответ

0 голосов
/ 25 марта 2020

Единственный ответ на это - я добавил немного таймера, и MissileCollision будет поставлен на отметку таймера, после чего используйте функцию загрузки формы, чтобы она заработала

...