My:Abs — различия между версиями

Материал из synset
Перейти к: навигация, поиск
(Инициализация состояния)
(Задание анимации объекта)
Строка 81: Строка 81:
 
Это осуществляется в таймерном разделе.
 
Это осуществляется в таймерном разделе.
 
Например, пусть объект должен переместиться в целевую точку с координатами tx,ty
 
Например, пусть объект должен переместиться в целевую точку с координатами tx,ty
со скоростью 0.1 пиксель в ms. Увеличивая свою непрозрачность с нуля до 1.  
+
со скоростью 0.1 пиксель в ms. Увеличивая свою непрозрачность с начальной до ta=1.  
 
Тогда функция инициализации выглядит следующим образом
 
Тогда функция инициализации выглядит следующим образом
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
Строка 87: Строка 87:
 
<timer>     
 
<timer>     
 
   <move  tx="100" ty="200" v="0.1"  />
 
   <move  tx="100" ty="200" v="0.1"  />
   <alpha a1="0"  a1="1.0" a="0.001"  />
+
   <alpha ta="1.0" da="0.001"  />
 
</timer>
 
</timer>
 
</pre>
 
</pre>

Версия 12:24, 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" state="wait">     
  
   <st id="wait">                       <!-- ждем клика -->
      <draw  res="101" />               <!-- рисовать граф.ресурс номер 101 -->
      <click go="run" />                <!-- при клике меняем состояние на play -->
   </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" >
   </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".

Инициализация состояния

При первом попадании в состояние можно установить те или иные параметры объекта. Например, его начальное положение в этом состоянии и alpha-прозрачность:

<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. Увеличивая свою непрозрачность с начальной до ta=1. Тогда функция инициализации выглядит следующим образом

<obj>     
<timer>     
   <move  tx="100" ty="200" v="0.1"  />
   <alpha ta="1.0" da="0.001"  />
</timer>