Как сделать счетчик хп в 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