<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.appsalutecreator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Steps</id>
	<title>wiki.appsalutecreator.com - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.appsalutecreator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Steps"/>
	<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Steps"/>
	<updated>2026-10-17T03:56:04Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.15</generator>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:HiddenList&amp;diff=3034</id>
		<title>Обсуждение:HiddenList</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:HiddenList&amp;diff=3034"/>
		<updated>2013-02-12T19:24:42Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Возможные расширения ([[Участник:Steps|Steps]] 20:22, 12 февраля 2013 (CET)):&lt;br /&gt;
* зеркальное отражение хидден-сцены вместе с объектами (режим НЛО в Mystery Manor).&lt;br /&gt;
* режим ночь - вся сцена затемнена и виден только луч фонаря (палец)&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:HiddenList&amp;diff=3033</id>
		<title>Обсуждение:HiddenList</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:HiddenList&amp;diff=3033"/>
		<updated>2013-02-12T19:22:41Z</updated>

		<summary type="html">&lt;p&gt;Steps: Новая страница: «Возможные расширения (~~~~): * зеркальное отражение хидден-сцены вместе с объектами (режим ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Возможные расширения ([[Участник:Steps|Steps]] 20:22, 12 февраля 2013 (CET)):&lt;br /&gt;
* зеркальное отражение хидден-сцены вместе с объектами (режим НЛО в Mystery Manor).&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2671</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2671"/>
		<updated>2013-01-25T11:17:48Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Улучшение интерфейса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Внимание !!&lt;br /&gt;
* Перед публикацией внимательно читать ВСЕ!&lt;br /&gt;
* Делаем при обсуждении отступы (двоеточие) и подписываемся (4 тильды).&lt;br /&gt;
&lt;br /&gt;
== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
:: С какой клавишей использовать  CTRL +S  сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
:: В чем отличие от &amp;quot;Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&amp;quot;&lt;br /&gt;
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)&lt;br /&gt;
:::: я поддерживаю. мелочь, а приятно. [[Участник:Steps|Steps]] 12:13, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
:: С точки зрения кнопки - Она  &amp;quot;Кнопка&amp;quot; имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля  то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)&lt;br /&gt;
:: Стоит обсудить. Действительно, не очень логично считать дизейбл рабочим состоянием. [[Участник:Steps|Steps]] 12:16, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.&lt;br /&gt;
[[Файл:Редактор ресурсов.JPG|120px]]&lt;br /&gt;
[[Файл:Предпросмотр.JPG‎|120px|]]&lt;br /&gt;
&lt;br /&gt;
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Editor123.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Новые объекты и свойства==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
- изучение возможности&lt;br /&gt;
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics  генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
 MEGEDIT-1102 - не срочно&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2670</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2670"/>
		<updated>2013-01-25T11:16:49Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Улучшение интерфейса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Внимание !!&lt;br /&gt;
