My:Abs — различия между версиями
WikiSysop (обсуждение | вклад) (→Объект : Машина состояний) |
WikiSysop (обсуждение | вклад) (→Объект : Машина состояний) |
||
Строка 43: | Строка 43: | ||
</st> | </st> | ||
</pre> | </pre> | ||
− | В данном состоянии может быть несколько событийных разделов, из которых выполняется первый, условия которого сработали: | + | В данном состоянии может быть несколько событийных разделов '''click''' и '''timer''', из которых выполняется первый, условия которого сработали: |
<pre class="brush:xml; gutter: false;"> | <pre class="brush:xml; gutter: false;"> | ||
<st id="wait"> <!-- реакция на клик --> | <st id="wait"> <!-- реакция на клик --> | ||
Строка 55: | Строка 55: | ||
</pre> | </pre> | ||
Т.е. в данном случае произойдет при клике переход в состояние "run", если объект 2 находится в состоянии "show" '''или''' объект 3 в состоянии "play". | Т.е. в данном случае произойдет при клике переход в состояние "run", если объект 2 находится в состоянии "show" '''или''' объект 3 в состоянии "play". | ||
+ | |||
+ | Машины состояний могут изменять состояния других объектов. Происходит это в секции '''init''': | ||
+ | <pre class="brush:xml; gutter: false;"> | ||
+ | <st id="wait"> | ||
+ | <init> <!-- инициализация этого состояния --> | ||
+ | <set obj="2" st="show" > <!-- установить у объекта 2 состояние show --> | ||
+ | </init> | ||
+ | </st> | ||
+ | </pre> |
Версия 11:49, 10 октября 2011
Объект : Машина состояний
Машина состояний является универсальным объектом для программирования в редакторе сцен сложного поведения объектов. В xml-файле он состоит из разделов st для каждого состояния объекта, внутри которых описаны разделы
- init - что делать при инициализации состояния
- draw - что рисовать в данном состоянии
- click - что делать при клике
- timer - как обрабатывать таймерную функцию
Например, рассмотрим объект, находящийся изначально в состоянии st="wait". При клике на него мышкой, объект переходит в состояние st="run", в котором он находится 3000 ms, через которые возвращается в состояние "wait". В xml-файле сцены он описывается следующим образом:
<obj id="1" kn="sts" w="64" h="64" x="734" y="534" st="wait"> <st id="wait"> <!-- ждем клика --> <init c1="10" c2="10" r="0" /> <!-- инициализация: стоять на 10-м кадре нулевой строчки --> <draw res="101" /> <!-- рисуем ресурс 101 --> <click go="run" /> <!-- при клике меняем состояние на play --> </st> <st id="run"> <!-- реакция на клик --> <init c1="0" c2="15" r="0" /> <!-- проигрывать 16 кадров нулевой строки --> <draw res="101" /> <!-- рисуем ресурс 21 --> <timer go="wait" tm="1600"/> <!-- через время tm переходим в wait --> </st> </obj>
Выше предполагается, что ресурс является анимацией, упакованной в прямоугольную таблицу фреймов (в простейшем случае одна строка из картинок-фреймов). В функции init задаются начальный с1 и конечный c2 фрейм для проигрывания в нулевой строке r таблицы (по умолчанию всегда 0).
Функции перехода 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" > </click> </st>
В данном состоянии может быть несколько событийных разделов 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".
Машины состояний могут изменять состояния других объектов. Происходит это в секции init:
<st id="wait"> <init> <!-- инициализация этого состояния --> <set obj="2" st="show" > <!-- установить у объекта 2 состояние show --> </init> </st>