My:Abs

Материал из synset
Версия от 13:47, 10 октября 2011; WikiSysop (обсуждение | вклад) (Описание свойств объекта)
Перейти к: навигация, поиск

Объект : Машина состояний

Машина состояний является универсальным объектом для программирования в редакторе сцен сложного поведения объектов. Для машин с типовым набором состояний и поведений, в дальнейшем будут вводиться отдельные объекты. В 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>