Данный гайд был создан по реквесту (запросу) «Willian Voryger«. Вы также, можете предложить свой реквест в группе ВК, или в комментариях к записи.
Предисловие
Во время битвы с боссом, зачастую, хочется видеть свой прогресс. Для этого в углу экрана, обычно, показывают количество хп босса. В этом уроке, мы как раз и реализуем подобную функцию.
Разбираемся в скрипте.
Перепишите данный скрипт к себе в ACS:
script 15 (int tid)
{
int maxhp = GetActorProperty(tid,APROP_Health);
while(true)
{
SetHudSize(500,500,0);
SetFont("BIGFONT");
int hp = GetActorProperty(tid,APROP_Health);
int hp2 = FixedMul(FixedDiv(hp,maxhp),100.0);
HudMessage(s:"Boss hp: ",f:hp2,s:"%";0,1,CR_CYAN,400.0,400.0,1.0);
if(hp < 1)
{
HudMessage(s:"Dead";0,1,CR_RED,400.0,400.0,3.0);
break;
}
Delay(1);
}
}
Данный скрипт, показывает HP монстра в процентах.
А теперь, разберем скрипт по порядку.
script 15 (int tid)
В этой строке, мы принимаем tid монстра, у которого будем смотреть HP.
int maxhp = GetActorProperty(tid,APROP_Health);
Получаем изначальное количество HP монстра (maxhp) с помощью GetActorProperty. Cинтаксис у GetActorProperty следующий:
GetActorProperty(tid,property)
- tid — указывает thing id, идентификатор монстра.
- property — указыавет проперти (APROP,PROP), полный список проперти доступен на вики.
Далее запускаем бесконечный цикл while, в котором будем выводит хп монстра.
SetHudSize(500,500,0);
Устанавливаем разрешение экрана 500×500.
SetFont("BIGFONT");
Устанавливаем шрифт BIGFONT, свои шрифты можно добавлять в FONTDEFS.
int hp = GetActorProperty(tid,APROP_Health);
Здесь, получаем текущее количество HP монстра.
int hp2 = FixedMul(FixedDiv(hp,maxhp),100.0);
А здесь, получаем количество HP в процентах. Я, для получения процентов использовал формулу:
hp2 = (hp / maxhp) * 100
Но вместо «/» и «*» я использовал «FixedDiv» и «FixedMul«. Я это сделал потому что «/» и «*» округляет все до целых чисел (5, 1), в то время как FixedDiv и FixedMul не округляет, оставляя дробное значение (5.5, 1.3).
Еще, вас может смутить, почему я использовал тип int:
int hp2
Вас это не должно смущать, потому-что ACS сломанный язык. Поэтому, в типе int можно хранить как целочисленные значения, так и дробные.
Проценты получили, теперь их нужно вывести на экран.
HudMessage(s:"Boss hp: ",f:hp2,s:"%";0,1,CR_CYAN,400.0,400.0,1.0);
HudMessage — слишком сложная комманда, рассмотрю её в отдельном гайде. Узнать о ней подробно вы можете на вики.
if(hp < 1)
{
HudMessage(s:"Dead";0,1,CR_RED,400.0,400.0,3.0);
break;
}
Здесь, если hp у монстра < 1, то выводим сообщение «Dead» на 3 секунды и выходим из цикла (break).
Delay(1);
В конце, ставим минимальную задержку (1 тик), чтобы скрипт не завис.
Ну вот, и все готово, проверяем.
Итоговый результат.
Дополнительный материал.
Также, вы можете округлить значение «boss hp» до целых чисел. Округлять мы будем функцией ceil, которая всегда округляет число в большую сторону. Синтаксис у неё следующий:
ceil(дробное_число)
- дробное_число — это число, которое мы будем округлять.
Округляем в HudMessage:
HudMessage(s:"Boss hp: ",f:ceil(hp2),s:"%";0,1,CR_CYAN,400.0,400.0,1.0);
В итоге, у нас получилось красивое целое число.