Пройденный материал
Трещины на блокахНа одном из предыдущих занятиях мы узнали, что блоки могут быть сделаны из разных материалом: Материал блока. Так же нам может понадобиться, чтобы на блоке рисовались трещины. Это полезно, если мы хотим, чтобы блок разбивался не с первого удара, а со второго или третьего или четвертого. Для того чтобы установить "уровень разбитости" блока существует метод setCrackLevel(цифра). Где цифра - это уровень разбитости от 0 до 3. Вот таблица всех материалов блоков и "уровней разбитости":
Пример: register('*', BlockSprite::new) Состояния спрайтовВ любой игре персонажи могут находится в разных состояниях, например в Арканоиде блоки могут быть целыми, а могут быть "полуразбитыми" если требуется несколько ударов, чтобы их разбить. Или мяч может быть обычным и отскакивать от всех блоков, а может быть "огненным" и пролетать сквозь все блоки. Создавая игру, мы должны сами определять все возможные состояния спрайтов и правильно обрабатывать события в каждом из состояний. Состояние - это набор обработчиков событий, которые работают только тогда, когда это состояние активно. Мы можем написать свои обработчики (например onCollision) для каждого состояния по-разному, поэтому спрайт будет вести себя по-разному, в зависимости от того, в каких он находится состояниях. Так же мы сами можем переключать спрайт из состояния в состояние. Состояние по умолчаниюКаждый спрайт создается в специальом состоянии "по умолчанию". То есть все события, которые мы обрабатывали до сих пор принадлежали этому состоянию. Состояние по умолчанию нельзя отключить - оно есть всегда и запускается автоматически вместе со спрайтом. register('+', BlockSprite::new) Включение состоянияДля того чтобы активировать состояние нужно вызвать метод register('+', BlockSprite::new) Определение состоянийВ предыдущем примере мы включаем состояние CRACK сразу после того как у блока срабатывает событие столкновение (onCollision). Но наша программа пока не знает что это такое - состояние CRACK - нам нужно объяснить. Чтобы определить новое состояние нужно воспользоваться конструкцией register('+', BlockSprite::new) Теперь все что будет написано ниже defineState("CRACK") будет срабатывать только тогда, когда состояние CRACK активно, т.е. после первого столкновения с мячом. В состоянии CRACK мы хотим, чтобы на спрайте блока нарисовалась одна трещина и при втором столкновении блок должен исчезнуть: register('+', BlockSprite::new) Событие onActivationВ тот момент, когда состояние становится активным - вызывается событие onActivation, если конечно оно написано для нашего состояния. В предыдущем примере по событию onActivation для состояния CRACK мы добавляем трещины на блоке. Еще более "крепкий" блокЕсли мы хотим сделать еще более крепкий блок, нам нужно добавить еще одно состояние. Код блока может выглядеть вот так: register('+', BlockSprite::new) ДополнительноСообщенияДо сих пор события происходили у каждого спрайта индивидуально и мы так же их обрабатывали индивидуально для каждого спрайта. Но если нам нужно по событию одного спрайта поменять что-то на других спрайтах? Например, если шарик выбивает кирпичный блок (BRICK), все песочные блоки (SAND) должны взорваться. Для этого существуют событие. Спрайт в любое время может отправить сообщение всем другим спрайтам. Другие спрайты могут на это событие отреагировать должным образом. Отправка сообщенийЧтобы отправить сообщение нужно вызвать метод Получение сообщенийДругие спрайты могут получить сообщение. Для этого существует событие Обработчик - это уже знакомый код, как ПримерПроще показать это на примере. Ниже зарегистрированы два блока. В момент, когда исчезает (выбивается) кирпичный блок (BRICK), отправляется сообщение Все песочные блоки (SAND) отлавливают это сообщение и так же исчезают: register('+', BlockSprite::new) ВНИМАНИЕ! очень важно не ошибиться в тексте сообщения. Если в событии onMessage будет написан текст, отличающийся хоть одной буквой от отправленного сообщения при помощи message - событие не сработает. Домашнее задание
|
Старшая группа >