Уроки · 81
Полоска здоровья
Давай нарисуем полоску здоровья. Для неё хватит двух прямоугольников, которые мы уже умеем рисовать по уроку «Прямоугольник».
Две полоски
Заголовок раздела «Две полоски»Первая, серая, рисуется целиком: она показывает всё здоровье, которое вообще может быть. Вторая, зелёная, лежит поверх неё и показывает, сколько здоровья осталось. Её рисуем позже серой, поэтому она оказывается сверху, как в уроке «Порядок отрисовки».
Обе полоски начинаются в одном месте и одной высоты. Отличается только ширина: у зелёной она зависит от здоровья.
Доля здоровья
Заголовок раздела «Доля здоровья»Чтобы найти ширину зелёной полоски, нужна доля здоровья от 0 до 1, как
в уроке «Доля от 0 до 1». Делим текущее здоровье на
максимальное. Осталось 50 из 100, значит доля равна 0.5, и зелёная
полоска вдвое короче серой. Это те же проценты из урока
«Проценты», только поделённые на сто.
// Доля здоровья от 0 до 1: осталось 50 из 100 — получится 0.5.let fraction = health / MAX_HEALTH;
// Серая подложка — вся полоска целиком.draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH, BAR_HEIGHT, GRAY);// Зелёная часть — столько от всей ширины, сколько осталось здоровья.draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH * fraction, BAR_HEIGHT, GREEN);Здоровье по клику
Заголовок раздела «Здоровье по клику»Текущее здоровье меняется, поэтому это переменная с mut, как в
уроке «Изменяемые переменные». Клик, как в уроке
«Клик мышью», отнимает DAMAGE. Когда здоровья уже
нет, следующий клик возвращает полное. Так полоска успевает показать
«пусто», а не перескакивает сразу на максимум:
if health <= 0.0 { // Здоровья уже нет — возвращаем полное. health = MAX_HEALTH;} else { // Отнимаем урон. max(0.0) не даёт здоровью уйти ниже нуля. health = (health - DAMAGE).max(0.0);}.max(0.0) берёт большее из двух чисел, как в уроке
«Радиус мышью». Если поменять DAMAGE на число,
которое не делит 100 нацело, без этого здоровье ушло бы ниже нуля, а
ширина зелёной полоски стала бы отрицательной.
Попробуй сам
Заголовок раздела «Попробуй сам»Что здесь происходит
Заголовок раздела «Что здесь происходит»MAX_HEALTH,DAMAGEи размеры полоски — константы, как в уроке «Константы»: они не меняются от кадра к кадру.health— текущее здоровье. Это единственное, что меняется в программе.fraction = health / MAX_HEALTH— доля здоровья от 0 до 1. По ней считается ширина зелёной полоски.- Серый прямоугольник шириной
BAR_WIDTHрисуется целиком, а зелёный ширинойBAR_WIDTH * fractionрисуется поверх него. - На клик здоровье уменьшается на
DAMAGE, а когда оно кончилось, возвращается к максимуму. .max(0.0)не даёт здоровью стать отрицательным.