My:Abs
Содержание
Объект : Машина состояний
Машина состояний является универсальным объектом для программирования в редакторе сцен сложного поведения объектов. Для машин с типовым набором состояний и поведений, в дальнейшем будут вводиться отдельные объекты. В xml-файле машина состояний состоит из разделов st для каждого состояния объекта, внутри которых описаны разделы:
- init - что делать при инициализации состояния
- draw - как рисовать объект в этом состоянии
- click - что делать при клике
- timer - как обрабатывать таймерную функцию
Например, рассмотрим объект, находящийся изначально в состоянии state="wait". При клике на него мышкой, объект переходит в состояние st="run", в котором он находится 3000 ms, через которые возвращается в состояние "wait". В xml-файле сцены он описывается следующим образом:
<obj id="1" kn="sts" w="64" h="64" x="734" y="534" state="wait"> <st id="wait"> <!-- ждем клика --> <draw res="101" /> <!-- рисовать граф.ресурс 101 --> <click go="run" /> <!-- при клике - идем в состояние run--> </st> <st id="run"> <!-- реакция на клик - другая картинка--> <draw res="102" /> <!-- рисовать граф.ресурс номер 102 --> <timer go="wait" tm="3000"/> <!-- через время tm переходим в wait --> </st> </obj>
В данном состоянии некоторые событийные разделы могут отсутствовать.
Условия перехода
Разделы click и timer могут содержать дополнительные условия перехода, в зависимости от того, в каком состоянии находятся другие объекты. Например, пусть переход по клику разрешен, если объект c id=2 находится в состоянии "show" и объект с id=3 находится в состоянии "play". Тогда:
<st id="wait"> <!-- реакция на клик --> <click go="run"> <if obj="2" st="show" > <if obj="3" st="play" go="end"> </click> </st>
Условие может переопределить состояние перехода, заданное по умолчанию в click (выше второй if)
В данном состоянии может быть несколько событийных разделов click и timer, из которых выполняется первый, условия которого сработали:
<st id="wait"> <!-- реакция на клик --> <click go="run"> <if obj="2" st="show" > </click> <click go="run"> <if obj="3" st="play"> </click> </st>
Т.е. при клике произойдет переход в состояние "run", если объект 2 находится в состоянии "show" или объект 3 в состоянии "play".
Инициализация состояния
При первом попадании в состояние можно установить те или иные параметры объекта. Например, его начальное положение в этом состоянии и alpha-прозрачность (если они отличны от общих параметров в разделе obj):
<init x="100" y="0" al="0" />
Машины состояний могут изменять состояния других объектов. Происходит это также в секции init:
<init> <set obj="2" st="show" > <!-- перевод объекта 2 в состояние show --> </init>
Анимация объекта
В разделе рисования происходит управление проигрыванием анимации объекта. Пусть, например, различные этапы движения персонажа собраны в графическом ресурсе в прямоугольную таблицу (по строкам расположено движение вперед, поворот и т.п.). Тогда можно указать начальный с1, конечный c2 фреймы в строке таблицы r (по умолчанию r=0):
<draw res="101" c1="0" c2="15" r="0" /> <!-- 16 кадров нулевой строки -->
Кроме фреймовой анимации возможно управление alpha-каналом, перемещением по сцене, вращением и т.п. Это осуществляется в таймерном разделе. Например, пусть объект должен переместиться в целевую точку с координатами tx,ty со скоростью 0.1 пиксель в ms, увеличивая свою непрозрачность с начальной (из раздела init) до ta=1 со скоростью da в ms. Тогда таймерный раздел выглядит следующим образом:
<timer tm="3000" go="wait"> <move tx="100" ty="200" v="0.1" br="1"/> <alpha ta="1.0" da="0.001" /> </timer>
Переход go из состояния происходит либо по истечению времени tm либо при достижению целевых значений, если установлен флаг br="1" (выше для move).
Описание свойств объекта
В файле со списком свойств данного объекта (в настройках проперти лист редактора сцен) вводится дополнительный тег add который добавляет раздел, имя которого указано в id в раздел объекта. К уже существующему разделу можно добавить еще один (например, по правой кнопке мыши), и т.д. Так, интерфейс машины состояний описывается следующим образом:
<machine name="Машина состояний" > <property name="имя" value="" type="string" id="nm" /> <property name="x" value="0" type="float" id="x" /> ... <group name"состояния"> <property name="начальное" value="" type="string" id="state" /> <add id="st"> <property name="имя" value="" type="string" id="id" /> <add name = "draw" id="draw"> <property name="картинка" value="" type="graph_id" id="res" /> </add> <add name = "timer" id="timer"> <property name="go" value="" type="string" id="go" /> <property name="time" value="" type="float" id="tm" /> <add name="если" id="if"> <property name="объект" value="" type="obj_id" id="obj" /> <property name="состояние" value="" type="string" id="st" /> </add> </add> </add> </group> </machine>