My:Abs

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

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

Машина состояний является универсальным объектом для программирования в редакторе сцен сложного поведения объектов. Для машин с типовым набором состояний и поведений, в дальнейшем будут вводиться отдельные объекты. В xml-файле машина состояний состоит из разделов st для каждого состояния объекта, внутри которых описаны разделы:

  • init - что делать при инициализации состояния
  • click - что делать при клике
  • timer - как обрабатывать таймерную функцию

Например, рассмотрим объект, находящийся изначально в состоянии st="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">                       <!-- ждем клика -->
      <init  res="101" />               <!-- инициализация: рисовать граф.ресурс номер 101 -->
      <click go="run" />                <!-- при клике меняем состояние на play -->
   </st>

   <st id="run">                        <!-- реакция на клик -->
      <init 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" >
   </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>

Задание анимации объекта

Инициализация управляется также проигрыванием анимации объекта. Пусть, например, различные этапы движения персонажа собраны в графическом ресурсе в прямоугольную таблицу (по строкам расположено движение вперед, поворот и т.п.). Тогда можно указать начальный с1, конечный c2 фреймы в строке таблицы r (по умолчанию r=0):

<obj>     
   <st id="run">                         
      <init res="101" c1="0" c2="15" r="0" />    <!-- проигрывать 16 кадров нулевой строки -->
   </st>
</obj>

Кроме фреймовой анимации возможно управление alpha-каналом, перемещением по сцене, вращением и т.п. Например, пусть объект должен переместиться в целевую точку с координатами tx,ty со скоростью 0.1 пиксель в ms. Увеличивая свою непрозрачность с нуля до 1. Тогда функция инициализации выглядит следующим образом

<obj>     
   <st id="run">                        
      <init res="100">     
         <move  tx="100" ty="200" v="0.1"  />
         <alpha a1="0"  a1="1.0"  a="0.001"  />
      </init>
   </st>
</obj>