* Перед публикацией внимательно читать ВСЕ!&lt;br /&gt;
* Делаем при обсуждении отступы (двоеточие) и подписываемся (4 тильды).&lt;br /&gt;
&lt;br /&gt;
== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
:: С какой клавишей использовать  CTRL +S  сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
:: В чем отличие от &amp;quot;Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&amp;quot;&lt;br /&gt;
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)&lt;br /&gt;
:::: я поддерживаю. мелочь, а приятно. [[Участник:Steps|Steps]] 12:13, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
:: С точки зрения кнопки - Она  &amp;quot;Кнопка&amp;quot; имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля  то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)&lt;br /&gt;
:: Стоит обсудить. Действительно, не очень логично считать дизейбл рабочим состоянием. [[Участник:Steps|Steps]] 12:16, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.&lt;br /&gt;
[[Файл:Редактор ресурсов.JPG|120px|thumb|left|описание]]&lt;br /&gt;
[[Файл:Предпросмотр.JPG‎|120px|thumb|left|описание]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Editor123.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Новые объекты и свойства==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
- изучение возможности&lt;br /&gt;
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics  генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
 MEGEDIT-1102 - не срочно&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2669</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2669"/>
		<updated>2013-01-25T11:15:08Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Внимание !!&lt;br /&gt;
* Перед публикацией внимательно читать ВСЕ!&lt;br /&gt;
* Делаем при обсуждении отступы (двоеточие) и подписываемся (4 тильды).&lt;br /&gt;
&lt;br /&gt;
== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
:: С какой клавишей использовать  CTRL +S  сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
:: В чем отличие от &amp;quot;Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&amp;quot;&lt;br /&gt;
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)&lt;br /&gt;
:::: я поддерживаю. мелочь, а приятно. [[Участник:Steps|Steps]] 12:13, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
:: С точки зрения кнопки - Она  &amp;quot;Кнопка&amp;quot; имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля  то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.&lt;br /&gt;
[[Файл:Редактор ресурсов.JPG|120px|thumb|left|описание]]&lt;br /&gt;
[[Файл:Предпросмотр.JPG‎|120px|thumb|left|описание]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Editor123.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Новые объекты и свойства==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
- изучение возможности&lt;br /&gt;
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics  генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
 MEGEDIT-1102 - не срочно&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2668</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2668"/>
		<updated>2013-01-25T11:13:53Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Улучшение интерфейса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Внимание !!&lt;br /&gt;
Перед публикацией внимательно читать ВСЕ!&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
:: С какой клавишей использовать  CTRL +S  сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
:: В чем отличие от &amp;quot;Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&amp;quot;&lt;br /&gt;
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)&lt;br /&gt;
:::: я поддерживаю. мелочь, а приятно. [[Участник:Steps|Steps]] 12:13, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
:: С точки зрения кнопки - Она  &amp;quot;Кнопка&amp;quot; имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля  то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.&lt;br /&gt;
[[Файл:Редактор ресурсов.JPG|120px|thumb|left|описание]]&lt;br /&gt;
[[Файл:Предпросмотр.JPG‎|120px|thumb|left|описание]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Editor123.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Новые объекты и свойства==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
- изучение возможности&lt;br /&gt;
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics  генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
 MEGEDIT-1102 - не срочно&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2667</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2667"/>
		<updated>2013-01-25T11:13:09Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Улучшение интерфейса */ форматирование. делаем отступы, подписываемся&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Внимание !!&lt;br /&gt;
Перед публикацией внимательно читать ВСЕ!&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
:: С какой клавишей использовать  CTRL +S  сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
:: В чем отличие от &amp;quot;Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&amp;quot;&lt;br /&gt;
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)&lt;br /&gt;
:::: я поддерживаю. мелочь, а приятно.&lt;br /&gt;
&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
:: С точки зрения кнопки - Она  &amp;quot;Кнопка&amp;quot; имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля  то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.&lt;br /&gt;
[[Файл:Редактор ресурсов.JPG|120px|thumb|left|описание]]&lt;br /&gt;
[[Файл:Предпросмотр.JPG‎|120px|thumb|left|описание]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Editor123.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Новые объекты и свойства==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
- изучение возможности&lt;br /&gt;
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics  генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
 MEGEDIT-1102 - не срочно&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2644</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2644"/>
		<updated>2013-01-24T18:31:49Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Улучшение интерфейса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать &amp;quot;w&amp;quot; создается ф-я wait, &amp;quot;i&amp;quot;=if,&amp;lt;br&amp;gt; &amp;quot;m&amp;quot; = move, &amp;quot;s&amp;quot; = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)&lt;br /&gt;
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)&lt;br /&gt;
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Новые объекты ==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве.    &amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
[[Файл:Машина.JPG‎ ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2631</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2631"/>
		<updated>2013-01-24T13:13:42Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Улучшение интерфейса ==&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Новые объекты ==&lt;br /&gt;
&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Баги ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Реализовано ==&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2630</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2630"/>
		<updated>2013-01-24T13:11:29Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пожелания:&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;br /&gt;
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;br /&gt;
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2629</id>
		<title>Книга жалоб и пожеланий</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0_%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1_%D0%B8_%D0%BF%D0%BE%D0%B6%D0%B5%D0%BB%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=2629"/>
		<updated>2013-01-24T13:08:04Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пожелания:&lt;br /&gt;
&lt;br /&gt;
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=MediaWiki:Sidebar&amp;diff=2628</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=MediaWiki:Sidebar&amp;diff=2628"/>
		<updated>2013-01-24T13:07:49Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Absolutist Framework&lt;br /&gt;
** Learning|Уроки&lt;br /&gt;
** Absolutist Framework|Документация&lt;br /&gt;
** Downloads|Загрузка&lt;br /&gt;
** Книга жалоб и пожеланий|Предложения&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** currentevents-url|currentevents&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2579</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2579"/>
		<updated>2013-01-23T20:17:42Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* '''&amp;amp;''' - логическое '''и''' (вместо значка '''&amp;amp;''' можно использовать запятую ''',''');&lt;br /&gt;
* '''|''' - логическое '''или''';&lt;br /&gt;
* '''!''' - логическое '''не'''.&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Логические связки используются также как математической логике или любом языке программирования. &lt;br /&gt;
Так:&lt;br /&gt;
* A '''&amp;amp;''' B - истинно, если истинны оба условия A и B;&lt;br /&gt;
* A '''|''' B - истинно, если истинно хотя бы одно условие (или оба);&lt;br /&gt;
* '''!''' А - истинно, если условие A ложно.&lt;br /&gt;
Скобки в логическом выражении определяют приоритет (порядок) выполнения логических операций.&lt;br /&gt;
Отметим несколько тождеств, справедливых при формировании логических высказываний:&lt;br /&gt;
* !(A &amp;amp; B) = (!A) | (!B)&lt;br /&gt;
* !(A | B) = (!A) &amp;amp; (!B)&lt;br /&gt;
* !(!A) = A&lt;br /&gt;
&lt;br /&gt;
Если при формировании условия (ниже) есть несколько проверок, то они соединены логическим '''и'''.&lt;br /&gt;
Т.е., если хотя бы одна из них не выполняется, то считается, что условие не выполнилось.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val;&lt;br /&gt;
* '''st''' - имя состояния в котором может находиться объект obj;&lt;br /&gt;
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;&lt;br /&gt;
* '''val''' - значение параметра par, которое проверяется у объекта obj;&lt;br /&gt;
* '''op''' - операция сравнения par op val. Если опреации нет, то предполагается проверка на равенство par=val. Иначе используются операторы:&lt;br /&gt;
** '''&amp;lt;''' - меньше (par &amp;lt; val);&lt;br /&gt;
** '''&amp;gt;''' - больше (par &amp;gt; val);&lt;br /&gt;
** '''!=''' - не равно (par != val);&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно (par &amp;lt;&amp;gt; val);&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно (par &amp;gt;= val);&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно (par &amp;lt;= val);&lt;br /&gt;
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.&lt;br /&gt;
* '''buy''' - был ли куплен данный inn-app (проверяется флаг поля в объекте [[Options]]);&lt;br /&gt;
* '''url''' - валиден (правилен и может быть запущен) ли данный интернет-адрес;&lt;br /&gt;
* '''is_mus''' - играет ли сейчас музыка (значение 1);&lt;br /&gt;
* '''guest''' - объект который установил состояние (используется вместо параметра obj). Если указанный объект не менял состояние этой машины, то условие не срабатывает.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
Если же использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2578</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2578"/>
		<updated>2013-01-23T20:11:53Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* '''&amp;amp;''' - логическое '''и''' (можно использовать запятую ''',''');&lt;br /&gt;
* '''|''' - логическое '''или''';&lt;br /&gt;
* '''!''' - логическое '''не'''.&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Логические связки используются также как математической логике или любом языке программирования. &lt;br /&gt;
Так:&lt;br /&gt;
* A '''&amp;amp;''' B - истинно, если истинны оба условия A и B;&lt;br /&gt;
* A '''|''' B - истинно, если истинно хотя бы одно условие (или оба);&lt;br /&gt;
* '''!''' А - истинно, если условие A ложно.&lt;br /&gt;
Скобки в логическом выражении определяют приоритет (порядок) выполнения логических операций.&lt;br /&gt;
Отметим несколько тождеств, справедливых при формировании логических высказываний:&lt;br /&gt;
* !(A &amp;amp; B) = (!A) | (!B)&lt;br /&gt;
* !(A | B) = (!A) &amp;amp; (!B)&lt;br /&gt;
* !(!A) = A&lt;br /&gt;
&lt;br /&gt;
Если при формировании условия (ниже) есть несколько проверок, то они соединены логическим '''и'''.&lt;br /&gt;
Т.е., если хотя бы одна из них не выполняется, то считается, что условие не выполнилось.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val;&lt;br /&gt;
* '''st''' - имя состояния в котором может находиться объект obj;&lt;br /&gt;
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;&lt;br /&gt;
* '''val''' - значение параметра par, которое проверяется у объекта obj;&lt;br /&gt;
* '''op''' - операция сравнения par op val. Если опреации нет, то предполагается проверка на равенство par=val. Иначе используются операторы:&lt;br /&gt;
** '''&amp;lt;''' - меньше (par &amp;lt; val)&lt;br /&gt;
** '''&amp;gt;''' - больше (par &amp;gt; val)&lt;br /&gt;
** '''!=''' - не равно (par != val)&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно (par &amp;lt;&amp;gt; val)&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно (par &amp;gt;= val)&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно (par &amp;lt;= val)&lt;br /&gt;
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.&lt;br /&gt;
* '''buy''' - был ли куплен данный inn-app (проверяется флаг поля в объекте [[Options]]);&lt;br /&gt;
* '''url''' - валиден (правилен и может быть запущен) ли данный интернет-адрес;&lt;br /&gt;
* '''is_mus''' - играет ли сейчас музыка (значение 1);&lt;br /&gt;
* '''guest''' - объект который установил состояние (используется вместо параметра obj). Если указанный объект не менял состояние этой машины, то условие не срабатывает.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2577</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2577"/>
		<updated>2013-01-23T19:51:50Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* play */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Почему нет параметра if, аналогично команде set?&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
* Непонятен параметр if (перехода нет). Его надо интерпретировать аналогично команде set?&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
* Добавить параметр if, аналогично команде set.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2576</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2576"/>
		<updated>2013-01-23T19:40:41Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* '''&amp;amp;''' - логическое '''и''' (можно использовать запятую ''',''');&lt;br /&gt;
* '''|''' - логическое '''или''';&lt;br /&gt;
* '''!''' - логическое '''не'''.&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val;&lt;br /&gt;
* '''st''' - имя состояния в котором может находиться объект obj;&lt;br /&gt;
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;&lt;br /&gt;
* '''val''' - значение параметра par, которое проверяется у объекта obj;&lt;br /&gt;
* '''op''' - операция сравнения par op val. Если опреации нет, то предполагается проверка на равенство par=val. Иначе используются операторы:&lt;br /&gt;
** '''&amp;lt;''' - меньше (par &amp;lt; val)&lt;br /&gt;
** '''&amp;gt;''' - больше (par &amp;gt; val)&lt;br /&gt;
** '''!=''' - не равно (par != val)&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно (par &amp;lt;&amp;gt; val)&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно (par &amp;gt;= val)&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно (par &amp;lt;= val)&lt;br /&gt;
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.&lt;br /&gt;
* '''buy''' - совершена ли покупка;&lt;br /&gt;
* '''guest''' - объект который установил состояние;&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2575</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2575"/>
		<updated>2013-01-23T19:37:09Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* '''&amp;amp;''' - логическое '''и''' (можно использовать запятую ''',''');&lt;br /&gt;
* '''|''' - логическое '''или''';&lt;br /&gt;
* '''!''' - логическое '''не'''.&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val;&lt;br /&gt;
* '''st''' - имя состояния в котором может находиться объект obj;&lt;br /&gt;
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;&lt;br /&gt;
* '''val''' - значение параметра par, которое проверяется у объекта obj;&lt;br /&gt;
* '''op''' - операция сравнения par op val. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;&lt;br /&gt;
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.&lt;br /&gt;
* '''buy''' - совершена ли покупка;&lt;br /&gt;
* '''guest''' - объект который установил состояние;&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2574</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2574"/>
		<updated>2013-01-23T19:23:26Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2573</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2573"/>
		<updated>2013-01-23T19:19:59Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* draw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2572</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2572"/>
		<updated>2013-01-23T19:16:05Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Процессы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать лагические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа&lt;br /&gt;
или в другое состояние (если есть параметр go).&lt;br /&gt;
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.&lt;br /&gt;
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект;&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта;&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется);&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду;&lt;br /&gt;
* '''t''' - время поворота (v игнорируется);&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды;&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; &lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;  команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; &lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2571</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2571"/>
		<updated>2013-01-23T18:57:14Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* wait */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать лагические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.&lt;br /&gt;
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.&lt;br /&gt;
&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2570</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2570"/>
		<updated>2013-01-23T18:53:22Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* play */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Почему нет параметра if, аналогично команде set?&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
* Непонятен параметр if (перехода нет). Он аналогичен set?&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
* Добавить параметр if, аналогично команде set.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2569</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2569"/>
		<updated>2013-01-23T18:50:48Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* init */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Почему нет параметра if, аналогично команде set?&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
* Непонятен параметр if (перехода нет). Он аналогичен set?&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2568</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2568"/>
		<updated>2013-01-23T18:48:44Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Почему нет параметра if, аналогично команде set?&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2567</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2567"/>
		<updated>2013-01-23T18:48:07Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать лагические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2566</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2566"/>
		<updated>2013-01-23T18:47:34Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать лагические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются&lt;br /&gt;
в параметре if других команд. Эти номера можно соединять при помощи логических связок:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if некоторой команды: '''(1&amp;amp;2)|(3&amp;amp;(!4))''',&lt;br /&gt;
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.&lt;br /&gt;
&lt;br /&gt;
Параметры команды:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2565</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2565"/>
		<updated>2013-01-23T18:43:30Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);&lt;br /&gt;
