https://wiki.appsalutecreator.com/api.php?action=feedcontributions&user=Nbeznosov&feedformat=atomwiki.appsalutecreator.com - Вклад участника [ru]2024-03-29T08:05:12ZВклад участникаMediaWiki 1.31.15https://wiki.appsalutecreator.com/index.php?title=Patchwork&diff=7183Patchwork2015-08-31T07:58:07Z<p>Nbeznosov: /* Пэчворк 1-го типа */</p>
<hr />
<div>{{TOC right}}<br />
<br />
<br />
'''Пэчворк ('' Patchwork '')''' - мини игра, цель которой состоит в том, чтобы сложить картинку, которая разрезана на различное количество изображений. Разрезанные изображения могут быть самых разных форм. Возможны две игровые механики: когда изображение разрезается на другие, более мелкие изображения и когда отдельные изображения могут являться частью объекта пэчворка ('' внесены в его группу ''), в таком случае, пэчворк будет считаться собранным, если куски графики будут поставлены на правильные места ('' те места, где изображения были первоначально расположены на поле ''). <br />
До сборки Окончание сборки <br />
<center>[[Файл:Patchwork.jpg]] [[Файл:Patchwork2.jpg]] </center><br />
<br><br />
<center>'''PATCHWORKZ!'''</center><center>[http://wellgames.com/free_online/patchworkz/ Wellgames.com]</center><br />
<br><br />
<br />
<br />
<br />
==Основные параметры==<br />
[[Файл:Patchwork properties part1.png|250px|right]]<br />
<br />
'''Общие параметры:'''<br />
(см. описание [[Object|Object]])<br />
<br />
''(Курсивом в скобках указан id параметра или состояния)''<br />
*'''Тип''' (''iType'') - важный параметр,определяющий тип механики patchwork, более детально [[#Типы пэчворков|см. типы пэчворков]]:<br />
:'''0-ый тип''' - пэчворк, который использует маску для разрезания изображений;<br />
:'''1-ый тип''':<br />
::- пэчворк, разрезанные фрагменты которого являются его подобъектами;<br />
::- круговой пэчворк, разрезанные фрагменты которого являются его подобъектами.<br />
<br />
*'''Состояние''' (''state'') - Начальное состояние: '''mix''' - сразу перемешать после запуска?, '''mix_and_fly''' - перемешать с анимацией полета.<br />
<br />
*'''Память''' (''memo''): '''1''' - при повторном открытии экрана объект не обновляет свои параметры (''помнит текущие параметры, оставшиеся от предыдущего посещения экрана''), '''0''' - при повторном открытии экрана объект обновит свои параметры.<br />
<br />
<br />
'''Группа - Внешний вид:''' <br />
*'''карт. спереди''' (''res'') - Графический ресурс картинки пэчворка спереди. Перетаскивается мышкой из редактора ресурсов (''поле должно находится в состоянии редактирования''); <br />
*'''карт. сзади''' (''resBack'') - Графический ресурс картинки пэчворка сзади. Перетаскивается мышкой из редактора ресурсов (''поле должно находится в состоянии редактирования''); <br />
*'''шаблон''' (''resT'') - Графический ресурс - битовая маска, используемая для разрезки картинки на части; <br />
*'''флаер на свое место''' (''fly'') - Флаер анимации установки на свое место; <br />
*'''флаер соединен с соседом''' (''flyCn'') - Флаер анимации соединения с соседом. <br />
<br />
[[Файл:Patchwork properties part2.png|250px|right]]<br />
<br />
<br />
'''Группа - счетчики:'''<br />
*'''таймер''' (''timer'') - Таймер, связанный с пазлой; <br />
*'''счетчик''' (''count'') - Счетчик сделанных ходов; <br />
*'''игра''' (''game'') - Имя игры (''раздела в опциях''), который надо вычитать для получения начального значения прогресса (''например, для отображения результатов''); <br />
*'''уровень''' (''level'') - Имя уровня (''параметра в разделе игра - см.выше''), который надо вычитать для получения начального значения прогресса (''например, для отображения результатов''). Для достижений запись будет равна [game.]level=1, для счетчика [game.]level+ct=число, для времени [game.]level+tm=время;<br />
*'''сохранять в профиль''' (''prof''): '''1''' - значение будет сохранено в текущий профиль, '''0''' - значение будет сохранено глобально. <br />
<br />
<br />
'''Группа - элементы пачворка:'''<br />
*'''тип перемещения фрагментов''' (''mvType'') - перемещение элементов пачворка: '''0''' - произвольное, '''1''' - по кругу, относительно точки пивота; <br />
*'''размещение''' (''place'') - Положение элементов пачворка: '''0''' - располагаются в таблице, '''1''' - на экране;<br />
*'''таблица''' (''table'') - Объект, типа table который является визуальным отображением списка элементов пачворка; <br />
*'''скорость полета''' (''velFly'') - Скорость полета элементов пачворка, измеряется в пикселях за минуту; <br />
*'''тень вкл.''' (''shV'') - Параметр отображения тени: '''0''' - не рисуется, '''1''' - рисуется;<br />
*'''сглаж вкл.''' (''cntV'') - Параметр отображения сглаженных краев: '''0''' - не рисуется, '''1''' - рисуется;<br />
*'''сглаж границ''' (''smB'') - Параметр сглаживания границ фрагментов: '''0''' - нет сглаживания, '''любое число''' - число точек соседнего фрагмента;<br />
*'''прозр. тени''' (''shAlpha'') - Альфа тени: от 0 (''прозрачна'') до 1 (''не прозрачна'');<br />
*'''смещение тени''' (''shOffs'') - Смещение тени в пикселях относительно основного фрагмента;<br />
*'''смещение тени в фокусе''' (''shOffsF'') - Смещение тени в пикселях относительно основного фрагмента, когда последний в фокусе;<br />
*'''скалир в фокусе''' (''focSc'') - Коэффициент масштабирования элемента при попадании в фокус (''1 - не изменяется'');<br />
*'''вращаемость''' (''rot''): '''1''' - элементы можно вращать на угол, указанный ниже, '''0''' - нельзя вращать;<br />
*'''угол вращения''' (''rotAng'') - угол, на который можно повернуть объект за один раз; <br />
*'''скорость вращения''' (''rotVel'') - скорость вращения в градусах за сек.; <br />
*'''притяжение табл''' (''magnTbl'') - расстояние до таблицы начиная с которого объекты уменьшают размер; <br />
*'''события переворота''' (''overtEv'') - По какому событию происходит переворот: '''0''' - по клику, '''1''' - по двойному клику;<br />
*'''ось переворота''' (''overtAxis''): '''0''' - переворот оси X, '''1''' - переворот оси Y;<br />
*'''скорость переворота''' (''overtVel'') - скорость переворота в градусах за сек.;<br />
*'''оставлять в конце игры''' (''stOnGameOver''): '''0''' - не показывать при сборе всех частей, '''1''' - показывать. <br />
<br />
<br />
==Дополнительные параметры==<br />
<br />
[[Файл:Patchwork properties part3.png|right]]<br />
'''Группа - игровое поле:'''<br />
*'''использование''' (''isGField''): '''1''' - использовать ниже приведенные параметры, '''0''' - не использовать;<br />
*'''лев. бордюр''' (''mixLOffs'') - Левый бордюр экрана игрового поля; <br />
*'''пр. бордюр''' (''mixROffs'') - Правый бордюр экрана игрового поля; <br />
*'''верх. бордюр''' (''mixTOffs'') - Верхний бордюр экрана игрового поля; <br />
*'''ниж. бордюр''' (''mixBOffs'') - Нижний бордюр экрана игрового поля.<br />
C помощью данных параметров можно ограничить область, в которой таскаются элементы пачворка. Значение бордюра - расстояние от края экрана, до области, в которой можно таскать элементы. Например выставлен верхний бордюр в 50, значит мы не сможем перетащить элемент в область шириной 50 пикселей от верха экрана. Также для частей пачворка нужно задать шейпы.<br />
<br />
<br />
'''Группа - разброс элементов:'''<br />
*'''дисперсия X''' (''mixDispX'') - Дисперсия элементов пачворка при размещении на экране по оси X;<br />
*'''дисперсия Y''' (''mixDispX'') - Дисперсия элементов пачворка при размещении на экране по оси Y;<br />
*'''изм. угол''' (''dispRot'') - Изменить угол после разброса элементов на экране "regexp=": '''0''' - нет, '''1''' - да.<br />
<br />
<br />
'''Группа - взятие частей:'''<br />
*'''тип взятия''' (''takeTp''): '''0''' - за что взяли, то и тянем, '''1''' - берем всегда за пивот, смещение указателя ниже;<br />
*'''смещ. X''' (''takeShX'') - смещение по оси X относительно пивота; <br />
*'''смещ. Y''' (''takeShY'') - смещение по оси Y относительно пивота. <br />
<br />
<br />
'''Группа - звуки:'''<br />
*'''приклеился''' (''sMag'') - Объект приклеился к другому объекту; <br />
*'''стал на свое место''' (''sPl'') - Объект стал на место на сцене;<br />
*'''захватили перемещать''' (''sDr'') - Объект захватили для перемещения; <br />
*'''отпустили, но не на месте''' (''sEr'') - Объект отпустили, но он оказался не на своем месте; <br />
*'''вернули в таблицу''' (''sTbl'') - Объект вернули в таблицу (''убрали с поля'').<br />
<br />
<br />
'''Группа - хинт 1:''' (подсказка ставит на место выбранный элемент patchwork)<br />
*'''палец нажат''' (''h1resDn'') - Графический ресурс нажатого пальца; <br />
*'''палец отжат''' (''h1resUp'') - Графический ресурс отжатого пальца; <br />
*'''скор. руки''' (''h1VelH'') - Скорость движения руки пикс/мин; <br />
*'''время пауз''' (''h1Pause'') - Время пауз между событиями. <br />
<br />
<br />
'''Группа - хинт 2:''' (подсказка показывает элемент patchwork из таблицы, и его конечное положение) <br />
*'''время хинта''' (''h2Time'') - Время работы хинта; <br />
*'''время пауз''' (''h2Pause'') - Время пауз между событиями; <br />
*'''время пульса''' (''h2Pulse'') - Время пульса подсказки.<br />
<br />
==Добавляемые параметры пачворка==<br />
Меню выбора ''Добавляемые параметры к объектам'' активируется по правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''начинаем игру: изменить состояние объекта''' (''nstBeg'')- начинаем игру: изменить состояние объекта - В начале игры перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - В начале игры перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''начинаем игру: изменить параметр объекта''' (''chgBeg'') - В начале игры изменить параметр объекта:<br />
*'''объект''' (''obj'') - В начале игры этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''поставили на место: изменить состояние объекта''' (''nstRightPl'') - После успешной вставки перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''поставили на место: изменить параметр объекта''' (''chgRightPl'') - После успешной вставки изменить параметр объекта:<br />
*'''объект''' (''obj'') - После успешной вставки этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''поставили не на место: изменить состояние объекта''' (''nstErorPl'') - После не успешной вставки перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''поставили не на место: изменить параметр объекта''' (''chgErorPl'') - После неуспешной вставки изменить параметр объекта:<br />
*'''объект''' (''obj'') - После успешной вставки этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''потянули: изменить состояние объекта''' (''nstDragStart'') - При начале таскания перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''перестали тянуть''' (''nstDragStop'') - При завершении таскания перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''завершили: если был экран''' (''wscrOk'') - При сборе всех элементов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
*'''был экран''' (''was'') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
*'''перейти на''' (''scr'') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
<br />
[[Файл:+.png]] '''завершили: изменить состояние объекта''' (''nstOk'') - При сборе всех элементов перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - При сборе всех элементов перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''завершили: изменить параметр объекта''' (''chgOk'') - При сборе всех элементов, изменить параметр объекта:<br />
*'''объект''' (''obj'') - При сборе всех элементов объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''параметры фрагмента''' (''ppar'') - Изменить параметры фрагмента:<br />
*'''объект''' (''obj'') - Параметр данного фрагмента будем менять (для типа пэчворка "1" если нужно, чтобы объект перед сбором пэчворка находился в конкретной точке);<br />
*'''start x''' (''x'') - Начальная позиция по X перед сбором фрагментов;<br />
*'''start y''' (''y'') - Начальная позиция по Y перед сбором фрагментов;<br />
*'''angle''' (''ang'') - Начальный угол перед сбором фрагментов.<br />
<br />
==Описание типов пэчворков==<br />
На данный момент, пэчворк имеет три основные механики:<br />
* пэчворк, который использует маску для разрезания изображений ('' 0-ый тип '')<br />
* пэчворк, разрезанные фрагменты которого являются его подобъектами ('' [[#Пэчворк 1-го типа|1-ый тип]] '')<br />
* круговой пэчворк, разрезанные фрагменты которого являются его подобъектами ('' [[#Круговой Пэчворк 1-го типа|1-ый тип]] '')<br />
<br />
===Пэчворк 0-го типа===<br />
Каким образом работает пэчворк?<br />
Существует какая-то картинка. Для того, чтобы использовать эту картинку в игре (''собрать ее из кусков''), нужно сперва разрезать ее. Для разрезания картинки используется ее маска, то есть тот контур по которому редактор будет разрезать изображение. После разрезания картинки, полученные куски (''части'') изображения попадают в таблицу, которая прикреплена к пэчворку. Благодаря таблице существует возможность наблюдать за разрезанными частями и выносить их на поле для дальнейшего складывания пэчворка. В случае, если таблица не была прикреплена к пэчворку, то разрезанные изображения исчезнут за границами экрана.<br />
<br><br />
'''Создание пэчворка 0-го типа пошагово:'''<br />
# Добавить новый объект на сцену и указать ему тип "пэчворк (''patchwork'')": <br />
##На панели '''''дерево проекта''''' выделить нужную сцену<br />
##Нажать правую кнопку мыши (''ПКМ'') и в всплывающем списке выбрать '''''создать объект в текущем элементе''''' <br />
##Перейти на панель свойств объекта '''''Property''''' <br />
##Выбрать тип объекта '''''patchwork'''''<br />
# В таблице свойств объекта указать тип пэчворка "0": <br />
##На панели '''''дерево проекта''''' выбрать '''''patchwork'''''<br />
##Перейти на панель свойств объекта '''''Property'''''<br />
##На панели свойств выбрать поле '''''тип'''''<br />
##Установить значение '''''0'''''<br />
# Подгрузить графику пэчворка:<br />
##Выбрать объект '''''patchwork'''''<br />
##Перейти на панель свойств объекта '''''Property'''''<br />
##Раскрыть поле '''''внешний вид'''''<br />
##В поле '''''карт. спереди''''' с помощью редактора ресурсов подгрузить исходную картинку, а в поле '''''шаблон''''' подгрузить маску, которая будет разрезать картинку<br />
# Добавить новый объект на сцену и указать ему тип "таблица (''table'')": <br />
##На панели '''''дерево проекта''''' выделить нужную сцену <br />
##Нажать правую кнопку мыши (''ПКМ'') и в всплывающем списке выбрать '''''создать объект в текущем элементе'''''<br />
##Выбрать панель '''''Property'''''<br />
##Выделить поле '''''тип''''' объекта и в всплывающем списке выбрать '''''table'''''<br />
# Настроить таблицу: <br />
##Выделить объект '''''table'''''<br />
##Выбрать панель '''''Property'''''<br />
##Выбрать поле '''''таблица'''''<br />
##Указать значения полям '''''колонок''''' и '''''строчек'''''<br />
# В таблице свойств объекта привязать таблицу к пэчворку: <br />
##Выбрать объект '''''patchwork'''''<br />
##Выбрать панель '''''Property''''' <br />
##Раскрыть поле '''''элементы пэчворка''''' <br />
##Выделить поле '''''таблица'''''<br />
##Выбрать нужную таблицу из списка<br />
<br><br />
<br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже порезанное изображение с применением маски.<br />
[[Файл:Example_result.jpg]]<br />
<br><br />
<br><br />
<br />
<br />
===Пэчворк 1-го типа===<br />
Чем отличается пэчворк 1-го типа от пэчворка 0-го типа?<br />
Отличается тем, что при использовании пэчворка 0-го типа нужна маска для разрезания изображений, а при использовании пэчворка 1-го типа маска не нужна, а просто нужны отдельные изображения, куски графики, которые будут являтся подобъектами пэчворка, то есть входить в его группу. В таком случае, целью игры будет постановка отдельных изображений на свои места на сцене. Алгоритм создания пэчворка 1-го типа мало чем отличается от алгоритма создания пэчворка 0-го типа. Отличием является то, что на панели свойств пэчворка в поле '''''тип''''' нужно поставить значение '''''1''''', а не '''''0'''''. Также отличие заключается в другом подгружении графики пэчворка:<br />
# Из редактора ресурсов вынести нужную графику на сцену<br />
# Зайти на панель '''''дерево проекта'''''<br />
# Переместить графические объекты в группу к пэчворку<br />
<br />
Если необходимо, чтобы в пэчворке начальные координаты подобъектов до сбора отличались от конечных, то необходимо использовать добавляемое свойство "Параметры фрагмента" и там указать начальные координаты и, при необходимости, угол для подобъектов пэчворка.<br />
[[Файл:Example_1st_type.jpg]]<br />
<br />
===Круговой Пэчворк 1-го типа===<br />
На поле расположено одно изображение, разрезанное на части в форме концентрических колец с одним центром. Кольцевые части могут вращаться вокруг общего центра при помощи захвата пальцем(''зажатой кнопкой мыши''). В начале игры кольца сдвинуты относительно своего правильного положения каждое на произвольный угол. Как только два кольца выставляются друг относительно друга в правильное положение они слипаются - "паркуются", и в дальнейшем вращаются вместе.<br />
<br />
Цель игры: выставить каждое из колец в правильное положение, чтоб исходное изображение было восстановлено.<br />
<br />
Графика в данном случае готовится и подгружается таким же образом, как и для пачворка 1 типа.<br />
<br />
Для данного типа пачворка существует ряд настроек, относящихся только к нему.<br />
<br />
'''Обязательно!''':<br />
:- в строке состояния указать состояние - '''mix''' (иначе по умолчанию - init, будет ожидать клик).<br />
:- указать параметры (иначе при двойном клике, нажатая часть сразу станет на своё место):<br />
::Элементы пэчворка:<br />
:::'''Вращаемость''' = 1;<br />
:::'''Угол вращения''' = число.<br />
<br />
==Состояния patchwork==<br />
<br />
Параметр, в который перейдёт patchwork при инициализации:<br />
*'''mix''' - перемешать сразу после запуска;<br />
*'''mix_and_fly''' - перемешать с анимацией полета;<br />
*'''init''' - исходное состояние пэчворка. Для того, чтобы пэчворк попал в таблицу нужно сделать по нему тап и можно будет наблюдать анимацию перемещения пэчворка в таблицу; <br />
*'''hint1''' - который ставит на место выбранные элемент patchwork, [[#Параметры состояний hint1 и hint2|см. параметры состояний hint1 и hint2]];<br />
*'''hint2''' - показывает элемент patchwork из таблицы, и конечное положение элемента, [[#Параметры состояний hint1 и hint2|см. параметры состояний hint1 и hint2]].<br />
В случае, если это поле останется пустым, то это будет приравниваться к тому, что пэчворк находится в состоянии '''''init'''''<br />
<br />
<br />
<br />
==Пример применения==<br />
<br />
<br />
===Пример создания 0-го типа пэчворка===<br />
<br><br />
[[Файл:Example_p1.jpg]]<br />
[[Файл:Example_p2.jpg]]<br />
[[Файл:Example_p3.jpg]]<br />
[[Файл:Example_p4.jpg]]<br />
[[Файл:Example_p5.jpg]]<br />
[[Файл:Example_p6.jpg]]<br />
<br><br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже порезанное изображение с применением маски.<br />
[[Файл:Example_result.jpg]]<br />
<br><br />
<br />
===Пример создания кругового пэчворка===<br />
<br />
[[Файл:П1.PNG]]<br />
<br />
'''Обязательно!''':<br />
:- в строке состояния указать состояние - '''mix'''.<br />
:- указать параметры (иначе при двойном клике, нажатая часть сразу станет на своё место):<br />
::Элементы пэчворка:<br />
:::'''Вращаемость''' = 1;<br />
:::'''Угол вращения''' = число.<br />
<br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже собранное изображение (''результат получен путем вращения элементов пэчворка'').<br />
<br />
[[Файл:П2.PNG]]<br />
<br />
[[Файл:П3.PNG]]<br />
<br />
[[Category:Game mechanic]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Patchwork&diff=7182Patchwork2015-08-31T07:53:55Z<p>Nbeznosov: /* Добавляемые параметры пачворка */</p>
<hr />
<div>{{TOC right}}<br />
<br />
<br />
'''Пэчворк ('' Patchwork '')''' - мини игра, цель которой состоит в том, чтобы сложить картинку, которая разрезана на различное количество изображений. Разрезанные изображения могут быть самых разных форм. Возможны две игровые механики: когда изображение разрезается на другие, более мелкие изображения и когда отдельные изображения могут являться частью объекта пэчворка ('' внесены в его группу ''), в таком случае, пэчворк будет считаться собранным, если куски графики будут поставлены на правильные места ('' те места, где изображения были первоначально расположены на поле ''). <br />
До сборки Окончание сборки <br />
<center>[[Файл:Patchwork.jpg]] [[Файл:Patchwork2.jpg]] </center><br />
<br><br />
<center>'''PATCHWORKZ!'''</center><center>[http://wellgames.com/free_online/patchworkz/ Wellgames.com]</center><br />
<br><br />
<br />
<br />
<br />
==Основные параметры==<br />
[[Файл:Patchwork properties part1.png|250px|right]]<br />
<br />
'''Общие параметры:'''<br />
(см. описание [[Object|Object]])<br />
<br />
''(Курсивом в скобках указан id параметра или состояния)''<br />
*'''Тип''' (''iType'') - важный параметр,определяющий тип механики patchwork, более детально [[#Типы пэчворков|см. типы пэчворков]]:<br />
:'''0-ый тип''' - пэчворк, который использует маску для разрезания изображений;<br />
:'''1-ый тип''':<br />
::- пэчворк, разрезанные фрагменты которого являются его подобъектами;<br />
::- круговой пэчворк, разрезанные фрагменты которого являются его подобъектами.<br />
<br />
*'''Состояние''' (''state'') - Начальное состояние: '''mix''' - сразу перемешать после запуска?, '''mix_and_fly''' - перемешать с анимацией полета.<br />
<br />
*'''Память''' (''memo''): '''1''' - при повторном открытии экрана объект не обновляет свои параметры (''помнит текущие параметры, оставшиеся от предыдущего посещения экрана''), '''0''' - при повторном открытии экрана объект обновит свои параметры.<br />
<br />
<br />
'''Группа - Внешний вид:''' <br />
*'''карт. спереди''' (''res'') - Графический ресурс картинки пэчворка спереди. Перетаскивается мышкой из редактора ресурсов (''поле должно находится в состоянии редактирования''); <br />
*'''карт. сзади''' (''resBack'') - Графический ресурс картинки пэчворка сзади. Перетаскивается мышкой из редактора ресурсов (''поле должно находится в состоянии редактирования''); <br />
*'''шаблон''' (''resT'') - Графический ресурс - битовая маска, используемая для разрезки картинки на части; <br />
*'''флаер на свое место''' (''fly'') - Флаер анимации установки на свое место; <br />
*'''флаер соединен с соседом''' (''flyCn'') - Флаер анимации соединения с соседом. <br />
<br />
[[Файл:Patchwork properties part2.png|250px|right]]<br />
<br />
<br />
'''Группа - счетчики:'''<br />
*'''таймер''' (''timer'') - Таймер, связанный с пазлой; <br />
*'''счетчик''' (''count'') - Счетчик сделанных ходов; <br />
*'''игра''' (''game'') - Имя игры (''раздела в опциях''), который надо вычитать для получения начального значения прогресса (''например, для отображения результатов''); <br />
*'''уровень''' (''level'') - Имя уровня (''параметра в разделе игра - см.выше''), который надо вычитать для получения начального значения прогресса (''например, для отображения результатов''). Для достижений запись будет равна [game.]level=1, для счетчика [game.]level+ct=число, для времени [game.]level+tm=время;<br />
*'''сохранять в профиль''' (''prof''): '''1''' - значение будет сохранено в текущий профиль, '''0''' - значение будет сохранено глобально. <br />
<br />
<br />
'''Группа - элементы пачворка:'''<br />
*'''тип перемещения фрагментов''' (''mvType'') - перемещение элементов пачворка: '''0''' - произвольное, '''1''' - по кругу, относительно точки пивота; <br />
*'''размещение''' (''place'') - Положение элементов пачворка: '''0''' - располагаются в таблице, '''1''' - на экране;<br />
*'''таблица''' (''table'') - Объект, типа table который является визуальным отображением списка элементов пачворка; <br />
*'''скорость полета''' (''velFly'') - Скорость полета элементов пачворка, измеряется в пикселях за минуту; <br />
*'''тень вкл.''' (''shV'') - Параметр отображения тени: '''0''' - не рисуется, '''1''' - рисуется;<br />
*'''сглаж вкл.''' (''cntV'') - Параметр отображения сглаженных краев: '''0''' - не рисуется, '''1''' - рисуется;<br />
*'''сглаж границ''' (''smB'') - Параметр сглаживания границ фрагментов: '''0''' - нет сглаживания, '''любое число''' - число точек соседнего фрагмента;<br />
*'''прозр. тени''' (''shAlpha'') - Альфа тени: от 0 (''прозрачна'') до 1 (''не прозрачна'');<br />
*'''смещение тени''' (''shOffs'') - Смещение тени в пикселях относительно основного фрагмента;<br />
*'''смещение тени в фокусе''' (''shOffsF'') - Смещение тени в пикселях относительно основного фрагмента, когда последний в фокусе;<br />
*'''скалир в фокусе''' (''focSc'') - Коэффициент масштабирования элемента при попадании в фокус (''1 - не изменяется'');<br />
*'''вращаемость''' (''rot''): '''1''' - элементы можно вращать на угол, указанный ниже, '''0''' - нельзя вращать;<br />
*'''угол вращения''' (''rotAng'') - угол, на который можно повернуть объект за один раз; <br />
*'''скорость вращения''' (''rotVel'') - скорость вращения в градусах за сек.; <br />
*'''притяжение табл''' (''magnTbl'') - расстояние до таблицы начиная с которого объекты уменьшают размер; <br />
*'''события переворота''' (''overtEv'') - По какому событию происходит переворот: '''0''' - по клику, '''1''' - по двойному клику;<br />
*'''ось переворота''' (''overtAxis''): '''0''' - переворот оси X, '''1''' - переворот оси Y;<br />
*'''скорость переворота''' (''overtVel'') - скорость переворота в градусах за сек.;<br />
*'''оставлять в конце игры''' (''stOnGameOver''): '''0''' - не показывать при сборе всех частей, '''1''' - показывать. <br />
<br />
<br />
==Дополнительные параметры==<br />
<br />
[[Файл:Patchwork properties part3.png|right]]<br />
'''Группа - игровое поле:'''<br />
*'''использование''' (''isGField''): '''1''' - использовать ниже приведенные параметры, '''0''' - не использовать;<br />
*'''лев. бордюр''' (''mixLOffs'') - Левый бордюр экрана игрового поля; <br />
*'''пр. бордюр''' (''mixROffs'') - Правый бордюр экрана игрового поля; <br />
*'''верх. бордюр''' (''mixTOffs'') - Верхний бордюр экрана игрового поля; <br />
*'''ниж. бордюр''' (''mixBOffs'') - Нижний бордюр экрана игрового поля.<br />
C помощью данных параметров можно ограничить область, в которой таскаются элементы пачворка. Значение бордюра - расстояние от края экрана, до области, в которой можно таскать элементы. Например выставлен верхний бордюр в 50, значит мы не сможем перетащить элемент в область шириной 50 пикселей от верха экрана. Также для частей пачворка нужно задать шейпы.<br />
<br />
<br />
'''Группа - разброс элементов:'''<br />
*'''дисперсия X''' (''mixDispX'') - Дисперсия элементов пачворка при размещении на экране по оси X;<br />
*'''дисперсия Y''' (''mixDispX'') - Дисперсия элементов пачворка при размещении на экране по оси Y;<br />
*'''изм. угол''' (''dispRot'') - Изменить угол после разброса элементов на экране "regexp=": '''0''' - нет, '''1''' - да.<br />
<br />
<br />
'''Группа - взятие частей:'''<br />
*'''тип взятия''' (''takeTp''): '''0''' - за что взяли, то и тянем, '''1''' - берем всегда за пивот, смещение указателя ниже;<br />
*'''смещ. X''' (''takeShX'') - смещение по оси X относительно пивота; <br />
*'''смещ. Y''' (''takeShY'') - смещение по оси Y относительно пивота. <br />
<br />
<br />
'''Группа - звуки:'''<br />
*'''приклеился''' (''sMag'') - Объект приклеился к другому объекту; <br />
*'''стал на свое место''' (''sPl'') - Объект стал на место на сцене;<br />
*'''захватили перемещать''' (''sDr'') - Объект захватили для перемещения; <br />
*'''отпустили, но не на месте''' (''sEr'') - Объект отпустили, но он оказался не на своем месте; <br />
*'''вернули в таблицу''' (''sTbl'') - Объект вернули в таблицу (''убрали с поля'').<br />
<br />
<br />
'''Группа - хинт 1:''' (подсказка ставит на место выбранный элемент patchwork)<br />
*'''палец нажат''' (''h1resDn'') - Графический ресурс нажатого пальца; <br />
*'''палец отжат''' (''h1resUp'') - Графический ресурс отжатого пальца; <br />
*'''скор. руки''' (''h1VelH'') - Скорость движения руки пикс/мин; <br />
*'''время пауз''' (''h1Pause'') - Время пауз между событиями. <br />
<br />
<br />
'''Группа - хинт 2:''' (подсказка показывает элемент patchwork из таблицы, и его конечное положение) <br />
*'''время хинта''' (''h2Time'') - Время работы хинта; <br />
*'''время пауз''' (''h2Pause'') - Время пауз между событиями; <br />
*'''время пульса''' (''h2Pulse'') - Время пульса подсказки.<br />
<br />
==Добавляемые параметры пачворка==<br />
Меню выбора ''Добавляемые параметры к объектам'' активируется по правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''начинаем игру: изменить состояние объекта''' (''nstBeg'')- начинаем игру: изменить состояние объекта - В начале игры перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - В начале игры перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''начинаем игру: изменить параметр объекта''' (''chgBeg'') - В начале игры изменить параметр объекта:<br />
*'''объект''' (''obj'') - В начале игры этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''поставили на место: изменить состояние объекта''' (''nstRightPl'') - После успешной вставки перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''поставили на место: изменить параметр объекта''' (''chgRightPl'') - После успешной вставки изменить параметр объекта:<br />
*'''объект''' (''obj'') - После успешной вставки этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''поставили не на место: изменить состояние объекта''' (''nstErorPl'') - После не успешной вставки перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''поставили не на место: изменить параметр объекта''' (''chgErorPl'') - После неуспешной вставки изменить параметр объекта:<br />
*'''объект''' (''obj'') - После успешной вставки этот объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
<br />
[[Файл:+.png]] '''потянули: изменить состояние объекта''' (''nstDragStart'') - При начале таскания перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''перестали тянуть''' (''nstDragStop'') - При завершении таскания перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - После успешной вставки перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''завершили: если был экран''' (''wscrOk'') - При сборе всех элементов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
*'''был экран''' (''was'') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
*'''перейти на''' (''scr'') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
<br />
[[Файл:+.png]] '''завершили: изменить состояние объекта''' (''nstOk'') - При сборе всех элементов перевести объект в новое состояние:<br />
*'''объект''' (''obj'') - При сборе всех элементов перевести объект в состояние из следующего поля;<br />
*'''состояние''' (''st'') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''завершили: изменить параметр объекта''' (''chgOk'') - При сборе всех элементов, изменить параметр объекта:<br />
*'''объект''' (''obj'') - При сборе всех элементов объект меняет свой параметр;<br />
*'''свойство''' (''par'') - Параметр, который мы изменяем;<br />
*'''значение''' (''val'') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''параметры фрагмента''' (''ppar'') - Изменить параметры фрагмента:<br />
*'''объект''' (''obj'') - Параметр данного фрагмента будем менять (для типа пэчворка "1" если нужно, чтобы объект перед сбором пэчворка находился в конкретной точке);<br />
*'''start x''' (''x'') - Начальная позиция по X перед сбором фрагментов;<br />
*'''start y''' (''y'') - Начальная позиция по Y перед сбором фрагментов;<br />
*'''angle''' (''ang'') - Начальный угол перед сбором фрагментов.<br />
<br />
==Описание типов пэчворков==<br />
На данный момент, пэчворк имеет три основные механики:<br />
* пэчворк, который использует маску для разрезания изображений ('' 0-ый тип '')<br />
* пэчворк, разрезанные фрагменты которого являются его подобъектами ('' [[#Пэчворк 1-го типа|1-ый тип]] '')<br />
* круговой пэчворк, разрезанные фрагменты которого являются его подобъектами ('' [[#Круговой Пэчворк 1-го типа|1-ый тип]] '')<br />
<br />
===Пэчворк 0-го типа===<br />
Каким образом работает пэчворк?<br />
Существует какая-то картинка. Для того, чтобы использовать эту картинку в игре (''собрать ее из кусков''), нужно сперва разрезать ее. Для разрезания картинки используется ее маска, то есть тот контур по которому редактор будет разрезать изображение. После разрезания картинки, полученные куски (''части'') изображения попадают в таблицу, которая прикреплена к пэчворку. Благодаря таблице существует возможность наблюдать за разрезанными частями и выносить их на поле для дальнейшего складывания пэчворка. В случае, если таблица не была прикреплена к пэчворку, то разрезанные изображения исчезнут за границами экрана.<br />
<br><br />
'''Создание пэчворка 0-го типа пошагово:'''<br />
# Добавить новый объект на сцену и указать ему тип "пэчворк (''patchwork'')": <br />
##На панели '''''дерево проекта''''' выделить нужную сцену<br />
##Нажать правую кнопку мыши (''ПКМ'') и в всплывающем списке выбрать '''''создать объект в текущем элементе''''' <br />
##Перейти на панель свойств объекта '''''Property''''' <br />
##Выбрать тип объекта '''''patchwork'''''<br />
# В таблице свойств объекта указать тип пэчворка "0": <br />
##На панели '''''дерево проекта''''' выбрать '''''patchwork'''''<br />
##Перейти на панель свойств объекта '''''Property'''''<br />
##На панели свойств выбрать поле '''''тип'''''<br />
##Установить значение '''''0'''''<br />
# Подгрузить графику пэчворка:<br />
##Выбрать объект '''''patchwork'''''<br />
##Перейти на панель свойств объекта '''''Property'''''<br />
##Раскрыть поле '''''внешний вид'''''<br />
##В поле '''''карт. спереди''''' с помощью редактора ресурсов подгрузить исходную картинку, а в поле '''''шаблон''''' подгрузить маску, которая будет разрезать картинку<br />
# Добавить новый объект на сцену и указать ему тип "таблица (''table'')": <br />
##На панели '''''дерево проекта''''' выделить нужную сцену <br />
##Нажать правую кнопку мыши (''ПКМ'') и в всплывающем списке выбрать '''''создать объект в текущем элементе'''''<br />
##Выбрать панель '''''Property'''''<br />
##Выделить поле '''''тип''''' объекта и в всплывающем списке выбрать '''''table'''''<br />
# Настроить таблицу: <br />
##Выделить объект '''''table'''''<br />
##Выбрать панель '''''Property'''''<br />
##Выбрать поле '''''таблица'''''<br />
##Указать значения полям '''''колонок''''' и '''''строчек'''''<br />
# В таблице свойств объекта привязать таблицу к пэчворку: <br />
##Выбрать объект '''''patchwork'''''<br />
##Выбрать панель '''''Property''''' <br />
##Раскрыть поле '''''элементы пэчворка''''' <br />
##Выделить поле '''''таблица'''''<br />
##Выбрать нужную таблицу из списка<br />
<br><br />
<br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже порезанное изображение с применением маски.<br />
[[Файл:Example_result.jpg]]<br />
<br><br />
<br><br />
<br />
<br />
===Пэчворк 1-го типа===<br />
Чем отличается пэчворк 1-го типа от пэчворка 0-го типа?<br />
Отличается тем, что при использовании пэчворка 0-го типа нужна маска для разрезания изображений, а при использовании пэчворка 1-го типа маска не нужна, а просто нужны отдельные изображения, куски графики, которые будут являтся подобъектами пэчворка, то есть входить в его группу. В таком случае, целью игры будет постановка отдельных изображений на свои места на сцене. Алгоритм создания пэчворка 1-го типа мало чем отличается от алгоритма создания пэчворка 0-го типа. Отличием является то, что на панели свойств пэчворка в поле '''''тип''''' нужно поставить значение '''''1''''', а не '''''0'''''. Также отличие заключается в другом подгружении графики пэчворка:<br />
# Из редактора ресурсов вынести нужную графику на сцену<br />
# Зайти на панель '''''дерево проекта'''''<br />
# Переместить графические объекты в группу к пэчворку<br />
[[Файл:Example_1st_type.jpg]]<br />
<br />
<br />
===Круговой Пэчворк 1-го типа===<br />
На поле расположено одно изображение, разрезанное на части в форме концентрических колец с одним центром. Кольцевые части могут вращаться вокруг общего центра при помощи захвата пальцем(''зажатой кнопкой мыши''). В начале игры кольца сдвинуты относительно своего правильного положения каждое на произвольный угол. Как только два кольца выставляются друг относительно друга в правильное положение они слипаются - "паркуются", и в дальнейшем вращаются вместе.<br />
<br />
Цель игры: выставить каждое из колец в правильное положение, чтоб исходное изображение было восстановлено.<br />
<br />
Графика в данном случае готовится и подгружается таким же образом, как и для пачворка 1 типа.<br />
<br />
Для данного типа пачворка существует ряд настроек, относящихся только к нему.<br />
<br />
'''Обязательно!''':<br />
:- в строке состояния указать состояние - '''mix''' (иначе по умолчанию - init, будет ожидать клик).<br />
:- указать параметры (иначе при двойном клике, нажатая часть сразу станет на своё место):<br />
::Элементы пэчворка:<br />
:::'''Вращаемость''' = 1;<br />
:::'''Угол вращения''' = число.<br />
<br />
==Состояния patchwork==<br />
<br />
Параметр, в который перейдёт patchwork при инициализации:<br />
*'''mix''' - перемешать сразу после запуска;<br />
*'''mix_and_fly''' - перемешать с анимацией полета;<br />
*'''init''' - исходное состояние пэчворка. Для того, чтобы пэчворк попал в таблицу нужно сделать по нему тап и можно будет наблюдать анимацию перемещения пэчворка в таблицу; <br />
*'''hint1''' - который ставит на место выбранные элемент patchwork, [[#Параметры состояний hint1 и hint2|см. параметры состояний hint1 и hint2]];<br />
*'''hint2''' - показывает элемент patchwork из таблицы, и конечное положение элемента, [[#Параметры состояний hint1 и hint2|см. параметры состояний hint1 и hint2]].<br />
В случае, если это поле останется пустым, то это будет приравниваться к тому, что пэчворк находится в состоянии '''''init'''''<br />
<br />
<br />
<br />
==Пример применения==<br />
<br />
<br />
===Пример создания 0-го типа пэчворка===<br />
<br><br />
[[Файл:Example_p1.jpg]]<br />
[[Файл:Example_p2.jpg]]<br />
[[Файл:Example_p3.jpg]]<br />
[[Файл:Example_p4.jpg]]<br />
[[Файл:Example_p5.jpg]]<br />
[[Файл:Example_p6.jpg]]<br />
<br><br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже порезанное изображение с применением маски.<br />
[[Файл:Example_result.jpg]]<br />
<br><br />
<br />
===Пример создания кругового пэчворка===<br />
<br />
[[Файл:П1.PNG]]<br />
<br />
'''Обязательно!''':<br />
:- в строке состояния указать состояние - '''mix'''.<br />
:- указать параметры (иначе при двойном клике, нажатая часть сразу станет на своё место):<br />
::Элементы пэчворка:<br />
:::'''Вращаемость''' = 1;<br />
:::'''Угол вращения''' = число.<br />
<br />
В результате проделанных манипуляций, после сохранения проекта и запуска вьювера, можно будет наблюдать следующий результат, где на первой картинке можно наблюдать исходное изображение, а на второй картинке уже собранное изображение (''результат получен путем вращения элементов пэчворка'').<br />
<br />
[[Файл:П2.PNG]]<br />
<br />
[[Файл:П3.PNG]]<br />
<br />
[[Category:Game mechanic]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Controls&diff=7080Controls2015-06-11T09:15:16Z<p>Nbeznosov: /* Использование */</p>
<hr />
<div>'''Controls''' - [[Object|объект]], используемый для выполнения каких либо действий по нажатию на клавиши клавиатуры или на девайсе.<br />
{{TOC right}}<br />
== Добавляемые параметры ==<br />
[[Файл:Controls1.png|right]]<br />
Открывается при нажатии правой кнопки мыши в поле параметров обьекта.<br />
<br />
[[Файл:+.png]] '''Реакция на нажатие кнопки''' - При нажатии на кнопку перевести обьект в новое состояние.<br />
*'''кнопка''' - Константа кнопки. (Таблица приведена ниже)<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''Реакция на отпускание кнопки''' - При отпускании кнопки перевести обьект в новое состояние.<br />
*'''кнопка''' - Константа кнопки. (Таблица приведена ниже)<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
== Таблица констант клавиш ==<br />
<br />
{| border="1"<br />
|s3eKeyFirst = 0 || Invalid Key<br />
|- <br />
|s3eKeyEsc = 1 || Esc (cancel)<br />
|- <br />
|s3eKeyTab = 2, || Tab.<br />
|- <br />
|s3eKeyBackspace = 3, || Backspace.<br />
|- <br />
|s3eKeyEnter = 4, || Enter.<br />
|- <br />
|s3eKeyLeftShift = 5, || Left shift key.<br />
|- <br />
|s3eKeyLeftControl = 6, || Left control key.<br />
|- <br />
|s3eKeyReserved = 7, || Reserved, do not use.<br />
|- <br />
|s3eKeySpace = 8, || Key Space.<br />
|- <br />
|s3eKeyLeft = 9, || Key Left.<br />
|- <br />
|s3eKeyUp = 10, || Key Up.<br />
|- <br />
|s3eKeyRight = 11, || Key Right.<br />
|- <br />
|s3eKeyDown = 12, || Key Down.<br />
|- <br />
|s3eKey0 = 13, || Key 0 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey1 = 14, || Key 1 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey2 = 15, || Key 2 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey3 = 16, || Key 3 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey4 = 17, || Key 4 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey5 = 18, || Key 5 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey6 = 19, || Key 6 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey7 = 20, || Key 7 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey8 = 21, || Key 8 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKey9 = 22, || Key 9 on device numberpad and on main keyboard.<br />
|- <br />
|s3eKeyA = 23, || Key A.<br />
|- <br />
|s3eKeyB = 24, || Key B.<br />
|- <br />
|s3eKeyC = 25, || Key C.<br />
|- <br />
|s3eKeyD = 26, || Key D.<br />
|- <br />
|s3eKeyE = 27, || Key E.<br />
|- <br />
|s3eKeyF = 28, || Key F.<br />
|- <br />
|s3eKeyG = 29, || Key G.<br />
|- <br />
|s3eKeyH = 30, || Key H.<br />
|- <br />
|s3eKeyI = 31, || Key I.<br />
|- <br />
|s3eKeyJ = 32, || Key J.<br />
|- <br />
|s3eKeyK = 33, || Key K.<br />
|- <br />
|s3eKeyL = 34, || Key L.<br />
|- <br />
|s3eKeyM = 35, || Key M.<br />
|- <br />
|s3eKeyN = 36, || Key N.<br />
|- <br />
|s3eKeyO = 37, || Key O.<br />
|- <br />
|s3eKeyP = 38, || Key P.<br />
|- <br />
|s3eKeyQ = 39, || Key Q.<br />
|- <br />
|s3eKeyR = 40, || Key R.<br />
|- <br />
|s3eKeyS = 41, || Key S.<br />
|- <br />
|s3eKeyT = 42, || Key T.<br />
|- <br />
|s3eKeyU = 43, || Key U.<br />
|- <br />
|s3eKeyV = 44, || Key V.<br />
|- <br />
|s3eKeyW = 45, || Key W.<br />
|- <br />
|s3eKeyX = 46, || Key X.<br />
|- <br />
|s3eKeyY = 47, || Key Y.<br />
|- <br />
|s3eKeyZ = 48, || Key Z.<br />
|- <br />
|s3eKeyF1 = 49, || Key F1.<br />
|- <br />
|s3eKeyF2 = 50, || Key F2.<br />
|- <br />
|s3eKeyF3 = 51, || Key F3.<br />
|- <br />
|s3eKeyF4 = 52, || Key F4.<br />
|- <br />
|s3eKeyF5 = 53, || Key F5.<br />
|- <br />
|s3eKeyF6 = 54, || Key F6.<br />
|- <br />
|s3eKeyF7 = 55, || Key F7.<br />
|- <br />
|s3eKeyF8 = 56, || Key F8.<br />
|- <br />
|s3eKeyF9 = 57, || Key F9.<br />
|- <br />
|s3eKeyF10 = 58, || Key F10.<br />
|- <br />
|s3eKeyNumPad0 = 59, || Key 0 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad1 = 60, || Key 1 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad2 = 61, || Key 2 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad3 = 62, || Key 3 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad4 = 63, || Key 4 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad5 = 64, || Key 5 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad6 = 65, || Key 6 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad7 = 66, || Key 7 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad8 = 67, || Key 8 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPad9 = 68, || Key 9 on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPadPlus = 69, || Plus key on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPadMinus = 70, || Minus key on keyboard numberpad.<br />
|- <br />
|s3eKeyNumPadEnter = 71, || Enter key on keyboard numberpad.<br />
|- <br />
|s3eKeyRSK = 72, || Right soft key.<br />
|- <br />
|s3eKeyLSK = 73, || Left soft key.<br />
|- <br />
|s3eKeyLS = 74, || Left shoulder button.<br />
|- <br />
|s3eKeyRS = 75, || Right shoulder button.<br />
|- <br />
|s3eKeyHash = 76, || Key #.<br />
|- <br />
|s3eKeyStar = 77, || Key * (on keyboard numberpad for normal keyboards).<br />
|- <br />
!colspan="2" align="center" | Select/ok button<br />
|- <br />
|s3eKeyOk = 78, || Select key.<br />
|- <br />
|s3eKeyCLR = 79, || CLR key.<br />
|- <br />
!colspan="2" align="center"| Volume <br />
|- <br />
|s3eKeyVolUp = 80, || Volume Up key.<br />
|- <br />
|s3eKeyVolDown = 81, || Volume Down key.<br />
|- <br />
!colspan="2" align="center"|Camera <br />
|- <br />
|s3eKeyCamera = 82, || Camera.<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyMic = 83, || Microphone button.<br />
|- <br />
|s3eKeyFn = 84, || Fn button.<br />
|- <br />
|s3eKeySym = 85, || Sym button.<br />
|-<br />
!colspan="2" align="center"| Call<br />
|- <br />
|s3eKeyAccept = 86, || call accept (talk).<br />
|- <br />
|s3eKeyEnd = 87, || call end (reject).<br />
|- <br />
|s3eKeyHomePage = 88, || Home key.<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyButton1 = 89, || Generic Button1.<br />
|- <br />
|s3eKeyButton2 = 90, || Generic Button2.<br />
|- <br />
|s3eKeyButton3 = 91, || Generic Button3.<br />
|- <br />
|s3eKeyButton4 = 92, || Generic Button4.<br />
|- <br />
|s3eKeyButton5 = 93, || Generic Button5.<br />
|- <br />
|s3eKeyButton6 = 94, || Generic Button6.<br />
|- <br />
|s3eKeyButton7 = 95, || Generic Button7.<br />
|- <br />
|s3eKeyButton8 = 96, || Generic Button8.<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyF11 = 97, || Key F11.<br />
|- <br />
|s3eKeyF12 = 98, || Key F12.<br />
|- <br />
|s3eKeyLeftAlt = 99, || Left Alt key.<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyRightControl = 100, || Right Control Key.<br />
|- <br />
|s3eKeyRightAlt = 101, || Right Alt Key.<br />
|- <br />
|s3eKeyRightShift = 102, || Right Shift Key.<br />
|- <br />
|s3eKeyBacktick = 103, || Backtick '`' Key.<br />
|- <br />
|s3eKeyComma = 104, || Comma ',' Key.<br />
|- <br />
|s3eKeyPeriod = 105, || Period '.' Key.<br />
|- <br />
|s3eKeySlash = 106, || Forward slash '/' Key.<br />
|- <br />
|s3eKeyBackSlash = 107, || Back slash '\' Key.<br />
|- <br />
|s3eKeySemicolon = 108, || Semicolon ';' Key.<br />
|- <br />
|s3eKeyApostrophe = 109, || Apostrophe (') Key.<br />
|- <br />
|s3eKeyLeftBracket = 110, || Left Bracket '[' Key.<br />
|- <br />
|s3eKeyRightBracket = 111, || Right Bracket ']' Key.<br />
|- <br />
|s3eKeyEquals = 112, || Equals '=' Key.<br />
|- <br />
|s3eKeyMinus = 113, || Minus '-' key on main keyboard.<br />
|- <br />
|s3eKeyCapsLock = 114, || Caps Lock key<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyNumPadPeriod = 115, || Period '.' key on numberpad<br />
|- <br />
|s3eKeyNumPadSlash = 116, || Slash '/' key on numberpad<br />
|- <br />
|s3eKeyNumLock = 117, || NumLock key<br />
|- <br />
|s3eKeyInsert = 118, || Insert key<br />
|- <br />
|s3eKeyHome = 119, || Home key<br />
|- <br />
|s3eKeyPageUp = 120, || Page Up key<br />
|- <br />
|s3eKeyPageDown = 121, || Page Down key<br />
|- <br />
|s3eKeyKbEnd = 122, || End key (on keyboard)<br />
|- <br />
|s3eKeyDelete = 123, || Delete key<br />
|- <br />
|s3eKeyPause = 124, || Pause key<br />
|- <br />
|s3eKeyAt = 125, || At '@' key<br />
|- <br />
|s3eKeyBack = 126, || Back key<br />
|- <br />
|s3eKeyMenu = 127, || Menu key<br />
|- <br />
|s3eKeySearch = 128, || Search key<br />
|- <br />
|s3eKey3DMode = 129, || 3D Mode key<br />
|- <br />
|s3eKeyMyApps = 130, || My Apps key<br />
|- <br />
|s3eKeyPrintScreen = 131, || Print screen key<br />
|- <br />
|s3eKeyScrollLock = 132, || Scroll lock key<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyAbsGameA = 200, || Abstract Game keyA.<br />
|- <br />
|s3eKeyAbsGameB = 201, || Abstract Game keyB.<br />
|- <br />
|s3eKeyAbsGameC = 202, || Abstract Game keyC.<br />
|- <br />
|s3eKeyAbsGameD = 203, || Abstract Game keyD.<br />
|- <br />
|s3eKeyAbsUp = 204, || Abstract Up.<br />
|- <br />
|s3eKeyAbsDown = 205, || Abstract Down.<br />
|- <br />
|s3eKeyAbsLeft = 206, || Abstract Left.<br />
|- <br />
|s3eKeyAbsRight = 207, || Abstract Right.<br />
|- <br />
|s3eKeyAbsOk = 208, || Abstract Ok.<br />
|- <br />
|s3eKeyAbsASK = 209, || Abstract action softkey.<br />
|- <br />
|s3eKeyAbsBSK = 210, || Abstract backwards softkey.<br />
|- <br />
|colspan="2"| <br />
|- <br />
|s3eKeyLeftWindows = 211, || The left Windows key.<br />
|- <br />
|s3eKeyRightWindows = 212, || The right Windows key.<br />
|- <br />
|s3eKeyLeftBackSlash = 213,|| The left backslash "\" key.<br />
|}<br />
<br />
==Использование==<br />
[[Файл:Control_esc.png|right]]<br />
Нужно создать экземпляр обьекта на экране. Желательно создавать его на глобальном экране, на сцене с опциями, т.к. в таком варианте клавиши будут доступны со всех экранов в проекте.<br />
<br />
Далее задаем обьект и состояние в которое должна перейти машина. (На рис. это машина "esc" в состояние "choose").<br />
<br />
Также задаем код клавиши, который берем из таблицы ( Код 1 - это клавиша "ESC").<br />
<br />
=== Примечание ===<br />
Использование более одного объекта в проекте не предусмотрено!<br />
<br />
В отладочном Viewer клавиша пробел ([[Интерфейс Viewer#Клавиша SPACE|Space]]) отвечает за паузу. Это может вызвать проблемы при отладке нажатия/отпускания Space (s3eKeySpace = 8).<br />
<br />
<br />
Для flash viewer клавишам-стралкам up, down, left, right отвечают коды из поля Abstract.<br />
<br />
==Комбинации клавиш==<br />
<br />
Ниже показан пример как можно реализовать нажатие комбинации клавиш ( SHIFT +Q )<br />
<br />
[[Файл:Combo_cntrl1.png]] [[Файл:Combo_esc.png]]<br />
<br />
== Пример ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/controls.rar Download]<br />
<br />
[[Category:Options]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Table&diff=6862Table2015-02-13T14:48:12Z<p>Nbeznosov: /* Основные параметры таблицы */</p>
<hr />
<div>{{TOC right}}<br />
'''Общие параметры'''<br />
<br />
Таблица имеет набор стандартных параметров (см. описание параметров [[Object|Object]]).<br />
<br />
[[Файл:Tabletext.png]]<br />
<br />
Таблица (Тable) является универсальным объектом. Она может использоваться как:<br />
<br />
- самостоятельный элемент включая в себя различные элементы ([[Image|Image]], [[Text|Text]], [[Button|Button]], [[Machine|Machine]] и пр.);<br />
<br />
- дополнение к таким объектам как [[Patchwork|Patchwork]], [[HiddenList|HiddenList]], [[Invetory|Invetory]] и др. Выступая в роли «поля» для отображения их элементов.<br />
<br />
[[Файл:Table4.png|right]]<br />
<br />
[[Файл:Table5.png]]<br />
<br />
[[Файл:Table6.png]]<br />
<br />
Для того чтобы поместить объекты в таблицу, необходимо внести их в группу таблицы в дереве проекта.<br />
Заполнение таблицы происходит по столбцам. Если в таблице число видимых колонок/строчек меньше общего количества колонок/строчек, то, в таком случае, таблицу можно листать в нужном направлении.<br />
<br />
== Основные параметры таблицы ==<br />
<br />
[[Файл:Table new1.png|300px|right]]<br />
'''Группа - таблица'''<br />
<br />
''(Курсивом в скобках указан id параметра, или состояния)''<br />
<br />
*'''колонок''' ''(cols)'' - Максимальное число колонок (ячейки должны поместиться).<br />
*'''колонок видно''' ''(cShw)'' - Количество колонок, видимых в области вывода таблицы (если включен флаг: ширина фиксированная).<br />
*'''строчек''' ''(rows)'' - Максимальное число строчек (ячейки должны поместиться).<br />
*'''строчек видно''' ''(rShw)'' - Количество строчек, видимых в области вывода таблицы (если включен флаг: высота фиксированная).<br />
*'''скорость листания''' ''(vel)'' - Скорость листания страниц (точек/секунду).<br />
*'''отсечение''' ''(cut)'' - "ширина и высота" - обрезать графику таблицы по ширине и высоте; "ширина" - обрезать графику таблицы по ширине; "высота" - обрезать графику таблицы по высоте; "нет" - не обрезать.<br />
*'''добавлять по строкам''' ''(bystr)'' - 1 - добавлять по строкам; 0 - добавлять по столбцам.<br />
*'''центрировать''' ''(cntr)'' - "нет" - не центрировать (ячейки заполняются начиная от левого края таблицы); "растянуть" - если количество заполненных ячеек меньше видимых, то они равномерно растягиваются по длине таблицы (при этом только увеличивается расстояние между ячейками); "прижать к центру" - если количество заполненных ячеек меньше видимых, то эти ячейки располагаются по центру таблицы (при этом расстояния между ячейками не увеличиваются).<br />
*'''добавлять только видимые''' - добавлять только видимые объекты таблицы (vis=1)<br />
<br />
'''Группа - бордюры таблицы'''<br />
<br />
*'''бордюр X''' ''(dx)'' - Ширина бордюра по x (отступ во внутрь слева и справа) от подложки или от ширины объекта для отображения видимых ячеек.<br />
*'''бордюр Y''' ''(dy)'' - Ширина бордюра по y (отступ во внутрь сверху и снизу) от подложки или от высоты объекта для отображения видимых ячеек.<br />
*'''отступ X''' ''(dxC)'' - Отступ по x во внутрь (слева и справа) в ячейке, чтобы содержимое соседних ячеек не сливалось.<br />
*'''отступ Y''' ''(dyC)'' - Отступ по y во внутрь (сверху и снизу) в ячейке, чтобы содержимое соседних ячеек не сливалось.<br />
<br />
'''Группа - смещение'''<br />
<br />
*'''смещ. X''' - Смещение по x объекта в ячейке.<br />
*'''смещ. Y''' - Смещение по y объекта в ячейке.<br />
*'''фон X''' - Смещение по x фона в ячейке.<br />
*'''фон Y''' - Смещение по y фона в ячейке.<br />
*'''зачеркивания X''' - Смещение по x ресурса зачеркивания ячейки.<br />
*'''зачеркивания Y''' - Смещение по y ресурса зачеркивания ячейки.<br />
<br />
'''Группа - размеры ячеек'''<br />
<br />
*'''фон''' - Графический ресурс фона ячейки. Перетаскивается мышкой из редактора ресурсов. Может отсутствовать.<br />
*'''ширина фиксированная''' - Если равно 1, то ширины колонок будут фиксированные и определяются полем: колонок видно.<br />
*'''высота фиксированная''' - Если равно 1, то высоты строчек будут фиксированные и определяются полем: строчек видно.<br />
*'''сжимать''' - Если равно 1, то будет сжимать картинки без искажения пропорций, чтобы они помещались в ячейке.<br />
*'''текущая колонка''' - Номер первой видимой колонки, начиная с 0-ля.<br />
*'''текущая строка''' - Номер первой видимой строки, начиная с 0-ля.<br />
<br />
'''Группа - параметры текста'''<br />
<br />
*'''текстID''' ''(tTxtID)'' - Текст (id из редактора текста), отображаемый построчно в таблице.<br />
*'''текст''' ''(tTxt)'' - Cтрока, отображаемая в таблице.<br />
*'''имя''' ''(fn)'' - Номер шрифта - целое число, начиная с 0 (порядковый номер шрифта).<br />
*'''размер''' ''(fs)'' - Размер шрифта в поинтах. <br />
*'''цвет 1''' ''(fc1)'' - Цвет текста обычного вида.<br />
*'''цвет 2''' ''(fc2)'' - Цвет текста помеченной ячейки.<br />
*'''alpha2''' ''(al2)'' - Прозрачность картинки в помеченной ячейке.<br />
*'''поз. гориз.''' ''(cellAlHor)'' - Горизонтальное выравнивание текста (0 - нет выравнивания; 1 - прижать к левому краю; 2 - центр; 3 - к правому).<br />
*'''поз. верт.''' ''(cellAlVer)'' - Вертикальное выравнивание текста (0 - нет выравнивания; 1 - прижать к верхнему краю; 2 - центр; 3 - к нижнему).<br />
*'''цвет зачеркивания 1''' ''(str_c1)'' - Цвет зачеркивания текста обычного вида.<br />
*'''цвет зачеркивания 2''' ''(str_c2)'' - Цвет зачеркивания текста помеченной ячейки.<br />
*'''ресурс зачеркивания''' ''(crRes)'' - Графический ресурс зачеркивания ячейки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Может отсутствовать.<br />
*'''толщина зачеркивания''' ''(str_s)'' - Толщина зачеркивания в пикселях.<br />
*'''отступ''' ''(skip)'' - Вертикальное расстояние в пикселях в одной ячейке между словами в словосочетании (например в словосочетании Морская звезда, если оно не помещается горизонтально в одну ячейку - это вертикальное расстояние между Морская и звезда).<br />
<br />
== Дополнительные параметры ==<br />
'''Группа - Управление''' <br />
<br />
[[Файл:Table new2.png|300px|right]]<br />
<br />
Когда таблица листаемая, можно отображать индикаторы страниц. У каждого индикатора два состояния: вкл - если соответствующая страница видна на экране и выкл в противоположном случае. Нажав на соответствующий индикатор, таблица перемещается со скоростью, указанной в параметре "скорость листания" <br />
на необходимую страницу.<br />
<br />
*'''индикатор ВКЛ''' - Картинка включенного индикатора.<br />
*'''индикатор ВЫКЛ''' - Картинка выключенного индикатора.<br />
*'''левая кнопка''' - Кнопка для листания списка влево.<br />
*'''правая кнопка''' - Кнопка для листания списка вправо.<br />
*'''верхняя кнопка'''- Кнопка для листания списка вверх. <br />
*'''нижняя кнопка''' - Кнопка для листания списка вниз. <br />
*'''отступ X''' - Отступ по x от таблицы.<br />
*'''отступ Y''' - Отступ по y от таблицы.<br />
*'''отступ W''' - Отступ между ячейками таблицы индексов.<br />
<br />
'''Группа - листание'''<br />
<br />
*'''тип листания''' - Тип листания таблицы: 0 - по страницам; 1 - в зависимости от скорости (IOS).<br />
*'''старт листания''' - Смещение в точках, начиная с которого скролим таблицу.<br />
*'''гориз. листание''' - Горизонтальное листание таблицы: 0 - выключено; 1 - включено.<br />
*'''вертик. листание''' - Вертикальное листание таблицы: 0 - выключено; 1 - включено.<br />
*'''цикл. листание''' - Циклическое листание таблицы: 0 - выключено; 1 - включено.<br />
*'''листание 360 градусов''' - Разрешено листание в двух направлениях: 0 - выключено; 1 - включено.<br />
*'''затухание''' - Затухание скорости листания таблицы: 0 - выключено; 1 - включено.<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:Table2_1.PNG|right]]<br />
Открывается при нажатии правой кнопки мыши в поле параметров таблицы.<br />
<br />
[[Файл:+.png]] '''ширина настраиваемая'''<br />
*'''ширина колонок''' - Через точку с запятой указываем ширину колонок по-порядку.<br />
[[Файл:+.png]] '''высота настраиваемая'''<br />
*'''высота строчек''' - Через точку с запятой указываем высоту строчек по-порядку.<br />
[[Файл:+.png]] '''добавить ячейку в таблицу'''<br />
*'''текстID''' - Строка (id из редактора строк), отображаемая в ячейке.<br />
*'''текст''' - Строка, отображаемая в ячейке.<br />
*'''картинка''' - Картинка, рисуемая в ячейке (строки игнорируются).<br />
<br />
[[Файл:+.png]] '''изменить состояние объекта''' - при тапе<br />
*'''объект''' - Строка которого мы меняем.<br />
*'''состояние''' - Значение нового состояния.<br />
<br />
[[Файл:+.png]] '''при листании влево - изменить состояние объекта'''<br />
*'''объект''' - При смене текущей страницы в таблице перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''при листании влево - изменить параметр (свойство) объекта'''<br />
*'''объект''' - При смене текущей страницы в таблице этот объект меняет свой параметр.<br />
*'''свойство''' - Параметр, который мы изменяем.<br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''при листании вправо - изменить состояние объекта''' <br />
*'''объект''' - При смене текущей страницы в таблице перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''при листании вправо - изменить параметр (свойство) объекта'''<br />
*'''объект''' - При смене текущей страницы в таблице этот объект меняет свой параметр.<br />
*'''свойство''' - Параметр, который мы изменяем.<br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''при листании вниз - изменить состояние объекта''' <br />
*'''объект''' - При смене текущей страницы в таблице перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''при листании вниз - изменить параметр (свойство) объекта'''<br />
*'''объект''' - При смене текущей страницы в таблице этот объект меняет свой параметр.<br />
*'''свойство''' - Параметр, который мы изменяем.<br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''при листании вверх - изменить состояние объекта''' <br />
*'''объект''' - При смене текущей страницы в таблице перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''при листании вверх - изменить параметр (свойство) объекта'''<br />
*'''объект''' - При смене текущей страницы в таблице этот объект меняет свой параметр.<br />
*'''свойство''' - Параметр, который мы изменяем.<br />
*'''значение''' - Новое значение параметра.<br />
<br />
== Состояния таблицы ==<br />
Так же мы можем управлять таблицей изменяя ее состояния.<br />
<br />
*'''first''' - Перелистнуть на первую страницу таблицы.<br />
*'''last''' - Перелистнуть на последнюю страницу таблицы.<br />
*'''prev''' - Перелистнуть на предыдущую страницу таблицы (влево по горизонтали).<br />
*'''next''' - Перелистнуть на следующую страницу таблицы (вправо по горизонтали).<br />
*'''up''' - Перелистнуть на следующую страницу таблицы (вверх по вертикали).<br />
*'''down''' - Перелистнуть на предыдущую страницу таблицы (вниз по вертикали).<br />
*'''refresh''' - Обновить таблицу.<br />
*'''reload''' - перезаполнить таблицу. Необходимо в случае, когда объекты в таблицу добавляются путем установки таблицы в качестве родителя.<br />
*'''flyto''' - Таблица плавно приедет к значению curRow и curCol, если они были изменены.<br />
*'''maxRow''' - Количество заполненных строк.<br />
*'''maxCol''' - Количество заполненных колонок.<br />
*'''curRow''' - Текущая строка.<br />
*'''curCol''' - Текущая колонка.<br />
Если изменить таблице значение параметра (текущего рядка или столбика), то после необходимо передать таблице состояние refresh или flyto, чтобы увидеть изменения. При refresh рядок или столбец поменяется мгновенно, при flyto таблица "приплывет" к нужному рядку или столбцу.<br />
<br />
== Использование таблицы для анимации ==<br />
<br />
=== Использование состояния flyto ===<br />
<br />
Иногда нужно получить анимацию выезда (или другого движения) некоторого объекта (окна, рисунка и тд) на экран. Это можно сделать с помощью таблицы. Ниже приведен пример для движения вниз (с постепенным пропаданием объекта из видимости). Делаем следующее: создаем таблицу(ее параметры приведены на рисунке) нужного размера(как минимум, чтобы поместился нужный объект). В нее помещаем 2 объекта: пустой рисунок(при движении он заменит собой движущийся объект) и объект-родитель(image размером 0*0 ), в котором находится объект, который будет двигаться.<br />
<br />
'''Важно!''' Для корректного отображения объекта в таблице, нужно:<br />
* Создать таблицу и разместить ее нужным образом,.<br />
* Разместить объект родитель посередине движущегося объекта <br />
* Поместить движущийся объект в родителя<br />
* Поместить родителя в таблицу<br />
<br />
Если нужно подкорректировать положение объекта в таблице, то нужно изменять именно его координаты. Изменение координат родителя не приведет к смещению объекта на экране вьювера.<br />
<br />
Для запуска анимации таблице нужно изменить значение текущей строки (столбца, при горизонтальном движении), после чего передать ей состояние <br />
flyto. Скорость анимации можно настроить изменяя параметр таблицы - скорость листания.<br />
<br />
[[Файл:Tblanimmove.png|250px|Расположение в дереве проекта]] [[Файл:Animmovestate.png|250px|Машина, запускающая анимацию]] [[Файл:Tableanimmove.png|250px|Параметры таблицы]]<br />
<br />
В объекта-родителя можно помещать не только картинки, но и машины(которые могут реализовывать собственное движение, при этом, при попадании за край таблицы, объект постепенно уходит из зоны видимости). Также в родителя можно поместить еще одну анимацию с помощью таблицы.<br />
<br />
<br />
В данном случае нужно движение по вертикали вниз. Для этого таблица имеет следующие параметры: 1 столбец, 2 строки, нелистаемая( тк не нужно взаимодействовать с объектами ). Принцип работы прост ячейка (1,0) заменяется на (0,0).<br />
<br />
<br />
=== Передвижение предмета под границу окна ===<br />
<br />
Такой же эффект можно достичь, если использовать ректангл. Помещаем окно в ректангл и задаем ему параметр отсечение.<br />
Использование ректангла потребляет меньше ресурсов.<br />
<br />
С помощью таблицы можно ограничить зону видимости предмета на экране. При этом, при выходе за эту зону, объект пропадает из видимости постепенно (эффект вылетания). <br />
<br />
Для этого помещаем наше окно в родительский объект(до помещения окна в родителя, родитель должен находится в центре окна). После создаем таблицу по размеру окна, и располагаем ее на сцене нужным образом. Потом помещаем в нее объект-родитель. Теперь таблица является границами видимости окошка и его элементов. Всё, что будет за границами таблицы будет невидимо. После этого, желательно, поместить таблицу в image 0*0.<br />
<br />
[[Файл:Wndtable.png|250px|Расположение в дереве проекта]][[Файл:Parwndtabl.png|250px|Параметры таблицы]]<br />
<br />
В данном случае у таблицы 1 столбец, 1 строка и 1 ячейка, в которой находится наше окошко. Листаться объекты в таблице не должны, но с ними нужно взаимодействовать. Если отключить листание вообще, то объекты не реагируют на воздействие. Для того, чтобы объекты вели себя корректно, делаем следующее: включаем листание 360 градусов (по горизонтали и вертикали) и выставляем большое значение в параметра "старт листание(чтобы клик по окошку таблица не воспринимала как попытку листания)".<br />
<br />
== Пример ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/Table.rar Download]<br />
<br />
[[Category:Main objects]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Machine&diff=6858Machine2015-02-12T10:03:26Z<p>Nbeznosov: /* play */</p>
<hr />
<div>{{TOC right}}<br />
[[Machine]] - [[Object|объект]] '''машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.<br />
<br />
== Введение ==<br />
<br />
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё<br />
<br />
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):<br />
<center><br />
[[Файл:def_states.png]]<br />
</center><br />
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.<br />
<br />
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.<br />
<br />
Все команды состояния, разбиваются на три группы:<br />
* '''[[#Инициализация|Инициализация]]''':<br />
** '''[[#draw|draw]]''' - установка графического ресурса;<br />
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);<br />
** '''[[#set|set]]''' - установка состояния другого объекта;<br />
** '''[[#play|play]]''' - проиграть звук;<br />
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;<br />
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки;<br />
** '''[[#download|download]]''' - запуск процедуры закачки контента.<br />
* '''[[#Процессы|Процессы]]''':<br />
** '''[[#wait|wait]]''' - задержка по времени;<br />
** '''[[#move|move]]''' - равномерное движение;<br />
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;<br />
** '''[[#alpha|alpha]]''' - изменение прозрачности;<br />
** '''[[#scale|scale]]''' - изменение размера;<br />
** '''[[#phys|phys]]''' - ускоренное движение;<br />
** '''[[#rgb|rgb]]''' - изменить rgb-каналы;<br />
** '''[[#spline|spline]]''' - движение по сплайну (по кривой).<br />
* '''[[#Воздействия|Воздействия]]''':<br />
** '''[[#click|click]]''' - что делать при клике на машине;<br />
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;<br />
** '''[[#drag|drag]]''' - машину схватили и тащат;<br />
** '''[[#throw|throw]]''' - машину схватили и кинули;<br />
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;<br />
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец "тащат" по экрану;<br />
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец "тащат" по экрану;<br />
** '''[[#touch_up|touch_up]]''' - отжатие мыши от машины;<br />
** '''[[#tap|tap]]''' - умный тач;<br />
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;<br />
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.<br />
<br />
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!<br />
<br />
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],<br />
начиная с [[Checkbox как машина состояний|третьего]].<br />
<br />
== Свойства ==<br />
<br />
Общие для всех объектов свойства описаны в документе [[Object|Object]].<br />
Дополнительные свойства:<br />
<br />
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.<br />
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.<br />
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).<br />
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.<br />
* '''отладка''' - Отображать в окне состояний текущий объект.<br />
* '''курсор''' - Графический ресурс курсора текущего и всех дочерних объектов.<br />
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.<br />
<br />
== Инициализация ==<br />
<br />
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.<br />
<br />
'''''Замечание.''''' По возможности, нужно избегать передачи значений другим объектам, в начальном состоянии машины, так как такие команды будут выполнятся даже тогда, когда машина будет выключена на визуальной сцене.<br />
<br />
=== draw ===<br />
<br />
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:<br />
<br />
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);<br />
* '''f''' - начальный кадр;<br />
* '''ft''' - длительность кадра в миллисекундах;<br />
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран один раз;<br />
* '''rev''' - играть анимацию в обратном порядке; 0 - прямой порядок проигрывания, 1 - обратный порядок проигрывания;<br />
* '''go''' - перейти в состояние;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Пустая команда draw (без параметров) "сбрасывает" текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.<br />
<br />
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).<br />
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).<br />
<br>Если есть анимация открывающейся и закрывающейся книги (коробки, двери и т.д.) не обязательно подгружать в проект две анимации, можно использовать одну, но запускать ее в обратном порядке, для этого есть параметр '''rev'''.<br />
<br />
=== init ===<br />
<br />
====Параметры объекта====<br />
<br />
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;<br />
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;<br />
* '''al''' - Прозрачность: от 0 (прозрачен) до 1 (не прозрачен);<br />
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);<br />
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима), если vis = 0, это равноценно отключению объекта в редакторе;<br />
* '''z координата''' - координата машины по z.<br />
* '''z приращение''' - приращение координаты машины по z относительно текущего<br />
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше;<br />
<br />
====Параметры движения====<br />
<br />
* '''v''' - скорость для команды move<br />
* '''vr''' - угловая скорость для команды rot<br />
* '''vx''','''vy''' - начальная скорость для команды phys<br />
* '''ax''','''ay''' - ускорение для команды phys<br />
<br />
====Системные действия====<br />
<br />
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга.<br />
Если на девайсе была нажата кнопка "отрейтинговать", то в опции запишется параметр rating значение 1, если нажата кнопка "позже" - rating 2, "никогда" - rating 3.<br />
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто.<br />
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут.<br />
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран.<br />
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние.<br />
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.<br />
* '''id внешней ссылки в текстовой базе''' - Ссыслка будет взята из текстовой базы в соответствии с текущим маркетом.<br />
* '''[[#Clone|clone]]''' - Значение 1 означает, что в текущем местоположении машины будет создана ее копия<br />
<br />
====Переходы и параметры выполнения====<br />
<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия выполнения; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений<br />
<br />
=== set ===<br />
<br />
Перевод другого объекта в некоторое состояние или изменение его параметров.<br />
<br />
* '''obj''' - изменяемый объект (выбирается из списка объектов). В значении объекта можно указать this, это значит что машина сама себе пропишет какой то параметр или состояние.<br />
* '''scr_param''' - глобальный либо текущий экран, параметры которого меняем.<br />
* '''scr_state''' - экран, состояние которого меняем.<br />
* '''parent''' - Объект, который будет установлен в качестве родителя объекту из obj. Объект obj будет оторван от текущего своего родителя и добавлен в детей объекта parent.<br><br />
* '''st''' - состояние в которое переводится объект.<br><br />
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr,val_vid,val_res,val_node.<br />
* '''mSt''' - Состояние машины в котором будем изменять параметр команды.<br />
* '''mCmd''' - Имя команды, параметр которой меняем.<br />
* '''mCmdN''' - Порядковый номер в перечне одноименных команд состояния.<br />
* '''mPar''' - Установить этот параметр команды в значение val.<br />
* '''val_obj''' - id объекта, будет записано в в par<br />
* '''val_txt''' - id текста, будет записано в в par(параметр для текстов "txtID")<br />
* '''val_vid''' - id video, будет записано в par(параметр для видео "video" - RGB, "videoA" - Alpha)<br />
* '''val_scr''' - id экрана, будет записано в в par<br />
* '''val_res''' - Новое значение графического ресурса (перетаскивается из редактора ресурсов). (пока не работает)<br />
* '''val_node''' - Новое нода графа (выбирается из списка, при заданном объекте)<br />
* '''val''' - значение параметра объекта для установки<br />
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par объекта obj<br />
* '''round''' - округлить значение, записываемое в val<br><br />
* '''scr''' - экран на который мы хотим перейти<br />
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется<br><br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. <br />
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).<br />
<br />
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.<br />
<br />
=== play ===<br />
<br />
Проиграть звук.<br />
<br />
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);<br />
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);<br />
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);<br />
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;<br />
*'''loop''' - зациклить звук (звуки);<br />
*'''mus_loop''' - позволяет выбрать зацикливать музыку или нет.По умолчанию установлено "да".<br />
*'''repeat''' - Число повторов выбранного звука при отключенном loop;<br />
*'''mus_stop''' - остановить текущую музыку (''mus_stop=1'');<br />
*'''mus_fading''' - Время затухания предыдущей мелодии в ms. Использовать совместно с mus.<br />
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;<br />
*'''не выгружать''' - позволяет продолжать проигрывание звука при смене экранов.<br />
*'''go''' - выбор состояния, в которое нужно перейти после проигрывания музыки/звука/голоса.<br />
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].<br />
<br />
Особенности применения:<br />
<br />
*Короткий звук (''snd'') нельзя запустить в первом (инитном) состоянии машины. Для того, чтобы запустить звук сразу при загрузке экрана, нужно в первом состоянии машины записать мгновенный переход во второе состояние мамашины (например, команда ''wait'', поле ''go'', в поле выбрать второе состояние), а во втором состоянии уже запустить звук. Если звук нужно зациклить и проигрывать какое-то количество раз (''loop=1,2,3,..,n'') или бесконечно (''loop=-1''), то нужно проследить чтобы состояние, в котором запускается звук, не вызывалось повторно во время проигрывания звука, иначе возникнет наложение звуков. Если во время проигрывания звука машина меняет свое состояние, звук продолжает играть. Если в одной машине почти одновременно воспроизводится несколько звуков, то они прерывают друг друга. Если каждый звук воспроизводится в отдельной машине, то они звучат параллельно.<br />
*Длинный звук (''mus'')- музыка. На экране не может воспроизводится несколько длинных звуков одновременно. Любой запуск длинного звука независимо от того, в какой машине он осуществляется, будет прекращать проигрывание предыдущего звука. Музыка, которая проигрывается на глобальном экране, проигрывается на всех экранах проекта.<br />
<br />
=== var ===<br />
<br />
Переменная, которой присваивается значение параметра объекта<br />
<br />
*'''name''' - имя переменной;<br />
*'''tp''' - тип переменной;<br />
*'''obj''' - объект, используемый далее;<br />
*'''par''' - имя параметра, значение которого присваивается переменной;<br />
*'''val''' - значение переменной, если отсутствуют obj и par;<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
*'''func''' - в выпадающем списке можно выбрать функцию:<br />
**'''random''' - использует arg1 и arg2, возвращает случайное целое число в диапазоне arg1 .. arg2.<br />
**'''conc''' - объединяет 4 строки arg1,arg2,arg3,arg4. Возвращает строку, в которой соединены все строки<br />
**'''exp''' - экспонента от аргумента arg1.<br />
**'''ln''' - натуральный логарифм аргумента arg1.<br />
*'''arg1''' - аргумент функции<br />
*'''arg2''' - аргумент функции<br />
*'''arg3''' - аргумент функции<br />
*'''arg4''' - аргумент функции<br />
<br />
Обозначенная переменная существует (может использоваться) только в текущем состоянии. Переменная может определятся в одном состоянии только один раз. Если созданной переменной нужно изменить значение в рамках состояния, это можно сделать через другую переменную или через параметр опций ([[Options]]). Если ее значение нужно использовать в другом состоянии, то оно присваивается параметру опций, а затем заново считывается в новом состоянии. Переменные можно указывать в поле ''val'' с другими математическими действиями и цифрами, при этом каждое действие заключать в скобки. Если в поле ''val'' указать имя переменной ''А'' без скобок - воспримется строка ''А'', если указать в скобках - воспримется значение переменной.<br />
<br />
=== buy === <br />
<br />
'''(in-app совершить in-app покупку)'''<br />
<br />
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).<br />
<br />
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];<br />
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;<br />
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;<br />
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;<br />
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.<br />
<br />
=== download ===<br />
<br />
'''(скачать загружаемый контент)'''<br />
<br />
При переходе в состояние будет совершена попытку закачать контент.<br />
* '''url''' - ссылка на zip архив с контентом в интернете.<br />
* '''объект успех''' - объект, которому в случае успешной закачки будет задаваться указанное состояние.<br />
* '''состояние (успех)''' - состояние, которое будет устанавливаться выше указанному объекту, в случае успешной закачки.<br />
* '''объект (провал)''' -объект, которому, в случае неудачи закачки, будет устанавливаться указанное состояние.<br />
* '''состояние (провал)''' - состояние, которое, в случае неудачи закачки,будет устанавливаться выше указанному объекту.<br />
* '''счетчик прогресса''' - объект, типа счетчик, который отображает прогресс закачки контента. Крайне желательно, что бы он измерялся в диапазоне от 0 до 100.<br />
<br />
Существует несколько причин при которых вызывается состояние "провал". Для того что бы сообщить пользователю, по какой именно причине возник провал закачки, следует идентифицировать причины провала. Это возможно сделать с помощью параметра <br />
<pre><br />
downloadErrCode<br />
</pre><br />
Ниже приведены значение параметра которые помогут вывести нужное текстовое сообщение :<br />
<pre><br />
GCUSTOM_ERROR_CODE_ERROR_UNKNOWN = 1, //!< ошибка не классифицирована<br />
GCUSTOM_ERROR_CODE_WIFI_DISABLED = 2, //!< отключен WIFI<br />
GCUSTOM_ERROR_CODE_SDCARD_UNAVAILABLE = 3, //!< SD-карта недоступна<br />
GCUSTOM_ERROR_CODE_SDCARD_FULL = 4, //!< SD-карта переполнена перед закачкой<br />
GCUSTOM_ERROR_CODE_UNZIP_FAIL = 5 //!< ошибка при распаковки пака (скорее всего на SD-карте не<br />
хватает места для распаковки <br />
</pre><br />
<br />
== Процессы ==<br />
<br />
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.<br />
<br />
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа<br />
или в другое состояние (если есть параметр go).<br />
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.<br />
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).<br />
<br />
=== wait ===<br />
<br />
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.<br />
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.<br />
<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t>t+dt прерывается в любом случае);<br />
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
Простейший набор параметров команды wait выглядит следующим образом:<br />
<pre><br />
<wait t="1000" go="next"/> // ждем 1000ms и покидаем состояние<br />
</pre><br />
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):<br />
<pre><br />
<wait t="100" p="0.5" go="st1"/> // через t с вероятностью 1/2 перейдет в st1<br />
<wait go="st2"/> // иначе, перейдем в st2<br />
</pre><br />
Этот же синтаксис позволяет делать состояния с различным временем жизни:<br />
<pre><br />
<wait t="100" p="0.5" go="next"/> // с вероятностью 1/2 живем 100ms<br />
<wait t="100" go="next"/> // или 200ms<br />
</pre><br />
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:<br />
<pre><br />
<wait t="1000" dt="200" go="next"/><br />
</pre><br />
<br />
=== move ===<br />
<br />
Перемещение по сцене:<br />
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект. Можно указывать переменные заданные с помощью [http://ge.absolutist.com/index.php/Machine#var_2 переменной var];<br />
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;<br />
* '''v''' - скорость перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;<br />
* '''t''' - время перемещения (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.<br />
<br />
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за секунду (а не миллисекунду!)<br />
<br />
=== rot ===<br />
<br />
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.<br />
* '''ta''' - целевой угол поворота объекта;<br />
* '''da''' - на сколько надо повернуться (ta игнорируется);<br />
* '''v''' - угловая скорость поворота в градусах в секунду;<br />
* '''t''' - время поворота (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.<br />
<br />
=== alpha ===<br />
<br />
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)<br />
* '''ta''' - целевая прозрачность<br />
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)<br />
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)<br />
* '''t''' - время изменения (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд alpha с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Если у объекта прозрачность ''al=0.00'', то он невидим для всякого взаимодействия. Если у объекта прозрачность ''al=0.01'', то он видим для клика, но невидим для дропа(команда drop на объект не видит объект с прозрачностью ''0.01''). Если у объекта ''al=0.02'', то он видим и для клика, и для дропа.<br />
<br />
=== scale ===<br />
<br />
Изменение размеров объекта<br />
* '''tx''', '''ty''' - целевой масштаб по каждой оси<br />
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси<br />
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)<br />
* '''t''' - длительность выполнения команды (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд scale с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== phys ===<br />
<br />
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).<br />
<br />
* '''vx''', '''vy''' - начальная скорость<br />
* '''ax''', '''ay''' - величина ускорения по каждой оси<br />
* '''a''' - полное ускорение<br />
* '''tvx''', '''tvy''' - целевая скорость<br />
* '''tx''', '''ty''' - целевая координата<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). <br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координате y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.<br />
<pre><br />
<br />
<st id="down"> // падаем<br />
<phys vy="0" ay="20" ty="0" go="touch"/><br />
</st><br />
<br />
<st id="touch"> // касаемся земли<br />
<move dy="24" t="300"/> // опускаем центр при сжатии<br />
<scale ty="0.8" t="300"/> // сжимаемся<br />
<move dy="-24" t="300"/> // поднимаем центр при разжатии<br />
<scale ty="1" t="300" go="up"/> // разжимаемся<br />
</st><br />
<br />
<st id="up"> // взлетаем<br />
<phys vy="0" ty="-200" go="down"/><br />
</st><br />
<br />
</pre><br />
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.<br />
<br />
=== rgb ===<br />
<br />
* '''trgb''' - целевой эффект rgb; подразумевает под собой цвет в виде HEX-кода; по-умолчанию: FFFFFF;<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== spline ===<br />
<br />
Сплайн позволяет перемещать машину по заранее заданной траектории.<br />
<br />
====Параметры====<br />
<br />
*'''key''' - точки сплайна по которым движется <br />
*'''t''' - время движения по траектории<br />
*'''go''' - по окончанию переход в состояние<br />
*'''if''' - условие перехода<br />
*'''loop''' - количество повторений<br />
*'''break''' - прервать команды на этой<br />
*'''wait''' - номер запускаемого действия<br />
*'''init''' - номер запускаемого действия<br />
*'''alpha''' - номер запускаемого действия<br />
*'''rot''' - номер запускаемого действия<br />
*'''move''' - номер запускаемого действия<br />
*'''set''' - номер запускаемого действия<br />
*'''phys''' - номер запускаемого действия<br />
*'''scale''' - номер запускаемого действия<br />
*'''drow''' - номер запускаемого действия<br />
<br />
====Построение сплайна====<br />
<br />
# в состоянии машины добавляем правой кнопкой мыши действие "spline"<br />
# добавляем минимально необходимые параметры: '''key''' и '''t''', указываем время движения в '''t'''<br />
# выделяем для редактирования поле '''key'''<br />
# записываем координаты точек через запятую, сначала x потом y, например: -211,-248,-151,-248,-91,-247,59,-246,60,101,60,159,1,190<br />
Если записали все координаты вручную, то можно сохранить и проверять.<br />
Или можно в окне списка состояний нажать на кнопку "build spline" (справа вверху).<br />
[[Файл:Btn spline.jpg|500px]]<br />
<br />
Окно с списком состояний закроется, появится дополнительная панель с настройками сплайна и появится возможность указывать мышкой по экрану точки для сплайна.<br />
<br />
[[Файл:Spline panel.jpg|500px]]<br />
<br />
Точки сплайна указываются кликом левой кнопки мыши по экрану.<br />
<br />
Возможности редактирования:<br />
<br />
'''режимы:'''<br />
*'''add''' - по нажатию левой кнопкой мыши по экрану - будет добавлена новая точка, которая соединится с предыдущей<br />
*'''select''' - по нажатию левой кнопкой мыши по точке сплайна появится возможность отредактировать её положение перетащив её или поменяв её координаты в полях x и у<br />
*'''delete''' - по нажатию левой кнопкой мыши по точке сплайна точка удалится<br />
<br />
Чтобы удалить все точки сплайна необходимо нажать на кнопку "'''delete all knots'''"<br />
<br />
Сохранить сплайн можно нажав на кнопку "'''Save spline'''"<br />
<br />
====Дополнительные сведения====<br />
<br />
* Время движения между двумя соседними точками всегда одинаково, то есть чем дальше друг от друга соседние точки, тем быстрее будет двигаться объект, чем ближе - тем медленней.<br />
* Координаты сплайна просчитываются относительно точки пивота родительского объекта, если соответствующая машина является подобъектом. На координаты могут влиять модификаторы родительского объекта.<br />
<br />
== Воздействия ==<br />
<br />
=== click ===<br />
<br />
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.<br />
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.<br />
<br />
По клику машина записывает координаты клика в параметры: clickX, clickY.<br />
<br />
=== touch_in ===<br />
<br />
Наведение мыши/пальца на машину, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== touch_out ===<br />
Выведение мыши/пальца из машины, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при клике нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== touch_up ===<br />
<br />
Отжатие мыши от машины<br />
<br />
* '''go''' - состояние в которое при отжатии мыши нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== mouse_in ===<br />
<br />
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== mouse_out ===<br />
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== drag ===<br />
<br />
Данная команда позволяет "таскать" объект по сцене нажав и удерживая клавишу мишки или (палец в случае сенсорного устройства) на нем.Так же есть возможность ограничить разрешенную область таскания, за пределы которой объект вытащить невозможно. [[Файл:drag.jpg|right]]<br />
* '''x1''' - разрешено таскать, когда координата объекта правее;<br />
* '''x2''' - разрешено таскать, когда координата объекта левее;<br />
* '''y1''' - разрешено таскать, когда координата объекта ниже;<br />
* '''y2''' - разрешено таскать, когда координата объекта выше;<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''за пивот''' - "да" - таскать объект за пивот, "нет" - за ту точку, за которую схватили<br />
* '''приклеивать''' - приклеивать при клике к мышке.<br />
<br />
=== dragRot ===<br />
<br />
Данная команда позволяет вращать объект вокруг точки пивота. Нажав и удерживая клавишу мишки или палец (в случае сенсорного устройства) на нем, мы можем вращать его по часовой либо против часовой стрелки. При многократном вращении вокруг своей оси значение его угла не накапливается, а обнуляется выходя за границы [360 ; -360] градусов. [[Файл:dragRot.jpg|right]]<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''maxVel''' - Максимальная скорость вращения градус/сек;<br />
* '''objStart''' - объект при начале вращения;<br />
* '''stStart''' - его новое состояние;<br />
* '''objEnd''' - объект при завершении вращения;<br />
* '''stEnd''' - его новое состояние;<br />
<br />
=== drop ===<br />
<br />
Если нажатая кнопка мышки отпускается, вызывается эта команда. Обычно она используется в связке с командой drag<br />
* '''obj''' - объект, на который надо уронить таскаемый объект;<br />
* '''go''' - состояние в которое переходим при отпускании мышки;<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:<br />
<pre><br />
<br />
<st id="drag"><br />
<drag x1="-350" x2="350" y1="-250" y2="250"/><br />
<drop obj="box" go="open"/><br />
</st><br />
<br />
<st id="open"><br />
<set obj="box" st="open"/><br />
<scale tx="0.01" ty="0.01" t="500" go="hide"/><br />
</st><br />
<br />
<st id="hide"><br />
<init x="268" y="30"/><br />
<scale tx="1" ty="1" t="500" go="drag"/><br />
</st><br />
<br />
<br />
</pre><br />
Ящик:<br />
<pre><br />
<br />
<st id="close"> // начальное состояние ящика<br />
<init al="1"/> // если его кто-то сюда переведет - он появится.<br />
</st><br />
<br />
<st id="open"> <br />
<alpha ta="0" t="500"/> // исчезает по прозрачности за 500 ms<br />
</st><br />
<br />
</pre><br />
<br />
====Использование свойства "Условие перехода" ====<br />
<br />
Можно прописать условие, при котором выполняется переход при дропе.<br />
[[Файл:Drop_if.png|300px|thumb|right]]<br />
<br />
С помощью этого условия мы можем научить наш объект выполнять разные задачи в зависимости от того, как именно его дропнули.<br />
Пусть есть объект который можно таскать. Когда объект не таскается должен быть включен флаер, привязанный к этому объекту. При клике на объект, он должен поворачиваться на 90 градусов. При дропе на соответствующую маску объект стает на свое место(Если выполнены условия, к примеру: установлен предыдущий объект и наш объект имеет правильный угол). Если дроп в любое другое место, то должен включится флаер.<br />
<br />
Для того, чтобы научить машину различать клик по ней и ее таскание сделаем следующее. Пропишем ей 2 состояния: click и drag, а также выставим ей параметр "хранить нажатость" = 1. В click будем вычислять координаты объекта и записывать объекту параметр допустимого смещения при котором таскание будет восприниматься как клик. (В данном примере эти параметры: cx, cy, vx, vy. А допустимое смещение составляет 10 пикселей.)<br />
<br />
В состоянии drag будем проверять попадает ли координата объекта при дропе в границы допустимого смещения. Для того чтобы сравнить параметр объекта с переменной, вычтем из нашего объекта, то что мы записали в click. В зависимости от условий и места дропа переходим в соответствующее состояние.<br />
<br />
[[Файл:Click.png|330px]] [[Файл:Drag st.png|630px]]<br />
<br />
=== throw ===<br />
<br />
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:<br />
* '''go''' - состояние, в которое, при клике, надо перейти;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;<br />
* '''force''' - получаемая скорость равна разнице пикселей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.<br />
<br />
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).<br />
<br />
=== tap ===<br />
<br />
* '''go''' - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
=== apply ===<br />
<br />
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.<br />
* '''obj''' - сработает , если пересеклись с этим объектом;<br />
* '''x1''' - сработает, если центр объекта левее этого x-са;<br />
* '''x2''' - сработает, если центр объекта правее этого x-са;<br />
* '''y1''' - сработает, если центр объекта выше этого y-ка;<br />
* '''y2''' - сработает, если центр объекта ниже этого y-ка;<br />
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)<br />
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)<br />
* '''st''' - состояние, в которое надо перевести объект obj<br />
* '''go''' - состояние, в которое надо перейти при срабатывании;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.<br />
<br />
[[Файл:Апплай.png|500px]]<br />
<br />
Блок схема работы '''apply'''<br />
<br />
[[Файл:Блок схема apply.png|500px]]<br />
<br />
* Сначала у нас проверяется координаты '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Далее проверяет если '''obj'''<br />
* Если '''obj''' нет, то идёт проверку, и выдаёт результат<br />
(если при этом если '''x1''', '''x2''', '''y1''', '''y2''' нет, то они считаются по ширине и высоте всего экрана.)<br />
* Если есть '''obj''', то проверяет есть ли радиусы '''rm''', '''ro'''.<br />
* Если он есть, то значит у нас '''apply''' по кругам<br />
* Если нет, то проверяем наличие '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Если они есть, то проверка и результат.<br />
* Если их нет, то проверка идёт по шейпам объектов, и выдаётся результат/<br />
Если не будет стоять ни каких галочек, то проверка будет идти по шейпам объектов.<br />
<br />
<br />
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в "тыкву". Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква "взрывается":<br />
<pre><br />
<br />
<st id="trow"><br />
<init x="-350" y="150"/> // начальное положение<br />
<throw go="fly"/> // бросаем<br />
</st><br />
<br />
<st id="fly"><br />
<phys ay="100"/> // летим<br />
<apply y2="300" go="throw"/> // с землей<br />
<apply obj="тыква" rm="8" ro="10" st="bang"/> // с тыквой<br />
</st><br />
<br />
</pre><br />
<br />
== Условия ==<br />
<br />
=== if ===<br />
<br />
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются<br />
в параметре if других команд. Эти номера можно соединять при помощи логических связок:<br />
* '''&''' - логическое '''и''' (вместо значка '''&''' можно использовать запятую ''',''');<br />
* '''|''' - логическое '''или''';<br />
* '''!''' - логическое '''не'''.<br />
Пример записи логического выражения в поле if некоторой команды: '''(1&2)|(3&(!4))''',<br />
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.<br />
<br />
Логические связки используются также как математической логике или любом языке программирования. <br />
Так:<br />
* A '''&''' B - истинно, если истинны оба условия A и B;<br />
* A '''|''' B - истинно, если истинно хотя бы одно условие (или оба);<br />
* '''!''' А - истинно, если условие A ложно.<br />
Скобки в логическом выражении определяют приоритет (порядок) выполнения логических операций.<br />
Отметим несколько тождеств, справедливых при формировании логических высказываний:<br />
* !(A & B) = (!A) | (!B)<br />
* !(A | B) = (!A) & (!B)<br />
* !(!A) = A<br />
<br />
Если при формировании условия (ниже) есть несколько проверок, то они соединены логическим '''и'''.<br />
Т.е., если хотя бы одна из них не выполняется, то считается, что условие не выполнилось.<br />
<br />
Параметры команды:<br />
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val. В этом поле можно указать this, это значит что if будет проводить проверку текущего объекта. Добавлено это вместе с параметром clone. Клоны рождаются и умирают в рамках одного экрана. Для различия клонов между собой машина имеет уникальный параметр "clone_num" у оригинала = -1, у клонов от 0 до N, собственно с помощью this машина может сама себя проверить клон ли она и если да то какой у нее номер;<br />
* '''st''' - имя состояния в котором может находиться объект obj;<br />
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;<br />
* '''val''' - значение параметра par, которое проверяется у объекта obj;<br />
* '''val_txt''' - Значение текстового параметра объекта для проверки условия;<br />
* '''val_res''' - Значение ресурсного параметра объекта для проверки условия;<br />
* '''op''' - операция сравнения par op val. Если операции нет, то предполагается проверка на равенство par=val. Иначе используются операторы:<br />
** '''<''' - меньше (par < val);<br />
** '''>''' - больше (par > val);<br />
** '''!=''' - не равно (par != val);<br />
** '''<>''' - не равно (par <> val);<br />
** '''>=''' - больше или равно (par >= val);<br />
** '''<=''' - меньше или равно (par <= val);<br />
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;<br />
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;<br />
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.<br />
* '''buy''' - был ли куплен данный inn-app (проверяется флаг поля в объекте [[Options]]);<br />
* '''url''' - валиден (правилен и может быть запущен) ли данный интернет-адрес;<br />
* '''is_mus''' - играет ли сейчас музыка (значение 1);<br />
* '''guest''' - объект который установил состояние (используется вместо параметра obj). Если указанный объект не менял состояние этой машины, то условие не срабатывает.<br />
<br />
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записанного в поле val.<br />
Если же использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.<br />
<br />
Для проверки текущего значения прозрачности у объекта можно воспользоваться параметром ''cur_al''<br />
<br />
== Математика ==<br />
Математика в appsalute creator представлена 4-мя основными операциями: (плюс), (минус), (умножить), (поделить) <br><br />
Организована благодаря совместному использованию '''[[#var|var]]''' и '''[[#set|set]]'''. <br />
=== var ===<br />
Благодаря использованию '''[[#var|var]]''' существует возможность cчитать любой числовой параметр любого объекта. Например: x - координату какой-то машины, текущее значение любого объекта counter или timer и конечно же считывание значения любого параметра из опций! Каким образом это устроено? Рассмотрим подробнее '''[[#var|var]]''': <br><br />
[[Файл:VAR.png|right]]<br />
*'''name''' - здесь выбираем имя для нашей будущей переменной, которой будем оперировать далее<br />
*'''obj''' - выбирается объект, параметры которого мы хотим считать<br />
*'''par''' - параметр, который нужно вычитать из объекта, указанного выше<br />
*'''val''' - указывается числовое значение, которое будет установлено по умолчанию в случае отсутствия obj и par<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
На изображении справа можно наблюдать каким образом организован '''[[#var|var]]'''. В данном случае объявлена переменная x_cor, которая считывает x-координату объекта actor_1, при этом считывание переменной происходит из текущего профиля, так, как в поле user установлено значение равное "1".<br />
<br />
=== set ===<br />
[[Файл:SET.png|right]]<br />
Использование '''[[#var|var]]''' без '''[[#set|set]]''' не имеет смысла. Так, как переменная создается, но не используется дальше. Рассмотрим следующий пример, где вычитаем x - координату из одного объекта и сохраним ее в опции, предварительно увеличив ее на 50 единиц (в данном случае 50 пикселей).<br />
На рисунке справа можно наблюдать, каким образом это сделано. В состоянии '''init''' объявляется переменная '''x_cor''', которая считывает координату '''x''' из объекта '''actor_1''', таким образом в переменную '''x_cor''' запишется положение по '''x''' объекта '''actor_1'''. Поле '''user''' в данном случае в '''1''' не обязательно устанавливать, так как работа ведется с машинами, а не с опциями. Если бы на месте '''actor_1''' оказался объект '''options''', то это было бы просто необходимо, иначе программа считает значение не из профиля. Далее в '''[[#set|set]]''' выбран объект '''options''', в параметр '''x_position''' которого будет сохранятся значение переменной '''x_cor''' увеличенной на 50. В поле '''round''' идет округление вычисляемого значения, если оно установлено в 1. Поле '''user ''' установлено в 1, это значит, что параметр '''x_position''' будет сохранен в профиль. После это выполняется сохранение опций путем задания объекту '''options''' состояния '''save'''.<br><br />
! ! !ВАЖНО: чтобы выполнить какие-то действия с '''[[#var|var]]''' его обязательно нужно указывать в поле '''val''' в '''set''', при этом, если он используется, то все выражение должно стоять в скобках. Если в поле '''val''' не используется переменная, то скобки необязательны.<br />
<br><br />
<br><br />
Существует также возможность использовать '''[[#var|var]]''' совместно с '''[[#if|if]]''', а также '''[[#var|var]]''' с '''[[#move|move]]'''<br />
<br><br />
Так же добавилась возможность записывать значение переменной в состояние "st", что значительно уменьшает<br />
необходимость в записи 1000 if-ов. При этом, тип переменной в '''[[#var|var]]''' должен быть "строка".<br />
И добавилась возможность записи переменной boolean: ((a)==(b)). true = 1, false = 0. Довольно полезная вещь,<br />
если не хотите забивать "память" ненужной математикой.<br />
<br />
=== var и if ===<br />
[[Файл:IF.png|right]]<br />
При подробном рассмотрении '''[[#if|if]]''' можно заметить, что в нем есть поле '''val''', соответственно в этом поле можно указать переменную. Таким образом в поле '''val''' необязательно указывать константу, а можно указать какую-то переменную, которая может постоянно изменяться. Например, существует два объекта, один находится состоянии покоя, а другой находится в движении. При этом первый объект (тот, который в состоянии покоя) постоянно опрашивает положение второго объекта, и в случае, если у объекта, который движется, '''х''' координата равна '''х''' координате первого объекта, то первый объект входит в состояние, где он начинает свое движение. На рисунке показан объект, который находится в состоянии покоя, рассмотрим его состояния:<br><br />
В данном объекте существует два состояния: '''init''' и '''move'''. В '''init''' объект опрашивает другой объект и в случае, когда условие срабатывает, то переходит в состояние '''move''', где начинает свое движение.<br />
В '''init''' создаем переменную, в которую записываем положение по '''x''' объекта '''actor_2''', в '''if''' проверяется условие на соответствие координат объектов '''actor_1''' и '''actor_2''', в данном случае координата объекта '''actor_2''' представлена в виде переменной '''x_cor'''. Если условие выполняется, то происходит переход в состояние '''move''', если нет, то заново проходим состояние '''init''' и повторяем вышеописанную последовательность действий.<br />
<br><br />
<br><br />
<br><br />
<br><br />
<br />
=== var и move ===<br />
Также с помощью '''[[#var|var]]''' есть возможность указать целевые координаты в '''[[#move|move]]'''. То есть, не обязательно указывать целевые координаты в виде констант, их можно указать теперь с помощью переменных. При использовании '''[[#var|var]]''' и '''[[#move|move]]''' можно организовать обмен двух объектов местами с анимацией движения. Для этого необходимо определять какой объект нажат первым, а какой вторым, сохранять их координаты через объект '''options''' и только потом менять их местами. На рисунке можно увидеть, как это организовано.<br />
[[Файл:var_move.png|1000px|thumb|center|]]<br />
Рассмотрим подробнее состояние данной машины:<br />
<br><br />
* '''init'''<br><br />
В этом состоянии ожидаем клик на объект и обнуляем параметр, который отвечает за то, какой по счету объект сейчас нажат. Так, как при обмене объектов, если мы делаем это по клику, важно знать, по какому кликнули первым, а по какому вторым.<br />
* '''check'''<br><br />
Проверяется параметр '''number''', если он равен '''0''', то это значит, что еще ничего не кликали и мы переходим в состояние, где в опции записываются координаты этого объекта, который считается нажатым первым. Если не равен '''0''', то считается, что этот объект нажат вторым и переходит в состояние, где в опции записываются координаты этого объекта, который считается нажатым вторым по счету.<br />
* '''first_object'''<br><br />
В этом состоянии записываются координаты объекта в опции. Чтобы записать координаты в опции используются '''[[#var|var]]''' и '''[[#set|set]]''' упоминаемые выше. В опции координаты первого нажатого объекта сохраняются под параметрами '''x_first''' и '''y_first'''. В конце параметру '''number''' присваиваем значение '''1''', чтобы указать, что следующий нажатый объект будет вторым по счету. <br />
* '''second_object'''<br><br />
В этом состоянии объект будет в том случае, если он будет нажатым вторым по счету, то есть после состояния '''check''' объект попадет в это состояние, где он запишет свои текущие координаты под параметрами '''x_second''' и '''y_second'''. Запись координат происходит таким же самым образом, что и в состоянии '''first_object'''. После этого он автоматически переходит в следующее состояние.<br />
* '''move_first'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат первым, поэтому он будет двигаться на место второго нажатого объекта, который сохранил свои координаты в параметры'''x_second''' и '''y_second'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты второго объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
* '''move_second'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат вторым, поэтому он будет двигаться на место первого нажатого объекта, который сохранил свои координаты в параметры '''x_first''' и '''y_first'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты первого объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
<br />
В результате проделанных манипуляций с машинами по кликам на две машины, они обменяются местами с анимацией движения. Это может быть очень полезным во многих мини играх!!!<br />
<br />
=== Важно знать ===<br />
* Переменная действует в рамках одного состояния, если нужно, чтобы она была глобальной, нужно сохранить ее в опции и потом в нужный момент считывать ее из опций.<br />
* Если складываем два числа, то в поле '''val''' они должны быть записаны в скобках: (5+3).<br />
* Если возникает необходимость написать какое-то более сложное арифметическое вычисление, то следует помнить, что на одно действие приходятся одни скобки. Например: (((5+3)\2)*2).<br />
* Количество открывающих и закрывающих скобок должно быть одинаковым.<br />
* В скобках можно писать переменную, если она была объявлена выше: (5+a).<br />
* Переменная может состоять из цифр и букв и знака нижнего подчеркивания.<br />
* Иногда бывает необходимым использование '''round''' в '''set''', так например, если какой-то параметр получен с помощью арифметических вычислений и потом используется его в каком-то условии, и условие проверяет параметр, как целочисленное значение, то могут возникнуть ошибки. Так, как число будет записано в следующем виде 123.0000 и программа будет считать, что оно не целочисленное, а дробное. И чтобы избавится от лишних нулей в дробной части следует округлять число.<br />
* Действия, которые требуют времени, такие как move, rot, wait и другие перестают работать для уменьшения вычислительной нагрузки на устройство.<br />
* Действия, которые не требуют времени, такие как set, init и другие продолжают функционировать.<br />
<br />
<br />
<pre><br />
Если с помощью переменной менять объекту любой параметр, например, координату X, то она<br />
запомнится (запишется как значение по умолчанию).<br />
Тогда при повторном попадании на экран считается не тот X, который указан в свойствах,<br />
а тот, который установлен через переменную.<br />
Если нужно при ините экрана возвращать начальные значения параметров,<br />
то можно сделать это двумя способами:<br />
- не использовать переменную;<br />
- создать отдельное состояние, которое будет "вручную" устанавливать начальные значения<br />
параметрам при ините экрана.<br />
Если координата (или другой параметр) меняется другим способом, то будут автоматически<br />
при ините экрана подтягиваться значения из свойств объекта.<br />
</pre><br />
<br />
=== Примеры применений ===<br />
С помощью математики можно организовать следующее:<br />
* динамические опции (изменение звука и музыки с помощью ползунка);<br />
* анимацию каунтера в играх (по окончанию уровня можно наблюдать, как изменяются очки);<br />
* подсчет очков (гибкая система подсчета очков);<br />
* обмен объектов местами (использование var и move)<br />
* увеличение z-координаты любого объекта (когда необходимо, чтобы нажатый или таскаемый объект был выше других по z);<br />
* простейший калькулятор;<br />
* и много других.<br />
<br />
== Копирование машины состояния с сохранением ссылки на себя ==<br />
Довольно часто бывает, что машина состояний ссылается только на глобальные объекты и на саму себя. При этом, если мы просто скопируем объект, он будет ссылаться на свою предыдущую копию. Этого можно избежать, сделав 3 шага:<br />
1. Переместить объект в отдельную сцену<br />
2. Скопировать данную сцену(имеется в виду обычное копирование, без ссылки)<br />
3. Перенести объект и его копию обратно, в нужную сцену<br />
4. Созданные сцены можно удалить :)<br />
<br />
== Guest ==<br />
<br />
'''Guest (гость)''' - объект, который перевел машину в текущее состояние. Пример: кнопка ''btn1'' по клику переводит машину ''mch1'' в состояние ''st1'', в этом состоянии у машины ''mch1'' гостем является кнопка ''btn1''. Гостем может быть объект любого типа, если он может менять состояние другому объекту (например: хидден-объект по нахождению может менять состояние объекту, кнопка, машина, пэчворк и т.д.)<br />
<br />
В машине состояний можно считывать (проверять) и передавать параметры и состояния гостя. Любое поле ''obj'' в выпадающем списке содержит строку ''guest'', что позволяет работать с гостем, как с любым другим объектом.<br />
<br />
=== Пример использования ===<br />
<br />
[[Файл:Guest1.jpg|left]]<br />
Пускай экран содержит 3 кнопки (''btn1'', ''btn2'' и ''btn3'') и одну машину ''mch1''. Нужно сделать так, чтобы по клику на любую из кнопок машина перемещалась в ее координаты и переводила кнопку в состояние ''disable''. Так же по клику на кнопку ''btn2'', машина должна перейти в состояние ''bonus''.<br><br />
Всем трем кнопкам по клику пропишем передавать объекту ''mch1'' состояние ''check''.<br><br><br />
Создадим в машине три состояния: ''init'' - состояние в котором машина будет находиться по умолчанию, ''check'' - состояние, которое будет вызываться тремя кнопками, в этом состоянии у машины ''mch1'' одна из трех кнопок будет гостем, ''bonus'' - последнее состояние.<br><br />
Две команды ''var'' считывают у гостя координаты, т.к. мы не знаем, какая именно кнопка перевела машину ''mch1'' в состояние ''check'', то обращаемся к гостю, а не к кнопкам. За ними следует две команды ''set'', которые передают координаты гостя машине. Еще один ''set'' переводит гостя в состояние ''disable''. И через ''wait'' осуществляется переход в состояние ''bonus'', если гость ''btn2''.<br />
<br />
<pre><br />
При смене состояния гость сохраняется, т.е. в состоянии bonus гостем останется btn2.<br />
</pre><br />
<pre><br />
Если машина изначально сама себе меняет состояния, то у нее нет гостя.<br />
</pre><br />
<br />
[[Файл:Guest2.jpg]]<br />
<br />
== Массив (Array) ==<br />
<br />
В данном объекте реализован массив, имеющий максимальную длину в 20 элементов.<br />
<br />
=== Свойства объекта массив: ===<br />
<br />
len - длинна массива. Длинна массива может как считываться, так и записываться. Влияет на количество сохраняемых объектов в Options.<br />
<br />
index1 - индекс элемента. (данный массив можно расширить до многомерного и использовать несколько индексов)<br />
<br />
val - значение элемента массива, с индексом index1<br />
<br />
a1..a20 - внутренние элементы массива(обращаться можно через свойство par объекта). Предполагается, что пользователь редактора к ним обращаться напрямую не будет, однако иногда для удобства полезны.<br />
<br />
=== Состояния объекта массив: ===<br />
<br />
get - при вызове этого состояния во внутреннюю переменную val записывается значение элемента с индексом index1<br />
<br />
set - при вызове этого состояния во внутреннюю переменную a1..a20, соответствующую индексу index1 записывается значение val<br />
<br />
load - загрузить значения массива из xml.<br />
<br />
save - сохранить элементы массива от 1 до len<br />
<br />
=== Как использовать? ===<br />
<br />
1. Загружаем массив, переводя объект array в состояние load<br />
<br />
2. Записываем значения массива<br />
<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, в которую будет заноситься число)<br />
б). Задаём значение свойству val объекта array (устанавливаем значение, которое будет заноситься в ячейку<br />
с индексом index1)<br />
в). Переводим объект array в состояние set<br />
<br />
3. Считываем значения массива<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, из которой будет считываться число)<br />
б). Переводим объект array в состояние get<br />
в). Считываем значение из свойства val объекта array<br />
<br />
4. Сохраняем массив, переводя объект array в состояние save. Если хотите изменить количество сохраняемых элементов - предварительно измените параметр len.<br />
<br />
=== Копирование объекта ===<br />
<br />
При копировании, необходимо заменить в состояниях load и save array.имя_параметра на другое имя. Например, array2.имя_параметра. Копировать следует через использование доп. сцены (см. выше)<br />
<br />
=== Достоинства ===<br />
<br />
Позволяет избежать необходимости каждый раз создавать большое количество if-ов и set-ов, если необходимо работать с нумерованным списком. Можно один раз создать структуру и копировать её неограниченное количество раз<br />
<br />
=== Недостатки ===<br />
<br />
Данный объект содержит довольно большое количество кода, поэтому при большом их обилии/длине может занизить скорость работы сцены и скорость загрузки сцены.<br />
<br />
=== Исходный XML код===<br />
Прим. id="369" - идентификатор объекта Options, сохраняющего все переменные приложения. id="7845" - идентификатор объекта<br />
<br />
<pre><br />
<obj id="7845" type="machine" nm="array" sync="1" w="1" h="1"><br />
<st id="init"/><br />
<st id="get"><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="7845" par="val" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="val" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="val" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="val" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="val" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="val" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="val" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="val" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="val" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="val" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="val" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="val" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="val" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="val" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="val" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="val" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="val" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="val" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="val" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="val" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="set"><br />
<var nm="val" obj="7845" par="val"/><br />
<set obj="7845" par="a1" val="(val)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(val)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(val)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(val)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(val)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(val)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(val)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(val)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(val)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(val)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(val)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(val)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(val)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(val)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(val)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(val)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(val)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(val)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(val)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(val)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="load"><br />
<var nm="a1" obj="369" par="array.a1" user="1"/><br />
<var nm="a2" obj="369" par="array.a2" user="1"/><br />
<var nm="a3" obj="369" par="array.a3" user="1"/><br />
<var nm="a4" obj="369" par="array.a4" user="1"/><br />
<var nm="a5" obj="369" par="array.a5" user="1"/><br />
<var nm="a6" obj="369" par="array.a6" user="1"/><br />
<var nm="a7" obj="369" par="array.a7" user="1"/><br />
<var nm="a8" obj="369" par="array.a8" user="1"/><br />
<var nm="a9" obj="369" par="array.a9" user="1"/><br />
<var nm="a10" obj="369" par="array.a10" user="1"/><br />
<var nm="a11" obj="369" par="array.a11" user="1"/><br />
<var nm="a12" obj="369" par="array.a12" user="1"/><br />
<var nm="a13" obj="369" par="array.a13" user="1"/><br />
<var nm="a14" obj="369" par="array.a14" user="1"/><br />
<var nm="a15" obj="369" par="array.a15" user="1"/><br />
<var nm="a16" obj="369" par="array.a16" user="1"/><br />
<var nm="a17" obj="369" par="array.a17" user="1"/><br />
<var nm="a18" obj="369" par="array.a18" user="1"/><br />
<var nm="a19" obj="369" par="array.a19" user="1"/><br />
<var nm="a20" obj="369" par="array.a20" user="1"/><br />
<set obj="7845" par="a1" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
<st id="save"><br />
<var nm="len" obj="7845" par="len"/><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="369" par="array.a1" val="(a1)" round="1" user="1" if="0"/><br />
<set obj="369" par="array.a2" val="(a2)" round="1" user="1" if="1"/><br />
<set obj="369" par="array.a3" val="(a3)" round="1" user="1" if="2"/><br />
<set obj="369" par="array.a4" val="(a4)" round="1" user="1" if="3"/><br />
<set obj="369" par="array.a5" val="(a5)" round="1" user="1" if="4"/><br />
<set obj="369" par="array.a6" val="(a6)" round="1" user="1" if="5"/><br />
<set obj="369" par="array.a7" val="(a7)" round="1" user="1" if="6"/><br />
<set obj="369" par="array.a8" val="(a8)" round="1" user="1" if="7"/><br />
<set obj="369" par="array.a9" val="(a9)" round="1" user="1" if="8"/><br />
<set obj="369" par="array.a10" val="(a10)" round="1" user="1" if="9"/><br />
<set obj="369" par="array.a11" val="(a11)" round="1" user="1" if="10"/><br />
<set obj="369" par="array.a12" val="(a12)" round="1" user="1" if="11"/><br />
<set obj="369" par="array.a13" val="(a13)" round="1" user="1" if="12"/><br />
<set obj="369" par="array.a14" val="(a14)" round="1" user="1" if="13"/><br />
<set obj="369" par="array.a15" val="(a15)" round="1" user="1" if="14"/><br />
<set obj="369" par="array.a16" val="(a16)" round="1" user="1" if="15"/><br />
<set obj="369" par="array.a17" val="(a17)" round="1" user="1" if="16"/><br />
<set obj="369" par="array.a18" val="(a18)" round="1" user="1" if="17"/><br />
<set obj="369" par="array.a19" val="(a19)" round="1" user="1" if="18"/><br />
<set obj="369" par="array.a20" val="(a20)" round="1" user="1" if="19"/><br />
<set obj="369" par="array.len" val="(len)" round="1" user="1"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
</obj><br />
</pre><br />
<br />
=== Машина состояний объекта ===<br />
[[Файл:array.jpg]]<br />
<br />
<br />
== Пример использования ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/machine.rar Download]<br />
<br />
== Clone ==<br />
Clone - параметр команды init в разделе "системные действия".<br />
<br />
[[Файл:Clone1.PNG]]<br />
<br />
<br />
Значение 1 означает, что в текущем местоположении машины будет создана ее копия.<br />
<br />
[[Файл:Clone2.PNG]]<br />
<br />
=== Свойства ===<br />
<br />
1) Клонированная машина состояний имеет все свойства, состояния и параметры исходного объекта клонирования.<br />
<br />
2) Клоны рождаются и умирают в рамках одного экрана.<br />
<br />
3) Клоны отличаются друг от друга лишь параметром '''clone_num''', который у оригинала равен "-1", а у клонов от 0 до N.<br />
<br />
4) Нежелательно применять клонирование к клону во избежание путаницы значений параметра '''clone_num'''.<br />
<br />
5) Если при проверке условия [[#if|if]] в поле '''obj''' указать this, это значит что if будет проводить проверку текущего объекта. Таким образом машина может сама себя проверить по параметру '''clone_num''' клон ли она и если да то какой у нее номер;<br />
<br />
=== Пример использования ===<br />
<br />
По ссылке пример использования с подробным описанием машин.<br />
<br />
[http://fs5.absolutist.com/files/wikisample/Clone.zip Download]<br />
<br />
== Параметр команды машины состояний ==<br />
<br />
В случае, когда необходимо изменить значение какого-либо параметра в командах машины состояний (например v в команде move) в процессе работы приложения, можно использовать блок "Параметр команды машины состояний" в команде ''set'' машины состояний. Приведу пример использования этого блока.<br />
<br />
Пусть есть 2 машины: управляющая и управляемая.<br />
<br />
[[Файл:Stm1.jpg|300px]][[Файл:Stm2.jpg|300px]]<br />
<br />
Управляемая машина практически пустая и не содержит каких либо данных о движении, но тем не менее при запуске она будет двигаться, меняя направление. Это движение - заслуга управляющей машины, которая на ходу изменяет параметры движения управляемой. Рассмотрим более детально ее состояния.<br />
<br />
В первом состоянии "wait" мы пытаемся изменить скорость движения управляемой машины. Для этого указали объект (sun), состояние в котором хотим поменять параметр (у машины sun это состояние move), имя команды в которой меняем параметр (в данном случае это move), номер команды (если таких команд несколько, то нужно указать порядковый номер начиная с 0; в нашем случае команда одна), имя параметра (мы хотим изменить скорость, поэтому имя параметра v) и значение (указали значение 200). После этого переходим в следующее состояние.<br />
<br />
В состоянии "1" управляющей машины сначала мы вывели объект sun из состояния move, изменили параметр целевой координаты x на 512 и затем вернули в состояние move, чтобы применить изменения параметров. Таким образом управляемая машина начала движение в x=512 со скоростью 200. Через 2 секунды мы переводим управляющую машину в состояние "2", где аналогичным образом изменяется целевая координата на -512.<br />
<br />
Такой способ задания параметров может найти применение в случае, когда параметры нужно задавать переменными.<br />
<br />
[[Category:Main objects]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Machine&diff=6843Machine2014-12-12T07:54:04Z<p>Nbeznosov: </p>
<hr />
<div>{{TOC right}}<br />
[[Machine]] - [[Object|объект]] '''машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.<br />
<br />
== Введение ==<br />
<br />
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё<br />
<br />
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):<br />
<center><br />
[[Файл:def_states.png]]<br />
</center><br />
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.<br />
<br />
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.<br />
<br />
Все команды состояния, разбиваются на три группы:<br />
* '''[[#Инициализация|Инициализация]]''':<br />
** '''[[#draw|draw]]''' - установка графического ресурса;<br />
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);<br />
** '''[[#set|set]]''' - установка состояния другого объекта;<br />
** '''[[#play|play]]''' - проиграть звук;<br />
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;<br />
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки;<br />
** '''[[#download|download]]''' - запуск процедуры закачки контента.<br />
* '''[[#Процессы|Процессы]]''':<br />
** '''[[#wait|wait]]''' - задержка по времени;<br />
** '''[[#move|move]]''' - равномерное движение;<br />
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;<br />
** '''[[#alpha|alpha]]''' - изменение прозрачности;<br />
** '''[[#scale|scale]]''' - изменение размера;<br />
** '''[[#phys|phys]]''' - ускоренное движение;<br />
** '''[[#rgb|rgb]]''' - изменить rgb-каналы;<br />
** '''[[#spline|spline]]''' - движение по сплайну (по кривой).<br />
* '''[[#Воздействия|Воздействия]]''':<br />
** '''[[#click|click]]''' - что делать при клике на машине;<br />
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;<br />
** '''[[#drag|drag]]''' - машину схватили и тащат;<br />
** '''[[#throw|throw]]''' - машину схватили и кинули;<br />
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;<br />
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец "тащат" по экрану;<br />
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец "тащат" по экрану;<br />
** '''[[#touch_up|touch_up]]''' - отжатие мыши от машины;<br />
** '''[[#tap|tap]]''' - умный тач;<br />
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;<br />
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.<br />
<br />
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!<br />
<br />
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],<br />
начиная с [[Checkbox как машина состояний|третьего]].<br />
<br />
== Свойства ==<br />
<br />
Общие для всех объектов свойства описаны в документе [[Object|Object]].<br />
Дополнительные свойства:<br />
<br />
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.<br />
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.<br />
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).<br />
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.<br />
* '''отладка''' - Отображать в окне состояний текущий объект.<br />
* '''курсор''' - Графический ресурс курсора текущего и всех дочерних объектов.<br />
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.<br />
<br />
== Инициализация ==<br />
<br />
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.<br />
<br />
'''''Замечание.''''' По возможности, нужно избегать передачи значений другим объектам, в начальном состоянии машины, так как такие команды будут выполнятся даже тогда, когда машина будет выключена на визуальной сцене.<br />
<br />
=== draw ===<br />
<br />
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:<br />
<br />
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);<br />
* '''f''' - начальный кадр;<br />
* '''ft''' - длительность кадра в миллисекундах;<br />
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран один раз;<br />
* '''rev''' - играть анимацию в обратном порядке; 0 - прямой порядок проигрывания, 1 - обратный порядок проигрывания;<br />
* '''go''' - перейти в состояние;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Пустая команда draw (без параметров) "сбрасывает" текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.<br />
<br />
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).<br />
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).<br />
<br>Если есть анимация открывающейся и закрывающейся книги (коробки, двери и т.д.) не обязательно подгружать в проект две анимации, можно использовать одну, но запускать ее в обратном порядке, для этого есть параметр '''rev'''.<br />
<br />
=== init ===<br />
<br />
====Параметры объекта====<br />
<br />
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;<br />
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;<br />
* '''al''' - Прозрачность: от 0 (прозрачен) до 1 (не прозрачен);<br />
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);<br />
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима), если vis = 0, это равноценно отключению объекта в редакторе;<br />
* '''z координата''' - координата машины по z.<br />
* '''z приращение''' - приращение координаты машины по z относительно текущего<br />
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше;<br />
<br />
====Параметры движения====<br />
<br />
* '''v''' - скорость для команды move<br />
* '''vr''' - угловая скорость для команды rot<br />
* '''vx''','''vy''' - начальная скорость для команды phys<br />
* '''ax''','''ay''' - ускорение для команды phys<br />
<br />
====Системные действия====<br />
<br />
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга.<br />
Если на девайсе была нажата кнопка "отрейтинговать", то в опции запишется параметр rating значение 1, если нажата кнопка "позже" - rating 2, "никогда" - rating 3.<br />
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто.<br />
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут.<br />
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран.<br />
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние.<br />
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.<br />
* '''id внешней ссылки в текстовой базе''' - Ссыслка будет взята из текстовой базы в соответствии с текущим маркетом.<br />
* '''[[#Clone|clone]]''' - Значение 1 означает, что в текущем местоположении машины будет создана ее копия<br />
<br />
====Переходы и параметры выполнения====<br />
<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия выполнения; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений<br />
<br />
=== set ===<br />
<br />
Перевод другого объекта в некоторое состояние или изменение его параметров.<br />
<br />
* '''obj''' - изменяемый объект (выбирается из списка объектов). В значении объекта можно указать this, это значит что машина сама себе пропишет какой то параметр или состояние.<br />
* '''scr_param''' - глобальный либо текущий экран, параметры которого меняем.<br />
* '''scr_state''' - экран, состояние которого меняем.<br />
* '''parent''' - Объект, который будет установлен в качестве родителя объекту из obj. Объект obj будет оторван от текущего своего родителя и добавлен в детей объекта parent.<br><br />
* '''st''' - состояние в которое переводится объект.<br><br />
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr,val_vid,val_res,val_node.<br />
* '''mSt''' - Состояние машины в котором будем изменять параметр команды.<br />
* '''mCmd''' - Имя команды, параметр которой меняем.<br />
* '''mCmdN''' - Порядковый номер в перечне одноименных команд состояния.<br />
* '''mPar''' - Установить этот параметр команды в значение val.<br />
* '''val_obj''' - id объекта, будет записано в в par<br />
* '''val_txt''' - id текста, будет записано в в par(параметр для текстов "txtID")<br />
* '''val_vid''' - id video, будет записано в par(параметр для видео "video" - RGB, "videoA" - Alpha)<br />
* '''val_scr''' - id экрана, будет записано в в par<br />
* '''val_res''' - Новое значение графического ресурса (перетаскивается из редактора ресурсов). (пока не работает)<br />
* '''val_node''' - Новое нода графа (выбирается из списка, при заданном объекте)<br />
* '''val''' - значение параметра объекта для установки<br />
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par объекта obj<br />
* '''round''' - округлить значение, записываемое в val<br><br />
* '''scr''' - экран на который мы хотим перейти<br />
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется<br><br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. <br />
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).<br />
<br />
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.<br />
<br />
=== play ===<br />
<br />
Проиграть звук.<br />
<br />
*'''snd''' - короткий звук (перетаскивается из редактора ресурсов);<br />
*'''voice''' - голос (запускается как звук, но без цикла и с громкостью голоса) (перетаскивается из редактора ресурсов);<br />
*'''mus''' - длинный звук (перетаскивается из редактора ресурсов);<br />
*'''preload''' - указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;<br />
*'''loop''' - зациклить звук (звуки);<br />
*'''repeat''' - Число повторов выбранного звука при отключенном loop;<br />
*'''mus_stop''' - остановить текущую музыку (''mus_stop=1'');<br />
*'''mus_fading''' - Время затухания предыдущей мелодии в ms. Использовать совместно с mus.<br />
*'''volume''' - установить громкость для всех звуком данной машины - тех что уже играют и тех, что будут запущены впоследствии;<br />
*'''не выгружать''' - позволяет продолжать проигрывание звука при смене экранов.<br />
*'''if''' - номер (начиная с нуля) условия перехода [[#if|if]].<br />
<br />
Особенности примененияния:<br />
<br />
*Короткий звук (''snd'') нельзя запустить в первом (инитном) состоянии машины. Для того, чтобы запустить звук сразу при загрузке экрана, нужно в первом состоянии машины записать мгновенный переход во второе состояние мамашины (например, команда ''wait'', поле ''go'', в поле выбрать второе состояние), а во втором состоянии уже запустить звук. Если звук нужно зациклить и проигрывать какое-то количество раз (''loop=1,2,3,..,n'') или бесконечно (''loop=-1''), то нужно проследить чтобы состояние, в котором запускается звук, не вызывалось повторно во время проигрывания звука, иначе возникнет наложение звуков. Если во время проигрывания звука машина меняет свое состояние, звук продолжает играть. Если в одной машине почти одновременно воспроизводится несколько звуков, то они прерывают друг друга. Если каждый звук воспроизводится в отдельной машине, то они звучат параллельно.<br />
*Длинный звук (''mus'')- музыка. На экране не может воспроизводится несколько длинных звуков одновременно. Любой запуск длинного звука независимо от того, в какой машине он осуществляется, будет прекращать проигрывание предыдущего звука. Музыка, которая проигрывается на глобальном экране, проигрывается на всех экранах проекта.<br />
<br />
=== var ===<br />
<br />
Переменная, которой присваивается значение параметра объекта<br />
<br />
*'''name''' - имя переменной;<br />
*'''tp''' - тип переменной;<br />
*'''obj''' - объект, используемый далее;<br />
*'''par''' - имя параметра, значение которого присваивается переменной;<br />
*'''val''' - значение переменной, если отсутствуют obj и par;<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
*'''func''' - в выпадающем списке можно выбрать функцию:<br />
**'''random''' - использует arg1 и arg2, возвращает случайное целое число в диапазоне arg1 .. arg2.<br />
**'''conc''' - объединяет 4 строки arg1,arg2,arg3,arg4. Возвращает строку, в которой соединены все строки<br />
**'''exp''' - экспонента от аргумента arg1.<br />
**'''ln''' - натуральный логарифм аргумента arg1.<br />
*'''arg1''' - аргумент функции<br />
*'''arg2''' - аргумент функции<br />
*'''arg3''' - аргумент функции<br />
*'''arg4''' - аргумент функции<br />
<br />
Обозначенная переменная существует (может использоваться) только в текущем состоянии. Переменная может определятся в одном состоянии только один раз. Если созданной переменной нужно изменить значение в рамках состояния, это можно сделать через другую переменную или через параметр опций ([[Options]]). Если ее значение нужно использовать в другом состоянии, то оно присваивается параметру опций, а затем заново считывается в новом состоянии. Переменные можно указывать в поле ''val'' с другими математическими действиями и цифрами, при этом каждое действие заключать в скобки. Если в поле ''val'' указать имя переменной ''А'' без скобок - воспримется строка ''А'', если указать в скобках - воспримется значение переменной.<br />
<br />
=== buy === <br />
<br />
'''(in-app совершить in-app покупку)'''<br />
<br />
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).<br />
<br />
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];<br />
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;<br />
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;<br />
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;<br />
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.<br />
<br />
=== download ===<br />
<br />
'''(скачать загружаемый контент)'''<br />
<br />
При переходе в состояние будет совершена попытку закачать контент.<br />
* '''url''' - ссылка на zip архив с контентом в интернете.<br />
* '''объект успех''' - объект, которому в случае успешной закачки будет задаваться указанное состояние.<br />
* '''состояние (успех)''' - состояние, которое будет устанавливаться выше указанному объекту, в случае успешной закачки.<br />
* '''объект (провал)''' -объект, которому, в случае неудачи закачки, будет устанавливаться указанное состояние.<br />
* '''состояние (провал)''' - состояние, которое, в случае неудачи закачки,будет устанавливаться выше указанному объекту.<br />
* '''счетчик прогресса''' - объект, типа счетчик, который отображает прогресс закачки контента. Крайне желательно, что бы он измерялся в диапазоне от 0 до 100.<br />
<br />
Существует несколько причин при которых вызывается состояние "провал". Для того что бы сообщить пользователю, по какой именно причине возник провал закачки, следует идентифицировать причины провала. Это возможно сделать с помощью параметра <br />
<pre><br />
downloadErrCode<br />
</pre><br />
Ниже приведены значение параметра которые помогут вывести нужное текстовое сообщение :<br />
<pre><br />
GCUSTOM_ERROR_CODE_ERROR_UNKNOWN = 1, //!< ошибка не классифицирована<br />
GCUSTOM_ERROR_CODE_WIFI_DISABLED = 2, //!< отключен WIFI<br />
GCUSTOM_ERROR_CODE_SDCARD_UNAVAILABLE = 3, //!< SD-карта недоступна<br />
GCUSTOM_ERROR_CODE_SDCARD_FULL = 4, //!< SD-карта переполнена перед закачкой<br />
GCUSTOM_ERROR_CODE_UNZIP_FAIL = 5 //!< ошибка при распаковки пака (скорее всего на SD-карте не<br />
хватает места для распаковки <br />
</pre><br />
<br />
== Процессы ==<br />
<br />
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.<br />
<br />
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа<br />
или в другое состояние (если есть параметр go).<br />
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.<br />
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).<br />
<br />
=== wait ===<br />
<br />
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.<br />
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.<br />
<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t>t+dt прерывается в любом случае);<br />
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
Простейший набор параметров команды wait выглядит следующим образом:<br />
<pre><br />
<wait t="1000" go="next"/> // ждем 1000ms и покидаем состояние<br />
</pre><br />
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):<br />
<pre><br />
<wait t="100" p="0.5" go="st1"/> // через t с вероятностью 1/2 перейдет в st1<br />
<wait go="st2"/> // иначе, перейдем в st2<br />
</pre><br />
Этот же синтаксис позволяет делать состояния с различным временем жизни:<br />
<pre><br />
<wait t="100" p="0.5" go="next"/> // с вероятностью 1/2 живем 100ms<br />
<wait t="100" go="next"/> // или 200ms<br />
</pre><br />
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:<br />
<pre><br />
<wait t="1000" dt="200" go="next"/><br />
</pre><br />
<br />
=== move ===<br />
<br />
Перемещение по сцене:<br />
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект. Можно указывать переменные заданные с помощью [http://ge.absolutist.com/index.php/Machine#var_2 переменной var];<br />
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;<br />
* '''v''' - скорость перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;<br />
* '''t''' - время перемещения (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.<br />
<br />
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за секунду (а не миллисекунду!)<br />
<br />
=== rot ===<br />
<br />
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.<br />
* '''ta''' - целевой угол поворота объекта;<br />
* '''da''' - на сколько надо повернуться (ta игнорируется);<br />
* '''v''' - угловая скорость поворота в градусах в секунду;<br />
* '''t''' - время поворота (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.<br />
<br />
=== alpha ===<br />
<br />
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)<br />
* '''ta''' - целевая прозрачность<br />
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)<br />
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)<br />
* '''t''' - время изменения (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд alpha с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Если у объекта прозрачность ''al=0.00'', то он невидим для всякого взаимодействия. Если у объекта прозрачность ''al=0.01'', то он видим для клика, но невидим для дропа(команда drop на объект не видит объект с прозрачностью ''0.01''). Если у объекта ''al=0.02'', то он видим и для клика, и для дропа.<br />
<br />
=== scale ===<br />
<br />
Изменение размеров объекта<br />
* '''tx''', '''ty''' - целевой масштаб по каждой оси<br />
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси<br />
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)<br />
* '''t''' - длительность выполнения команды (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд scale с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== phys ===<br />
<br />
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).<br />
<br />
* '''vx''', '''vy''' - начальная скорость<br />
* '''ax''', '''ay''' - величина ускорения по каждой оси<br />
* '''a''' - полное ускорение<br />
* '''tvx''', '''tvy''' - целевая скорость<br />
* '''tx''', '''ty''' - целевая координата<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). <br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координате y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.<br />
<pre><br />
<br />
<st id="down"> // падаем<br />
<phys vy="0" ay="20" ty="0" go="touch"/><br />
</st><br />
<br />
<st id="touch"> // касаемся земли<br />
<move dy="24" t="300"/> // опускаем центр при сжатии<br />
<scale ty="0.8" t="300"/> // сжимаемся<br />
<move dy="-24" t="300"/> // поднимаем центр при разжатии<br />
<scale ty="1" t="300" go="up"/> // разжимаемся<br />
</st><br />
<br />
<st id="up"> // взлетаем<br />
<phys vy="0" ty="-200" go="down"/><br />
</st><br />
<br />
</pre><br />
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.<br />
<br />
=== rgb ===<br />
<br />
* '''trgb''' - целевой эффект rgb; подразумевает под собой цвет в виде HEX-кода; по-умолчанию: FFFFFF;<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== spline ===<br />
<br />
Сплайн позволяет перемещать машину по заранее заданной траектории.<br />
<br />
====Параметры====<br />
<br />
*'''key''' - точки сплайна по которым движется <br />
*'''t''' - время движения по траектории<br />
*'''go''' - по окончанию переход в состояние<br />
*'''if''' - условие перехода<br />
*'''loop''' - количество повторений<br />
*'''break''' - прервать команды на этой<br />
*'''wait''' - номер запускаемого действия<br />
*'''init''' - номер запускаемого действия<br />
*'''alpha''' - номер запускаемого действия<br />
*'''rot''' - номер запускаемого действия<br />
*'''move''' - номер запускаемого действия<br />
*'''set''' - номер запускаемого действия<br />
*'''phys''' - номер запускаемого действия<br />
*'''scale''' - номер запускаемого действия<br />
*'''drow''' - номер запускаемого действия<br />
<br />
====Построение сплайна====<br />
<br />
# в состоянии машины добавляем правой кнопкой мыши действие "spline"<br />
# добавляем минимально необходимые параметры: '''key''' и '''t''', указываем время движения в '''t'''<br />
# выделяем для редактирования поле '''key'''<br />
# записываем координаты точек через запятую, сначала x потом y, например: -211,-248,-151,-248,-91,-247,59,-246,60,101,60,159,1,190<br />
Если записали все координаты вручную, то можно сохранить и проверять.<br />
Или можно в окне списка состояний нажать на кнопку "build spline" (справа вверху).<br />
[[Файл:Btn spline.jpg|500px]]<br />
<br />
Окно с списком состояний закроется, появится дополнительная панель с настройками сплайна и появится возможность указывать мышкой по экрану точки для сплайна.<br />
<br />
[[Файл:Spline panel.jpg|500px]]<br />
<br />
Точки сплайна указываются кликом левой кнопки мыши по экрану.<br />
<br />
Возможности редактирования:<br />
<br />
'''режимы:'''<br />
*'''add''' - по нажатию левой кнопкой мыши по экрану - будет добавлена новая точка, которая соединится с предыдущей<br />
*'''select''' - по нажатию левой кнопкой мыши по точке сплайна появится возможность отредактировать её положение перетащив её или поменяв её координаты в полях x и у<br />
*'''delete''' - по нажатию левой кнопкой мыши по точке сплайна точка удалится<br />
<br />
Чтобы удалить все точки сплайна необходимо нажать на кнопку "'''delete all knots'''"<br />
<br />
Сохранить сплайн можно нажав на кнопку "'''Save spline'''"<br />
<br />
====Дополнительные сведения====<br />
<br />
* Время движения между двумя соседними точками всегда одинаково, то есть чем дальше друг от друга соседние точки, тем быстрее будет двигаться объект, чем ближе - тем медленней.<br />
* Координаты сплайна просчитываются относительно точки пивота родительского объекта, если соответствующая машина является подобъектом. На координаты могут влиять модификаторы родительского объекта.<br />
<br />
== Воздействия ==<br />
<br />
=== click ===<br />
<br />
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.<br />
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.<br />
<br />
По клику машина записывает координаты клика в параметры: clickX, clickY.<br />
<br />
=== touch_in ===<br />
<br />
Наведение мыши/пальца на машину, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== touch_out ===<br />
Выведение мыши/пальца из машины, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при клике нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== touch_up ===<br />
<br />
Отжатие мыши от машины<br />
<br />
* '''go''' - состояние в которое при отжатии мыши нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== mouse_in ===<br />
<br />
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== mouse_out ===<br />
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== drag ===<br />
<br />
Данная команда позволяет "таскать" объект по сцене нажав и удерживая клавишу мишки или (палец в случае сенсорного устройства) на нем.Так же есть возможность ограничить разрешенную область таскания, за пределы которой объект вытащить невозможно. [[Файл:drag.jpg|right]]<br />
* '''x1''' - разрешено таскать, когда координата объекта правее;<br />
* '''x2''' - разрешено таскать, когда координата объекта левее;<br />
* '''y1''' - разрешено таскать, когда координата объекта ниже;<br />
* '''y2''' - разрешено таскать, когда координата объекта выше;<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''за пивот''' - "да" - таскать объект за пивот, "нет" - за ту точку, за которую схватили<br />
* '''приклеивать''' - приклеивать при клике к мышке.<br />
<br />
=== dragRot ===<br />
<br />
Данная команда позволяет вращать объект вокруг точки пивота. Нажав и удерживая клавишу мишки или палец (в случае сенсорного устройства) на нем, мы можем вращать его по часовой либо против часовой стрелки. При многократном вращении вокруг своей оси значение его угла не накапливается, а обнуляется выходя за границы [360 ; -360] градусов. [[Файл:dragRot.jpg|right]]<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''maxVel''' - Максимальная скорость вращения градус/сек;<br />
* '''objStart''' - объект при начале вращения;<br />
* '''stStart''' - его новое состояние;<br />
* '''objEnd''' - объект при завершении вращения;<br />
* '''stEnd''' - его новое состояние;<br />
<br />
=== drop ===<br />
<br />
Если нажатая кнопка мышки отпускается, вызывается эта команда. Обычно она используется в связке с командой drag<br />
* '''obj''' - объект, на который надо уронить таскаемый объект;<br />
* '''go''' - состояние в которое переходим при отпускании мышки;<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:<br />
<pre><br />
<br />
<st id="drag"><br />
<drag x1="-350" x2="350" y1="-250" y2="250"/><br />
<drop obj="box" go="open"/><br />
</st><br />
<br />
<st id="open"><br />
<set obj="box" st="open"/><br />
<scale tx="0.01" ty="0.01" t="500" go="hide"/><br />
</st><br />
<br />
<st id="hide"><br />
<init x="268" y="30"/><br />
<scale tx="1" ty="1" t="500" go="drag"/><br />
</st><br />
<br />
<br />
</pre><br />
Ящик:<br />
<pre><br />
<br />
<st id="close"> // начальное состояние ящика<br />
<init al="1"/> // если его кто-то сюда переведет - он появится.<br />
</st><br />
<br />
<st id="open"> <br />
<alpha ta="0" t="500"/> // исчезает по прозрачности за 500 ms<br />
</st><br />
<br />
</pre><br />
<br />
====Использование свойства "Условие перехода" ====<br />
<br />
Можно прописать условие, при котором выполняется переход при дропе.<br />
[[Файл:Drop_if.png|300px|thumb|right]]<br />
<br />
С помощью этого условия мы можем научить наш объект выполнять разные задачи в зависимости от того, как именно его дропнули.<br />
Пусть есть объект который можно таскать. Когда объект не таскается должен быть включен флаер, привязанный к этому объекту. При клике на объект, он должен поворачиваться на 90 градусов. При дропе на соответствующую маску объект стает на свое место(Если выполнены условия, к примеру: установлен предыдущий объект и наш объект имеет правильный угол). Если дроп в любое другое место, то должен включится флаер.<br />
<br />
Для того, чтобы научить машину различать клик по ней и ее таскание сделаем следующее. Пропишем ей 2 состояния: click и drag, а также выставим ей параметр "хранить нажатость" = 1. В click будем вычислять координаты объекта и записывать объекту параметр допустимого смещения при котором таскание будет восприниматься как клик. (В данном примере эти параметры: cx, cy, vx, vy. А допустимое смещение составляет 10 пикселей.)<br />
<br />
В состоянии drag будем проверять попадает ли координата объекта при дропе в границы допустимого смещения. Для того чтобы сравнить параметр объекта с переменной, вычтем из нашего объекта, то что мы записали в click. В зависимости от условий и места дропа переходим в соответствующее состояние.<br />
<br />
[[Файл:Click.png|330px]] [[Файл:Drag st.png|630px]]<br />
<br />
=== throw ===<br />
<br />
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:<br />
* '''go''' - состояние, в которое, при клике, надо перейти;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;<br />
* '''force''' - получаемая скорость равна разнице пикселей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.<br />
<br />
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).<br />
<br />
=== tap ===<br />
<br />
* '''go''' - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
=== apply ===<br />
<br />
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.<br />
* '''obj''' - сработает , если пересеклись с этим объектом;<br />
* '''x1''' - сработает, если центр объекта левее этого x-са;<br />
* '''x2''' - сработает, если центр объекта правее этого x-са;<br />
* '''y1''' - сработает, если центр объекта выше этого y-ка;<br />
* '''y2''' - сработает, если центр объекта ниже этого y-ка;<br />
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)<br />
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)<br />
* '''st''' - состояние, в которое надо перевести объект obj<br />
* '''go''' - состояние, в которое надо перейти при срабатывании;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.<br />
<br />
[[Файл:Апплай.png|500px]]<br />
<br />
Блок схема работы '''apply'''<br />
<br />
[[Файл:Блок схема apply.png|500px]]<br />
<br />
* Сначала у нас проверяется координаты '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Далее проверяет если '''obj'''<br />
* Если '''obj''' нет, то идёт проверку, и выдаёт результат<br />
(если при этом если '''x1''', '''x2''', '''y1''', '''y2''' нет, то они считаются по ширине и высоте всего экрана.)<br />
* Если есть '''obj''', то проверяет есть ли радиусы '''rm''', '''ro'''.<br />
* Если он есть, то значит у нас '''apply''' по кругам<br />
* Если нет, то проверяем наличие '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Если они есть, то проверка и результат.<br />
* Если их нет, то проверка идёт по шейпам объектов, и выдаётся результат/<br />
Если не будет стоять ни каких галочек, то проверка будет идти по шейпам объектов.<br />
<br />
<br />
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в "тыкву". Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква "взрывается":<br />
<pre><br />
<br />
<st id="trow"><br />
<init x="-350" y="150"/> // начальное положение<br />
<throw go="fly"/> // бросаем<br />
</st><br />
<br />
<st id="fly"><br />
<phys ay="100"/> // летим<br />
<apply y2="300" go="throw"/> // с землей<br />
<apply obj="тыква" rm="8" ro="10" st="bang"/> // с тыквой<br />
</st><br />
<br />
</pre><br />
<br />
== Условия ==<br />
<br />
=== if ===<br />
<br />
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются<br />
в параметре if других команд. Эти номера можно соединять при помощи логических связок:<br />
* '''&''' - логическое '''и''' (вместо значка '''&''' можно использовать запятую ''',''');<br />
* '''|''' - логическое '''или''';<br />
* '''!''' - логическое '''не'''.<br />
Пример записи логического выражения в поле if некоторой команды: '''(1&2)|(3&(!4))''',<br />
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.<br />
<br />
Логические связки используются также как математической логике или любом языке программирования. <br />
Так:<br />
* A '''&''' B - истинно, если истинны оба условия A и B;<br />
* A '''|''' B - истинно, если истинно хотя бы одно условие (или оба);<br />
* '''!''' А - истинно, если условие A ложно.<br />
Скобки в логическом выражении определяют приоритет (порядок) выполнения логических операций.<br />
Отметим несколько тождеств, справедливых при формировании логических высказываний:<br />
* !(A & B) = (!A) | (!B)<br />
* !(A | B) = (!A) & (!B)<br />
* !(!A) = A<br />
<br />
Если при формировании условия (ниже) есть несколько проверок, то они соединены логическим '''и'''.<br />
Т.е., если хотя бы одна из них не выполняется, то считается, что условие не выполнилось.<br />
<br />
Параметры команды:<br />
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val. В этом поле можно указать this, это значит что if будет проводить проверку текущего объекта. Добавлено это вместе с параметром clone. Клоны рождаются и умирают в рамках одного экрана. Для различия клонов между собой машина имеет уникальный параметр "clone_num" у оригинала = -1, у клонов от 0 до N, собственно с помощью this машина может сама себя проверить клон ли она и если да то какой у нее номер;<br />
* '''st''' - имя состояния в котором может находиться объект obj;<br />
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;<br />
* '''val''' - значение параметра par, которое проверяется у объекта obj;<br />
* '''val_txt''' - Значение текстового параметра объекта для проверки условия;<br />
* '''val_res''' - Значение ресурсного параметра объекта для проверки условия;<br />
* '''op''' - операция сравнения par op val. Если операции нет, то предполагается проверка на равенство par=val. Иначе используются операторы:<br />
** '''<''' - меньше (par < val);<br />
** '''>''' - больше (par > val);<br />
** '''!=''' - не равно (par != val);<br />
** '''<>''' - не равно (par <> val);<br />
** '''>=''' - больше или равно (par >= val);<br />
** '''<=''' - меньше или равно (par <= val);<br />
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;<br />
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;<br />
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.<br />
* '''buy''' - был ли куплен данный inn-app (проверяется флаг поля в объекте [[Options]]);<br />
* '''url''' - валиден (правилен и может быть запущен) ли данный интернет-адрес;<br />
* '''is_mus''' - играет ли сейчас музыка (значение 1);<br />
* '''guest''' - объект который установил состояние (используется вместо параметра obj). Если указанный объект не менял состояние этой машины, то условие не срабатывает.<br />
<br />
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записанного в поле val.<br />
Если же использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.<br />
<br />
Для проверки текущего значения прозрачности у объекта можно воспользоваться параметром ''cur_al''<br />
<br />
== Математика ==<br />
Математика в appsalute creator представлена 4-мя основными операциями: (плюс), (минус), (умножить), (поделить) <br><br />
Организована благодаря совместному использованию '''[[#var|var]]''' и '''[[#set|set]]'''. <br />
=== var ===<br />
Благодаря использованию '''[[#var|var]]''' существует возможность cчитать любой числовой параметр любого объекта. Например: x - координату какой-то машины, текущее значение любого объекта counter или timer и конечно же считывание значения любого параметра из опций! Каким образом это устроено? Рассмотрим подробнее '''[[#var|var]]''': <br><br />
[[Файл:VAR.png|right]]<br />
*'''name''' - здесь выбираем имя для нашей будущей переменной, которой будем оперировать далее<br />
*'''obj''' - выбирается объект, параметры которого мы хотим считать<br />
*'''par''' - параметр, который нужно вычитать из объекта, указанного выше<br />
*'''val''' - указывается числовое значение, которое будет установлено по умолчанию в случае отсутствия obj и par<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
На изображении справа можно наблюдать каким образом организован '''[[#var|var]]'''. В данном случае объявлена переменная x_cor, которая считывает x-координату объекта actor_1, при этом считывание переменной происходит из текущего профиля, так, как в поле user установлено значение равное "1".<br />
<br />
=== set ===<br />
[[Файл:SET.png|right]]<br />
Использование '''[[#var|var]]''' без '''[[#set|set]]''' не имеет смысла. Так, как переменная создается, но не используется дальше. Рассмотрим следующий пример, где вычитаем x - координату из одного объекта и сохраним ее в опции, предварительно увеличив ее на 50 единиц (в данном случае 50 пикселей).<br />
На рисунке справа можно наблюдать, каким образом это сделано. В состоянии '''init''' объявляется переменная '''x_cor''', которая считывает координату '''x''' из объекта '''actor_1''', таким образом в переменную '''x_cor''' запишется положение по '''x''' объекта '''actor_1'''. Поле '''user''' в данном случае в '''1''' не обязательно устанавливать, так как работа ведется с машинами, а не с опциями. Если бы на месте '''actor_1''' оказался объект '''options''', то это было бы просто необходимо, иначе программа считает значение не из профиля. Далее в '''[[#set|set]]''' выбран объект '''options''', в параметр '''x_position''' которого будет сохранятся значение переменной '''x_cor''' увеличенной на 50. В поле '''round''' идет округление вычисляемого значения, если оно установлено в 1. Поле '''user ''' установлено в 1, это значит, что параметр '''x_position''' будет сохранен в профиль. После это выполняется сохранение опций путем задания объекту '''options''' состояния '''save'''.<br><br />
! ! !ВАЖНО: чтобы выполнить какие-то действия с '''[[#var|var]]''' его обязательно нужно указывать в поле '''val''' в '''set''', при этом, если он используется, то все выражение должно стоять в скобках. Если в поле '''val''' не используется переменная, то скобки необязательны.<br />
<br><br />
<br><br />
Существует также возможность использовать '''[[#var|var]]''' совместно с '''[[#if|if]]''', а также '''[[#var|var]]''' с '''[[#move|move]]'''<br />
<br><br />
Так же добавилась возможность записывать значение переменной в состояние "st", что значительно уменьшает<br />
необходимость в записи 1000 if-ов. При этом, тип переменной в '''[[#var|var]]''' должен быть "строка".<br />
И добавилась возможность записи переменной boolean: ((a)==(b)). true = 1, false = 0. Довольно полезная вещь,<br />
если не хотите забивать "память" ненужной математикой.<br />
<br />
=== var и if ===<br />
[[Файл:IF.png|right]]<br />
При подробном рассмотрении '''[[#if|if]]''' можно заметить, что в нем есть поле '''val''', соответственно в этом поле можно указать переменную. Таким образом в поле '''val''' необязательно указывать константу, а можно указать какую-то переменную, которая может постоянно изменяться. Например, существует два объекта, один находится состоянии покоя, а другой находится в движении. При этом первый объект (тот, который в состоянии покоя) постоянно опрашивает положение второго объекта, и в случае, если у объекта, который движется, '''х''' координата равна '''х''' координате первого объекта, то первый объект входит в состояние, где он начинает свое движение. На рисунке показан объект, который находится в состоянии покоя, рассмотрим его состояния:<br><br />
В данном объекте существует два состояния: '''init''' и '''move'''. В '''init''' объект опрашивает другой объект и в случае, когда условие срабатывает, то переходит в состояние '''move''', где начинает свое движение.<br />
В '''init''' создаем переменную, в которую записываем положение по '''x''' объекта '''actor_2''', в '''if''' проверяется условие на соответствие координат объектов '''actor_1''' и '''actor_2''', в данном случае координата объекта '''actor_2''' представлена в виде переменной '''x_cor'''. Если условие выполняется, то происходит переход в состояние '''move''', если нет, то заново проходим состояние '''init''' и повторяем вышеописанную последовательность действий.<br />
<br><br />
<br><br />
<br><br />
<br><br />
<br />
=== var и move ===<br />
Также с помощью '''[[#var|var]]''' есть возможность указать целевые координаты в '''[[#move|move]]'''. То есть, не обязательно указывать целевые координаты в виде констант, их можно указать теперь с помощью переменных. При использовании '''[[#var|var]]''' и '''[[#move|move]]''' можно организовать обмен двух объектов местами с анимацией движения. Для этого необходимо определять какой объект нажат первым, а какой вторым, сохранять их координаты через объект '''options''' и только потом менять их местами. На рисунке можно увидеть, как это организовано.<br />
[[Файл:var_move.png|1000px|thumb|center|]]<br />
Рассмотрим подробнее состояние данной машины:<br />
<br><br />
* '''init'''<br><br />
В этом состоянии ожидаем клик на объект и обнуляем параметр, который отвечает за то, какой по счету объект сейчас нажат. Так, как при обмене объектов, если мы делаем это по клику, важно знать, по какому кликнули первым, а по какому вторым.<br />
* '''check'''<br><br />
Проверяется параметр '''number''', если он равен '''0''', то это значит, что еще ничего не кликали и мы переходим в состояние, где в опции записываются координаты этого объекта, который считается нажатым первым. Если не равен '''0''', то считается, что этот объект нажат вторым и переходит в состояние, где в опции записываются координаты этого объекта, который считается нажатым вторым по счету.<br />
* '''first_object'''<br><br />
В этом состоянии записываются координаты объекта в опции. Чтобы записать координаты в опции используются '''[[#var|var]]''' и '''[[#set|set]]''' упоминаемые выше. В опции координаты первого нажатого объекта сохраняются под параметрами '''x_first''' и '''y_first'''. В конце параметру '''number''' присваиваем значение '''1''', чтобы указать, что следующий нажатый объект будет вторым по счету. <br />
* '''second_object'''<br><br />
В этом состоянии объект будет в том случае, если он будет нажатым вторым по счету, то есть после состояния '''check''' объект попадет в это состояние, где он запишет свои текущие координаты под параметрами '''x_second''' и '''y_second'''. Запись координат происходит таким же самым образом, что и в состоянии '''first_object'''. После этого он автоматически переходит в следующее состояние.<br />
* '''move_first'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат первым, поэтому он будет двигаться на место второго нажатого объекта, который сохранил свои координаты в параметры'''x_second''' и '''y_second'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты второго объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
* '''move_second'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат вторым, поэтому он будет двигаться на место первого нажатого объекта, который сохранил свои координаты в параметры '''x_first''' и '''y_first'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты первого объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
<br />
В результате проделанных манипуляций с машинами по кликам на две машины, они обменяются местами с анимацией движения. Это может быть очень полезным во многих мини играх!!!<br />
<br />
=== Важно знать ===<br />
* Переменная действует в рамках одного состояния, если нужно, чтобы она была глобальной, нужно сохранить ее в опции и потом в нужный момент считывать ее из опций.<br />
* Если складываем два числа, то в поле '''val''' они должны быть записаны в скобках: (5+3).<br />
* Если возникает необходимость написать какое-то более сложное арифметическое вычисление, то следует помнить, что на одно действие приходятся одни скобки. Например: (((5+3)\2)*2).<br />
* Количество открывающих и закрывающих скобок должно быть одинаковым.<br />
* В скобках можно писать переменную, если она была объявлена выше: (5+a).<br />
* Переменная может состоять из цифр и букв и знака нижнего подчеркивания.<br />
* Иногда бывает необходимым использование '''round''' в '''set''', так например, если какой-то параметр получен с помощью арифметических вычислений и потом используется его в каком-то условии, и условие проверяет параметр, как целочисленное значение, то могут возникнуть ошибки. Так, как число будет записано в следующем виде 123.0000 и программа будет считать, что оно не целочисленное, а дробное. И чтобы избавится от лишних нулей в дробной части следует округлять число.<br />
* Действия, которые требуют времени, такие как move, rot, wait и другие перестают работать для уменьшения вычислительной нагрузки на устройство.<br />
* Действия, которые не требуют времени, такие как set, init и другие продолжают функционировать.<br />
<br />
<br />
<pre><br />
Если с помощью переменной менять объекту любой параметр, например, координату X, то она<br />
запомнится (запишется как значение по умолчанию).<br />
Тогда при повторном попадании на экран считается не тот X, который указан в свойствах,<br />
а тот, который установлен через переменную.<br />
Если нужно при ините экрана возвращать начальные значения параметров,<br />
то можно сделать это двумя способами:<br />
- не использовать переменную;<br />
- создать отдельное состояние, которое будет "вручную" устанавливать начальные значения<br />
параметрам при ините экрана.<br />
Если координата (или другой параметр) меняется другим способом, то будут автоматически<br />
при ините экрана подтягиваться значения из свойств объекта.<br />
</pre><br />
<br />
=== Примеры применений ===<br />
С помощью математики можно организовать следующее:<br />
* динамические опции (изменение звука и музыки с помощью ползунка);<br />
* анимацию каунтера в играх (по окончанию уровня можно наблюдать, как изменяются очки);<br />
* подсчет очков (гибкая система подсчета очков);<br />
* обмен объектов местами (использование var и move)<br />
* увеличение z-координаты любого объекта (когда необходимо, чтобы нажатый или таскаемый объект был выше других по z);<br />
* простейший калькулятор;<br />
* и много других.<br />
<br />
== Копирование машины состояния с сохранением ссылки на себя ==<br />
Довольно часто бывает, что машина состояний ссылается только на глобальные объекты и на саму себя. При этом, если мы просто скопируем объект, он будет ссылаться на свою предыдущую копию. Этого можно избежать, сделав 3 шага:<br />
1. Переместить объект в отдельную сцену<br />
2. Скопировать данную сцену(имеется в виду обычное копирование, без ссылки)<br />
3. Перенести объект и его копию обратно, в нужную сцену<br />
4. Созданные сцены можно удалить :)<br />
<br />
== Guest ==<br />
<br />
'''Guest (гость)''' - объект, который перевел машину в текущее состояние. Пример: кнопка ''btn1'' по клику переводит машину ''mch1'' в состояние ''st1'', в этом состоянии у машины ''mch1'' гостем является кнопка ''btn1''. Гостем может быть объект любого типа, если он может менять состояние другому объекту (например: хидден-объект по нахождению может менять состояние объекту, кнопка, машина, пэчворк и т.д.)<br />
<br />
В машине состояний можно считывать (проверять) и передавать параметры и состояния гостя. Любое поле ''obj'' в выпадающем списке содержит строку ''guest'', что позволяет работать с гостем, как с любым другим объектом.<br />
<br />
=== Пример использования ===<br />
<br />
[[Файл:Guest1.jpg|left]]<br />
Пускай экран содержит 3 кнопки (''btn1'', ''btn2'' и ''btn3'') и одну машину ''mch1''. Нужно сделать так, чтобы по клику на любую из кнопок машина перемещалась в ее координаты и переводила кнопку в состояние ''disable''. Так же по клику на кнопку ''btn2'', машина должна перейти в состояние ''bonus''.<br><br />
Всем трем кнопкам по клику пропишем передавать объекту ''mch1'' состояние ''check''.<br><br><br />
Создадим в машине три состояния: ''init'' - состояние в котором машина будет находиться по умолчанию, ''check'' - состояние, которое будет вызываться тремя кнопками, в этом состоянии у машины ''mch1'' одна из трех кнопок будет гостем, ''bonus'' - последнее состояние.<br><br />
Две команды ''var'' считывают у гостя координаты, т.к. мы не знаем, какая именно кнопка перевела машину ''mch1'' в состояние ''check'', то обращаемся к гостю, а не к кнопкам. За ними следует две команды ''set'', которые передают координаты гостя машине. Еще один ''set'' переводит гостя в состояние ''disable''. И через ''wait'' осуществляется переход в состояние ''bonus'', если гость ''btn2''.<br />
<br />
<pre><br />
При смене состояния гость сохраняется, т.е. в состоянии bonus гостем останется btn2.<br />
</pre><br />
<pre><br />
Если машина изначально сама себе меняет состояния, то у нее нет гостя.<br />
</pre><br />
<br />
[[Файл:Guest2.jpg]]<br />
<br />
== Массив (Array) ==<br />
<br />
В данном объекте реализован массив, имеющий максимальную длину в 20 элементов.<br />
<br />
=== Свойства объекта массив: ===<br />
<br />
len - длинна массива. Длинна массива может как считываться, так и записываться. Влияет на количество сохраняемых объектов в Options.<br />
<br />
index1 - индекс элемента. (данный массив можно расширить до многомерного и использовать несколько индексов)<br />
<br />
val - значение элемента массива, с индексом index1<br />
<br />
a1..a20 - внутренние элементы массива(обращаться можно через свойство par объекта). Предполагается, что пользователь редактора к ним обращаться напрямую не будет, однако иногда для удобства полезны.<br />
<br />
=== Состояния объекта массив: ===<br />
<br />
get - при вызове этого состояния во внутреннюю переменную val записывается значение элемента с индексом index1<br />
<br />
set - при вызове этого состояния во внутреннюю переменную a1..a20, соответствующую индексу index1 записывается значение val<br />
<br />
load - загрузить значения массива из xml.<br />
<br />
save - сохранить элементы массива от 1 до len<br />
<br />
=== Как использовать? ===<br />
<br />
1. Загружаем массив, переводя объект array в состояние load<br />
<br />
2. Записываем значения массива<br />
<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, в которую будет заноситься число)<br />
б). Задаём значение свойству val объекта array (устанавливаем значение, которое будет заноситься в ячейку<br />
с индексом index1)<br />
в). Переводим объект array в состояние set<br />
<br />
3. Считываем значения массива<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, из которой будет считываться число)<br />
б). Переводим объект array в состояние get<br />
в). Считываем значение из свойства val объекта array<br />
<br />
4. Сохраняем массив, переводя объект array в состояние save. Если хотите изменить количество сохраняемых элементов - предварительно измените параметр len.<br />
<br />
=== Копирование объекта ===<br />
<br />
При копировании, необходимо заменить в состояниях load и save array.имя_параметра на другое имя. Например, array2.имя_параметра. Копировать следует через использование доп. сцены (см. выше)<br />
<br />
=== Достоинства ===<br />
<br />
Позволяет избежать необходимости каждый раз создавать большое количество if-ов и set-ов, если необходимо работать с нумерованным списком. Можно один раз создать структуру и копировать её неограниченное количество раз<br />
<br />
=== Недостатки ===<br />
<br />
Данный объект содержит довольно большое количество кода, поэтому при большом их обилии/длине может занизить скорость работы сцены и скорость загрузки сцены.<br />
<br />
=== Исходный XML код===<br />
Прим. id="369" - идентификатор объекта Options, сохраняющего все переменные приложения. id="7845" - идентификатор объекта<br />
<br />
<pre><br />
<obj id="7845" type="machine" nm="array" sync="1" w="1" h="1"><br />
<st id="init"/><br />
<st id="get"><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="7845" par="val" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="val" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="val" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="val" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="val" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="val" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="val" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="val" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="val" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="val" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="val" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="val" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="val" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="val" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="val" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="val" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="val" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="val" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="val" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="val" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="set"><br />
<var nm="val" obj="7845" par="val"/><br />
<set obj="7845" par="a1" val="(val)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(val)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(val)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(val)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(val)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(val)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(val)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(val)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(val)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(val)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(val)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(val)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(val)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(val)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(val)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(val)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(val)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(val)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(val)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(val)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="load"><br />
<var nm="a1" obj="369" par="array.a1" user="1"/><br />
<var nm="a2" obj="369" par="array.a2" user="1"/><br />
<var nm="a3" obj="369" par="array.a3" user="1"/><br />
<var nm="a4" obj="369" par="array.a4" user="1"/><br />
<var nm="a5" obj="369" par="array.a5" user="1"/><br />
<var nm="a6" obj="369" par="array.a6" user="1"/><br />
<var nm="a7" obj="369" par="array.a7" user="1"/><br />
<var nm="a8" obj="369" par="array.a8" user="1"/><br />
<var nm="a9" obj="369" par="array.a9" user="1"/><br />
<var nm="a10" obj="369" par="array.a10" user="1"/><br />
<var nm="a11" obj="369" par="array.a11" user="1"/><br />
<var nm="a12" obj="369" par="array.a12" user="1"/><br />
<var nm="a13" obj="369" par="array.a13" user="1"/><br />
<var nm="a14" obj="369" par="array.a14" user="1"/><br />
<var nm="a15" obj="369" par="array.a15" user="1"/><br />
<var nm="a16" obj="369" par="array.a16" user="1"/><br />
<var nm="a17" obj="369" par="array.a17" user="1"/><br />
<var nm="a18" obj="369" par="array.a18" user="1"/><br />
<var nm="a19" obj="369" par="array.a19" user="1"/><br />
<var nm="a20" obj="369" par="array.a20" user="1"/><br />
<set obj="7845" par="a1" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
<st id="save"><br />
<var nm="len" obj="7845" par="len"/><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="369" par="array.a1" val="(a1)" round="1" user="1" if="0"/><br />
<set obj="369" par="array.a2" val="(a2)" round="1" user="1" if="1"/><br />
<set obj="369" par="array.a3" val="(a3)" round="1" user="1" if="2"/><br />
<set obj="369" par="array.a4" val="(a4)" round="1" user="1" if="3"/><br />
<set obj="369" par="array.a5" val="(a5)" round="1" user="1" if="4"/><br />
<set obj="369" par="array.a6" val="(a6)" round="1" user="1" if="5"/><br />
<set obj="369" par="array.a7" val="(a7)" round="1" user="1" if="6"/><br />
<set obj="369" par="array.a8" val="(a8)" round="1" user="1" if="7"/><br />
<set obj="369" par="array.a9" val="(a9)" round="1" user="1" if="8"/><br />
<set obj="369" par="array.a10" val="(a10)" round="1" user="1" if="9"/><br />
<set obj="369" par="array.a11" val="(a11)" round="1" user="1" if="10"/><br />
<set obj="369" par="array.a12" val="(a12)" round="1" user="1" if="11"/><br />
<set obj="369" par="array.a13" val="(a13)" round="1" user="1" if="12"/><br />
<set obj="369" par="array.a14" val="(a14)" round="1" user="1" if="13"/><br />
<set obj="369" par="array.a15" val="(a15)" round="1" user="1" if="14"/><br />
<set obj="369" par="array.a16" val="(a16)" round="1" user="1" if="15"/><br />
<set obj="369" par="array.a17" val="(a17)" round="1" user="1" if="16"/><br />
<set obj="369" par="array.a18" val="(a18)" round="1" user="1" if="17"/><br />
<set obj="369" par="array.a19" val="(a19)" round="1" user="1" if="18"/><br />
<set obj="369" par="array.a20" val="(a20)" round="1" user="1" if="19"/><br />
<set obj="369" par="array.len" val="(len)" round="1" user="1"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
</obj><br />
</pre><br />
<br />
=== Машина состояний объекта ===<br />
[[Файл:array.jpg]]<br />
<br />
<br />
== Пример использования ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/machine.rar Download]<br />
<br />
== Clone ==<br />
Clone - параметр команды init в разделе "системные действия".<br />
<br />
[[Файл:Clone1.PNG]]<br />
<br />
<br />
Значение 1 означает, что в текущем местоположении машины будет создана ее копия.<br />
<br />
[[Файл:Clone2.PNG]]<br />
<br />
=== Свойства ===<br />
<br />
1) Клонированная машина состояний имеет все свойства, состояния и параметры исходного объекта клонирования.<br />
<br />
2) Клоны рождаются и умирают в рамках одного экрана.<br />
<br />
3) Клоны отличаются друг от друга лишь параметром '''clone_num''', который у оригинала равен "-1", а у клонов от 0 до N.<br />
<br />
4) Нежелательно применять клонирование к клону во избежание путаницы значений параметра '''clone_num'''.<br />
<br />
5) Если при проверке условия [[#if|if]] в поле '''obj''' указать this, это значит что if будет проводить проверку текущего объекта. Таким образом машина может сама себя проверить по параметру '''clone_num''' клон ли она и если да то какой у нее номер;<br />
<br />
=== Пример использования ===<br />
<br />
По ссылке пример использования с подробным описанием машин.<br />
<br />
[http://fs5.absolutist.com/files/wikisample/Clone.zip Download]<br />
<br />
== Параметр команды машины состояний ==<br />
<br />
В случае, когда необходимо изменить значение какого-либо параметра в командах машины состояний (например v в команде move) в процессе работы приложения, можно использовать блок "Параметр команды машины состояний" в команде ''set'' машины состояний. Приведу пример использования этого блока.<br />
<br />
Пусть есть 2 машины: управляющая и управляемая.<br />
<br />
[[Файл:Stm1.jpg|300px]][[Файл:Stm2.jpg|300px]]<br />
<br />
Управляемая машина практически пустая и не содержит каких либо данных о движении, но тем не менее при запуске она будет двигаться, меняя направление. Это движение - заслуга управляющей машины, которая на ходу изменяет параметры движения управляемой. Рассмотрим более детально ее состояния.<br />
<br />
В первом состоянии "wait" мы пытаемся изменить скорость движения управляемой машины. Для этого указали объект (sun), состояние в котором хотим поменять параметр (у машины sun это состояние move), имя команды в которой меняем параметр (в данном случае это move), номер команды (если таких команд несколько, то нужно указать порядковый номер начиная с 0; в нашем случае команда одна), имя параметра (мы хотим изменить скорость, поэтому имя параметра v) и значение (указали значение 200). После этого переходим в следующее состояние.<br />
<br />
В состоянии "1" управляющей машины сначала мы вывели объект sun из состояния move, изменили параметр целевой координаты x на 512 и затем вернули в состояние move, чтобы применить изменения параметров. Таким образом управляемая машина начала движение в x=512 со скоростью 200. Через 2 секунды мы переводим управляющую машину в состояние "2", где аналогичным образом изменяется целевая координата на -512.<br />
<br />
Такой способ задания параметров может найти применение в случае, когда параметры нужно задавать переменными.<br />
<br />
[[Category:Main objects]]</div>Nbeznosovhttps://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&diff=3797Книга жалоб и пожеланий2013-04-26T07:13:09Z<p>Nbeznosov: /* Улучшение интерфейса */</p>
<hr />
<div>Внимание !!<br />
* Перед публикацией внимательно читать ВСЕ!<br />
* Делаем при обсуждении отступы (двоеточие) и подписываемся (4 тильды).<br />
<br />
== Улучшение интерфейса ==<br />
<br />
* Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)<br />
* Поворачивать, масштабировать объекты прямо на сцене (как в любом граф.редакторе) [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)<br />
* Добавить горячие клавиши в состоянии машин. В выбранном состоянии машины, например если нажать "w" создается ф-я wait, "i"=if,<br> "m" = move, "s" = set ну и так далее. --[[Участник:Igood|Igood]] 16:10, 24 января 2013 (CET)<br />
:: С какой клавишей использовать CTRL +S сохранение + давайте уже весь список хоткеев. Проще разнести и реализовать.\<br />
<br />
* Возможность копирования ф-й(set,wait...) из одного состояния машины в другую.--[[Участник:Igood|Igood]] 16:12, 24 января 2013 (CET)<br />
:: В чем отличие от "Возможность копирования состояний из машины в машину.--[[Участник:Oilich|Oilich]] 13:36, 24 января 2013 (CET)"<br />
::: В том что это не состояния а отдельные функции в состоянии.--[[Участник:Igood|Igood]] 08:53, 25 января 2013 (CET)<br />
:::: я поддерживаю. мелочь, а приятно. [[Участник:Steps|Steps]] 12:13, 25 января 2013 (CET)<br />
<br />
* Добавить событие кнопке, изм. состояния объекта если на нее нажали в состоянии disable.--[[Участник:Igood|Igood]] 16:18, 24 января 2013 (CET)<br />
<br />
:: С точки зрения кнопки - Она "Кнопка" имеет два состояния, в состоянии disable кнопка не должна вообще воспринимать кликов. Но если всех это не запутает и нужно для космического корабля то ОК--[[Участник:Boyarin|Boyarin]] 21:45, 24 января 2013 (CET)<br />
:: Стоит обсудить. Действительно, не очень логично считать дизейбл рабочим состоянием. [[Участник:Steps|Steps]] 12:16, 25 января 2013 (CET)<br />
<br />
* Добавить возможность открывать несколько машин состояний одновременно. Сделать так, чтоб их можно было сворачивать.--[[Участник:Fhod|Fhod]] 17:00, 25 января 2013 (CET)<br />
<br />
<br />
* По логике в списке сначала должен идти параметр, а потом его значение.--[[Участник:Avereskun|Avereskun]] 10:06, 25 января 2013 (CET)<br />
<br />
[[Файл:Editor123.jpg]]<br />
<br />
* В редакторе сцен, если закрыл окно с параметрами или деревом объектов, то его можно вернуть только переоткрыв редактор. Необходимо добавить управление отображением этих окон из меню. --[[Участник:Shejko|Shejko]] 09:22, 29 января 2013 (CET) <br />
: Ну не совсем так. Правой кнопкой на панели и галкой можно включить область с деревом и проперти - Но понятно что требует в настройки вынести --[[Участник:Boyarin|Boyarin]] 21:29, 30 января 2013 (CET)<br />
<br />
* Добавить возможность одновременно синхронизировать и снимать синхронизацию с группы объектов.--[[Участник:Odyadina|Odyadina]] 13:54, 29 января 2013 (CET)<br />
: Согласен + можно подумать и про др груп изменения--[[Участник:Boyarin|Boyarin]] 21:29, 30 января 2013 (CET)<br />
<br />
* Добавить синхронизацию (да-нет) свойств сцены --[[Участник:Odyadina|Odyadina]] 10:59, 30 января 2013 (CET)<br />
: согласен--[[Участник:Boyarin|Boyarin]] 21:29, 30 января 2013 (CET)<br />
<br />
* Добавить возможность хранить проекты на разных дисках, не привязываясь к местонахождению редактора.<br />
Нужно с этим что-то делать:<br />
[[Файл:Файл_проекта.JPG|200px|thumb|left|описание]]<br />
<br clear="all" /><br />
--[[Участник:Dorl|Dorl]] 09:02, 31 января 2013 (CET)<br />
<br />
* Возможность добавлять графические объекты с применением к ним свойств объектов, которые уже заданы аниматором, а именно параметры кнопок, чекбоксов, НО НЕ КООРДИНАТЫ. Чтобы работало по типу пипетки--[[Участник:Lsokol|Lsokol]] 13:17, 6 февраля 2013 (CET). <br />
<br />
Потому как часто возникает вопрос коррекции сцены с перемещением (также увеличением-уменьшением, вращением, заменой цвета и т.д.), например, тех же кнопок для улучшения общего вида сцены--[[Участник:Lsokol|Lsokol]] 13:17, 6 февраля 2013 (CET). <br />
<br />
Во-первых - облегчит работу аниматору (не нужно будет искать новое расположение исправленного объекта), во-вторых - объект будет обладать уже заданными параметрами, в-третьих - расположение изображения будет соответствовать тому, как задумал графический дизайнер--[[Участник:Lsokol|Lsokol]] 13:17, 6 февраля 2013 (CET).<br />
<br />
<br />
* Добавить кнопку "снять все выделения" и "выделить всё" в окно управления предзагрузкой на кнопках.<br />
<br />
[[Файл:Wind preload button.jpg|150px|thumb|left|окно в которое добавить кнопки]]<br />
<br />
<br clear="all" /><br />
--[[Участник:Shejko|Shejko]] 14:40, 13 февраля 2013 (CET)<br />
<br />
* После добавления дополнительных возможностей объекта не перемещать в начало списка параметров. Я добавляю возможность в объект в конец списка его параметров, скажем в пазл, после добавления параметра меня автоматически бросает вверх списка и чтобы поменять параметры приходится снова опускаться к добавленному параметру.<br />
<br />
--[[Участник:Shejko|Shejko]] 09:38, 14 февраля 2013 (CET)<br />
<br />
* Добавить кнопку "развернуть всё" в списке параметров объектов.<br />
--[[Участник:Shejko|Shejko]] 09:38, 14 февраля 2013 (CET)<br />
<br />
* Также в добавляемых возможностях объекта, таких как "изменить графический id", где всего 3 параметра и в любом случае для работы этого параметра необходимо заполнить все 3 поля, при добавлении возможности лучше было бы если все 3 параметра добавляются автоматически и если один из них не задал - не убирать поле после переоткрытия проекта - его всё равно придётся добавлять.<br />
--[[Участник:Shejko|Shejko]] 09:38, 14 февраля 2013 (CET)<br />
<br />
*Добавить для редактора текстовых ресурсов, как в редакторе ресурсов, пункт меню View с подпунктом Always on Top.Было очень актуально при работе с хиддн объектами.<br />
--[[Участник:lkunica|lkunica]] 16:40, 6 марта 2013 (CET)<br />
<br />
*Возможность поменять графический ресурс не перетаскивая его. Для этого программист редактора в поле "res" прописывает имя изображения. При этом, редактор производит поиск и подставляет первое изображение, соответствующее данному имени. Если не находит - выдаёт ошибку.<br />
--[[Участник:Atonkonog|Atonkonog]] 15:40, 18 марта 2013 (CET)<br />
** а если имен изображений несколько, что тогда? какой брать? При перетаскивании привязываем по id а не по имени. --[[Участник:Boyarin|Boyarin]] 07:29, 20 марта 2013 (CET) <br />
<br />
*Возможность поменять текст не перетаскивая его. Для этого программист редактора в поле "" прописывает имя изображения. При этом, редактор производит поиск и подставляет первую строку, соответствующую данному имени. Если не находит - выдаёт ошибку.<br />
--[[Участник:Atonkonog|Atonkonog]] 15:40, 18 марта 2013 (CET)<br />
** а если имен текстовых объектов несколько, что тогда? ну дальше понятно .... --[[Участник:Boyarin|Boyarin]] 07:29, 20 марта 2013 (CET) <br />
<br />
*Добавить возможность быстро устанавливать следующий/предыдущий текст и графический ресурс в граф. базе ресурсов. Довольно часто бывает, что нужно, например, добавить кучу инвентарных объектов, идентификаторы которых идут последовательно один за другим<br />
--[[Участник:Atonkonog|Atonkonog]] 16:46, 18 марта 2013 (CET)<br />
<br />
*При копировании машин состояний:<br />
1. Копировать ссылку на самого себя (уже писал, повторяюсь)<br />
2. Если есть вложенные объекты, в новом объекте ссылки должны ссылаться на его подобъекты. Если у объектов есть подобъекты - принцип тоже должен действовать<br />
--[[Участник:Atonkonog|Atonkonog]] 16:46, 18 марта 2013 (CET)<br />
<br />
*Добавить множественное копирование<br />
Добавить возможность копировать объект несколько раз, при этом, предусмотреть инкрементированную замену параметров объекта(переменные локальные и глобальные, идентификаторы объектов, ресурсов, текстов)<br />
--[[Участник:Atonkonog|Atonkonog]] 16:46, 18 марта 2013 (CET)<br />
<br />
*Добавить возможность во viewer'e менять любой параметр и состояние любого объекта(простенький дебаг)--[[Участник:Atonkonog|Atonkonog]] 14:45, 26 марта 2013 (CET)<br />
<br />
*Добавить возможность предосмотра текста в объекте текст. Чтобы любое форматирование сразу отображалось. Надоело после каждой правки текста пересохранять весь проект, чтобы увидеть результат.--[[Участник:Amohov|Summer Cat]] 10:51, 1 апреля 2013 (CEST)<br />
<br />
*Добавить возможность менять тип объекта у группы объектов. Например на сцене есть 50 объектов и все они должны быть хидденобъектами. В текущей реализации надо у каждого объекта отдельно менять тип. --[[Участник:Shejko|Shejko]] 08:51, 3 апреля 2013 (CEST)<br />
<br />
*Добавить горячие клавиши для вызова редактора ресурсов и редактора текстов.--[[Участник:Amohov|Summer Cat]] 16:48, 11 апреля 2013 (CEST)<br />
<br />
*Сделать так, чтобы при наведении на объект выбранный в поле '''obj''', в пояснении отображался ''ID'' объекта. Такая возможность позволит избежать ошибок в случаях: <br />
:а) когда вдруг существуют два объекта с одинаковым именем; <br />
:б) когда в поле отображается ''нет'', в этом случае возможны три варианта: объект не выбран, объект с таким ID удален, объект находится на другом экране.--[[Участник:Odyadina|Odyadina]] 12:19, 18 апреля 2013 (CEST)<br />
<br />
*Вынести кнопку "Delete temp data" на панель где кнопки запуска вьювера,базы ресурсов и т.д.--[[Участник:Nbeznosov|Nbeznosov]] 09:13, 26 апреля 2013 (CEST)<br />
<br />
== Новые объекты и свойства==<br />
<br />
* Добавить сплайн (кривая линия), который можно рисовать на сцене и передавать команде move [[Участник:Steps|Steps]] 14:11, 24 января 2013 (CET)<br />
- запланировано--[[Участник:Boyarin|Boyarin]] 20:10, 3 марта 2013 (CET)<br />
* Добавить в редактор генератор комиксов. Хорошим и простым примером является [http://1001mem.ru/create_comics генератор комиков] Это пожелания на будущее. --[[Участник:Dorl|Dorl]] 10:35, 25 января 2013 (CET)<br />
- все равно не понял --[[Участник:Boyarin|Boyarin]] 20:10, 3 марта 2013 (CET)<br />
* Машина состояний. Добавить в команду '''drag''' распознавания в какую сторону происходит движение (вправо, влево, вниз, вверх) при этом давать возможность менять графический ресурс в зависимости от направления. --[[Участник:Dorl|Dorl]] 16:48, 25 января 2013 (CET)<br />
[[Файл:[[Файл:Drag.JPG|200px|thumb|left|]]<br />
[[Файл:Drag_fish.JPG|200px|thumb|left|]]<br />
<br clear="all" /><br />
* Добавить гибкость работы со шрифтами. Как минимум должна быть: ''возможность наклона'', '''возможность полужирного начертания.''' --[[Участник:Dorl|Dorl]] 09:08, 31 января 2013 (CET)<br />
- покурим, но пока все упирается в лишнюю память<br />
*Когда запущен редактор ресурсов и был свёрнут, то при попытке его запустить снова с панели хорошо бы разворачивать, а не ругаться что он уже запущен.--[[Участник:Amohov|Summer Cat]] 11:00, 20 февраля 2013 (CET)<br />
- согласен--[[Участник:Boyarin|Boyarin]] 20:10, 3 марта 2013 (CET)<br />
*Будет очень удобно если вызывать меню методов двойным кликом по этой области, а не по кнопке. Экономит немного времени на разработку проекта.--[[Участник:Amohov|Summer Cat]] 11:11, 20 февраля 2013 (CET)<br />
[[Файл:New addons.PNG|200px|thumb|left|]]<br clear="all" /><br />
*Добавить возможность вызвать редактор ресурсов, когда работаешь с свойствами машины.--[[Участник:Amohov|Summer Cat]] 11:16, 20 февраля 2013 (CET)<br />
- ок --[[Участник:Boyarin|Boyarin]] 20:10, 3 марта 2013 (CET)<br />
*Выделить несколько объектов и изменить например на машины сразу несколько одним кликом.--[[Участник:Amohov|Summer Cat]] 11:19, 20 февраля 2013 (CET)<br />
- ок --[[Участник:Boyarin|Boyarin]] 20:10, 3 марта 2013 (CET)<br />
*Когда сильно увеличен экран проекта и мы видим только часть его, хорошо бы на колесо мышки назначить руку для передвижение по экрану, а не пользоваться полосами прокрутки. Это сильно ускорит навигацию по рабочей области а вследствие и разработку.--[[Участник:Amohov|Summer Cat]] 11:24, 20 февраля 2013 (CET)<br />
*Стрелками клавиатуры поточнее подгонять объекты на нужное место.--[[Участник:Amohov|Summer Cat]] 11:26, 20 февраля 2013 (CET)<br />
*Хорошо бы добавить offline версию справки с возможностью обновления при наличии интернет подключения --[[Участник:Amohov|Summer Cat]] 07:34, 21 февраля 2013 (CET)<br />
- пока не планировал, очень быстро меняем и дополняем существующую<br />
<br />
*Сделать объект HiddenHint универсальным, щас хины 2го и 4го типа работаю только если их графика находиться на сцене с поисковыми объектами за счет этого в Travel`е в каждой сцене своя кнопка запуска хинта и индивидуальный HiddenHint, по-этому интерфейс сделан запутано. Хотелось бы один HiddenHint который отвечает за все хинты во всей игре!--[[Участник:Igood|Igood]] 08:56, 6 марта 2013 (CET)<br />
<br />
*Добавить понятие Шаблон объекта. Довольно часто мы создаём повторяющиеся структуры. Ярчайший тому пример - объект Tool(http://ge.absolutist.com/index.php/Tool), разработаный Олей. Позже, он был сделан программистами. Суть предложения:<br />
<br />
1. Программист редактора создаёт объект(машину состояний), прописывает все необходимые действия с другими объектами<br />
<br />
2. Меняет тип объекту на шаблон<br />
<br />
3. Меняет все необходимые объекты(а также, возможно и параметры используемых объектов) на переменные. (У переменной планируется 2 поля - имя в панели редактора и идентификатор). Прописывает переменным (по желанию) значения по умолчанию. Также предлагаю ввести переменную "this", которая будет обозначать обращение к самому себе.<br />
<br />
4.Переменные могут быть следующих типов:<br />
*Объект - ссылка на объект<br />
*Строка - как правило, это состояние объекта или свойство<br />
*Число - переменная численного типа.<br />
<br />
5. Создаёт новый объект, устанавливает ему тип заранее созданного шаблона. (предлагаю ввести вкладку шаблоны на равне с Global Mechanics, Global Score, Options, Social)<br />
<br />
6. Прописывает все необходимые переменные в панели объекта<br />
<br />
--[[Участник:Atonkonog|Atonkonog]] 11:34, 12 марта 2013 (CET)<br />
<br />
*При копировании объекта, подменять ссылку на самого себя. Т. е. новый объект везде должен ссылаться на себя, а не на старый объект.<br />
<br />
--[[Участник:Atonkonog|Atonkonog]] 11:34, 12 марта 2013 (CET)<br />
<br />
* Добавить полигон. Позволит получать объекты (картинки, машины и т.д.) произвольной формы, используя тайлинг и полигон. --[[Участник:Odyadina|Odyadina]] 11:58, 22 марта 2013 (CET)<br />
<br />
*Добавить cos, sin, tan, abs, sqrt, sqr - для облегчение вычисления параметров по формулам.--[[Участник:Amohov|Summer Cat]] 08:58, 16 апреля 2013 (CEST)<br />
<br />
== Баги ==<br />
<br />
* В машине, которая загружается одновременно с загрузкой экрана, если звук (snd) стоит в первом состоянии, то он либо воспроизводится до загрузки экрана (и то не до конца или не сначала) или не воспроизводится вообще. Сейчас это обходится дополнительным предварительным состоянием с вэйтом на 400ms (не меньше!).<br />
[[Файл:Sndinit.jpg]]<br />
<br />
<br />
<br clear="all" /><br />
<br />
Баг это или не баг - считать вам. Но эта проблема отняла у меня уйму времени.<br />
Если у объекта свойство vis=0, то когда ему set-ом меняем состояние, никакие действия не выполняются и никаких предупреждений не выдаётся.<br />
<br />
Выходов из данной ситуации вижу 2:<br />
<br />
1. Обрабатывать переходы в новое состояние в невидимом объекте.<br />
<br />
2. Выдавать Warning в системной строке приложения и делать соответственную запись в лог-файл.<br />
<br />
* Добавить ползунок, для того, чтобы можно было видеть название объектов в дереве сцены. <br />
[[Файл:Дерево.JPG]]<br />
<br clear="all" /><br />
<br />
судя по описанию - писал Андрей--[[Участник:Boyarin|Boyarin]] 20:04, 3 марта 2013 (CET)<br />
<br />
*При форматировании текста в горизонтальном форматировании в подсказке есть что текст можно установить по центру, по правому краю, а вот что по левому можно я догадался только интуитивно. Прошу дополнить всплывающую подсказку.<br />
[[Файл:Text h align.jpg]]<br />
<br clear="all" /><br />
--[[Участник:Amohov|Summer Cat]] 10:13, 14 марта 2013 (CET)<br />
<br />
== Реализовано ==<br />
* Редактор ресурсов. При загрузке картинок в редактор ресурсов, хотелось бы иметь возможность видеть превью картинок.<br />
[[Файл:Редактор ресурсов.JPG|120px]]<br />
[[Файл:Предпросмотр.JPG|120px|]]<br />
<br />
* Переместив картинку из редактора ресурсов на сцену, в свойствах она имеет по умолчанию тип '''image'''. Меняя тип '''image''' на '''machine''' иконка в дереве остается по-прежнему '''image''' до первого клика. Необходимо сделать мгновенную смену иконки в дереве. <br clear="all" /><br />
<br><br />
[[Файл:Машина.JPG ]]<br />
<br />
* В редакторе ресурсов у левой половинки (в которой дерево папок) нет возможности регулировать ширину --[[Участник:Podkor|Podkor]] 16:53, 25 января 2013 (CET)<br />
[[Файл:ArtSource.jpg|300px]]<br />
<br />
* При вызове состояний в viewer нет возможности просмотреть все состояния если они не помещаются в экран. Здорово было бы иметь возможность прокручивать список<br />
[[Файл:State.jpg|200px]] <br />
--[[Участник:Podkor|Podkor]] 13:42, 19 февраля 2013 (CET)<br />
<br>''Зачем нам так много просматривать не нужных машин? Лучше сделать Debug систему где мы выберем только те машины которые хотим отследить. Желательно отслеживать состояния машин, различные параметры + было бы не плохо ставить break например когда объект перейдет в какое то состояние ставить движок на паузу!''--[[Участник:Igood|Igood]] 09:05, 20 февраля 2013 (CET)</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Flyer&diff=3785Flyer2013-04-24T06:49:26Z<p>Nbeznosov: /* Цикл жизни */</p>
<hr />
<div>[[Файл:flyers_prop.png|right]]<br />
Флаеры (flyers) - летающие картинки, при помощи которых можно реализовывать различные эффекты - типа взрывов, падающих снежинок, струй фонтана и т.п.<br />
Внешний вид<br />
<br />
Для изображения флаеров служат картинки из раздела "внешний вид" (не более пяти). При рождении каждого флаера, случайным образом будет выбираться одна из этих картинок.<br />
<br />
== Модификаторы ==<br />
Модификаторы становятся активными если установлен флаг «использовать модификаторы», в противном случае установленные параметры игнорируются.<br />
*'''alpha''' - изменяет прозрачность используемого ресурса<br />
*'''angle''' - изменяет угол наклона используемого ресурса<br />
*'''scaleX/scaleY''' – изменяют масштаб используемого ресурса, но при этом изменяет и положение точки рождения флаера, что делает использование данного модификатора крайне неудобным<br />
<br />
== Состояния ==<br />
*'''beg''' – состояние в котором флаер начинает свой цикл жизни (включается)<br />
*'''end''' – состояние которое выключает флаер<br />
<br />
== Область рождения ==<br />
<br />
*'''только контур'''- если включен флаг, по контуру, фигуры (круг или прямоугольник)<br />
*'''радиус r'''-внутри круга радиуса r; <br />
*'''горизонтальная rx''' - внутри прямоугольника с шириной 2rx<br />
*'''вертикальная ry''' - внутри прямоугольника с высотой 2ry<br />
* из одной точки, если все параметры области рождения равны нулю: r=rx=ry=0;<br />
Центр области рождения задается стандартными для всех объектов координатами x,y из раздела "положение". Круг имеет приоритет над прямоугольником (если r не равно 0, то, не зависимо от значений rx или ry, рождение будет происходить внутри круга):<br />
<center><br />
[[Файл:flyers_born.png]]<br />
</center><br />
<br />
== Начальная скорость ==<br />
<br />
<br />
*'''минимальная''' - минимальная скорость при рождении летуна в px/сек.<br />
*'''максимальная''' - максимальная скорость при рождении летуна в px/сек.<br />
*'''от угла''' - начальный угол сектора для направления скоростей<br />
*'''до угла''' - конечный угол сектора для направления скоростей<br />
*'''угловая''' - угловая скорость вращения одного летуна в градуса/сек.<br />
<br />
При рождении каждый флаер имеет определенную скорость, величина (по модулю) которой выбирается случайным образом из диапазона от v1 до v2. Скорость измеряется в пикселях за секунду. Типичные значения, обычно, не превышают 100.<br />
<br />
По умолчанию вектор скорости направлен изотропно (равновероятно во всех направлениях). В разделе "начальная скорость" можно определить сегмент круга, внутри которого будет направлена начальная скорость флаера. Углы отсчитываются от оси x вниз (положительные углы) или вверх (отрицательные углы) и измеряется в градусах. Например, если a1=45, a2=135, то флаеры будут вылетать вниз веером в 90 градусов.<br />
<center><br />
[[Файл:flyers_vel.png]]<br />
</center><br />
<br />
Кроме линейной скорости можно задавать угловую скорость вращения - w, в градусах в секунду. Тогда при движении флаеры будут вращаться. Впрочем, увлекаться этим эффектом не стоит, так как это дополнительная нагрузка на ресурсы.<br />
<br />
== Цикл жизни ==<br />
<br />
:'''на экране''' - максимально количество летунов которые видны на экране<br />
:'''всего''' - общее число созданных летунов<br />
*'''время'''' каждый флаер рождается, живет и умирает. Соответственно, можно задать три параметра (tmBorn, tmLife, tmDie) в ms.<br />
:'''интенсивность''' - интенсивность рождения одного флаера в милисикундах.<br />
:'''рождения''' - за период рождения tmBorn прозрачность флаера увеличивается от нуля до заданной в общих настройках. <br />
:'''время жизни''' tmLife может быть отрицательным. В этом случае флаер живет, пока живет его группа (т.е. у него бесконечное время жизни). Если tmLife положительно, то после истечения времени tmLife флаер умирает в течении времени смерти tmDie. <br />
:'''время смерти''' - за это время он меняет свою прозрачность, от установленной в общих параметрах до указанной<br />
:''' до прозрачности''' - прозрачность в конце периода умирания<br />
<br />
Когда флаер окончательно исчезает, вместо него в области рождения может появиться новый флаер. Это происходит, если число летающих к данному моменту флаеров не превышает параметра num (цикл жизни:на экране). Кроме этого, в процессе жизни группы флаеров подсчитывается общее число родившихся флаеров. Если их количество превышает параметр tot (цикл жизни:всего), то рождений больше не происходит. Если tot меньше 0, то подобное ограничение игнорируется.<br />
<br />
Если параметры num и tot допускают рождение новых флаеров, то происходит это с интенсивностью, определяемой временем в миллисекундах на рождение одного флайера nms. Например, если число видимых флаеров равно num=100, а nms=10, то все 100 флаеров покажутся на экране через 1000 ms (одну секунду). Если при этом поставить время жизни tmLife=0, tmDie=1000, то получится файербол. Вообще, чтобы не было пульсаций при порождении флаеров, для интенсивности необходимо пользоваться формулой "общее время на количество":<br />
<pre><br />
nms = (tmBorn+tmLife+tmDie)/ num<br />
</pre><br />
Пульсации могут, тем не менее, происходить, даже при выполнении этой формулы, если параметр nms оказывается существенно меньше времени одного фрейма (вызова таймера). Поэтому надо стремиться к тому, чтобы nms был больше реального периода таймера. Впрочем, при помощи праметра "ограничение" (max) можно задавать максимальное число флаеров, которые могут рождаться в ms (тогда при большом тике таймера больше, чем разрешено не родиться).<br />
<br />
== Действующие силы ==<br />
<br />
На каждый флаер может действовать одна из следующих сил:<br />
*'''горизонтальная''' - постоянная горизонтальная сила fx, подобная силе ветра<br />
*'''вертикальная ''' - постоянная вертикальная сила fy. Если она положительна, то это оказывает эффект силы тяжести (ось y направлена вниз!)<br />
*'''радиальная''' - постоянная радиальная сила fr. Она направлена к центру группы с координатами (x,y) и не зависит от расстояния до этого центра. Если fr положительна, то это сила отталкивания, если отрицательна - притяжения<br />
*'''конфайнмента''' - радиальная сила конфайнмента fc. Аналогична fr, но её величина линейно растёт с увеличением расстояния от центра.<br />
*'''к линии''' - сила притяжения к вертикальной линии, проходящей через координаты центра рождения флаеров (из общих параметров).<br />
*'''случайная''' амплитуда стохастического (случайного) воздействия fs. При каждом перемещении к компонентам скорости добавляется случайная велична в диапазоне от -fs до fs. Например, снежинки неплохо моделируются с fy=fs=2<br />
*'''трения''' сила трения ff, уменьшающая скорость объектов. Измеряется в процентах уменьшения скорости за секунду: 0 - нет трения, 100 - за секунду остановится.<br />
В результате воздействия сил, и при неконтролируемом подвисании компьютера (таймер получает большой интервал времени), возможно резкое увеличение скорости флаеров. Для контроля этих эффектов служит раздел "ограничения" по скорости (vMax, px/сек) и величине смещения по экрану (dMax, px)<br />
<br />
== Звуки ==<br />
<br />
*'''звук''' — звук, который будет запущен при переходе флаера в состояние beg<br />
*'''зациклить''' — если установлен этот флаг, то звук будет зациклен<br />
<br />
== Советы ==<br />
<br />
Для настройки флаеров необходимо контролировать множество параметров. Необходимо четко понимать смысл этих параметров и их возможное влияние на результат. Возможно, помогут следующие советы:<br />
* Сначала надо определиться с базовыми параметрами - область рождения, величина и угол начальных скоростей.<br />
* Затем определить направление и характер сил.<br />
* Не стоит менять за один раз больше 2-х параметров<br />
* На начальном этапе параметры необходимо менять решительно - в 2, в 10 раз и т.п.<br />
* Необходимо экспериментировать с комбинацией цветов и размером флаеров.<br />
* Запоминайте промежуточные, более или менее удачные, наборы параметров, чтобы к ним вернуться, если все "разрегулировалось".<br />
* Если получился прикольный, но не нужный эффект - стоит запомнить его параметры, потом пригодится.<br />
<br />
== Производительность ==<br />
<br />
Флаеры сильно грузят быстродействие машины. Поэтому необходим самоконтроль по необходимости их использования и контроль длительности кадра (с проверкой его на реальных устройствах). Ниже идет ряд советов:<br />
* Если можне нужный эффект реализовать кадрами анимации - часто, лучше анимация, чем флаеры.<br />
* Стремиться реализовать нужный эффект с минимумом флаеров<br />
* Искать баланс соотношения размера картинки и количества флаеров. Большие картинки (даже, если их и не много) - долго рисуются. Большое число маленьких картинок - также плохо, т.к. много рисурсов уходит на обсчет их физики.<br />
* Не увлекаться без нужды вращением частицы - это требует дополнительных вычислений матрицы поворота.<br />
* Сила конфйнмента (зависящая от расстояния) не содержит корня и чуть быстрее радиальной силы.<br />
* Помнить, что хороший эффект может, в силу производительности, совсем не так хорошо выглядить на мобильном устройстве.<br />
<br />
== Примечания ==<br />
<br />
Флаеры не предпологают, что у них могут быть подобъекты.<br />
Если флаер подобъект машины состояний, то при её движении будет двигаться и центр эмиссии (область рождения флаеров), в результате чего возникает "шлейф"<br />
Флаеры не учитывают прозрачности родительского объекта или сцены, считая её единичной.<br />
<br />
== Примеры ==<br />
<br />
===Фонтан===<br />
<br />
[[Файл:Fontan1.JPG|200px]][[Файл:Fontan2.JPG]]<br />
<br />
===Рыбки ===<br />
<br />
[[Файл:Ribki1.JPG|200px]][[Файл:Ribki2.JPG]]<br />
<br />
===Дождь ===<br />
<br />
[[Файл:Dojd1.JPG|200px]][[Файл:Dojd2.JPG]]<br />
<br />
===Снег ===<br />
<br />
[[Файл:Sneg1.JPG|200px]][[Файл:Sneg2.JPG]]<br />
<br />
===Фейерверк ===<br />
<br />
[[Файл:Feyerverk1.JPG|200px]][[Файл:Feyerverk2.JPG]]<br />
<br />
===Звезды ===<br />
<br />
[[Файл:Zvezdi1.JPG|200px]][[Файл:Zvezdi2.JPG]]<br />
<br />
===Файербол ===<br />
<br />
[[Файл:Fireball1.JPG|200px]][[Файл:Fireball2.JPG]]<br />
<br />
===Взрыв ===<br />
<br />
[[Файл:Vzriv1.JPG|200px]][[Файл:Vzriv2.JPG]]<br />
<br />
===Дым ===<br />
<br />
[[Файл:Dim1.JPG|200px]][[Файл:Dim2.JPG]]<br />
<br />
===Свеча ===<br />
<br />
[[Файл:Svecha1.JPG|200px]][[Файл:Svecha2.JPG]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Inventory&diff=3752Inventory2013-04-17T06:50:22Z<p>Nbeznosov: /* Инвентарь на нескольких игровых экранах */</p>
<hr />
<div>'''Инвентарь''' необходим для «собирания» игровых объектов с последующим их использованием. Инвентарь незаменим, если объекты находящиеся в одном экране должны быть использованы в другом экране.<br />
<br />
== Параметры==<br />
<br />
'''Картинка''' - ресурс для отображения инвентаря (тогда таблица помещается сверху инвентаря), может отсутствовать, если таблица имеет свой ресурс. Удобнее делать инвентарь безресурсным.<br />
<br />
'''Сцена извлечения''' - можно указать конкретную сцену, на которую будет извлекаться инвентарь, не обязательно.<br />
<br />
'''Объект''' — если для инвентаря один объект, то его можно указать в этом поле, но чаще всего объектов несколько (в этом случае оставляем поле пустым).<br />
<br />
'''Сохранять извлеченный''' - принимает два значения: 0 - после извлечения из таблицы, при смене экрана или сворачивании, объект теряется; 1 - после извлечения из таблицы, при смене экрана или сворачивании, объект возвращается в таблицу. <br />
<br />
'''Скорость'''<br />
<br />
*'''полёта''' — скорость полёта объекта перемещаемого в инвентарь к таблице инвентаря.<br />
<br />
*'''вращения''' — скорость вращения объекта во время полёта в инвентарь.<br />
<br />
'''Таблица''' — таблица, в которой будут находиться объекты перемещенные в инвентарь. Если количество ячеек в таблице будет меньше,чем количество добавляемых объектов, то добавляемый объект при смене сцены потеряется.<br />
<br />
''' Таблица для инвентаря '''<br />
<br />
Может быть вертикальной, горизонтальной, или иметь несколько ячеек в ширину и несколько в высоту.<br />
Если у таблицы несколько строк и столбцов, то объекты заполняют столбцы, то есть объекты сначала заполнят первый столбец, потом начнут заполнять второй столбец, потом третий и т. д..<br />
Объект при переводе инвентаря в состояние add или return летят к правому нижнему углу таблицы.<br />
Если в таблице не хватает места, то объекты в таблицу не попадают, а остаются возле правого нижнего её угла.<br />
<br />
== Состояния ==<br />
<br />
'''add''' – добавить объект в инвентарь.<br />
<br />
'''extract''' — достать объект из инвентаря.<br />
<br />
'''return''' — вернуть объект в инвентарь.<br />
<br />
'''remove''' - удалить объект из инвентаря.<br />
<br />
Один объект не может быть добавлен (add) дважды. А извлекать (extract) и возвращать (return) объект в инвентарь можно n-раз. После того как объект "отработал", его необходимо удалить из инвентаря (remove), при удалении освобождается занимаемая им ячейка таблицы.<br />
<br />
Добавлять в инвентарь можно различные типы объектов, например, рисунок, машина, текст, а так же объекты, содержащие свои подобъекты.<br />
<br />
Инвентарь с таблицей располагаются на одной расшариной сцене, чтобы быть доступными на любом экране.<br />
<br />
Инвентарь и таблица должны иметь параметр Память = 1, чтобы при смене экрана запоминались объекты, содержащиеся в таблице.<br />
<br />
Объект, который добавляется в инвентарь, например, машина Obj1, должен находиться на отдельной сцене, у которой Пямять = 1 (чтобы сцена, которая изначально содержит Obj1, не инитилась больше, и объект не скакал от таблицы к сцене и обратно, т.к. это скакание заметно визуально при смене экранов). Лучше всего, если эта "родная" сцена с памятью содержала только объекты, которые будут добавляться в инвентарь.<br />
<br />
== Пример использования ==<br />
<br />
Рассмотрим для примера проект в котором можно применить объект инвентарь.<br />
<br />
Есть поросёнок, который ходит из одного края экрана в другой, и 3 объекта: молоток, шапка, ведро, которые разбросаны по экрану.<br />
По первому клику по каждому объекту они должны попасть в инвентарь -> по второму — достаться из инвентаря и начать тягаться. -> Когда объект попадает на поросёнка надо чтобы он появился у поросёнка -> клик на объект у поросёнка — объект снова попадает в инвентарь.<br />
<br />
=== Пример использования состояний инвентаря ===<br />
<br />
[[Файл:Invent example.jpg]]<br />
<br />
Состояние '''to''':<br />
<br />
'''set'''<br />
<br />
: '''obj''' — указан инвентарь в который добавляем объект.<br />
<br />
: '''par''' — параметр в который будем записывать id добавляемого объекта. Для инвентаря этот параметр называется '''obj'''.<br />
<br />
: '''val_obj''' – указан объект, id которого будет записано в параметр '''obj''' инвентаря.<br />
<br />
'''set'''<br />
<br />
: '''obj''' — объект который переводим в новое состояние, в данном случае будем добавлять объект указанный выше в инвентарь.<br />
<br />
: '''st''' — состояние в которое переводим инвентарь, в нашем случае добавляем объект в инвентарь, поэтому состояние '''add'''.<br />
<br />
<br />
<br />
Состояние '''out''' - всё аналогично состоянию '''to''', кроме второго set-а, которым достаём объект из инвентаря, с помощью перевода инвентаря в состояние '''extract'''. Аналогично прописываются перевод в состояния '''return''', '''remove'''.<br />
<br />
=== Обзор проекта ===<br />
<br />
Инвентарь вынесен в отдельный глобальный экран для того чтобы в дальнейшем была возможность использовать один и тот же инвентарь на разных экранах. Экран инвентаря расшарен(сделана ссылка) на основной экран, для того чтобы инвентарь отображался на экране основной сцены, но мог быть отредактирован из других сцен в будущем. Также организована маска для поросёнка, на которую будут "падать" ведро, молоток, шапка. Маска вынесена отдельно для избежания проблем с падением объекта на группу объектов. Маска двигается с такой же скоростью, как и поросёнок.<br />
<br />
[[Файл:Invent_dcr_pr.jpg]]<br />
<br />
<br />
=== Настройки инвентаря и таблиц ===<br />
<br />
====Настройки инвентаря====<br />
<br />
<br />
[[Файл:Invent_options.jpg]]<br />
<br />
В качестве таблицы для инвентаря используем выбранную таблицу.<br />
Объекты в таблицу летят со скоростью 500 и вращаются со скоростью 360.<br />
<br />
<br />
====Настройки таблицы инвентаря====<br />
<br />
У таблицы всего 2 колонки и 2 строчки(определены в группе параметров "таблица"), видимых 2 колонки и 2 строчки(определены в группе параметров "размеры ячеек"), при этом объекты, которые попадают в таблицу инвентаря не будут сжиматься(сжимать = 0).<br />
<br />
[[Файл:Invent_table.jpg]]<br />
<br />
<br />
=== Основные машины ===<br />
<br />
Основное ведро:<br />
[[Файл:Invent_bucket.jpg]]<br />
<br />
По клику Передаём id ведра инвентарю и добавляем его в инвентарь, ждём второго клика.<br />
По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка.<br />
При падении на маску поросёнка ведро исчезает и включает до того скрытое ведро у поросёнка.<br />
Состояние '''with''' необходимо для того чтобы по клику можно было снова вытянуть объект из инвентаря, если его туда положила другая машина или кнопка.<br />
<br />
Ведро у поросёнка:<br />
[[Файл:Invent_p_bucket.jpg]]<br />
<br />
Изначально машина прозрачна и не видна на экране.<br />
Основное ведро переводит в определённый момент ведро у поросёнка в состояние '''on''' в котором ведро у поросёнка становится видимым и ожидает клика.<br />
При помощи изменения состояния у объекта инвентарь на состояние '''return''' основное ведро помещается в инвентарь, и делается видимым(alpha=1), а ведро у поросёнка становится прозрачным.<br />
<br />
Основной молоток:<br />
[[Файл:Invent_hammer.jpg]]<br />
<br />
По клику Передаём id молотка инвентарю и добавляем его в инвентарь, ждём второго клика.<br />
По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка.<br />
При падении на маску поросёнка молоток исчезает и включает до того скрытый молоток у поросёнка.<br />
<br />
Молоток у поросёнка:<br />
[[Файл:Invent p hammer.jpg]]<br />
<br />
Изначально машина прозрачна и не видна на экране.<br />
Основной молоток переводит в определённый момент молоток у поросёнка в состояние '''on''' в котором молоток у поросёнка становится видимым и ожидает клика.<br />
При клике переводим основной молоток в состояние, в котором с помощью состояния инвентаря '''add''' молоток добавляется в инвентарь, и делаем основной молоток видимым, а молоток у поросёнка становится прозрачным.<br />
<br />
Основная шапка:<br />
[[Файл:Invent_hat.jpg]]<br />
<br />
По клику Передаём id шапки инвентарю и добавляем её в инвентарь, ждём второго клика.<br />
По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка.<br />
При падении на маску поросёнка шапка исчезает и включает до того скрытую шапку у поросёнка.<br />
<br />
Шапка у поросёнка:<br />
[[Файл:Invent_p_hat.jpg]]<br />
<br />
Изначально машина прозрачна и не видна на экране.<br />
Основная шапка переводит в определённый момент шапку у поросёнка в состояние '''on''' в котором шапка у поросёнка становится видимым и ожидает клика.<br />
При клике переводим основную шапку в состояние, в котором с помощью состояния инвентаря '''add''' шапка добавляется в инвентарь, и делаем основную шапку видимой, а шапка у поросёнка становится прозрачной.<br />
<br />
=== Инвентарь на нескольких игровых экранах === <br />
Также инвентарь можно использовать на нескольких игровых экранах, для этого надо расположить на глобальном экране сам объект инвентарь, его таблицу и все объекты которые будут класться в инвентарь. Для того чтобы при переходе с экрана на экран объекты, которые будут в инвентаре не приводили к ошибкам необходимо, как минимум, им в параметре "память" поставить "1". Тогда при переходе с экрана на экран объект не будет уходить в начальное состояние.<br />
<br />
Рассмотрим на базе текущего проекта использование общего инвентаря для нескольких экранов.<br />
Для этого добавим ещё один экран. На него скопируем графику из игрового, кроме поросёнка, и расшарим туда инвентарь<br />
Обязательно поставим параметр "память" для ведра, молотка, шапки, которые на сцене с инвентарём, равным "1". Также укажем "память"="1" для шапки, молотка и ведра, которые у поросёнка.<br />
<br />
В итоге у нас получится 3 экрана:<br />
*1-й без поросёнка<br />
*2-й с поросёнком на которого можно применять объекты из инвентаря<br />
*3-й - глобальный - на нём инвентарь, таблица и объекты инвентаря.<br />
[[Файл:Invent sh global.jpg]]<br />
<br />
Изменения в настройках машин, которые помещаются в инвентарь, для корректного его использования:<br />
[[Файл:Inventory example save.jpg]]<br />
Аналогично необходимо сделать в машинах "ведро", "шапка", "молоток" у поросёнка<br />
<br />
Теперь на первом экране можно собрать объекты в инвентарь и на втором их применить на поросёнке. Не использованные объекты будут оставаться в инвентаре.<br />
Если заберём все объекты с первого экрана в инвентарь, перейдём во второй экран, и применим, на пример, молоток, потом снова перейдём на 1-й экран, то в инвентаре останутся только 2 оставшихся объекта, а если снова вернёмся на 2-й экран, то поросёнок будет бегать уже с применённым на него объектом, если его вернём в инвентарь, кликнув на него, то он вернётся и будет перемещаться с инвентарём по экранам.<br />
<br />
В качестве дальнейшего улучшения можно дописать условия которые будут скрывать и показывать определённые объекты на определённых экранах в зависимости от их местонахождения(в инвентаре или нет). С текущими настройками, не собирая объекты на первом экране, и переместившись на второй, они там будут т.к. сцена на которой они находятся расшарена и они в составе сцены будут отображаться на всех экранах.<br />
<br />
== Дополнительные возможности ==<br />
<br />
Параметр '''ret''' - используется при изменении параметров объектов, помещенных в инвентарь. "Перечитывает" параметры объектов инвентаря и "возвращает" объекты с новыми параметрами сцене. Например, если в инвентарь был помещен объект, у которого альфа = 0, а затем в определенный момент мы меняем этому объекту параметр альфа на 1, то, чтобы эти изменения выполнились, необходимо через set объекту Inventory установить параметр ret в значение val_obj = сцена, на которой находится таблица и инвентарь. <br />
<br />
На рисунке ниже done6 - подобъект объекта task_6, помещенного в инвентарь, у которого альфа меняется с 0 на 1. Объект типа инвентарь Task_Inv находится на сцене game. m_text - обычная машина, которая меняет параметр.<br />
<br />
[[Файл:Ret.jpg]]<br />
<br />
Состояние '''pos''' - Инвентарь в этом состоянии возвращает два параметра, строку и столбец ячейки, в которой находится объект (только перед тем, как перевести инвентарь в это состояние, нужно ему указать объект):<br />
<br />
*'''posRow''' - номер строки, начиная с 0;<br />
*'''posCol''' - номер столбца, начиная с 0.<br />
<br />
Пример<br />
<br />
Таблица инвентаря состоит из нескольких столбцов по три строки в каждом, нумерация сверху-вниз, справа-налево. Нам нужно вычислить номер, под которым объект task_6 добавлен в инвентарь. Переменной r присваивается строка, переменной c присваивается столбец, переменная taskk - номер в списке.<br />
<br />
[[Файл:Pos.jpg]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B8_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0&diff=3509Установка и настройка2013-03-18T06:41:48Z<p>Nbeznosov: </p>
<hr />
<div>==Загрузка и настройка редактора для обучения==<br />
<br />
Переходим на сайт Appsalute Creator [http://appsalutecreator.com http://appsalutecreator.com], находим справа кнопку "Download PC version beta 2.0" или аналогичную, жмём на неё. После этого начинается загрузка установочного пакета. Размер инсталятора больше 70Mb, так что прийдётся немного подождать.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (13).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Запускаем инсталятор. (Если у вас не установлен Marmalade, то Вы увидите правую картинку [[#Настройка пакета для сборки под все платформы|чтобы устранить]] )<br />
:Жмём "далее"<br />
<br />
<gallery widths="490px" heights="370px" perrow="4" ><br />
File:Install (33).jpg<br />
File:NotMarmalade.png<br />
</gallery><br />
<br />
Внимательно читаем лицензионное соглашение, соглашаемся и жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (34).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем путь для установки редактора и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (35).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем необходимые пункты, лучше всего отметить все 3 пункта, и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (36).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем название папки в меню "пуск" и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (37).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Подтверждаем настройки нажатием на кнопку "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (38).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Начинается установка<br />
<div class="tleft" style="clear:none"> [[Файл:Install (39).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
По окончании жмём "Finish"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (40).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Редактор установлен. Можно [[Learning|выполнять уроки]].<br />
<br />
==Настройка пакета для сборки под все платформы==<br />
Для правильной работы(работа редактора и сборка проектов на ios и android) необходимо:<br />
* JDK 1.6 (последняя версия ''Java SE 6 Update 39'')<br />
* Marmalade SDK<br />
* Appsalute creator<br />
=== Загрузка и установка JDK 1.6 ===<br />
Загрузить JDK можно по адресу [http://www.oracle.com/technetwork/java/index-jsp-138363.html http://www.oracle.com/technetwork/java/index-jsp-138363.html], или ввести в поисковой системе запрос "JDK" Вероятно первая ссылка будет с названием "Java SE Downloads" и ссылаться на сайт Oracle.<br />
<br />
Перейдя на страницу загрузки видим:<br />
<div class="tleft" style="clear:none"> [[Файл:Install (11).jpg | мини |500пкс ]] </div><br />
<br />
<br clear="all" /><br />
<br />
Под Java 7 находится Java 6 и под надписью JDK находится кнопка Download (выделена красным). Жмём её и попадаем на следующую страницу:<br />
<br />
<br />
<div class="tleft" style="clear:none"> [[Файл:Install (12).jpg | мини |500пкс ]] </div><br />
<br />
<br clear="all" /><br />
<br />
Читаем лицензионное соглашение, соглашаемся и выбираем ссылку в платформе windows x86 (выделена красным).<br />
После этого начинается загрузка инсталятора.<br />
<br />
Запускаем установочный пакет.<br />
Жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (14).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (15).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
когда предложит поставить JRE - соглашаемся, и жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (16).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
После окончания установки жмём "finish"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (17).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
===Загрузка и установка Marmalade SDK===<br />
<br />
Переходим на сайт Marmalade [http://www.madewithmarmalade.com/ http://www.madewithmarmalade.com/].<br />
<br />
Здесь необходимо:<br />
* зарегистрироваться, если ещё не зарегистрированы<br />
* получить лицензию<br />
* после получения лицензии можно будет скачать установочный пакет<br />
<br />
====Регистрация====<br />
Или сразу жмём зарегистрироваться, или выбираем "trial/buy/download" затем выбираем подходящую версию и выбираем покупаем или trial получить, нас перекинет на страницу где предложат войти в систему, если ещё не зарегистрировались - жмём зарегистрироваться.<br />
<br />
<div class="tleft" style="clear:none"> [[Файл:Install (1).jpg | мини |500пкс ]] </div><br />
<div class="tleft" style="clear:none"> [[Файл:Install (2).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<div class="tleft" style="clear:none"> [[Файл:Install (3).jpg | мини |500пкс ]] </div><br />
<br />
<br clear="all" /><br />
<br />
Далее заполняем регистрационную форму и жмём "зарегестрироваться"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (4).jpg | мини |500пкс ]] </div><br />
<br />
<br clear="all" /><br />
После этого придёт на указанный электронный ящик письмо в котором будет ссылка по которой надо перейти чтобы подтвердить регистрацию.<br />
<br />
Переходим по ссылке и можем логиниться.<br />
<br />
<div class="tleft" style="clear:none"> [[Файл:Install (5).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
====Получние лицензии и загрузка установочного пакета====<br />
<br />
Когда залогинились система попросит уточнить данные о пользователе - вводим все данные, которые необходимо ввести и нажимаем save.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (7).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Далее снова попадаем на главную страницу и снова выбираем "trial/buy/download" и выбираем необходимую версию.<br />
После этого попадаем на страницу:<br />
<div class="tleft" style="clear:none"> [[Файл:Install (8).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
и выбираем "Get PC Release".<br />
Лицензия попадает в "корзину" и система просит уточнить данные для получения лицензии:<br />
<div class="tleft" style="clear:none"> [[Файл:Install (9).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
Заполняем необходимые поля. На снимке пример для trial лицензии - при покупке вид страницы может отличаться.<br />
Жмём Next и попадаем на предыдущую страницу, но сверху написано, что мы получили лицензию.<br />
Снова выбираем "Get PC Release" - теперь начнётся загрузка установочного пакета.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (10).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
====Установка====<br />
Запускаем инсталятор, жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (18).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Внимательно читаем лицензию, соглашаемся и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (19).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
<br />
Путь куда установится можно не менять и снова жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (20).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
<br />
По-умолчанию указана полная установка - ничего не меняем и жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (21).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Здесь предлагается выбрать плагины для установки. Для редактора ничего из списка не надо, поэтому ничего не выбирая жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (22).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Начинается установка.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (23).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
После установки появитя окно настройки Marmalade SDK. Для того чтобы можно было собирать на устройства проекты необходимо активировать уже полученную лицензию, поэтому жмём "Activate license"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (24).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Вводим электронный ящик, который указывали при регистрации, и пароль. После этого жмём "OK".<br />
<div class="tleft" style="clear:none"> [[Файл:Install (25).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем лицензию и снова "OK".<br />
<div class="tleft" style="clear:none"> [[Файл:Install (26).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Снова читаем лицензионное соглашение и снова "OK"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (27).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Если всё было сделано правильно появится окно о том, что лицензия успешно активирована, жмём "OK"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (28).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Если всё успешно прошло, то под кнопкой "Activate license" будет указано какая лицения активирована. Жмём OK.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (29).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Если не установлена Microsoft Visual Studio, то появится следующее сообщение:<br />
Жмём "OK"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (30).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Утилита сделает последние настройки и после этого выдаст сообщение<br />
<div class="tleft" style="clear:none"> [[Файл:Install (31).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Жмём "OK".<br />
Настройка Marmalade SDK завершена.<br />
<br />
===Загрузка и установка Appsalute Creator===<br />
Переходим на сайт Appsalute Creator [http://appsalutecreator.com http://appsalutecreator.com], находим справа кнопку "Download PC version beta 2.0" или аналогичную, жмём на неё. После этого начинается загрузка установочного пакета.<br />
<div class="tleft" style="clear:none"> [[Файл:Install (13).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
====Установка====<br />
Запускаем инсталятор.<br />
Жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (33).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Внимательно читаем лицензионное соглашение, соглашаемся и жмём "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (34).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем путь для установки редактора и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (35).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем необходимые пункты, лучше всего отметить все 3 пункта, и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (36).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Выбираем название папки в меню "пуск" и снова "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (37).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Подтверждаем настройки нажатием на кнопку "далее"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (38).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Начинается установка<br />
<div class="tleft" style="clear:none"> [[Файл:Install (39).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
По окончании жмём "Finish"<br />
<div class="tleft" style="clear:none"> [[Файл:Install (40).jpg | мини |500пкс ]] </div><br />
<br clear="all" /><br />
<br />
Редактор установлен.<br />
<br />
===Настройка для сборки под IOS===<br />
Для того чтобы собрать ipa и установить его на устройство необходим ключ и сертификат разработчика<br />
<br />
<pre><br />
Certificates and keys must always be placed in the following folder: <SDK Install dir>/s3e/deploy/plugins/iphone/certificates<br />
<br />
To "install" on PC, simply name and place all the .key and .cer files in this folder. The Deploy Tool will just look here and expect the files to have the specific names:<br />
<br />
developer_identity.key - development private key<br />
distribution_identity.key - distribution private key<br />
developer_identity.cer - development certificate<br />
distribution_identity.cer - distribution certificate<br />
AppleWWDRCA.cer - universal cert provided with the SDK<br />
Apple Root CA.cer - iOS WWDR intermediate certificate from the portal<br />
</pre><br />
<br />
Ключи и сертификаты должны называться именно так как требует Marmalade SDK и находиться именно там где требует Marmalade SDK. Если установлено несколько версий Marmalade SDK, ключи и сертификаты должны находиться в текущей активной версии Marmalade SDK<br />
<br />
[http://docs.madewithmarmalade.com/native/platformguides/iosguide/iossigning/iossigningassetssetup.html Инструкция по правильной установке и получению ключей разработчика]<br />
<br />
[http://www.iguides.ru/forum/showthread.php?t=43253 iOS Dev Сертификат разработчика и все, что с ним связано]- Создание сертификата и добавление устройств <br />
<br />
[http://help.adobe.com/ru_RU/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff0.html#WSFAB6E5EB-316A-42b0-81A3-0BC232ACD99A Цифровая подпись файлов AIR]- есть информация по генерированию ключей и сертификатов на Windows<br />
<br />
<br />
===Настройка для сборки под Blackberry===<br />
<br />
Для того чтобы собрать bar и установить его на устройство необходимы '''BlackBerry Author Name''' и '''BlackBerry Author ID''', которые можно получить на портале разработчиков Blackberry. Также для загрузки на устройство понадоится ключ debug-token, который генерируется на основе BlackBerry Author ID и других параметров. BlackBerry Author ID - это уникальный идентефикатор системы на которой будут собираться пакеты.<br />
<br />
BlackBerry Author Name и BlackBerry Author ID необходимо вписать в соответствующие поля в файл '''playbook_conf.csv''', который находится в папке '''''system\scripts\'''''<br />
<br />
Для сборки bar файла с подписью понадобятся ещё хранилище ключей разработчика, пароль к хранилищу и CSK пароль.<br />
Хранилище ключей должно называться '''key.p12''' и должно находиться в папке '''''system\temp\build_last\Viewer\platforms\marmalade\conf\playbook'''''<br />
пароли заролняются в файле playbook_conf.csv в соответствующие поля.<br />
<br />
Если хранилища нет, или оно называется не должным образом, то пакет соберётся не подписанный.<br />
<br />
Пример заполнения playbook_conf.csv:<br />
<br />
<pre><br />
# 1 - BlackBerry Author Name: Specifies the author name from the debug token requested from RIM<br />
# 2 - BlackBerry Author ID: Specifies the author id, assigned by RIM signing authority, embedded in the debug token requested from RIM<br />
# 3 - BlackBerry Keystore Password: The password for the keystore<br />
# 4 - BlackBerry CSK Password: The password to use CSK keys (used for encrypting communications with RIM Signing Authority) <br />
Super Company LTD;sdfJygsdf78sdfkh;Pa$$w0rd3;$ec0nD_Pa$$w0rd<br />
</pre><br />
<br />
'''Super Company LTD''' - BlackBerry Author Name<br />
<br />
'''sdfJygsdf78sdfkh''' - BlackBerry Author ID<br />
<br />
'''Pa$$w0rd3''' - Пароль хранилища (BlackBerry Keystore Password)<br />
<br />
'''$ec0nD_Pa$$w0rd''' - CSK пароль (BlackBerry CSK Password)</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Image&diff=3502Image2013-03-15T06:19:30Z<p>Nbeznosov: </p>
<hr />
<div>'''Image''' - самый простой объект, применяется для отображения графических файлов на сцене.<br />
Сам по себе объект Image статичен, т е не может менять положение на сцене. <br />
Общие параметры полностью соответствуют всем объектам используемым в редакторе(см. описание [[Object|Object]])<br />
<br />
== Общие параметры ==<br />
[[Файл:object.png|400px|]]<br />
*'''имя''' - Имя графического объекта в дереве проекта. Может быть произвольным. По умолчанию соответствует имени файла из базы ресурсов.<br />
*'''синхронизация''' - Применяется для синхронизации между лейаутами, если указан параметр ''нет'' то объект будет активен только на текущем лейауте<br />
*'''память''' - Если 1, то при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана).<br />
*'''res''' - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''прокликиваемая''' - Если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то картинка сама обрабатывает клик, но и пропускает его "дальше"<br />
<br />
'''Группа - положение''' <br />
<br />
*'''положение -> X''' - Горизонтальная координата центра графического объекта (его точки пивота) в пикселях. Отсчитывается от точки пивота сцены. <br />
*'''положение -> Y''' - Вертикальная координата центра графического объекта (его точки пивота) в пикселях. Отсчитывается от точки пивота сцены.<br />
<br />
'''Группа - размер'''<br />
<br />
*'''размер -> W''' - Ширина графического объекта в пикселях<br />
*'''размер -> H''' - Высота графического объекта в пикселях<br />
** Точка пивота сцены как правило расположена в центре сцены.<br />
<br />
'''Группа - модификаторы'''<br />
<br />
*'''alpha''' - Прозрачность: от 0 (прозрачен) до 1 (не прозрачен).<br />
*'''angle''' - Угол поворота в градусах (0 - не повёрнут). Отсчитывается от оси x вниз. Вверх - идут отрицательные углы.<br />
*'''scale x''' - Масштаб по оси '''x''' (1 - не изменен, 1.5 - увеличен в полтора раза, и т.д.).<br />
*'''scale y''' - Масштаб по оси '''y''' (1 - не изменен, 1.5 - увеличен в полтора раза, и т.д.).<br />
*'''z''' - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''[[тайлинг]]''' -если да то тайлинг включен, <br />
<br />
'''Группа - [[позиционирование]]'''<br />
<br />
*'''горизонтальное''' - нет выравнивания; 1 - прижать к левому краю; 2 - центр; 3 - к правому<br />
*'''вертикальное''' - нет выравнивания; 1 - прижать к верхнему краю; 2 - центр; 3 - к нижнему<br />
<br />
== Точка пивота ==<br />
<br />
[[Файл:scena.png|500px|thumb|center]]<br />
'''Точка пивота''' - точка вращения графического объекта. Может находится за пределами графического объекта.<br> <br />
Параметры точки пивота задаются в редакторе ресурсов и могут быть изменены в любое время.<br><br />
<br />
'''Пример изменения координат точки пивота'''<br> <br />
Применение параметра angle =90<br />
[[Файл:pivot1.png|400px|left]][[Файл:pivot2.png|400px|center]]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Learning&diff=3501Learning2013-03-15T06:14:20Z<p>Nbeznosov: </p>
<hr />
<div>'''Для кого предназначены уроки'''<br />
<br />
Данные уроки предназначены как для начинающих, так и для программистов, желающих освоить простой инструмент для создания игр. Уроки базируется на пакете для создания игр AppSalute Game Сreator, использующей мощные технологии создания игр для платформ: Windows, WPH8, Mac OS, Android, iOS, Blackberry, Flash; <br />
Для успешного прохождения уроков НЕ требуется знаний языков программирования. Необходимо любить компьютерные игры и знать основы математики, геометрии, физики (понимать, что такое координаты на плоскости).<br />
<br />
'''Что вы будете уметь''' <br />
<br />
Пройдя уроки обучения созданию игр с использованием пакета AppSalute Game Сreator, Вы овладеете техникой создания современных компьютерных игр, получите необходимые практические навыки для самостоятельной работы по созданию игровых приложений для любых платформ. Создадите небольшую адвентюру. Запустите свою игру на мобильном устройстве.<br />
<br />
<br />
[[Введение в AppSalute Сreator|Урок 1: Введение в AppSalute Сreator]]<br />
<br />
[[Создание экранов, сцен. Работа с кнопками|Урок 2: Создание экранов, сцен. Работа с кнопками]]<br />
<br />
[[Checkbox как машина состояний|Урок 3: Checkbox как машина состояний]]<br />
<br />
[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4: Взаимодействие машин: «Лампочка» и «Светофор»]]<br />
<br />
[[Движение машин: жучки, ключи и многое другое|Урок 5: Движение машин: жучки, ключи и многое другое]]<br />
<br />
[[Редактор текстовых ресурсов|Урок 6: Редактор текстовых ресурсов]]<br />
<br />
[[Создание игры «Hidden Object Game»|Урок 7: Создание игры «Hidden Object Game»]]<br />
<br />
[[Настройка миниигр|Урок 8: Настройка миниигр]]<br />
<br />
[[Работа с эффектами|Урок 9: Работа с эффектами]]<br />
<br />
[[Экспорт, импорт и релиз проекта|Урок 10: Экспорт, импорт и релиз проекта]]<br />
<br />
[[Создание простой адвентюры|Урок 11: Создание простой адвентюры]]<br />
<br />
'''Дополнительные материалы''':<br />
<br />
* [[Absolutist_Framework|Документация]]<br />
* [http://fs.absolutist.com/Partner/AppSalute/learning_project_video.mp4 Видео с уроками]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=Learning&diff=3368Learning2013-03-05T12:33:07Z<p>Nbeznosov: </p>
<hr />
<div>'''Для кого предназначены уроки'''<br />
<br />
Данные уроки предназначены как для начинающих, так и для программистов, желающих освоить простои инструмент для создания игр. Уроки базируется на пакете для создания игр AppSalute Game Сreator, использующей мощные технологии создания игр для платформ: Windows, WPH8, Mac OS, Android, iOS, Blackberry, Flash; <br />
Для успешного прохождения уроков НЕ требуется знаний языков программирования. Необходимо любить компьютерные игры и знать основы математики, геометрии, физики (понимать, что такое координаты на плоскости).<br />
<br />
'''Что вы будете уметь''' <br />
<br />
Пройдя уроки обучения созданию игр с использованием пакета AppSalute Game Сreator, Вы овладеете техникой создания современных компьютерных игр, получите необходимые практические навыки для самостоятельной работы по созданию игровых приложений для любых платформ. Создадите небольшую адвентюру. Запустите свою игру на мобильном устройстве.<br />
<br />
<br />
[[Введение в AppSalute Сreator|Урок 1: Введение в AppSalute Сreator]]<br />
<br />
[[Создание экранов, сцен. Работа с кнопками|Урок 2: Создание экранов, сцен. Работа с кнопками]]<br />
<br />
[[Checkbox как машина состояний|Урок 3: Checkbox как машина состояний]]<br />
<br />
[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4: Взаимодействие машин: «Лампочка» и «Светофор»]]<br />
<br />
[[Движение машин: жучки, ключи и многое другое|Урок 5: Движение машин: жучки, ключи и многое другое]]<br />
<br />
[[Редактор текстовых ресурсов|Урок 6: Редактор текстовых ресурсов]]<br />
<br />
[[Создание игры «Hidden Object Game»|Урок 7: Создание игры «Hidden Object Game»]]<br />
<br />
[[Настройка миниигр|Урок 8: Настройка миниигр]]<br />
<br />
[[Работа с эффектами|Урок 9: Работа с эффектами]]<br />
<br />
[[Экспорт, импорт и релиз проекта|Урок 10: Экспорт, импорт и релиз проекта]]<br />
<br />
[[Создание простой адвентюры|Урок 11: Создание простой адвентюры]]<br />
<br />
'''Дополнительные материалы''':<br />
<br />
* [[Absolutist_Framework|Документация]]<br />
* [http://fs.absolutist.com/Partner/AppSalute/learning_project_video.mp4 Видео с уроками]</div>Nbeznosovhttps://wiki.appsalutecreator.com/index.php?title=HiddenObject&diff=3226HiddenObject2013-02-21T08:10:37Z<p>Nbeznosov: /* Параметры объекта */</p>
<hr />
<div>HiddenObject - поисковый объкт на сцене в хиден игре.<br />
----<br />
Добавив из редактроа ресурсов на сцену картинку поискового предмета мы извеняем его тип на hiddenObject<br />
<br />
[[Файл:Example.jpg]]<br />
<br />
Все хидден объекты должны быть подключены к объекту с типом HiddenList. (Название листа произвольное)<br />
<br />
[[Файл:Example2.jpg]]<br />
----<br />
== Параметры объекта == <br />
<br />
<br />
*'''Картинка''' - графический ресурс хидден объекта.<br />
*'''ТекстID '''- перетягивается из текстового редактора<br />
*'''Текст'''- при отсутствии ТекстID, это текст который выводит таблица.<br />
*'''list'''- тут указать хидденлист к которому будет подключен объект.<br />
*''' actor'''- анимация (машина состояний) которая запустится после нахождения объекта.<br />
*''' flayer''' - Объект типа flyers, который запустится при клике на спрятанный объект.<br />
*'''Тип''' - Номер типа объекта. Используется при выставленном ограничении в hiddenList (поле [одного типа])<br />
*'''Обязательный''' - если флаг включен то объект всегда будет в списке на поиск<br />
*'''Выделение цветом''' - если включен флаг то на объект будет распространяться выделения цветом (цвет указывается в HiddenList)<br />
*'''collection''' - Объект типа коллекция, к которому относится данный объект. Если объект не коллекционный - просто не задавать.</div>Nbeznosovhttps://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:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&diff=3157Обсуждение:Создание игры «Hidden Object Game»2013-02-19T12:12:13Z<p>Nbeznosov: </p>
<hr />
<div>* Добавить работу с хинтами разных видов. [[Участник:Steps|Steps]] 10:40, 18 января 2013 (CET)<br />
"7. Присвоить каждой текстовой записи значение Word, Sentence-En, добавить графическое отображение поискового объекта с типом icon1"<br />
Не описывается значение и предназначение Sentence-En. --[[Участник:Nbeznosov|Nbeznosov]] 13:12, 19 февраля 2013 (CET)</div>Nbeznosov