Как сделать счетчик хп в winforms?

 private void Intersect()
        {
            for (int i = 0; i < enemies.Length; i++)
            {
                if (bullets[0].Bounds.IntersectsWith(enemies[i].Bounds))
                {
                    Score += 1;
                    labelScore.Text = (Score < 10) ? "0" + Score.ToString() : Score.ToString();

                    if (Score % 20 == 0)
                    {
                        Level += 1;
                        labelLevel.Text = (Level < 20) ? "0" + Level.ToString() : Level.ToString();

                        if (enemiesSpeed <= 4)
                        {
                            enemiesSpeed++;
                        }

                        if (playerSpeed <= 4)
                        {
                            playerSpeed++;
                        }

                        if (Level == 8)
                        {
                            GameOver("You win!");
                        }
                    }
                    enemies[i].Location = new Point(mainPlayer.Location.X + 600 + i * 500, mainPlayer.Location.Y + 150); // 100 + i * 50 + 50
                    bullets[0].Location = new Point(2000, mainPlayer.Location.Y + 50);                    
                }
                if (mainPlayer.Bounds.IntersectsWith(enemies[i].Bounds)) //вот здесь происходит пересечений игрока и энеми
                {
                    mainPlayer.Visible = false;  
                    GameOver("Game Over");          
                }
            }
        }

Не получается сделать счетчик хп в игре на winforms. При пересечение enemy с mainplayer должно убавляться 1хп, изначально должно быть 3хп. Как это реализовать?


Ответы (1 шт):

Автор решения: Frehzy

Это можно сделать с помощью подписки на событие обновления свойства inotifypropertychanged.

Пример реализации:

Можно ли заменить два метода одним?

Возьмите отсюда код и добавьте подобную обработку:

public Player Player { get; }

public Form1()
{
    InitializeComponent();
    Player = new Player("Вася", 100, 100);
    Player.PropertyChanged += Player_PropertyChanged;
}

private void Player_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName is nameof(Player.HP))
        label1.Text = $"HP: {Player.HP}";
}

private void button1_Click(object sender, EventArgs e) =>
    Player.Hit(20);

Таким образом, при обновлении свойства HP, у вас будет триггерится ивент PropertyChanged, который будет вызывать метод Player_PropertyChanged, который уже будет обновлять у вас label

→ Ссылка