My:Abs

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

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

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

  • init - что делать при инициализации состояния
  • draw - как рисовать объект в этом состоянии
  • click - что делать при клике
  • time - время прибывании в состоянии

Кроме этих тегов, существуют также теги управления движением:

  • move - как двигаться
  • scale - как изменять размеры
  • spin - как вращаться

и теги проверки и задания состояния других объектов:

  • wait - жать, пока другой объект не окажется в неком состоянии
  • set - перевести объект в фиксированное состояние

Все теги могут встречаться при описании данного состояния по несколько раз (см.ниже)

Рассмотрим пример. Пусть объект, находится в состоянии 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 -->
      <time tm="3000" go="wait" />  <!-- через время tm переходим в wait -->
   </st>

</obj>

Условные переходы

Любой тег может содержать свойство go="новое состояние" которое означает переход к новому состоянию после завершения выполнения данного тега. Подобный переход может сопровождаться условием пребывании некоторого объекта в фиксированном состоянии. Например, пусть переход по клику разрешен, только если, если объект c id=2 находится в состоянии "show". Тогда:

<click  go="run" obj="2" st="show"/> 

Если нужно отслеживать состояние нескольких объектов, то делаем несколько секций click:

<click  go="run" obj="2" st="show"/> 
<click  go="run" obj="3" st="play"/> 

В этом случае работает логическое или (или 2-й объект в st=show или 3-й в st=play). В случае логического и формат следующий:

<click  go="run" >
   <and obj="2" st="show"/>
   <and obj="3" st="run"/>
</click> 
<click  go="run" obj="4" st="play"> 

Т.е. (2-й в show и 3-й в run) или (4-й в play).

Инициализация

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

<init x="100" y="0"  al="0" /> 

Кроме этого, машина состояний может изменять состояния других объектов (не только машин).

<set obj="2" st="show" >                    <!-- перевод объекта 2 в состояние show -->    
<set obj="3" st="play" >                    <!-- перевод объекта 3 в состояние play -->    

Анимация объекта

В разделе рисования происходит задание графического ресурса и параметров проигрывания анимации объекта. Пусть, например, различные этапы движения персонажа собраны в графическом ресурсе в прямоугольную таблицу (по строкам расположено движение вперед, поворот и т.п.). Тогда можно указать начальный с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. При этом он вращается и уменьшается:

<move  tx="100" ty="200" v="0.1" />
<alpha ta="1.0" da="0.001"  />
<spin  ta="0.1" da="0.001"  />
<scale ts="0.1" ds="0.001"  />

Любых команд движения может быть несколько. Например, пусть в данном состоянии объект должен двигаться по квадрату, пока мы на него не кликнем:

<init  x="0"    y="0"  />                <!-- левый верхний угол -->
<move  tx="10"  ty="0"  v="0.1" />       <!-- вправо -->   
<move  tx="10"  ty="10" v="0.1" />       <!-- вниз -->
<move  tx="0"   ty="10" v="0.1" />       <!-- влево -->
<move  tx="0"   ty="0"  v="0.1" loop />  <!-- вверх и повтор -->
<click  go="next"/> 

Флаг loop в последнем теге loop означает, повтор проигрывания тегов move.

При движении (особенно, персонажей) необходимо производить смену фреймов анамимаци. Пусть в 0-й строке таблицы анимаций находится движение вправо, а в 1-й - вниз. Тогда перемещение вправо и вниз будет проводится следующим образом:

<draw res c1="0" c2="15" c="10" r="0" /> <!-- анимация движения вправо -->   
<draw res c1="0" c2="15" c="10" r="1" /> <!-- анимация движения вниз -->   
<move  tx="10"  ty="0"  v="0.1" draw/>   <!-- вправо -->
<move  tx="10"  ty="0"  v="0.1"/>        <!-- вниз -->

Флаг draw означает, что по окончании движения происходит перывание выполнения тега draw и переход к следующему тегу в списке тегов draw. Аналогично можно прервать тег вращения spin и т.д.

Симулирование физики

Тег move может быть в нескольких форматах

  • (tx,ty,v,a) - где (tx,ty) - целевая точка, v-скорость a-ускорение движения к ней.
  • (vx,vy,ax,ay) - где (vx,vy) - начальная скорость, (ax,ay) - ускорение (сила) действующая на объект.

Смоделируем падение объекта до линии ty="0", с последующим его подпрыгиванием три раза с затухающей амплитудой (координата y направлена вниз):

<init  x="0"    y="0"  />
<move  vx="0"   vy="0"    ay="9.8" ty="0"/>   <!-- падаем -->
<move  vx="0.5" vy="-0.5" ay="9.8" ty="0"/>   <!-- первый отскок -->
<move  vx="0.3" vy="-0.3" ay="9.8" ty="0"/>   <!-- второй отскок -->
<move  vx="0.1" vy="-0.1" ay="9.8" ty="0"/>   <!-- третий отскок -->

Описание свойств объекта

В файле со списком свойств данного объекта (в настройках проперти лист редактора сцен) вводится дополнительный тег add который добавляет раздел, имя которого указано в id в раздел объекта. К уже существующему разделу можно добавить еще один (например, по правой кнопке мыши), и т.д. Так, интерфейс машины состояний описывается следующим образом:

<machine name="Машина состояний" >
   <property name="имя" value=""   type="string" id="nm" />
   <group name = "координаты">
      <property name="x"   value="0"  type="float" id="x" />
      <property name="y"   value="0"  type="float" id="y" />
   </group>
   ...
   <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>