* '''f''' - начальный кадр;&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах;&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз;&lt;br /&gt;
* '''go''' - перейти в состояние;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать лагические операторы (см. [[#if|if]]);&lt;br /&gt;
* '''break''' - прервать команды.&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;&lt;br /&gt;
*'''loop''' - зациклить звук (звуки);&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку;&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной;&lt;br /&gt;
*'''obj''' - объект, используемый далее;&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной;&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер  (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2564</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2564"/>
		<updated>2013-01-23T18:33:15Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* var */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
*'''par''' - имя параметра, значение которого присваивается переменной&lt;br /&gt;
*'''val''' - значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2563</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2563"/>
		<updated>2013-01-23T18:32:39Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Инициализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.&lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2562</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2562"/>
		<updated>2013-01-23T18:25:52Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* draw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2561</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2561"/>
		<updated>2013-01-23T18:25:10Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''[[#Инициализация|Инициализация]]''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''[[#Процессы|Процессы]]''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''[[#Воздействия|Воздействия]]''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2560</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2560"/>
		<updated>2013-01-23T18:23:15Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#Условия_if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Инициализация ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Процессы ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Воздействия ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2559</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2559"/>
		<updated>2013-01-23T18:20:52Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''[[#draw|draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''[[#set|set]]''' - установка состояния другого объекта;&lt;br /&gt;
** '''[[#play|play]]''' - проиграть звук;&lt;br /&gt;
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''[[#wait|wait]]''' - задержка по времени;&lt;br /&gt;
** '''[[#move|move]]''' - равномерное движение;&lt;br /&gt;
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''[[#alpha|alpha]]''' - изменение прозрачности;&lt;br /&gt;
** '''[[#scale|scale]]''' - изменение размера;&lt;br /&gt;
** '''[[#phys|phys]]''' - ускоренное движение.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''[[#click|click]]''' - что делать при клике на машине;&lt;br /&gt;
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''[[#drag|drag]]''' - машину схватили и тащат;&lt;br /&gt;
** '''[[#throw|throw]]''' - машину схватили и кинули;&lt;br /&gt;
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''[[#Условия_if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2558</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2558"/>
		<updated>2013-01-23T18:16:37Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''[[#draw]]''' - установка графического ресурса;&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''set''' - установка состояния другого объекта;&lt;br /&gt;
** '''play''' - проиграть звук;&lt;br /&gt;
** '''var''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени;&lt;br /&gt;
** '''move''' - равномерное движение;&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''alpha''' - изменение прозрачности;&lt;br /&gt;
** '''scale''' - изменение размера;&lt;br /&gt;
** '''phys''' - ускоренное движение.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине;&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''drag''' - машину схватили и тащат;&lt;br /&gt;
** '''throw''' - машину схватили и кинули;&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''touch_in''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''touch_out''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''mouse_in''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''mouse_out''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2557</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2557"/>
		<updated>2013-01-23T18:13:51Z</updated>

		<summary type="html">&lt;p&gt;Steps: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса;&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''set''' - установка состояния другого объекта;&lt;br /&gt;
** '''play''' - проиграть звук;&lt;br /&gt;
** '''var''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени;&lt;br /&gt;
** '''move''' - равномерное движение;&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''alpha''' - изменение прозрачности;&lt;br /&gt;
** '''scale''' - изменение размера;&lt;br /&gt;
** '''phys''' - ускоренное движение.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине;&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''drag''' - машину схватили и тащат;&lt;br /&gt;
** '''throw''' - машину схватили и кинули;&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''touch_in''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''touch_out''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''mouse_in''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''mouse_out''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2556</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2556"/>
		<updated>2013-01-23T18:13:01Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса;&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.);&lt;br /&gt;
** '''set''' - установка состояния другого объекта;&lt;br /&gt;
** '''play''' - проиграть звук;&lt;br /&gt;
** '''var''' - переменная, которой присваивается значение параметра объекта;&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки.&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени;&lt;br /&gt;
** '''move''' - равномерное движение;&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота;&lt;br /&gt;
** '''alpha''' - изменение прозрачности;&lt;br /&gt;
** '''scale''' - изменение размера;&lt;br /&gt;
** '''phys''' - ускоренное движение.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине;&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши;&lt;br /&gt;
** '''drag''' - машину схватили и тащат;&lt;br /&gt;
** '''throw''' - машину схватили и кинули;&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом;&lt;br /&gt;
** '''touch_in''' - наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''touch_out''' - выведение мыши из машины, если палец &amp;quot;тащат&amp;quot; по экрану;&lt;br /&gt;
** '''mouse_in''' - наведение мыши на машину даже если не нажата кнопка мыши;&lt;br /&gt;
** '''mouse_out''' - выведение мыши из машины даже если не нажата кнопка мыши.&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2555</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2555"/>
		<updated>2013-01-23T18:05:18Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Команды процессов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2554</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2554"/>
		<updated>2013-01-23T18:00:17Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* init */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Почему нет параметра if, аналогично команде set?&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;br /&gt;
* Плохо описана команда в документации. Непонятно куда вставлять условия и т.п.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2553</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2553"/>
		<updated>2013-01-23T17:59:33Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* draw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Лучше, чтобы if работал также, как и в команде set (т.е. если if сработал, установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;br /&gt;
* Плохо описана команда в документации. Непонятно куда вставлять условия и т.п.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2552</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2552"/>
		<updated>2013-01-23T17:56:04Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* draw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Стоит if либо убрать, либо сделать, чтобы она работала аналогично команде set (т.е. если if сработал установить этот ресурс, иначе - нет;  и затем в любом случае перейти к следующим командам draw).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;br /&gt;
* Плохо описана команда в документации. Непонятно куда вставлять условия и т.п.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2551</id>
		<title>Обсуждение:Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:Machine&amp;diff=2551"/>
		<updated>2013-01-23T17:51:08Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторые замечания по синтаксису машин состояний [[Участник:Steps|Steps]] 16:19, 23 января 2013 (CET):&lt;br /&gt;
=== draw ===&lt;br /&gt;
* Зачем параметр '''go''' в командах инициализации?&lt;br /&gt;
* Сейчас параметр '''if''' бестолково работает в команде '''draw'''. Хоть срабатывает условие, хоть нет, происходит переход к следующему draw. Можно if-ом только один раз перебить ресурс из свойств. Стоит if либо убрать, либо сделать его break-м (т.е. если if сработал установить этот ресурс и к следующим командам draw не переходить).&lt;br /&gt;
* В анимации не работает '''loop''' и '''ft'''.&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
* Последние 7 параметров меняют другие машины, объекты и по-логике должны находиться к команде '''set'''.&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
* Если есть только одна команда wait, то '''loop''' в ней не срабатывает.&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
* Добавить параметр '''go'''. Тогда можно переходы-ветвления делать не из wait, а не посредственно из if. Будет короче и понятнее.&lt;br /&gt;
* Плохо описана команда в документации. Непонятно куда вставлять условия и т.п.&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2550</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2550"/>
		<updated>2013-01-23T17:48:16Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* wait */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms;&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае);&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано;&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go;&lt;br /&gt;
* '''loop''' - зациклить команды;&lt;br /&gt;
* '''break''' - прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2549</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2549"/>
		<updated>2013-01-23T17:47:16Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* wait */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2548</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2548"/>
		<updated>2013-01-23T17:46:30Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* buy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2547</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2547"/>
		<updated>2013-01-23T17:31:54Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* play */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
Проиграть звук.&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
*'''loop''' - зациклить звук (звуки)&lt;br /&gt;
*'''mus_stop''' - остановить текущую музыку&lt;br /&gt;
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
*'''if''' - номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2546</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2546"/>
		<updated>2013-01-23T17:30:56Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* Условия if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
play - проиграть звук&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''voice''' - Голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
&lt;br /&gt;
*'''loop''' - Зациклить звук (звуки)&lt;br /&gt;
&lt;br /&gt;
*'''mus_stop''' - Остановить текущую музыку&lt;br /&gt;
&lt;br /&gt;
*'''volume''' - Установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
&lt;br /&gt;
*'''if''' - Номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* '''obj''' - объект&lt;br /&gt;
* '''st''' - объект находится в состоянии&lt;br /&gt;
* '''par''' - параметр объекта&lt;br /&gt;
* '''op''' - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** '''&amp;lt;''' - меньше&lt;br /&gt;
** '''&amp;gt;''' - больше&lt;br /&gt;
** '''!=''' - не равно&lt;br /&gt;
** '''&amp;lt;&amp;gt;''' - не равно&lt;br /&gt;
** '''&amp;gt;=''' - больше или равно&lt;br /&gt;
** '''&amp;lt;=''' - меньше или равно&lt;br /&gt;
* '''val''' - значение&lt;br /&gt;
* '''buy''' - совершена ли покупка&lt;br /&gt;
* '''Guest''' - объект который установил состояние&lt;br /&gt;
* '''curScr''' - если текущий экран&lt;br /&gt;
* '''prScr''' - если предыдущий экран&lt;br /&gt;
* '''wasScr''' - если был экран&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* ''',''' - и&lt;br /&gt;
* '''&amp;amp;''' - и&lt;br /&gt;
* '''|''' - или&lt;br /&gt;
* '''!''' - не&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2545</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2545"/>
		<updated>2013-01-23T17:27:58Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* apply */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* '''obj''' - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* '''x1''' - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* '''x2''' - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* '''y1''' - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* '''y2''' - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* '''st''' - состояние, в которое надо перевести объект obj&lt;br /&gt;
* '''go''' - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения применения команды apply.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
play - проиграть звук&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''voice''' - Голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
&lt;br /&gt;
*'''loop''' - Зациклить звук (звуки)&lt;br /&gt;
&lt;br /&gt;
*'''mus_stop''' - Остановить текущую музыку&lt;br /&gt;
&lt;br /&gt;
*'''volume''' - Установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
&lt;br /&gt;
*'''if''' - Номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* Guest - объект который установил состояние&lt;br /&gt;
* curScr - если текущий экран&lt;br /&gt;
* prScr - если предидущий экран&lt;br /&gt;
* wasScr - если был экран&lt;br /&gt;
* obj - объект&lt;br /&gt;
* st - объект находится в состоянии&lt;br /&gt;
* par - параметр объекта&lt;br /&gt;
* op - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** &amp;lt; - меньше&lt;br /&gt;
** &amp;gt; - больше&lt;br /&gt;
** != - не равно&lt;br /&gt;
** &amp;lt;&amp;gt; - не равно&lt;br /&gt;
** &amp;gt;= - больше или равно&lt;br /&gt;
** &amp;lt;= - меньше или равно&lt;br /&gt;
* val - значение&lt;br /&gt;
* buy - совершена ли покупка&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* , - и&lt;br /&gt;
* &amp;amp; - и&lt;br /&gt;
* | - или&lt;br /&gt;
* ! - не&lt;br /&gt;
&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2544</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2544"/>
		<updated>2013-01-23T17:26:34Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* throw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* '''go''' - состояние, в которое, при клике, надо перейти;&lt;br /&gt;
* '''if''' - номер команды разрешения бросания;&lt;br /&gt;
* '''force''' - получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* obj - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* x1 - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* x2 - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* y1 - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* y2 - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* rm - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* ro - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* st - состояние, в которое надо перевести объект obj&lt;br /&gt;
* go - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* if - номер команды разрешения применения.&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
play - проиграть звук&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''voice''' - Голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
&lt;br /&gt;
*'''loop''' - Зациклить звук (звуки)&lt;br /&gt;
&lt;br /&gt;
*'''mus_stop''' - Остановить текущую музыку&lt;br /&gt;
&lt;br /&gt;
*'''volume''' - Установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
&lt;br /&gt;
*'''if''' - Номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* Guest - объект который установил состояние&lt;br /&gt;
* curScr - если текущий экран&lt;br /&gt;
* prScr - если предидущий экран&lt;br /&gt;
* wasScr - если был экран&lt;br /&gt;
* obj - объект&lt;br /&gt;
* st - объект находится в состоянии&lt;br /&gt;
* par - параметр объекта&lt;br /&gt;
* op - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** &amp;lt; - меньше&lt;br /&gt;
** &amp;gt; - больше&lt;br /&gt;
** != - не равно&lt;br /&gt;
** &amp;lt;&amp;gt; - не равно&lt;br /&gt;
** &amp;gt;= - больше или равно&lt;br /&gt;
** &amp;lt;= - меньше или равно&lt;br /&gt;
* val - значение&lt;br /&gt;
* buy - совершена ли покупка&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* , - и&lt;br /&gt;
* &amp;amp; - и&lt;br /&gt;
* | - или&lt;br /&gt;
* ! - не&lt;br /&gt;
&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2543</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2543"/>
		<updated>2013-01-23T17:25:51Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* drop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* '''obj''' - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* '''go''' - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* '''if''' - номер условия разрешения бросания.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* go - состояние, в которое, при клике, надо перейти.&lt;br /&gt;
* if - номер команды разрешения бросания.&lt;br /&gt;
* force - Получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* obj - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* x1 - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* x2 - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* y1 - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* y2 - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* rm - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* ro - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* st - состояние, в которое надо перевести объект obj&lt;br /&gt;
* go - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* if - номер команды разрешения применения.&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
play - проиграть звук&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''voice''' - Голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
&lt;br /&gt;
*'''loop''' - Зациклить звук (звуки)&lt;br /&gt;
&lt;br /&gt;
*'''mus_stop''' - Остановить текущую музыку&lt;br /&gt;
&lt;br /&gt;
*'''volume''' - Установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
&lt;br /&gt;
*'''if''' - Номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* Guest - объект который установил состояние&lt;br /&gt;
* curScr - если текущий экран&lt;br /&gt;
* prScr - если предидущий экран&lt;br /&gt;
* wasScr - если был экран&lt;br /&gt;
* obj - объект&lt;br /&gt;
* st - объект находится в состоянии&lt;br /&gt;
* par - параметр объекта&lt;br /&gt;
* op - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** &amp;lt; - меньше&lt;br /&gt;
** &amp;gt; - больше&lt;br /&gt;
** != - не равно&lt;br /&gt;
** &amp;lt;&amp;gt; - не равно&lt;br /&gt;
** &amp;gt;= - больше или равно&lt;br /&gt;
** &amp;lt;= - меньше или равно&lt;br /&gt;
* val - значение&lt;br /&gt;
* buy - совершена ли покупка&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* , - и&lt;br /&gt;
* &amp;amp; - и&lt;br /&gt;
* | - или&lt;br /&gt;
* ! - не&lt;br /&gt;
&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2542</id>
		<title>Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Machine&amp;diff=2542"/>
		<updated>2013-01-23T17:25:23Z</updated>

		<summary type="html">&lt;p&gt;Steps: /* drag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC right}}&lt;br /&gt;
'''Машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё&lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
Все команды состояния, разбиваются на три группы:&lt;br /&gt;
* '''Инициализации''':&lt;br /&gt;
** '''draw''' - установка графического ресурса&lt;br /&gt;
** '''init''' - инициализация параметров машины (координаты и т.п.)&lt;br /&gt;
** '''set''' - установка состояния другого объекта&lt;br /&gt;
** '''buy''' - запуск процедуры in-app покупки&lt;br /&gt;
* '''Процессов''':&lt;br /&gt;
** '''wait''' - задержка по времени&lt;br /&gt;
** '''move''' - движение&lt;br /&gt;
** '''alpha''' - изменение прозрачности&lt;br /&gt;
** '''scale''' - изменение размера&lt;br /&gt;
** '''rot''' - вращение вокруг точки пивота&lt;br /&gt;
** '''phys''' - движение в силовом поле.&lt;br /&gt;
* '''Воздействия''':&lt;br /&gt;
** '''click''' - что делать при клике на машине&lt;br /&gt;
** '''drop''' - на машине отпущена клавиша мыши&lt;br /&gt;
** '''drag''' - машину схватили и тащат&lt;br /&gt;
** '''throw''' - машину схватили и кинули&lt;br /&gt;
** '''apply''' - сработает при пересечении машины с линией или объектом&lt;br /&gt;
&lt;br /&gt;
Кроме этого, есть команда '''if''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу.&lt;br /&gt;
&lt;br /&gt;
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],&lt;br /&gt;
начиная с [[Checkbox как машина состояний|третьего]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
Общие для всех объектов свойства описаны в документе [[Object|Object]].&lt;br /&gt;
Дополнительные свойства:&lt;br /&gt;
&lt;br /&gt;
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.&lt;br /&gt;
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.&lt;br /&gt;
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).&lt;br /&gt;
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.&lt;br /&gt;
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.&lt;br /&gt;
&lt;br /&gt;
== Команды инициализации ==&lt;br /&gt;
&lt;br /&gt;
При первом попадании в состояние, сразу выполняются команды инициализации init, draw и set. Если в этих командах нет параметра break, они все выполняются до запуска процессов. &lt;br /&gt;
&lt;br /&gt;
=== draw ===&lt;br /&gt;
&lt;br /&gt;
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:&lt;br /&gt;
&lt;br /&gt;
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов)&lt;br /&gt;
* '''f''' - начальный кадр&lt;br /&gt;
* '''ft''' - длительность кадра в миллисекундах&lt;br /&gt;
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран одина раз&lt;br /&gt;
* '''go''' - перейти в состояние&lt;br /&gt;
* '''if''' - условие перехода&lt;br /&gt;
* '''break''' - прервать команды&lt;br /&gt;
&lt;br /&gt;
Пустая команда draw (без параметров) &amp;quot;сбрасывает&amp;quot; текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.&lt;br /&gt;
&lt;br /&gt;
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).&lt;br /&gt;
&lt;br /&gt;
'''Для работы loop необходимо чтобы в редакторе ресурсов в настройках анимации было отключено зацикливание(looped).&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
&lt;br /&gt;
Инициализация параметров данной машины&lt;br /&gt;
&lt;br /&gt;
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;&lt;br /&gt;
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);&lt;br /&gt;
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;&lt;br /&gt;
* '''v''' - скорость для команды move&lt;br /&gt;
* '''vr''' - угловая скорость для команды rot&lt;br /&gt;
* '''vx''','''vy''' - начальная скорость для команды phys&lt;br /&gt;
* '''ax''','''ay''' - ускорение для команды phys&lt;br /&gt;
* '''z координата''' - координата машины по z.&lt;br /&gt;
* '''z приращение''' - приращение координаты машины по z относительно текущего&lt;br /&gt;
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима)&lt;br /&gt;
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга&lt;br /&gt;
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто&lt;br /&gt;
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут&lt;br /&gt;
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран&lt;br /&gt;
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние&lt;br /&gt;
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше&lt;br /&gt;
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.&lt;br /&gt;
&lt;br /&gt;
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
&lt;br /&gt;
Перевод другого объекта в некоторое состояние или изменение его параметров.&lt;br /&gt;
&lt;br /&gt;
* '''obj''' - изменяемый объект (выбирается из списка объектов);&lt;br /&gt;
* '''st''' - состояние в которое переводится объект.&lt;br /&gt;
* '''scr_obj''' - у какого экрана надо изменить состояние st либо параметры.&lt;br /&gt;
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr.&lt;br /&gt;
* '''val''' - значение параметра объекта для установки&lt;br /&gt;
* '''round''' - округлить значение, записываемое в val&lt;br /&gt;
* '''val_obj''' - id объекта, будет записано в в par&lt;br /&gt;
* '''val_txt''' - id текста, будет записано в в par&lt;br /&gt;
* '''val_scr''' - id экрана, будет записано в в par&lt;br /&gt;
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par  объекта obj&lt;br /&gt;
* '''scr''' - экран на который мы хотим перейти&lt;br /&gt;
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется&lt;br /&gt;
* '''if''' - номер (начиная с нуля) команды if при выполнении которого происходит отработка команды set. &lt;br /&gt;
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.&lt;br /&gt;
&lt;br /&gt;
=== buy ===&lt;br /&gt;
&lt;br /&gt;
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).&lt;br /&gt;
&lt;br /&gt;
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте store&lt;br /&gt;
* '''объект(успех)''' - объект, которому сообщается об удачной покупке&lt;br /&gt;
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки&lt;br /&gt;
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке&lt;br /&gt;
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки&lt;br /&gt;
&lt;br /&gt;
== Команды процессов ==&lt;br /&gt;
&lt;br /&gt;
=== wait ===&lt;br /&gt;
 &lt;br /&gt;
Пауза имеет следующие параметры:&lt;br /&gt;
* '''t''' - длительность выполнения команды в ms&lt;br /&gt;
* '''dt''' - интервал t+/- dt, внутри которого команда может быть случайно прервана (при t&amp;gt;t+dt прерывается в любом случае)&lt;br /&gt;
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go.&lt;br /&gt;
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия if, если оно указано.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды&lt;br /&gt;
* '''break''' - Прервать выполнение команд wait на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Кроме этих параметров, все команды процессов могут содержать параметры break, loop и параметры совпадающие с именами других процессов move,rot и т.д. Все эти параметры служат для управления циклами и прерываниями.&lt;br /&gt;
&lt;br /&gt;
Простейший набор параметров команды wait выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;    // ждем 1000ms и покидаем состояние&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;st1&amp;quot;/&amp;gt; // через t с вероятностью 1/2 перейдет в st1&lt;br /&gt;
&amp;lt;wait go=&amp;quot;st2&amp;quot;/&amp;gt; // иначе,  перейдем в st2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Этот же синтаксис позволяет делать состояния с различным временем жизни:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; p=&amp;quot;0.5&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt; // с вероятностью 1/2 живем 100ms&lt;br /&gt;
&amp;lt;wait t=&amp;quot;100&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;       // или 200ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;wait t=&amp;quot;1000&amp;quot; dt=&amp;quot;200&amp;quot; go=&amp;quot;next&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== move ===&lt;br /&gt;
&lt;br /&gt;
Перемещение по сцене:&lt;br /&gt;
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект&lt;br /&gt;
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются). Можно задавать смесь tx, dy или dx,ty&lt;br /&gt;
* '''v''' - скороcть перемещения в пикселях в секунду. Для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость.&lt;br /&gt;
* '''t''' - время перемещения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.&lt;br /&gt;
&lt;br /&gt;
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за cекунду (а не миллисекунду!)&lt;br /&gt;
&lt;br /&gt;
=== rot ===&lt;br /&gt;
&lt;br /&gt;
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.&lt;br /&gt;
* '''ta''' - целевой угол поворота объекта&lt;br /&gt;
* '''da''' - на сколько надо повернуться (ta игнорируется)&lt;br /&gt;
* '''v''' - угловая скорость поворота в градусах в секунду&lt;br /&gt;
* '''t''' - время поворота (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд движения с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.&lt;br /&gt;
&lt;br /&gt;
=== alpha ===&lt;br /&gt;
&lt;br /&gt;
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)&lt;br /&gt;
* '''ta''' - целевая прозрачность&lt;br /&gt;
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)&lt;br /&gt;
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)&lt;br /&gt;
* '''t''' - время изменения (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд alpha с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== scale ===&lt;br /&gt;
&lt;br /&gt;
Изменение размеров объекта&lt;br /&gt;
* '''tx''', '''ty''' - целевой масштаб по каждой оси&lt;br /&gt;
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси&lt;br /&gt;
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)&lt;br /&gt;
* '''t''' - длительность выполнения команды (v игнорируется)&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop'''  - зациклить команды - Начать выполнение команд scale с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).&lt;br /&gt;
&lt;br /&gt;
=== phys ===&lt;br /&gt;
&lt;br /&gt;
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).&lt;br /&gt;
&lt;br /&gt;
* '''vx''', '''vy''' - начальная скорость&lt;br /&gt;
* '''ax''', '''ay''' - величина ускорения по каждой оси&lt;br /&gt;
* '''tvx''', '''tvy''' - целевая скорость&lt;br /&gt;
* '''tx''', '''ty''' - целевая координата&lt;br /&gt;
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.&lt;br /&gt;
* '''if''' - номер команды if  (начиная с нуля), при выполнении которой происходит переход go.&lt;br /&gt;
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.&lt;br /&gt;
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их сново можно из команд процессов). &lt;br /&gt;
&lt;br /&gt;
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координте y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;down&amp;quot;&amp;gt;                                    // падаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ay=&amp;quot;20&amp;quot; ty=&amp;quot;0&amp;quot; go=&amp;quot;touch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;touch&amp;quot;&amp;gt;                                   // касаемся земли&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                       // опускаем центр при сжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;0.8&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                     // сжимаемся&lt;br /&gt;
    &amp;lt;move dy=&amp;quot;-24&amp;quot; t=&amp;quot;300&amp;quot;/&amp;gt;                      // поднимаем центр при разжатии&lt;br /&gt;
    &amp;lt;scale ty=&amp;quot;1&amp;quot; t=&amp;quot;300&amp;quot; go=&amp;quot;up&amp;quot;/&amp;gt;               // разжимаемся&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;up&amp;quot;&amp;gt;                                      // взлетаем&lt;br /&gt;
    &amp;lt;phys vy=&amp;quot;0&amp;quot; ty=&amp;quot;-200&amp;quot; go=&amp;quot;down&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.&lt;br /&gt;
&lt;br /&gt;
== Команды воздействий ==&lt;br /&gt;
&lt;br /&gt;
=== click ===&lt;br /&gt;
&lt;br /&gt;
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_in ===&lt;br /&gt;
&lt;br /&gt;
Наведение мыши/пальца на машину, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== touch_out ===&lt;br /&gt;
Выведение мыши/пальца из машины, если палец &amp;quot;тащат&amp;quot; по экрану.&lt;br /&gt;
* '''go''' - состояние в которое при клике надо перейти;&lt;br /&gt;
* '''if''' - номер команды условия, при котором срабатывает переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_in ===&lt;br /&gt;
&lt;br /&gt;
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== mouse_out ===&lt;br /&gt;
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)&lt;br /&gt;
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля), при срабатывании которого, происходит переход go.&lt;br /&gt;
&lt;br /&gt;
=== drag ===&lt;br /&gt;
&lt;br /&gt;
Если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект &amp;quot;прилипнет&amp;quot; к мышке, и будет за ней таскаться. Можно ограничить разрешенную область таскания, за которую объект выпускаться не будет. &lt;br /&gt;
* '''x1''' - разрешено таскать, когда координата объекта правее;&lt;br /&gt;
* '''x2''' - разрешено таскать, когда координата объекта левее;&lt;br /&gt;
* '''y1''' - разрешено таскать, когда координата объекта ниже;&lt;br /&gt;
* '''y2''' - разрешено таскать, когда координата объекта выше;&lt;br /&gt;
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;&lt;br /&gt;
* '''obj''' - объект у какоторого надо изменить состояние;&lt;br /&gt;
* '''st'''  - новое состояние объекта obj;&lt;br /&gt;
* '''таскать за пивот''' - 1 - таскать объект за пивот, 0 - за ту точку, за которую схватили&lt;br /&gt;
&lt;br /&gt;
=== drop ===&lt;br /&gt;
&lt;br /&gt;
Если нажатая кнопка мышки отпускается, вызвается эта команда. Обычно она используется в связке с командой drop&lt;br /&gt;
* obj - объект, на который надо уронить таскаемый объект;&lt;br /&gt;
* go - состояние в которое переходим при отпускании мышки;&lt;br /&gt;
* if - номер условия разрешения бросания.&lt;br /&gt;
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;drag&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;drag x1=&amp;quot;-350&amp;quot; x2=&amp;quot;350&amp;quot; y1=&amp;quot;-250&amp;quot; y2=&amp;quot;250&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;drop obj=&amp;quot;box&amp;quot; go=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;set obj=&amp;quot;box&amp;quot; st=&amp;quot;open&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;0.01&amp;quot; ty=&amp;quot;0.01&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;hide&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;268&amp;quot; y=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;scale tx=&amp;quot;1&amp;quot; ty=&amp;quot;1&amp;quot; t=&amp;quot;500&amp;quot; go=&amp;quot;drag&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ящик:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;close&amp;quot;&amp;gt;                        // начальное состояние ящика&lt;br /&gt;
    &amp;lt;init al=&amp;quot;1&amp;quot;/&amp;gt;                     // если его кто-то сюда переведет - он появится.&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;open&amp;quot;&amp;gt;              &lt;br /&gt;
    &amp;lt;alpha ta=&amp;quot;0&amp;quot; t=&amp;quot;500&amp;quot;/&amp;gt;            // исчезает по прозрачности за 500 ms&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== throw ===&lt;br /&gt;
 &lt;br /&gt;
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:&lt;br /&gt;
* go - состояние, в которое, при клике, надо перейти.&lt;br /&gt;
* if - номер команды разрешения бросания.&lt;br /&gt;
* force - Получаемая скорость равна разнице пискелей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.&lt;br /&gt;
&lt;br /&gt;
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).&lt;br /&gt;
&lt;br /&gt;
=== apply ===&lt;br /&gt;
&lt;br /&gt;
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.&lt;br /&gt;
* obj - сработает , если пересеклись с этим объектом;&lt;br /&gt;
* x1 - сработает, если центр объекта левее этого x-ка;&lt;br /&gt;
* x2 - сработает, если центр объекта правее этого x-ка;&lt;br /&gt;
* y1 - сработает, если центр объекта выше этого y-ка;&lt;br /&gt;
* y2 - сработает, если центр объекта ниже этого y-ка;&lt;br /&gt;
* rm - радиус этой машины (если rm=0, то она считается прямоугольной)&lt;br /&gt;
* ro - радиус объекта obj (если ro=0, то он считается прямоугольным)&lt;br /&gt;
* st - состояние, в которое надо перевести объект obj&lt;br /&gt;
* go - состояние, в которое надо перейти при срабатывании;&lt;br /&gt;
* if - номер команды разрешения применения.&lt;br /&gt;
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в &amp;quot;тыкву&amp;quot;. Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква &amp;quot;взрывается&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;trow&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;init x=&amp;quot;-350&amp;quot; y=&amp;quot;150&amp;quot;/&amp;gt;                      // начальное положение&lt;br /&gt;
    &amp;lt;throw go=&amp;quot;fly&amp;quot;/&amp;gt;                             // бросаем&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;st id=&amp;quot;fly&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;phys ay=&amp;quot;100&amp;quot;/&amp;gt;                              // летим&lt;br /&gt;
    &amp;lt;apply y2=&amp;quot;300&amp;quot; go=&amp;quot;throw&amp;quot;/&amp;gt;                  // с землей&lt;br /&gt;
    &amp;lt;apply obj=&amp;quot;тыква&amp;quot; rm=&amp;quot;8&amp;quot; ro=&amp;quot;10&amp;quot; st=&amp;quot;bang&amp;quot;/&amp;gt; // с тыквой&lt;br /&gt;
&amp;lt;/st&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
&lt;br /&gt;
play - проиграть звук&lt;br /&gt;
&lt;br /&gt;
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''voice''' - Голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов)&lt;br /&gt;
&lt;br /&gt;
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом&lt;br /&gt;
&lt;br /&gt;
*'''loop''' - Зациклить звук (звуки)&lt;br /&gt;
&lt;br /&gt;
*'''mus_stop''' - Остановить текущую музыку&lt;br /&gt;
&lt;br /&gt;
*'''volume''' - Установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии&lt;br /&gt;
&lt;br /&gt;
*'''if''' - Номер (начиная с нуля) условия перехода (команды if)&lt;br /&gt;
&lt;br /&gt;
=== var ===&lt;br /&gt;
&lt;br /&gt;
Переменная, которой присваивается значение параметра объекта&lt;br /&gt;
&lt;br /&gt;
*'''name''' - имя переменной&lt;br /&gt;
&lt;br /&gt;
*'''obj''' - объект, используемый далее&lt;br /&gt;
&lt;br /&gt;
*'''par''' - Имя параметра, значение которого присваивается переменной&lt;br /&gt;
&lt;br /&gt;
*'''val''' - Значение переменной, если отсутствуют obj и par&lt;br /&gt;
&lt;br /&gt;
== Условия if ==&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
* Guest - объект который установил состояние&lt;br /&gt;
* curScr - если текущий экран&lt;br /&gt;
* prScr - если предидущий экран&lt;br /&gt;
* wasScr - если был экран&lt;br /&gt;
* obj - объект&lt;br /&gt;
* st - объект находится в состоянии&lt;br /&gt;
* par - параметр объекта&lt;br /&gt;
* op - операция сравнения с заданным значением. Может быть:&lt;br /&gt;
** &amp;lt; - меньше&lt;br /&gt;
** &amp;gt; - больше&lt;br /&gt;
** != - не равно&lt;br /&gt;
** &amp;lt;&amp;gt; - не равно&lt;br /&gt;
** &amp;gt;= - больше или равно&lt;br /&gt;
** &amp;lt;= - меньше или равно&lt;br /&gt;
* val - значение&lt;br /&gt;
* buy - совершена ли покупка&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-val, то будет происходить проверка на равенство значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
Если использовать obj-par-op-val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записаного в поле val.&lt;br /&gt;
&lt;br /&gt;
По отдельноси каждый из if-ов возвращает значение true или false, далее с if-ами можно создавать логические выражения, в том числе со знаками приоритета(скобочками), например в set-aх.&lt;br /&gt;
&lt;br /&gt;
Логические операции:&lt;br /&gt;
* , - и&lt;br /&gt;
* &amp;amp; - и&lt;br /&gt;
* | - или&lt;br /&gt;
* ! - не&lt;br /&gt;
&lt;br /&gt;
Пример записи логического выражения в поле if set-a: (1&amp;amp;2)|(3&amp;amp;(!4))&lt;/div&gt;</summary>
		<author><name>Steps</name></author>
		
	</entry>
</feed>