Checkbox как машина состояний — различия между версиями

Материал из wiki.appsalutecreator.com
Перейти к: навигация, поиск
(Программирование состояний)
(Программирование состояний)
Строка 90: Строка 90:
 
Сделаем активной голову правого слонёнка, которая стала машиной состояний.
 
Сделаем активной голову правого слонёнка, которая стала машиной состояний.
 
В панели её свойств кликаем на поле '''states''', а затем на появившиеся в нём три точки (помним первый урок?). В результате этих действий, выскочит окошко в котором мы будем создавать состояния  
 
В панели её свойств кликаем на поле '''states''', а затем на появившиеся в нём три точки (помним первый урок?). В результате этих действий, выскочит окошко в котором мы будем создавать состояния  
и их программировать. Два раза нажмём кнопку '''Добавить состояние''' в правом нижнем углу окна.
+
и их программировать. Два раза нажмём кнопку '''Добавить состояние''' в правом нижнем углу окна:
  
 
[[файл:lesson_3_states1.png]]
 
[[файл:lesson_3_states1.png]]
 +
 +
В результате появилось две области, каждая из которых будущее состояние головы.
 +
Зададим имена состояний, введя их имена left и right в полях '''имя''' каждой области.
 +
Затем станем мышкой на поле '''имя''' левого состояния и нажмём правую кнопку мышки.
 +
Появится большое меню, в котором кликнем на первый пункт draw:
 +
 +
[[файл:lesson_3_states2.png]]
 +
 +
=== Непослушный слоненок ===
  
 
== Упражнения ==
 
== Упражнения ==

Версия 21:10, 10 января 2013

Урок 2 << Оглавление >> Урок 4

Цель: изучить понятие машины состояний на примере объекта Checkbox

Задачи:

  • Cоздать новый экран и сцену для этого урока.
  • При помощи объекта Checkbox заставит слонёнка кивать головой.
  • Воспроизвести этого же слонёнка при помощи машины состояний


Checkbox

Начнём, как обычно, урок с открытия проекта lessons. В нём добавим новый экран lesson_3 со сценой stg_main, так как это было описано в предыдущем уроке. Поместим из редактора ресурсов на сцену любой фон на выбор из папки этого урока или предыдущего. Для примера далее используется "лунный пейзаж" (картинка bg).

Lesson 3 chk1.png

Поверх фона перетащите из редактора ресурсов тело слонёнка (ресурс body) и затем его голову head1. Расположите их так, чтобы получился примерно целый слонёнок. Переименуйте эти 2 объекта в elephant_body и elephant_head_chk (помним о необходимости осмысленных имен в объектах?). Чтобы голова и тело стали "целым" существом, стоит в дереве проекта (Layout) перетащить голову на тело, сделав её подобъектом. Теперь, если на сцене начать таскать тело слоненка, то голова будет послушно следовать за ним. Хотя, если схватить за голову, то её легко можно оторвать. Так, что будьте со слоненком поаккуратнее.

Lesson 3 chk.png

Зайдем в свойство головы elephant_head_chk и изменим её тип на checkbox. Раскроем треугольнички возле свойств "не отмечена (внешний вид)" и "не отмечена (внешний вид)". Разместим поверх окна редактор ресурсов и перетащим в поле up первой группы (не отмечена) картинку head_1, а в такое же поле второй группы (отмечена) картинку head_2.

Сохраняем проект и запускаем вьювер. При клике на голову слонёнка она должна туда-сюда поворачиваться.

Обычно чекбоксы (сheckbox) это такие квадратики в которых ставят или убирают галочку. Конечно и в игровом приложении может понадобиться такой внешний вид чекбокса. В этом случае нужно будет подготовить соответствующие картинки. Однако многие простые игровые объекты типа подобной головы могут находиться в двух состояниях (выбран, не выбран).

Машины состояний

Немного теории

Машина состояний (state machine) является универсальным инструментом для программирования в редакторе сцен сложного поведения объектов. Логика поведения машины состояний разбивается на отдельные узлы (состояния). Объект всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на объект, либо в результате окончания некоторых процессов протекающих внутри объекта.

Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. Настоятельно рекомендуется рисовать такие графы в процессе проектирования машины, а лишь затем переходить к их описанию в окне редактора состояний. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):

Def states.png

Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.

Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.

Проектирование машины

Перейдем теперь от нудной теории к веселой практике. Посмотрим внимательно на поведение головы слоненка, которая является чекбоксом. На самом деле это типичная машина состояний с двумя состояниями. Назовём их left и right по направлению ориентации головы слонёнка. Сначала слоненок находится в состоянии left (смотрит влево). Когда мы кликаем в голову, машина переходит в новое состояние right (голова поворачивается вправо). Это поведение жестко запрограммированно внутри объекта checkbox. Попробуем добиться того же эффекта, используя универсальный игровой объект "машина состояний".

Прежде всего не поленимся нарисовать весёлый граф состояний и переходов между ними:

Lesson 3 states.png

Теперь, когда на бумаге всё стало ясно :), необходимо эту машину создать в редакторе.

Создание машины

Чтобы не тратить время на редактор ресурсов, скопируем уже существующего слонёнка. Для этого станем в дереве проекта на его тело (elephant_body) и правой кнопкой мыши вызовем меню. В нём выбираем пункт Copy. Затем повторяем операцию, но выбираем уже пункт вставить ("Paste after curent object"). В дереве проекта появятся два слоненка. Причем оба будут иерархичной веткой, состоящей из "тела" (elephant_body) и подобъекта "голова" (elephant_head). А вот на сцене редактора видимых изменений не произойдет. Мы помним, что при копировании объектов копируются также все их свойства. Поэтому на сцене на самом деле два слоненка, но они имеют одинаковые координаты. Поэтому хватаемся за тело и тащим его левее на свободное место:

Lesson 3 2elephants.png


Левого слона оставим чекбоксом, а голову правого превратим в машину состояний. Для этого кликаем в голову и меняем её тип с checkbox на machine (поле тип в панели Properties). Поменяем также имя головы, укоротив его до "elephant_head".

Можно попробовать посмотреть, что у нас получилось. Сохраняем проект и запускаем вьювер. Упс... Голова исчезла, а вверху экрана появилось малопонятное ругательство, из которого можно заключить, что у объекта elephant_head состояний то и нет.

Таким образом, не достаточно создать машину, её еще необходимо научить ездить. Поэтому закрываем окно вьювера и начинаем заниматься программированием.

Программирование состояний

Сделаем активной голову правого слонёнка, которая стала машиной состояний. В панели её свойств кликаем на поле states, а затем на появившиеся в нём три точки (помним первый урок?). В результате этих действий, выскочит окошко в котором мы будем создавать состояния и их программировать. Два раза нажмём кнопку Добавить состояние в правом нижнем углу окна:

Lesson 3 states1.png

В результате появилось две области, каждая из которых будущее состояние головы. Зададим имена состояний, введя их имена left и right в полях имя каждой области. Затем станем мышкой на поле имя левого состояния и нажмём правую кнопку мышки. Появится большое меню, в котором кликнем на первый пункт draw:

Lesson 3 states2.png

Непослушный слоненок

Упражнения


Урок 2 << Оглавление >> Урок 4