Уроки · 82
else if
Давай сделаем полоску здоровья из урока «Полоска здоровья» трёхцветной: зелёной, пока здоровья много, жёлтой, когда его осталось поменьше, и красной, когда оно почти кончилось.
Больше двух вариантов
Заголовок раздела «Больше двух вариантов»if с else выбирает из двух вариантов. Когда их три, между ними можно
вставить ещё одну проверку: else if, то есть «а если нет, то проверь
вот это». Выбор получается таким же, как в уроке
«if как значение», только вариантов теперь три:
// Много здоровья — зелёный, иначе средне — жёлтый, иначе мало — красный.let color = if fraction > GOOD_HEALTH { GREEN} else if fraction > LOW_HEALTH { YELLOW} else { RED};GOOD_HEALTH равно 0.6, а LOW_HEALTH равно 0.3: зелёный выше 60
процентов, жёлтый от 30 до 60, красный ниже.
Проверяются по очереди
Заголовок раздела «Проверяются по очереди»Условия проверяются сверху вниз. Как только одно оказалось верным, берём
его ветку, а остальные пропускаем, даже если они тоже верны. Осталось 80
процентов здоровья: первое условие fraction > GOOD_HEALTH верно,
получается зелёный, и до второго дело не доходит.
Поэтому порядок проверок важен. Что будет, если поменять их местами:
// Неправильный порядок: зелёного не получится никогда.let color = if fraction > LOW_HEALTH { YELLOW} else if fraction > GOOD_HEALTH { GREEN} else { RED};80 процентов здоровья больше 0.3, поэтому сработает первая проверка и
полоска станет жёлтой, а до зелёной дело не дойдёт. Проверять надо от
самого строгого условия к самому мягкому.
Правила те же
Заголовок раздела «Правила те же»Всё, как в уроке «if как значение»: во всех ветках
значения одного типа, на конце веток нет точки с запятой, а последний
else обязателен. else if можно добавлять сколько нужно.
Он работает и в обычном if, где ветки не выдают значение, а что-то
делают.
Попробуй сам
Заголовок раздела «Попробуй сам»Кликай по примеру: каждый клик отнимает здоровье. Когда оно кончится, следующий клик вернёт его полностью. Меняй длину полоски ниже:
use macroquad::prelude::*;
// Здоровье в начале и его максимум.const MAX_HEALTH: f32 = 100.0;// Сколько здоровья отнимает один клик.const DAMAGE: f32 = 10.0;// Выше какой доли здоровья полоска зелёная.const GOOD_HEALTH: f32 = 0.6;// Выше какой доли — жёлтая, а ниже — красная.const LOW_HEALTH: f32 = 0.3;
// Левый верхний угол полоски, её высота и длина.const BAR_X: f32 = 20.0;const BAR_Y: f32 = 20.0;const BAR_HEIGHT: f32 = 40.0;const BAR_WIDTH: f32 = 400.0;
#[macroquad::main("else if")]async fn main() { // Текущее здоровье — сначала полное. let mut health = MAX_HEALTH;
loop { clear_background(BLACK);
// Кнопка мыши только что нажата. if is_mouse_button_pressed(MouseButton::Left) { if health <= 0.0 { // Здоровья уже нет — возвращаем полное. health = MAX_HEALTH; } else { // Отнимаем урон. max(0.0) не даёт здоровью уйти ниже нуля. health = (health - DAMAGE).max(0.0); } }
// Доля здоровья от 0 до 1. let fraction = health / MAX_HEALTH;
// Цвет выбираем по очереди: много здоровья — зелёный, иначе // средне — жёлтый, иначе мало — красный. let color = if fraction > GOOD_HEALTH { GREEN } else if fraction > LOW_HEALTH { YELLOW } else { RED };
// Серая подложка: вся полоска целиком. draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH, BAR_HEIGHT, GRAY); // Цветная часть поверх неё: ширина — доля от всей полоски. draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH * fraction, BAR_HEIGHT, color);
next_frame().await; }}Что здесь происходит
Заголовок раздела «Что здесь происходит»GOOD_HEALTHиLOW_HEALTH— доли здоровья, по которым цвет меняется. Это константы, как в уроке «Константы».if fraction > GOOD_HEALTH { GREEN }— первое условие. Если здоровья больше 60 процентов, цвет зелёный.else if fraction > LOW_HEALTH { YELLOW }— проверяется, только если первое условие не сработало. Если здоровья больше 30 процентов, цвет жёлтый.else { RED }— всё остальное: здоровья 30 процентов или меньше.- Условия проверяются сверху вниз, срабатывает первое верное. Поэтому их записывают от самого строгого к самому мягкому.