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

Материал из synset
Перейти к: навигация, поиск
(Объект : Машина состояний)
Строка 38: Строка 38:
 
</pre>
 
</pre>
  
=== Управления объектами ===
+
=== Условные переходы ===
Любой тег может содержать свойство go="новое состояние" которое означает
+
'''Любой тег''' может содержать свойство go="новое состояние" которое означает
 
переход к новому состоянию после завершения выполнения данного тега.
 
переход к новому состоянию после завершения выполнения данного тега.
 
Подобный переход может сопровождаться условием пребывании некоторого объекта в фиксированном состоянии.
 
Подобный переход может сопровождаться условием пребывании некоторого объекта в фиксированном состоянии.
 
Например, пусть переход по клику разрешен, только если, если объект c id=2 находится в состоянии "show". Тогда:
 
Например, пусть переход по клику разрешен, только если, если объект c id=2 находится в состоянии "show". Тогда:
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
<click  go="run" obj="2" st="show">  
+
<click  go="run" obj="2" st="show"/>  
 
</pre>
 
</pre>
 
Если нужно отслеживать состояние нескольких объектов, то делаем несколько секций click:
 
Если нужно отслеживать состояние нескольких объектов, то делаем несколько секций click:
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
<click  go="run" obj="2" st="show">  
+
<click  go="run" obj="2" st="show"/>  
<click  go="run" obj="3" st="play">  
+
<click  go="run" obj="3" st="play"/>  
 
</pre>
 
</pre>
 
В этом случае работает '''логическое или''' (или 2-й объект в st=show или 3-й в st=play).
 
В этом случае работает '''логическое или''' (или 2-й объект в st=show или 3-й в st=play).
Строка 55: Строка 55:
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
 
<click  go="run" >
 
<click  go="run" >
   <if obj="2" st="show">
+
   <if obj="2" st="show"/>
   <if obj="2" st="show">
+
   <if obj="2" st="show"/>
/>  
+
</click>  
 
<click  go="run" obj="3" st="play">  
 
<click  go="run" obj="3" st="play">  
 
</pre>
 
</pre>
 
'''и''' объект с id=3 находится в состоянии  "play"
 
'''и''' объект с id=3 находится в состоянии  "play"
  
В данном состоянии может быть несколько событийных разделов '''click''' и '''timer''', из которых выполняется первый, условия которого сработали:
+
=== Инициализация ===
<pre class="brush:xml; gutter: false;">
 
<st id="wait">                        <!-- реакция на клик -->
 
  <click  go="run">
 
      <if obj="2" st="show" >
 
  </click>
 
  <click  go="run">
 
      <if obj="3" st="play">
 
  </click>
 
</st>
 
</pre>
 
Т.е. при клике произойдет переход в состояние "run", если объект 2 находится в состоянии "show" '''или''' объект 3 в состоянии "play".
 
 
 
=== Инициализация состояния ===
 
  
 
При первом попадании в состояние можно установить те или иные параметры объекта.
 
При первом попадании в состояние можно установить те или иные параметры объекта.
Строка 82: Строка 69:
 
<init x="100" y="0"  al="0" />  
 
<init x="100" y="0"  al="0" />  
 
</pre>
 
</pre>
 
+
Кроме этого, машина состояний может изменять состояния других объектов (не только машин).  
Машины состояний могут изменять состояния других объектов. Происходит это также в секции '''init''':
 
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
<init>                           
+
<set obj="2" st="show" >                   <!-- перевод объекта 2 в состояние show -->     
  <set obj="2" st="show" >   <!-- перевод объекта 2 в состояние show -->     
+
<set obj="3" st="play" >                   <!-- перевод объекта 3 в состояние play -->   
</init>  
 
 
</pre>
 
</pre>
  
 
=== Анимация объекта ===
 
=== Анимация объекта ===
  
В разделе рисования происходит управление проигрыванием анимации объекта.
+
В разделе рисования происходит задание графического ресурса и параметров проигрывания анимации объекта.
 
Пусть, например, различные этапы движения персонажа собраны в графическом ресурсе в прямоугольную
 
Пусть, например, различные этапы движения персонажа собраны в графическом ресурсе в прямоугольную
 
таблицу (по строкам расположено движение вперед, поворот и т.п.).
 
таблицу (по строкам расположено движение вперед, поворот и т.п.).
Строка 101: Строка 86:
  
 
Кроме фреймовой анимации возможно управление alpha-каналом, перемещением по сцене, вращением и т.п.
 
Кроме фреймовой анимации возможно управление alpha-каналом, перемещением по сцене, вращением и т.п.
Это осуществляется в таймерном разделе.
 
 
Например, пусть объект должен переместиться в целевую точку с координатами tx,ty
 
Например, пусть объект должен переместиться в целевую точку с координатами tx,ty
со скоростью 0.1 пиксель в ms, увеличивая свою непрозрачность с начальной (из раздела init) до ta=1 со скоростью da в ms. Тогда таймерный раздел выглядит следующим образом:
+
со скоростью 0.1 пиксель в ms, увеличивая свою непрозрачность с начальной (из раздела init) до ta=1 со скоростью da в ms. При этом он вращается и уменьшается:
 
<pre class="brush:xml; gutter: false;">
 
<pre class="brush:xml; gutter: false;">
<timer tm="3000" go="wait">   
+
<move  tx="100" ty="200" v="0.1" />
  <move  tx="100" ty="200" v="0.1" br="1"/>
+
<alpha ta="1.0" da="0.001"  />
  <alpha ta="1.0" da="0.001"  />
+
<spin  ta="0.1" da="0.001"  />
</timer>
+
<scale ts="0.1" ds="0.001"  />
 
</pre>
 
</pre>
Переход '''go''' из состояния происходит либо по истечению времени tm либо при достижению целевых значений, если установлен флаг br="1" (выше для move).
+
Любых команд движения может быть несколько. Например, пусть в данном состоянии объект должен двигаться по квадрату, пока мы на него не кликнем:
 +
<pre class="brush:xml; gutter: false;">
 +
<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"/>
 +
</pre>
 +
Флаг loop в последнем теге loop означает, повтор проигрывания тегов move.
 +
 
 +
=== Симулирование физики ===
  
 +
Тег 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"/>  <!-- третий отскок -->
 +
</pre>
 +
 
=== Описание свойств объекта ===
 
=== Описание свойств объекта ===
  

Версия 08:19, 12 октября 2011

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

Машина состояний является универсальным объектом для программирования в редакторе сцен сложного поведения объектов. Для машин с типовым набором состояний и поведений, в дальнейшем будут вводиться отдельные объекты. В 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" >
   <if obj="2" st="show"/>
   <if obj="2" st="show"/>
</click> 
<click  go="run" obj="3" st="play"> 

и объект с id=3 находится в состоянии "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.

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

Тег 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>