https://wiki.appsalutecreator.com/api.php?action=feedcontributions&user=Arudaya&feedformat=atomwiki.appsalutecreator.com - Вклад участника [ru]2024-03-28T11:50:27ZВклад участникаMediaWiki 1.31.15https://wiki.appsalutecreator.com/index.php?title=Store&diff=9614Store2018-07-11T13:01:25Z<p>Arudaya: /* Создание */</p>
<hr />
<div>{{TOC right}}<br />
<br />
[[Object|Объект]] '''Store''' необходим для описания InApp покупок(позволяют продавать отдельные бонусы, паки и т.п.) в игре.<br />
<br />
== Параметры объекта Store ==<br />
<br />
*'''service id''' - Идентификатор сервиса для Fortumo<br />
*'''app secret''' - Секретный ключ для Fortumo<br />
*'''group id''' - ID группы для Samsung<br />
*'''wallet''' - Объект типа [[Wallet|Wallet]]<br />
<br />
'''Группа adjust'''<br />
*'''включить adjust''' - нет=0, да=1;<br />
*'''событие первой покупки для iOS'''<br />
*'''событие первой покупки для Ansroid'''<br />
*'''событие покупки для iOS'''<br />
*'''событие покупки для Android'''<br />
<br />
==Добавляемые параметры==<br />
<br />
[[Файл:+.png]] '''Покупка''' - Описание одной внутриигровой покупки.<br />
<br />
*'''id покупки''' - внутренний id покупки<br />
*'''числовой id покупки''' - Числовой id покупки для сохранения истории покупок в опции<br />
*'''цена''' - Цена покупки по умолчанию<br />
*'''объект (успех)''' - Этому объекту будет сообщено об успехе покупки<br />
*'''состояние (успех)''' - Это состояние будет установлено объекту при успешной покупке<br />
*'''объект (провал)''' - Этому объекту будет сообщено о неудаче покупки<br />
*'''состояние (провал)''' - Это состояние будет установлено объекту при ошибке/отмене покупки<br />
*'''iOS id покупки''' - id покупки в магазине Apple для iOS версии приложения<br />
*'''Amazon id покупки''' - id покупки для Amazon версии приложения<br />
*'''Fortumo id покупки''' - id Fortumo покупки для Android версии приложения<br />
*'''Описание покупки Fortumo''' - отбражаемое описание покупки для Frotumo под Android<br />
*'''Fortumo service Id''' - берутся с сайта фортумо (их видно в свойствах покупки)<br />
*'''Fortumo appSecret''' - берутся с сайта фортумо (их видно в свойствах покупки)<br />
*'''Samsung Item ID''' - id покупки в самсунговском маркете<br />
*'''Wild Tangent Product Name''' - имя продукта в маркете Wild Tangent(берётся из сайта Wild Tangent)<br />
*'''Wild Tangent Partner Name''' - имя партнера в маркете Wild Tangent(берётся из сайта Wild Tangent)<br />
*'''Wild Tangent Site Name''' - имя сайта в маркете Wild Tangent(берётся из сайта Wild Tangent)<br />
*'''Wild Tangent Game Name''' - имя игры в маркете Wild Tangent(берётся из сайта Wild Tangent)<br />
*'''Google Product ID''' - ID покупки на Google Play [[http://ge.absolutist.com/index.php/Store#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D1.8F]]<br />
*'''BlackBerry id покупки''' - BlackBerry ID<br />
*'''WP8 ID''' - id покупки для Windows Phone 8 приложений<br />
*'''Windows 81 id покупки''' - Windows 81 ID<br />
*'''Netmarble transaction id''' - Netmarble transaction id<br />
*'''Netmarble item id''' - Netmarble item id<br />
*'''Tizen id покупки''' - id покупки в магазине Tizen<br />
*'''Yandex id покупки''' - id покупки в магазине Yandex<br />
*'''Nokia id покупки''' - id покупки в магазине Nokia<br />
*'''Mobiroo id покупки''' - id покупки в магазине Mobiroo<br />
*'''Web facebook id''' - Web facebook id<br />
*'''Web odnoklassniki id''' - Web odnoklassniki id<br />
*'''Web vkontakte id''' - Web vkontakte id<br />
*'''Web yahoo id''' - Web yahoo id<br />
*'''Web mailru id''' - Web mailru id<br />
*'''Web wizq id''' - Web wizq id<br />
*'''Steam id покупки''' - id покупки в Steam версии приложения<br />
*'''Consumable''' - 1 - покупка расходуемая, 0 - покупка раз и навсегда. '''! Важно, если параметр не указан, по-умолчанию покупка - навсегда !'''<br />
*'''объект (restore)''' - объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.<br />
*'''состояние (restore)''' - Это состояние будет установлено объекту при успешном восстановлении этой покуки<br />
<br />
<br />
[[Файл:+.png]] '''успех restore''' - Выполняется когда хотя бы одна покупка успешно восстановлена.<br />
<br />
*'''объект''' - Объект - состояние которого меняем. Этому объекту будет сообщено о завершении восстановления покупок.<br />
*'''состояние''' - Это состояние будет установлено объекту при завершении восстановления покупок.<br />
<br />
<br />
[[Файл:+.png]] '''ошибка restore''' - выполняется, когда произошла ошибка при восстановлении покупок<br />
<br />
*'''объект''' - Объект - состояние которого меняем. Этому объекту будет сообщено об ошибке восстановления покупок.<br />
*'''состояние''' - Это состояние будет установлено объекту при ошибке восстановления покупок.<br />
<br />
<br />
[[Файл:+.png]] '''пусто restore''' - выполняется когда нет покупок для восстановления<br />
<br />
*'''объект''' - Объект - состояние которого меняем. Этому объекту будет сообщено об отсутствии покупок для восстановления.<br />
*'''состояние''' - Это состояние будет установлено объекту при отсутствии покупок для восстановления.<br />
<br />
==Состояния==<br />
<br />
*'''purchase''' - совершить покупку, взяв ее идентификатор (внутренний id) из параметра ''productBundle''<br />
*'''restore''' - вызвать восстановление покупок<br />
<br />
<br />
<br />
==Создание, совершение и восстановление покупок==<br />
<br />
===Создание===<br />
<br />
'''Шаг 1.''' Создание объекта Store.<br />
На глобальном экране (например, там, где находятся [[options]]) создать объект [[store]]. Для этого на сцене ПКМ (правой кнопкой мыши), из выпадающего меня выбрать "создать объект сцены в текущем объекте". У созданного объекта изменить тип объекта на [[store]]. В поле ''имя'' вводим уникальное имя (приучаем себя к порядку в проекте).<br />
<center><br />
[[Файл:store_new.png]]<br />
</center><br />
<br />
'''Шаг 2.''' Создание покупки.<br />
* В свойствах этого объекта нажимаем ПКМ и добавляем раздел '''in-app покупка'''. По умолчанию создаются параметры: объект (успех), состояние (успех), объект (провал), состояние (провал), объект (restore), состояние (restore).<br />
* Для выбора остальных параметров нужно нажать на кнопку с троеточием, откроется окно с параметрами, в котором проставим галочки на нужных параметрах:<br />
<center><br />
[[Файл:store_params.png]].<br />
</center><br />
'''!!! Обязательным параметром является ''внутренний id покупки'' - это уникальный идентификатор покупки в проекте.!!!'''<br />
Можно выбирать сразу несколько систем in-app покупок - при сборке в зависимости от платформы и целевого маркета на устройстве будут использованы соответствующие покупки.<br />
* В первом поле "'''id покупки'''" записываем строковый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки. '''!!!Недопустимо начинать внутренний id покупки с числа!!!'''<br />
* Во втором поле, в примере "'''iOS id покупки'''", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем.<br />
* Далее, таким же образом, добавляется следующий инап. '''!!!Недопустимо использовать одинаковый идентификатор инапа из стора в разных внутренних покупках!!!'''<br />
В результате, окно настроек объекта будет выглядеть примерно таким образом:<br />
<center><br />
[[Файл:store_buy.png]]<br />
</center><br />
<br />
===Совершение покупки===<br />
<br />
Для инициации процесса покупки существует несколько способов.<br />
<br />
'''Способ 1.''' По нажатию на кнопку.<br />
В кнопке добавляется свойство "'''совершить in-app покупку'''" (как обычно, ПКМ). В нем отмечается галкой поле ''внутренний id покупки'' - тот же, что и "id покупки" в объекте [[store]]. По нажатию на эту кнопку произойдет обращение к магазину.<br />
<br />
'''Способ 2.''' Из машины состояний.<br />
В машине состояний выбрать команду '''in-app совершить in-app покупку''', в ней отметить галкой поле ''внутренний id покупки'' по аналогии с кнопкой. При вызове нужного состояния машине будет произведено обращение к магазину.<br />
<br />
===Обработчики покупки===<br />
Перед вызовом обработчика успеха объект пишет в шапку опций параметры:<br />
*'''store_last_purchase_id''' - внутренний id совершённой покупки<br />
*'''store_last_purchase_date''' - дата последней покупки<br />
<br />
<br />
'''Обработка успеха'''<br />
Если игрок произвел покупку, то объект, заданный в поле этой покупки объекта Store ''объект (успех)'' будет переведен в состояние ''состояние (успех)''. В этом объекте (обычно [[Machine|машина состояний]]) может быть активированы некоторые действия (например, спрятаны замочки, блокирующие продаваемый бонус). Одновременно с этим, в раздел опций который соответствует полю "внутренний id покупки" будет записано значение "1" (покупка совершена). Это поле может в дальнейшем вычитываться различными игровыми объектами.<br />
Если в объекте Store указан объект Wallet, и начисление ресурсов покупки происходит через него, то начисление произойдет автоматически при успехе покупки.<br />
<br />
'''Обработка ошибки'''<br />
Если покупка не была совершена (нет интернета, игрок не стал её делать и т.п.), то спустя некоторое время ''объект (провал)'' будет переведен в ''состояние (провал)''. В этом объекте можно, например, открыть окно, сообщающее, что покупка не может быть произведена и инап не активирован.<br />
В основном для обработки ошибок используется объект [[Errormanager|Errormanager]].<br />
<br />
===Типы ошибок при совершении покупки===<br />
<br />
0 - Unknown error<br />
<br />
1 - Client is not allowed to make the payment<br />
<br />
2 - Client canceled purchase<br />
<br />
3 - Invalid parameter/purchase ID<br />
<br />
4 - Device is not allowed to make the payment<br />
<br />
5 - No internet connection ( нет сети )<br />
<br />
6 - No internet connection ( нет интернета )<br />
<br />
7 - The service is not available for some reason (Услуга временно не доступна)<br />
<br />
8 - Purchase restore failed (Восстановить покупку не возможно)<br />
<br />
код ошибки находится в объекте типа options в параметре store.lastError<br />
<br />
В данный момент для IOS работает возврат всех ошибок, для других платформ "неизвестная ошибка" и "отсутствие интернета".<br />
<br />
<br />
===Восстановление покупок===<br />
<br />
В некоторых магазинах используется восстановление покупок автоматически. В Apple Store для восстановления нерасходуемых покупок нужно вызвать состояние ''restore''.<br />
<br />
В полях "объект (restore)" и "состояние (restore)" in-app покупки указывается машина и состояние в которое её надо перевести, если придёт сообщение, о том, что данная покупка должна быть восстановлена.<br />
<br />
Обработчики "успех restore", "ошибка restore" и "пусто restore" используются в общем по приходу сообщений о восстановлении. Т.е. если пришло сообщение в восстановлении 2-х покупок, то переведутся в указанные состояние 2 машины в покупках, которые необходимо восстановить, и переведётся машина в "успех restore" в указанное состояние. Если придёт сообщение о ошибке восстановления или о том что нет покупок для восстановления , то машины в "ошибка restore" и "пусто restore" переведутся в указанные состояние соответственно.<br />
<br />
===Восстановление покупки через патч опций===<br />
<br />
Если возникла необходимость восстановить покупку методом патча опций, то процедура следующая:<br />
* патчем записываем в опции в некий параметр строку ''внутренний id покупки'';<br />
* машиной состояний вычитываем эту строку и записываем в параметр ''productBundle'' и вызываем состояние ''purchase''.<br />
<br />
В итоге получаем успех совершенной покупки.<br />
<br />
<br />
== Пример InApp-a==<br />
<br />
Предположим, что в игре [[puzzle]] есть бонус, ставящий ячейку на своё место.<br />
Игроку дается возможность использовать этот бонус 3 раза за игровую сессию, после чего появляется окно на подобное этому:<br />
<center><br />
[[Файл:store2.png]]<br />
</center><br />
При нажатии на крестик окно закрывается, а при нажатии на замок активируется процесс покупки.<br />
<br />
Голубая кнопка с белым ноликом является кнопкой запуска хинта. В ней есть раздел<br />
* '''изменить состояние объекта'''<br />
** объект = puzzle (идентификатор миниигры [[puzzle]])<br />
** состояние = swap (состояние котором одна из ячеек становится на свое место).<br />
<br />
Белая цифра поверх кнопки - это счетчик [[counter]]. Его идентификатор cnt_hnt сообщается пазле (она уменьшает его значение при выполнении этого хинта). Диапазон изменения счетчика задан в пределах min=0, max=3. Начальное значение val=3. Кроме этого в счетчик правой кнопкой мыши добавлены разделы:<br />
* '''min: изменить объект'''<br />
** объект = win_buy_hint<br />
** состояние = open<br />
* '''minIf: условие изменения min'''<br />
** куплено = buy.hint<br />
** not = 1<br />
Эти разделы означают, что при достижении счетчиком минимальной границы будет открыто окно win_buy_hint если в опциях '''не''' (поле not) отмечена покупка "buy.hint".<br />
<br />
Заметим, что пазла [[puzzle]] выполняет этот хинт (получив состояние от кнопки), если счетчика этих хинтов нет, или он не достиг минимума, или достиг, но в нем нет выполнившегося раздела "min: изменить объект".<br />
<br />
Само окно win_buy_hint (желтый прямоугольник) является [[Machine|машиной состояний]] в которой может быть выключен счётчик, открывается окно, закрывается окно.<br />
<br />
У машины состояний есть 2 подобъекта - кнопки с замочком и крестиком.<br />
Крестик имеет добавленный раздел, который закрывает окно.<br />
Замок запускает процесс покупки и также закрывает окно:<br />
* '''изменить состояние объекта'''<br />
** объект = win_buy_hint<br />
** состояние = close<br />
* '''совершить in-app покупку'''<br />
** id покупки = buy.hint<br />
** объект (успех) = win_buy_hint<br />
** состояние (успех) = hide <br />
** объект (провал) = win_error<br />
** состояние (провал) = open <br />
В случае успешной покупки счетчик становится невидимым (состояние hide окна). При неудаче открывается окно win_error, аналогичное win_buy_hint сообщающее об ошибке покупки хинта.<br />
<br />
Обратим внимание, что выполнение состояний "успех" и "провал" является отложенными во времени.<br />
Они вызываются магазином, когда соответствующие события (покупка или отказ от неё) возникнут.<br />
<br />
== Дополнительные сведения ==<br />
<br />
===Покупки Google Play===<br />
<br />
* Для работы покупок на Google Play необходимо добавить разрешения:<br />
<pre><br />
<br />
<uses-permission android:name="com.android.vending.BILLING" /><br />
<br />
</pre><br />
<br />
<br />
* Для получения ID покупки на Google Play необходимо сначала загрузить apk с разрешением покупок<br />
<br />
* Разрешения записываются в AndroidManifest.xml, который находится обычно в каталоге %s3e_dir%\deploy\plugins\android. Также можно вместо AndroidManifest.xml вносить соответствующие настройки в android-extra-manifest.xml, который находится в каталоге %каталог_редактора%\system\marmalade\conf\%марект%(к примеру android)<br />
<br />
* Для приложения с покупками на google play надо добавить лицензионный ключ приложения в app.icf в группу [AndroidLVL] и разбить его на 4 части длинной не более 100 знаков. Также добавить для бесплатного приложения параметр ''free_app=1''<br />
<pre><br />
[AndroidLVL]<br />
base64_public_key_1=""<br />
base64_public_key_2=""<br />
base64_public_key_3=""<br />
base64_public_key_4=""<br />
free_app=1<br />
</pre><br />
<br />
* Для корректной обработки покупок в случае неожиданного закрытия приложения(например во время открытого системного окна с процессом покупки пользователь сворачивает всё и закрывает приложение), необходимо добавить восстановление покупок для всех типов покупок. Таким образом если покупка произошла успешно, но в приложение не попали, при следующем запуске пользователю зачислится то что он купил.<br />
<br />
===Настройка маркета действующих покупок===<br />
<br />
* Для работы соостветствующего маркета на устройстве недобходимо в [[app.icf]] в секцию [Game] добавить параметр Market с значением для маркета.<br />
<br />
магазин - значение в [[app.icf]]<br><br />
Fortumo - fortumo<br><br />
Samsung - samsung<br><br />
Amazon market - amazon<br><br />
Apple store - ios<br><br />
Wildtangent - wildtangent<br><br />
Windows Store - wp8<br><br />
Blackberry - blackberry<br><br />
Google Play - android<br><br />
<br />
Пример: <br />
<pre><br />
[Game]<br />
Market="ios"<br />
</pre><br />
<br />
<br />
<br />
===Trial период в Windows Phone 8===<br />
* Для windows phone 8 есть возможность работы в пробном режиме. То есть пользователь может пользоваться платным приложением или некоторое время или с ограниченными возможностями.<br />
<br />
<br />
"The trial/full state of a user’s execution rights for an app are maintained in a license. When a user tries your app, it is installed on their phone along with a license that grants them the right to try the app. Trial licenses do not expire but when a user purchases an app they have been trying a full license is downloaded. The full license replaces the trial license and grants full rights to the app."<br />
<br />
[http://msdn.microsoft.com/library/windowsphone/develop/ff967558%28v=vs.105%29.aspx Creating trial apps for Windows Phone]<br />
<br />
Данный функционал связан с объектом типа store - недоступный функционал находится за внутриигровой покупкой. Когда пользователь покупает полную версию все покупки помечаются автоматически как "купленные".<br />
<br />
Для работы данного функционала в [[app.icf]] или [[platform.icf]] необходимо в группу <nowiki>[Game]</nowiki> поместить параметр '''''trial'''''<br />
<br />
'''trial=0''' - без триала<br />
<br />
'''trial=1''' - с триалом<br />
<br />
Также что приложение имеет триальный функционал необходимо отметить в соответствующих настройках приложения при создании в магазине страницы приложения.<br />
<br />
===Тестирование покупок для Blackberry===<br />
Для тестирования покупок на Blackberry устройствах в app.icf сборки необходимо добавить следующие строки:<br />
<pre><br />
[Game]<br />
inappTest=1<br />
</pre><br />
inappTest=1 - all in-app in test mode, 0 - default<br />
<br />
<br />
===Тестирование покупок из редактора на Viewer===<br />
Для тестирования покупок на Viewer-е в app.icf необходимо добавить следующие строки:<br />
<pre><br />
[Game]<br />
purchaseEverything=1<br />
</pre><br />
<br />
<br />
[[Category:Options]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=%D0%9E%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F_%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC&diff=9607Отличия подготовки проекта для разных платформ2018-07-06T07:15:24Z<p>Arudaya: /* Google Play */</p>
<hr />
<div>{{TOC right}}<br />
[[Файл:Simple.png|thumb|right]]<br />
AppSalute Game Сreator позволяет использовать один проект (один лейаут), чтобы собирать приложение для разных платформ (маркетов). <br />
Значительная часть проекта одинакова для всех платформ, но существуют некоторые различия. Для того чтобы иметь один лейаут для всех платформ используется внутренняя переменная "market", которая задается в конфигурационном файле platform.icf. И которая переносится в приложении непосредственно при сборке.<br />
<br />
В самом же проекте, проверяя значение этой переменной реализуем нужную логику. На данный момент такую проверку можно делать в [[Machine|машине состояний]], а также в [[Taskorganizer|таскорганайзере]].<br />
<br />
На данный момент существует 2 основных вида сборок - для мобильных платформ (google, ios) и для веб-платформ (facebook).<br />
Как подготовить версию для веб-платформ из версии для мобильных платформ описано в этой статье: https://docs.google.com/document/d/1seTO3nphCsqqYHjumkl6b4r9RWLNGdokHjpDyDDP1T4/edit#<br />
<br />
Кроме отличий в самом проекте, также есть отличия при сборке проекта. Эти особенности также будут описаны ниже, но на данный момент эти отличия применяются автоматически при сборке через артефактори.<br />
<br />
=Google Play=<br />
*Значение переменной market = "android".<br />
*Если в проекте есть курсоры (для веб-версий), то при запуске (на глобальном экране) приложения [[Options|опциям]] нужно вызывать состояние disableCursor.<br />
*Для приложений GP есть возможность использовать социальную сеть G+. Для этого при запуске приложения (на глобальном экране) нужно установить объекту [[Esocial]] параметр socialnet = 2.<br />
*На GP есть система внутриигровых достижений (ачивок). Для их корректной работы должен быть настроен объект [[Gamecenter]]. В частности в нем должны быть указаны ключи ачивок. Ачивки заводят маркетологи, они же дают ключи.<br />
*Для доступа к сервису GP в проекте должно быть 2 кнопки: одна для доступа к ачивкам, вторая для доступа к лидерам. Также, если в проект поддерживаются локальные достижения, то в [[Gamecenter]] нужно указать текст для этого достижения.<br />
*По системной кнопке "back" должно закрываться открытое окно. Если открытых окон нет, показывается окно выхода из приложения / хиддена / миниигры и тд.<br />
*Если в приложении есть реклама, то в файле конфигурации (platform.icf) должны быть указаны параметры для провайдера рекламы.<br />
*Если используется [[Flurry|флурри]] в файле viewer_google.xml должен быть указан game_id.<br />
*Так как упаковка экранов оптимизирована для веб-платформ, то на данный момент после экспорта в файле *.sirx нужно найти ноду в которой указан адрес для закачки 1-го пака(имеет вид <pack fsize="406951055" url="imgs1/res.dat" md5="7a...d" p="1"/>) и изменить в ней url на следующий: "http://imgs1/res.dat".<br />
*Размер apk файла для приложения на GP ограничено 100 мб. Если приложение больше этого размера, то его нужно разделить на 2 пака. Содержимое второго пака нужно поместить в zip архив и переименовать его в соответствии с шаблоном main.v1.v2.v3.****.obb (v1, v2, v3 - составные версии приложения, ***** - некое имя приложения на GP). Потом этот файл нужно будет поместить в соответствующий каталог для сборки.<br />
*'''Перед тестированием версию всегда нужно заливать в альфу GP. Что бы версию можно было залить в альфу, нужно чтобы текущая версия была выше предыдущей.'''<br />
<br />
=iTunes=<br />
*Значение переменной market = "ios".<br />
*Если в проекте есть курсоры (для веб-версий), то при запуске (на глобальном экране) приложения [[Options|опциям]] нужно вызывать состояние disableCursor.<br />
*На iTunse есть система внутриигровых достижений (ачивок). Для их корректной работы должен быть настроен объект [[Gamecenter]]. В частности в нем должны быть указаны ключи ачивок. Ачивки заводят маркетологи, они же дают ключи.<br />
*Для доступа к геймцентру в проекте должно быть кнопка, которая вызывает состояние achievements_show. Также, если в проект поддерживаются локальные достижения, то в [[Gamecenter]] нужно указать текст для этого достижения.<br />
*Если в приложении есть реклама, то в файле конфигурации (platform.icf) должны быть указаны параметры для провайдера рекламы.<br />
*Если используется [[Flurry|флурри]] в файле viewer_iphone.xml должен быть указан game_id.<br />
*Приложение пакуем в 2 пака(настройки как для GP), 2 пак архивом не жмем.<br />
<br />
=Amazon Appstore=<br />
*Значение переменной market = "amazon".<br />
*Если в проекте есть курсоры (для веб-версий), то при запуске (на глобальном экране) приложения [[Options|опциям]] нужно вызывать состояние disableCursor.<br />
*На Amazon Appstore есть система внутриигровых достижений (ачивок). Для их корректной работы должен быть настроен объект [[Gamecenter]]. В частности в нем должны быть указаны ключи ачивок. Ачивки заводят маркетологи, они же дают ключи.<br />
*Для доступа к геймцентру в проекте должно быть кнопка, которая вызывает состояние achievements_show. Также, если в проект поддерживаются локальные достижения, то в [[Gamecenter]] нужно указать текст для этого достижения.<br />
*По системной кнопке "back" должно закрываться открытое окно. Если открытых окон нет, показывается окно выхода из приложения / хиддена / миниигы и тд.<br />
*Если в приложении есть реклама, то в файле конфигурации (platform.icf) должны быть указаны параметры для провайдера рекламы.<br />
*Если используется [[Flurry|флурри]] в файле viewer_amazon.xml должен быть указан game_id.<br />
*Так как упаковка экранов оптимизирована для веб-платформ, то на данный момент после экспорта в файле *.sirx нужно найти ноду в которой указан адрес для закачки 1-го пака(имеет вид <pack fsize="406951055" url="imgs1/res.dat" md5="7a...d" p="1"/>) и изменить в ней url на следующий: "http://imgs1/res.dat".<br />
*Приложение разбивается на 2 пака. Содержимое второго пака нужно поместить в zip архив и переименовать его в pack.zip. Потом этот файл нужно будет поместить в соответствующий каталог для сборки.<br />
<br />
=Samsung Galaxy Apps=<br />
*Значение переменной market = "samsung".<br />
*Если в проекте есть курсоры (для веб-версий), то при запуске (на глобальном экране) приложения [[Options|опциям]] нужно вызывать состояние disableCursor.<br />
*Данный маркет не имеет собственного геймцентра, но на нем можно использовать локальные достижения. Для этого в [[Gamecenter]] нужно указать текст для этого достижения.<br />
*По системной кнопке "back" должно закрываться открытое окно. Если открытых окон нет, показывается окно выхода из приложения / хиддена / миниигы и тд.<br />
*Если используется [[Flurry|флурри]] в файле viewer_samsung.xml должен быть указан game_id.<br />
*Так как упаковка экранов оптимизирована для веб-платформ, то на данный момент после экспорта в файле *.sirx нужно найти ноду в которой указан адрес для закачки 1-го пака(имеет вид <pack fsize="406951055" url="imgs1/res.dat" md5="7a...d" p="1"/>) и изменить в ней url на следующий: "http://imgs1/res.dat".<br />
*Приложение разбивается на 2 пака. Содержимое второго пака нужно поместить в zip архив и переименовать его в pack.zip. Потом этот файл нужно будет поместить в соответствующий каталог для сборки.<br />
*Samsung Galaxy Apps просит, чтобы их приложение чем то отличалось, от версии на GP. На начальном этапе игры можно сделать подарок, где указать, что это уникальная особенность для пользователей данного маркета.<br />
<br />
=Facebook=<br />
*Значение переменной market = "webfb".<br />
*Для корректной работы курсора нужно указать его для каждого экрана в проекте, а также поместить на расшаренной сцене с альфой = 0. (Чтобы подтягивался ресурс при экспорте и но не было переключений между текстурами). При загрузке приложения [[Options|опциям]] нужно вызывать состояние readCursor. Также в файле app.icf в параметрах нужно указать id ресурса для курсора (используя param_name и param_value).<br />
*Геймцентра нет, но есть механизм постов на стену при получении очередного достижения. В [[Gamecenter]] указываем ключи этих достижений. Ключи представляют собой адрес к файлу ачивки на сервере. Для показа ачивок используются локальные достижения. Для этого в [[Gamecenter]] нужно указать текст для этих достижений.<br />
*В веб-версиях человек может играть в фулскрине, для этого нужно сделать кнопки смены режима (обычный/фулскрин). Также нужно предусмотреть выход из фулскрина, при совершении покупки (Устанавливать опциям fullScreen = 0, при нажатии на кнопку совершения покупки).<br />
*Для веб-версий нужно отключить иконку социальной сети, выключив vis картинке, указанной в поле snIco, в темплейте иконки друга.<br />
*Для каждой покупки нужен специальный файл, который должен быть загружен на сервер. Так же обстоит дело с постами на стену (при сдаче коллекций, получении нового уровня, ачивки и тд). При получении очередного достижения (сдача коллекции, новый уровень и тд), человек может отправить себе на стену пост об этом достижении. При этом на соответствующей кнопке вместо "Принять" нужно писать "Поделиться".<br />
*Каждый экран должен быть упакован в отдельный пак. После экспорта, видео в формате absmp4 нужно изменить формат на mp4. Также нужно изменить расширение для видео в файле *.sirx.<br />
<br />
=Submit Facebook=<br />
После каждого добавления новых постов ( лвл-апы, пост аччивок) нужно пройти проверку от Facebook. Для этого все посты настраиваются в админке, собирается версия на webfb релиз(если посты содержат новую графику) и отдаются две версии приложения на проверку. Два приложения - ios и google, должны соблюдать требования:<br />
:должны состоять из одного файла (apk,ipa - без obb файла); <br />
:посты должны отсылаться без проверки разрешений (пермишенов); Для этого в app.icf указываем в теге [s3eFacebook] параметр с значением: "DonotCheckAppPermision=1"<br />
<br />
<br />
=Одноклассники=<br />
*Значение переменной market = "webok".<br />
*В проекте весь интерфейс, тексты должны быть на Русском. В app.icf указываем lang="ru".<br />
*В проекте должна быть отключена возможность смены языка ( всегда должен быть Русский). <br />
*На иконках постов, игровых картинках не должно быть надписей на иностранном языке ( в проекте если market="webok" меняем некот. графику) .<br />
*Иконки пользователей в социальных окнах должны вписываться ( в объекте image указываем параметр тайлинг="вписать"), т.к. одноклассники отдают нам не квадратные иконки. <br />
*Тексты постов, уведомлений - д.б. на Русском.<br />
*В проекте не д.б. внешних ссылок, кроме как отправить письмо и ссылки на группы в Одноклассниках.<br />
*В проекте не д.б. иконок других соцсетей.<br />
*Для корректной работы курсора нужно указать его для каждого экрана в проекте, а также поместить на расшаренной сцене с альфой = 0. (Чтобы подтягивался ресурс при экспорте и но не было переключений между текстурами). При загрузке приложения [[Options|опциям]] нужно вызывать состояние readCursor. Также в файле app.icf в параметрах нужно указать id ресурса для курсора (используя param_name и param_value).<br />
*Таким же образом (используя param_name и param_value) указываем параметр lang = en.<br />
*Геймцентра нет, но есть локальные достижения. Для их показа в [[Gamecenter]] нужно указать текст для этих достижений.<br />
*В веб-версиях человек может играть в фулскрине, для этого нужно сделать кнопки смены режима (обычный/фулскрин). Также нужно предусмотреть выход из фулскрина, при совершении покупки (Устанавливать опциям fullScreen = 0, при нажатии на кнопку совершения покупки).<br />
*Для веб-версий нужно отключить иконку социальной сети, выключив vis картинке, указанной в поле snIco, в темплейте иконки друга.<br />
*Механизма постов на стену нет, надписи "Поделиться" быть не должно. Кнопку "Поделиться" из окна коллекций делаем недоступной.<br />
*Также прячем в настройках чекбокс "Уведомления". На Yahoo их нет.<br />
*Каждый экран должен быть упакован в отдельный пак. После экспорта, видео в формате absmp4 нужно изменить формат на mp4. Также нужно изменить расширение для видео в файле *.sirx.<br />
<br />
=Steam=<br />
*Значение переменной market = "steam".<br />
*Экспортируется как обычная виндовая версия win_abs.<br />
*Для отображения сплеш скрина компании рядом с .exe файлом должен лежать файл default.dat. Создается он следующим образом: <br />
- 1. В папке ..\project\icons\splash выбирается иконка размера 1024*768.<br />
- 2. Через paint эта картинка сохраняется как .bmp.<br />
- 3. И переименовывается на default.dat.<br />
Либо вариант видео: в кофиги платформы добавить файл splash.ogv. <br />
Еще в app.icf в группе Game указать fullScreenOnStart=1. <br />
*Для запуска приложения также рядом с .exe файлом должен лежать файл steam_appid.txt, содержащий только id приложения (просто число, без "id=" и т.д.). Этот id дают маркетологи. А вообще его нужно положить в конфигурациях .....\project\platforms\win_abs. При сборке он подтянется.<br />
*Объект Facebook не функционален. Сделать картинкой для улучшения производительности. <br />
*Объект Advertisement тоже сделать картинкой.<br />
*Вся графика проекта должна находится в нулевом паке.<br />
*Удалить из проекта все ссылки на absolutist.com и другие ресурсы, куда может перейти пользователь и купить игры вне Steam. <br />
<br />
<br />
[[Category:Projects]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_Viewer&diff=9606Интерфейс Viewer2018-07-06T07:12:39Z<p>Arudaya: </p>
<hr />
<div>{{TOC right}}<br />
=Начало работы со вьювером =<br />
'''Вьювер''' — приложение, визуализирующие созданную игру, и дающее возможность выявить ошибки и артефакты до начала тестирования. <br><br />
Вьювер предназначен для отладки и тестирования созданной игры самим гейм- дизайнером.<br><br />
Вьювер запускается непосредственно из ScenceEditor двумя способами из меню Вьювер - Открыть вьювер или кликом по кнопке [[Файл:00_9.png]]<br><br />
Для закрытия вьювера нажимаем «Закрыть» или клавишу Esc <br><br />
Перед запуском вьювера необходимо выбрать экран или сцену на экране, который начнёт проигрываться, и сохранить проект. <br />
Может быть запущено несколько вюверов.<br><br />
При визуализации игры размеры окна вьювера можно изменять (растягивать / сжимать)<br><br />
==Особенности работы двух вьюверов одновременно==<br />
Последний запущенный вьювер отображает внесенные и сохраненные изменения перед его запуском. Предыдущий запущенный вьювер — не будет отображать изменения в проекте, внесенные после его запуска<br><br />
<br />
=Вывод сообщений об ошибках в окне вьювера=<br />
<br />
В ходе создания приложения возникают ошибки, которые вьювер отлеживает и отображает в своем окне.<br><br />
На примере ниже рассмотрим структуру сообщений об ошибках.<br><br />
Предположим, по клику на кнопку А пользователь должен прочитать сообщение, нажать на кнопку Б и уйти на другой экран.<br><br />
Алгоритм программы без ошибок:<br><br />
1. при клике на кнопку А, изменяется состояние машины MASH на see.<br><br />
2. Состояние see машины MASH показывает обьект TEXT c фразой и проявляет кнопку Б.<br><br />
3. При клике на кнопку Б переходим на другой экран<br><br />
<br />
Однако гейм-дизайнер допустил ряд ошибок:<br><br />
1) при клике на кнопку А изменил состояние машина MASH на не существующее (asd)<br><br />
2) В свойстве обьекта TEXT не указал фразу персонажа<br><br />
3) Случайно удалил кнопку Б с экрана, а ссылка на нее осталась в машине MASH<br><br />
<br />
'''Вьювер отобразит ошибки:'''<br><br />
''При обращении к несуществующему состоянию обьекта.'' На экране будет отображен номер и тип обьекта, состояние которого пытаются вызвать,а также имя несуществующего состояния обьекта.<br> <br />
[[Файл:Ошибка_тип_1.JPG|300px]] <br> <br />
''При создании обьекта, которому не установили обязательные параметры, или при удалении обьекта из дерева проекта могут оставаться ссылки на него в других обьектах''. В таком случае вьювер вероятнее всего проигнорирует написанный Вами код и ничего не отобразит в своем окне.<br />
<br />
=Клавиша F1=<br />
[[Файл:Вьювер_1.JPG|right|200px]] Список команд, доступных во вьювере, вызываемых по нажатию клавиши F1: <br />
*F2 (help) — открывается панель отладки приложения<br />
*S (states) – при вызове команды на экране отображаются состояния объектов, у которых включена отладка<br />
*F(frames) — отображаются границы обьектов<br />
*V(verbose) – в браузере, установленном по умолчанию, откоется xml — код визуализируемой сцены<br />
*T(fps) — отобразится информация о загрузке операционной памяти ПК<br />
*M(mouse) – при клике по обьекту отобразятся координаты мыши <br />
*D(device) - параметры экрана устройства, под которое разрабатвается приложение<br />
*R(reload) — перезагружает во вьювер весь проект и визуализирует первый по списку экран проекта, но при этом считывает все параметры, записанные в опции<br />
*space – останавливает все процессы игры на данном экране. Для повторного запуска нажимаем space.<br />
Список команд закрывается при повторном нажатии клавиши F1<br />
<br />
=Клавиша F2=<br />
При клике на клавишу F2 вызвается панель отладки, позволяющая осуществить :[[Файл:Вювер_3.JPG|500px|right]]<br><br />
*переходы между экранами<br />
*вызов других команд вювера<br />
*отслеживать запись параметров в опции (в файл options)<br />
*переключение между локализациями на разные языки<br />
*настройка цвета текста, отображаемого на экране<br />
На рисунке справа приведен вид экрана с включеной панелью отладки. <br><br />
Панель отладки закрывается при повторном нажатии клавиши F2<br><br />
'''Замечания:'''<br />
*Для перехода на другой экран кликните по названию экрана левой кнопкой мыши.<br />
*Для выбора оптимального цвета шрифта информации,отображаемой на экране поставьте галочки на панели выбора цвета шрифта или кликаем по клавише С<br />
*Для выбора языка локализации игры кликните левой кнопкой мыши по аббревиатуре языка.<br />
*При клике на кнопку Reload во вьювер перезагружается весь проект и визуализируется первый экран в дереве экранов проекта<br />
*При клике на кнопку Save записываются текущие параметры игры (обьектов) и отображаются по порядку в области записи параметров прохождения игры. При клике на запись в области записи параметров прохождения игры игра возвращается в то состояние, после которого были записаны параметры игры.<br />
*При вызове команды time отобразится информация о загрузке операционной памяти ПК/<br />
*При клике на кнопку log записываются текущие статусы обьектов во viewer.log<br />
*При вызове команды log откроется меню в панели отладки (отобразятся кнопоки hystory и pause) и одновременно на экране отобразится информация об изменении состояний и свойств обьектов во время прохождения игры в режиме реального времени. При клике на pause информация перестанет изменяться при клике на любые обьекты.<br><br />
*При вызове команды flyers показывается состояние всех флаеров<br />
<br />
В нашем проекте может быть создано несколько лэйаутов под разные магазины, платформы и устройства. Для переключения между лэйатуами кликнем по его названию в правом верхнем углу. Для визуализации приложения на разных типах устройствах кликнем по списку устройств, расположенному чуть выше области записи параметров прохождения игры.<br><br />
'''Примечание:'''<br />
Для того, чтобы была возможность визуализации игры на разных устройствах, необходимо в файле viewer.xml , расположенному в Application Data\Absolutist\Viewer, в параметрах <br />
autoScX и autoScY прописать значения, подобранные относительно выбраного разрешения и устройства, моделью которого будет являться окно вьювера при визуализации игры.<br><br />
<br />
=Клавиши F7 и F8=<br />
Нажатие клавиш ''F7'' и ''F8'' позволяет симулировать горячие кнопки девайсов работающих на платформе Android - Home и Back<br />
<br />
=Клавиша S (states)=<br />
Для отслеживания перехода обьекта в различные состояния в процессе проигрывания игры необходимо свойству обьекта Отладка присвоить вкл и при визуализации экрана нажать клавишу S.<br><br />
Ниже приведен пример отображения информации в окне вьювера при включенной функции states.<br />
На экране отображена следующая информация:<br />
*имя экрана <br />
*уникальный номер и имя обьекта<br />
*имя состояния, в котором обьект находится в данную секунду<br />
[[Файл:States.JPG |500px|right]]<br><br />
'''Замечание:'''<br />
*Не все обьекты имееют свойство Отладка.<br />
*Для некоторых обьектов отображается дополнительная служебная информация (например, для обьектов типа mashine)<br />
*Для получения более детальной информации о смене состояний и параметров обьектов в течении нескольких секунд рекомендуется воспользоваться кнопкой pause панели Отладка<br />
<br />
==Включение отслеживания обьектов в процессе визуализации игры==<br />
Существует возможность включения отслеживания перехода обьекта в другое состояние при визуализации игры. При включении функции states в левом верхнем углу появляется:<br><br />
*поле ID, куда необходимо вписать уникальный номер объекта,<br />
*кнопка ADD – добавить обьект в / в список обьектов, изменение состояния которых отслеживается на экране<br />
*кнопка DEL – удалить объект из списка бьектов, изменение состояния которых отслеживается на экране<br><br />
[[Файл:Frames_F.JPG|right|400px]]<br><br />
<br />
=Кнопка F (frames)=<br />
В процессе размещения на сцене различных обьектов возникает необходимость отслеживать:<br><br />
*обьекты, которые прокликиваются,не должны перекрываться другими<br />
*обьекты должны находится в точно заданных границах (например, при создании хидден-игр)<br />
*обьекты, расположенные на разных сценах, не должны перекрываться другими<br />
Во вьювере при клике на клавишу F отобразятся границы всех обьектов, расположенных на экране.<br><br />
'''Замечание:''' Границы обьектов выделяются разными цветами. <br><br />
<br />
<br />
<br />
<br />
=Кнопка V (verbose)=<br />
[[Файл:verbose.JPG|right|500px]]<br />
При визуализации может возникнуть необходимость просмотреть параметры обьектов, расположенных на визуализируемой сцене, не переходя в ScenceEditor и не открывая xml-файл проекта.<br><br />
Нажимаем кливишу V и в браузере установленном по умолчанию отобразится файл viewer_info.html, в котором описаны объекты, расположенные на визуализируемой сцене.<br><br />
<br />
'''Замечание.''' Файл viewer_info.html расположен в \Application Data\Absolutist\Viewer<br><br />
<br />
= Клавиша T (fps,time)=<br />
<br />
В процессе визуализации экрана полезно отслеживать такие параметры:<br><br />
*как использование памяти<br />
*какие экраны одновременно подгружены в память в месте с экраном, воспроизводимым в данную минуту<br />
*количество обьектов, расположенных на экране<br />
*количество кадров в минуту<br />
*количество ошибок<br />
Для получения всей этой информации мы нажимаем клавишу T.<br><br />
[[Файл:Time.JPG|800px]]<br><br />
Отображаемые параметры:<br><br />
*f: - количество кадров в секунду. (должно быть больше 30)<br />
*loading screen – имя экрана, загружаемого перед этим (если включена функция предзагрузки экрана)<br />
*img – количество загруженых обьектов<br />
*ram+vram - суммарное количество занимаемой памяти . Значение параметра max – максимальное суммарное количество занимаемой памяти в какой-то момент визуализации игры<br />
*RAM — группа параметров:<br />
#первый параметр — количество памяти, указанное в файле app.icf<br />
# need - количество памяти необходимое для игры<br><br />
# used – количество памяти используемое игрой<br><br />
# max – максимальное количество памяти, требуемой для игры<br><br />
#free – количество свободной памяти<br><br />
*VRAM – количество занимаемой памяти приложением и максимальное занимаемая память<br><br />
*OS free mem -количество свободной памяти на устройстве<br><br />
Render:<br />
*textures: количество загруженых картинок<br />
*imPerLastFrame: картинок в последнем кадре<br />
*imBatchPerLastFrame: упакованных картинок, если значение совпадает с значением в max для этого параметра - значит графика не была упакована в текстуры.<br />
<br />
=Клавиша М (mouse)=<br />
[[Файл:Mouse.JPG|right|300px]]<br><br />
Иногда бывает ситуация, когда по клику в некоторой заданой области должно производиться некоторое действие. Для уточнения границы такой области воспользуемся функцией Mouse (клавиша М).<br><br />
На экране отобразится координата последнего выполненного клика.<br />
<br />
=Клавиша D (device)=<br />
Для получения информации о масштабе визуализации игры в окне вьювера необходимо нажать клавишу D в окне вьювера. <br />
На экране отобразится информация:[[Файл:Device.JPG|right|400px]]<br><br />
*W – размеры окна вьювера<br />
*L – размеры лэйаута<br />
*D - размеры устройства.<br />
*S – масштаб окна вьювера (относительно размеров лэйаута)<br><br />
Примечание. Значения параметра D забираются из файла viewer.xml , который расположен в Application Data\Absolutist\Viewer<br />
<br />
=Клавиша С=<br />
Нажатие клавиши ''С'' в тот момент когда на вьювере отображена какая-либо информация, позволяет менять цвет шрифта. Удобно если цвет текста сливается с бекграуном.<br />
<br />
<br />
<br />
=Клавиша SPACE=<br />
Нажатие клавиши SPACE "ставит на паузу" отображаемый во вьювере проект..<br />
<br />
<br />
=Клавиша A или покадровая отрисовка=<br />
При нажатии на A включается режим покадровой отрисовки, один кадр отрисовывается медленнее с подсветкой текущей текстуры.<br />
<br />
:Клавиша "space" - тормозит отрисовку и руками можно перемещаться в обе стороны стрелками "<-" или "->" <br />
:Клавиши "<-","->" - смещение на пред./след. отрисовываемую графику; <br />
:Клавиши "вверх", "вниз" - увеличивает / уменьшает скорость отрисовки;<br />
:Клавиша "S" показывает вставляемую текстуру<br />
<br />
<br />
[[Category:AppSalute]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=Statesmanager&diff=9595Statesmanager2018-06-23T06:13:15Z<p>Arudaya: /* Очередь из окон */</p>
<hr />
<div>[[Object|Объект]] предназначен для постановки объектов в очередь выполнения единообразными командами. Можно применять для управления отображением всплывающих окон.<br />
<br />
=Свойства=<br />
<br />
==Процесс==<br />
*'''объект открытия''' (obj) - объект который будет переведён в заданное состояние, если данный объект будет первым в очереди на открытие и передадим менеджеру окон состояние ''next''; <br />
*'''состояние открытия''' (st) - перевести выбранный объект в заданное состояние;<br />
*'''объект back''' (obj_b) - объект который будет переведён в заданное состояние, если данный объект будет первым в очереди на закрытие и передадим менеджеру окон состояние ''back''; <br />
*'''состояние back''' (st_b) - перевести выбранный объект в заданное состояние.<br />
<br />
==Визуализация окон==<br />
*'''fading_t''' - Время фейдинга для окон типа ''по альфе''. Statesmanager'у должен приходить таймер!!!<br />
<br />
<br />
=Дополнительные параметры=<br />
[[Файл:+.png]] '''изменить состояние объекта - очередь back пуста:'''<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''изменить состояние объекта - очередь next пуста:'''<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
=Параметры которые мы можем считать из statesmanager=<br />
*'''n_back''' - количество событий в очереди на закрытие (не учитывая события добавленные как попапы);<br />
*'''n_next''' - количество событий в очереди на открытие (не учитывая события добавленные как попапы).<br />
*'''n_popup''' - количество событий открытых как попапы.<br />
<br />
<br />
=Состояния=<br />
*'''add_first''' - добавить событие в начало очереди на открытие;<br />
*'''add_first_uni''' - добавить событие в начало очереди на открытие, но если данное событие уже добавлено в очередь, то повторно оно не добавиться (удобно если окно не должно открываться дважды);<br />
*'''add_last''' - добавить событие в конец очереди на открытие;<br />
*'''add_last_uni''' - добавить событие в конец очереди на закрытие, но если данное событие уже добавлено в очередь, то повторно оно не добавиться;<br />
*'''add_popup''' - добавить в очередь попапов событие, и сразу его открыть (добавляется в очередь беков на закрытие в начало). Примечание попапы добавляются в свою очередь на закрытие и открытие, параметры объекта statesmanagera (n_back и n_next) не повышаются при добавления попапа. <br />
*'''add_popup_uni''' - добавить попап с проверкой уникальности;<br />
*'''next''' - активировать первое событие в очереди на открытие;<br />
*'''back''' - активировать back для текущего события в очереди на закрытие;<br />
*'''clear''' - очищает стек очереди, очищает обе очереди (на открытие и на закрытие, включая попапы);<br />
*'''clear_back''' - очищает стек очереди на закрытие ( чистит очередь окон на закрытие, очередь попапов не трогает);<br />
*'''delete''' - удалить из очереди элемент с id из param;<br />
*'''log''' - записывает в лог, три очереди ( очередь next и две очереди беков (попапы и окна)):<br />
*'''add_state_last''' - добавить в очередь состояний вызываемых при закрытых окнах<br />
<br />
==================================================<br />
NEXT QUEUE<br />
id = 15, st = open<br />
id = 18, st = open<br />
id = 21, st = open<br />
id = 72, st = open<br />
id = 68, st = open<br />
id = 80, st = open<br />
id = 80, st = open<br />
id = 76, st = open<br />
03/10/14 11:53:17.485: <br />
==================================================<br />
POPUP QUEUE<br />
03/10/14 11:53:17.485: <br />
==================================================<br />
BACK QUEUE<br />
id = 11, st = open<br />
<br />
<br />
==Альтернативное описание состояний, взятое прямиком из кода==<br />
"idle", //!< Состояние простоя<br />
"add_first", //!< Добавить событие в начало очереди<br />
"add_last", //!< Добавить событие в конец очереди<br />
"add_first_uni", //!< Добавить событие в начало очереди<br />
"add_last_uni", //!< Добавить событие в конец очереди<br />
"next", //!< Активировать первое событие в очереди<br />
"back", //!< Активировать back для текущего события в очереди<br />
"clear", //!< Очистить обе очереди<br />
"add_popup", //!< Начать ветку попапов от текущего элемента очереди. Срабатывает<br />
//!< сразу, до зачиски всех попапов next не делает ничего, back сначала <br />
//!< закрывает попапы<br />
"delete", //!< Удалить из очереди элемент с id из param;<br />
"log" //!< Вывести содержимое всех трех очередей в лог<br />
"double_back", //!< двойной back (и отличная песня ZZ Top, к тому же)<br />
"triple_back" //!< тройной back<br />
<br />
=Схема работы=<br />
<br />
1) Добавить объекты по одному в очередь<br />
<br />
2) вызывать состояния next или back - объекты у которых вызваны состояния убираются из очереди<br />
очередь разбирается с конца<br />
<br />
<br />
=Пример реализации=<br />
<br />
==Очередь из окон==<br />
Задача: У нас открывается окно 1, после его закрытия открывается окно 2,окно 3 и т.д. (после закрытия одного окна открывается другое).<br />
<br />
Пример: Закончили уровень, и после закрытия окна с результатами, мы должны показать два окошка с новыми задачами.<br />
<br />
<br />
'''Реализация:'''<br />
<br />
*'''1) Открываем окно с результатами:'''<br />
:Из машины окна, вызываем состояние ''next'' машине обработчику менеджера окон (9win_root). Предварительно записываем состояния для закрытия и открытия данного окна машины (состояния ''close'' и ''open'' соответственно):<br />
<br />
::[[Файл:Statesmanager W next.png]]<br />
<br />
:В машине обработчике менеджера окон (9win_root), в состоянии ''next'' мы задаём менеджеру окон и передаём состояние ''add_first'', а затем ''next''. То есть мы добавляем первым в очередь на открытие наше окно с результатами и его открываем:<br />
<br />
::[[Файл:Statesmanager Next.png]]<br />
<br />
<br />
*'''2) Добавляем в очередь окно с задачей:'''<br />
:Из машины окна, вызываем состояние ''add'' машине обработчику менеджера окон (9win_root). Предварительно записываем состояния для закрытия и открытия данного окна машины (состояния ''close'' и ''open'' соответственно):<br />
<br />
::[[Файл:Statesmanager W add.png]]<br />
<br />
:В машине обработчике менеджера окон (9win_root), в состоянии ''add'' мы задаём менеджеру окон и передаём состояние ''add_last''( то есть мы добавляем окно в конец очереди на открытие).<br />
:[[Файл:Statesmanager.Add.png]]<br />
<br />
<br />
*'''3) Аналогично добавляем другие задачи.'''<br />
<br />
<br />
*'''4) Для закрытия окна с результатами уровня, мы передаём менеджеру окон состояние ''back'' (закрываем окно, первое в списке на закрытие), а затем состояние ''next'' (открываем первое окно в очереди на открытие, в нашем случае - первую добавленную задачу) '''.<br />
<br />
<br />
[[Category:Main objects]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=2048&diff=959420482018-06-22T09:10:38Z<p>Arudaya: /* Настройка игрового объекта */</p>
<hr />
<div>{{TOC right}}<br />
'''2048''' (twentyfourtyeight) - встроенный объект редактора, который реализует механику игры [https://ru.wikipedia.org/wiki/2048_(%D0%B8%D0%B3%D1%80%D0%B0) 2048]. <br />
<br />
== Правила игры ==<br />
<br />
1. Для игры используется поле размером 4х4, по которому могут перемещаться плитки с цифрами(цифры, являются степенью 2).<br /><br />
2. В начале игры на игры на поле имеется 2 плитки, с номиналом 2 или 4.<br /><br />
3. С помощью свайпа игрок может скинуть все плитки игрового поля в одну из 4 сторон.<br /><br />
4. После свайпа в свободной клетке появляется плитка с номиналом 2 или 4.<br /><br />
5. Если при сбрасывании две плитки одного номинала «налетают» одна на другую, то они слипаются в одну,<br /> номинал которой равен сумме соединившихся плиток.<br /><br />
6. Если при свайпе местоположение плиток или их номинал не изменится, то ход не совершается.<br /><br />
7. За каждое соединение игровые очки увеличиваются на номинал получившейся плитки.<br /><br />
8. Игра заканчивается, если после очередного хода невозможно совершить действие.<br /><br />
9. Для победы нужно получить плитку номиналом 2048(или другое значение, указанное в параметрах).<br /><br />
<br />
<br />
== Основные параметры ==<br />
<br />
Кроме базовых параметров [[Object|объекта]], имеет ряд специализированных параметров.<br />
[[Файл:Param.png|thumb|right|500|Параметры объекта 2048]]<br />
<br />
''(Курсивом в скобках указан id параметра, или состояния)''.<br />
<br />
*'''ячейка сетки''' ''(cell_res)'' - Графический ресурс, для отображения плитки.<br />
*'''ободок ячейки''' ''(cell_border_res)'' - Графический ресурс ободка плитки.<br />
*'''графика цифр''' ''(num_pics)'' - Клип с картинками цифр. Цифрам 2,4,8,16,32... соответствую кадры 0,1,2,3,4....<br />
<br />
<br />
'''Группа - размер поля''' - Позволяет изменять размер стандартного игрового поля (4х4).<br />
*'''столбцов''' ''(cols)'' - Ширина игрового поля.<br />
*'''строк''' ''(rows)'' - Высота игрового поля.<br />
<br />
<br />
*'''задержка анимации числа''' ''(number_scaling_delay)'' - Задержка после анимации появления, после которой начнётся анимация числа внутри ячейки.<br />
*'''область текста''' ''(max_cell_text_ratio)'' - Максимальная область, занимаемая текстом относительно размеров ячейки.<br />
*'''время перемещения''' ''(item_moving_time)'' - Время, за которое элементы будут перемещены в одну сторону в миллисекундах.<br />
*'''чувствительность свайпа''' ''(swipe_length)'' - Количество пикселей, которые нужно провести, прежде чем сработает событие свайпа.<br />
*'''пульсация при матче''' ''(scale_number_on_match)'' - Разрешает анимацию номера внутри ячейки после матча.<br />
*'''пульсация при появлении''' ''(scale_number_on_appear)'' - Разрешает анимацию номера внутри ячейки при появлении.<br />
<br />
<br />
'''Группа - анимация появления'''<br />
*'''время масштабирования''' ''(item_scaling_time)'' - Время за которое масштаб достигнет максимума в миллисекундах.<br />
*'''минимум масштаба''' ''(item_scaling_start)'' - Пороговое значение масштаба, с которого элемент начнёт увеличиваться.<br />
*'''максимум масштаба''' ''(item_scaling_end)'' - Пороговое значение масштаба, после которого элемент начнёт уменьшаться.<br />
<br />
<br />
'''Группа - шрифт'''<br />
*'''имя''' ''(font)'' - Ещё не реализовано.<br />
*'''размер''' ''(font_size)'' - Размер шрифта в пикселях.<br />
<br />
<br />
'''Группа - звуки'''<br />
*'''звук свайпа''' ''(swipe_sound)'' - Id звука в редакторе ресурсов. Перетягивается мышкой с редактора ресурсов(Поле должно быть активно для редактирования).<br />
*'''звук появления''' ''(appear_sound)'' - Id звука в редакторе ресурсов. Перетягивается мышкой с редактора ресурсов(Поле должно быть активно для редактирования).<br />
*'''звук матча''' ''(match_sound)'' - Id звука в редакторе ресурсов. Перетягивается мышкой с редактора ресурсов(Поле должно быть активно для редактирования).<br />
<br />
<br />
*'''счетчик очков''' ''(score_counter)'' - Счетчик, куда будут выводится заработанные очки.<br />
*'''набрать очков''' ''(score_to_reach)'' - Количество очков которые требуются, чтобы выиграть игру.<br />
*'''достигнуть значения''' ''(value_to_reach)'' - Достигнуть значения на поле, чтобы выиграть. Значение должно быть степенью двойки.<br />
<br />
<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:Additional option.png|thumb|right|500px|Дополнительные параметры объекта 2048]]<br />
<br />
[[Файл:+.png]] '''Добавить цвет для значения'''''(color_list)'' - Добавить цвет ячейки, соответствующий определённому значению.<br />
*'''значение''' ''(item_value)'' - Значение. Должно быть степенью двойки. Ноль для цвета фона.<br />
*'''цвет фона''' ''(item_color)'' - Цвет ячейки с соответствующим значением.<br />
*'''цвет шрифта''' ''(item_font_color)'' - Цвет шрифта ячейки, которым будет отрисовано значение.<br />
<br />
<br />
[[Файл:+.png]] '''игра проиграна: изменить параметр (свойство) объекта'''''(game_lost_param)'' - Когда игра проиграна изменить параметр объекта.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект меняет свой параметр.<br />
*'''свойство''' ''(par)'' - Параметр, который мы изменяем.<br />
*'''значение''' ''(val)'' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''игра проиграна: изменить состояние объекта'''''(game_lost_state)'' - Когда игра проиграна перевести объект в новое состояние.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект переходит в состояние из следующего поля.<br />
*'''состояние''' ''(st)'' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''игра выиграна: достигнуто значение'''''(game_value_reached_param)'' - Когда игра выиграна изменить параметр объекта.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект меняет свой параметр.<br />
*'''свойство''' ''(par)'' - Параметр, который мы изменяем.<br />
*'''значение''' ''(val)'' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''игра выиграна: достигнуто значение'''''(game_value_reached_state)'' - Когда игра выиграна перевести объект в новое состояние.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект переходит в состояние из следующего поля.<br />
*'''состояние''' ''(st)'' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''игра выиграна: набраны очки'''''(game_score_reached_param)'' - Когда игра выиграна изменить параметр объекта.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект меняет свой параметр.<br />
*'''свойство''' ''(par)'' - Параметр, который мы изменяем.<br />
*'''значение''' ''(val)'' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''игра выиграна: набраны очки'''''(game_score_reached_state)'' - Когда игра выиграна перевести объект в новое состояние.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект переходит в состояние из следующего поля.<br />
*'''состояние''' ''(st)'' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''достигнуто новое максимальное значение'''''(game_reached_new_max_value_param)'' - Достигнуто новое максимальное значение в клетке: изменить параметр (свойство) объекта. Само значение можно получить из поля maxValue.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект меняет свой параметр.<br />
*'''свойство''' ''(par)'' - Параметр, который мы изменяем.<br />
*'''значение''' ''(val)'' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''достигнуто новое максимальное значение'''''(game_reached_new_max_value_state)'' - Достигнуто новое максимальное значение в клетке: изменить состояние объекта. Само значение можно получить из поля maxValue.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект переходит в состояние из следующего поля.<br />
*'''состояние''' ''(st)'' - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''ход завершен'''''(turn_done_param)'' - Изменить параметр (свойство) объекта, когда был сделан ход.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект меняет свой параметр.<br />
*'''свойство''' ''(par)'' - Параметр, который мы изменяем.<br />
*'''значение''' ''(val)'' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''ход завершен'''''(turn_done_state)'' - Изменить состояние объекта, когда был сделан ход.<br />
*'''объект''' ''(obj)'' - После успешной вставки этот объект переходит в состояние из следующего поля.<br />
*'''состояние''' ''(st)'' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
== Примечания и дополнения ==<br />
Из объекта можно вычитать несколько значений: '''maxValue''', '''maxValueCellX''', '''maxValueCellY'''.<br />
*'''maxValue''' - максимальное значение в клетке. Есть одна особенность: если сделать переход на другой экран по событию "игра выиграна: достигнуто значение" и при этом считывать maxValue, с дальнейшей записью в опции. То в опциях будет записано предыдущее значение maxValue.<br />
То есть, если для победы нужно набрать 2048, то при получении этого числа в соответствующую переменную в опциях будет записано 1024.<br />
*'''maxValueCellX''' - координата x ячейки(собранной первой) с максимальным значением.<br />
*'''maxValueCellY''' - координата y ячейки(собранной первой) с максимальным значением.<br />
<br />
Одно из возможных применений данных координат: вместе с событием "достигнуто новое максимальное значение" сделать эффект для сборки нового максимального значения.<br />
<br />
При использовании была замечена ситуация некорректной работы объекта: на игровом поле размещалась неподвижная плитка, которая иногда пряталась под другие плитки, иногда прятала плитки под себя. С другими плитками не матчилась. В основном данная ситуация наблюдалась когда управление реализовывалось с помощью клавиш. И возникала при многократном нажатии всех 4 клавиш. ''(В скором времени будет исправлено.)''<br />
<br />
Свою конфигурацию объект не запоминает. Продолжить работу с объектом при возвращении после перехода на другой экран нельзя.<br />
<br />
== Состояния ==<br />
Объекту можно передавать состояния: '''create_items''', '''undo''', '''skip''', '''swipe_left''', '''swipe_right''', '''swipe_up''', '''swipe_down''', '''mix''', '''restart'''.<br />
*'''swipe_(right, left, up, down)''' - Передача данных состояний объекту равносильно свайпу в соответствующем направлении. С помощью данных состояний можно управлять объектом кнопками(или другими объектами) на экране. Также, если использовать объект controls, можно реализовать управление с помощью клавиш.<br />
*'''create_items''' - Используется для запуска объекта. При этом на поле появляются 2 плитки.<br />
*'''undo''' - Используется для отмены хода. Отменить можно только один ход. Использовать осторожно, так как, если сделать отмену до первого свайпа, то отменится состояние "create_items". И на экране будет пустое игровое поле. ''(Данная ситуация в процессе доработки программистами)''<br />
*'''skip''' - Пропуск хода. При использовании появляется новая плитка без совершения свайпа. Также после передачи этого состояния сработает событие "ход завершен".<br />
*'''mix''' - Перемешает плитки на игровом поле.<br />
*'''restart''' - Полностью перезапустит игру.<br />
<br />
== Пример ==<br />
Можно посмотреть по адресу:<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample\2048.7z<br />
<br />
== Настройка игрового объекта ==<br />
[[Category:Game mechanic]]<br />
<br />
Настроим проект 2048.<br />
Создаем объект twentyfourtyeight и задаем ему значения: <br />
<br />
[[Файл:w3.png|200px|thumb|right|2048]]<br />
[[Файл:w1.png]]<br />
[[Файл:w4.png|right]]<br />
<br />
После настройки объекта twentyfourtyeight необходимо добавить 4 кнопки ([[button]]) управления: <br />
<br />
*arrow_down_norm (вниз), <br />
<br />
*arrow_left_norm (лево), <br />
<br />
*arrow_right_norm (право), <br />
<br />
*arrow_up_norm (вверх)<br />
<br />
Для связи кнопок с игрой необходимо создать в объекте [[controls]] 4 копии машин down, left, right, up.<br />
<br />
(в машинах меняеться только состояние)<br />
<br />
*swip_down (вниз),<br />
<br />
*swip_left (лево), <br />
<br />
*swip_right (право), <br />
<br />
*swip_up (вверх).<br />
<br />
[[Файл:w5.png]] [[Файл:w6.png]]<br />
<br />
В машине start_game прописываем запуск игры<br />
<br />
[[Файл:w7.png]]<br />
<br />
В таймере ([[timer]]) и счетчиках ([[counter]]) прописываем уровень игры<br />
<br />
[[Файл:w8.png]] [[Файл:w9.png]]<br />
<br />
Для кнопок «пропустить ход» и «отменить ход» создаем машины с двумя состояниями, в кнопках изменяем состояние объекта<br />
<br />
[[Файл:w10.png]]<br />
<br />
Для кнопки «сброс» машина reset_game<br />
<br />
[[Файл:w11.png]]<br />
<br />
Для сохранения игровых параметров, использования на итоговом экране и переходим на этот экран создаем машину data_save<br />
<br />
[[Файл:w12.png|data_save]]<br />
<br />
На экране результатов создаем 3 счетчика, таймер, текст и кнопки перехода. <br />
<br />
[[Файл:w13.png|200px|thumb||left|Экран результатов game_result]]<br />
<br />
[[Файл:w14.png]]<br />
<br />
Машина occured_victory нужна для показания результатов игры<br />
<br />
В обьекте 2048 указываем состояние машины occured_victory<br />
<br />
[[Файл:w15.png|occured_victory]] <br />
<br />
[[Файл:w16.png]]<br />
<br />
Машина reference_values передает в счетчики значения (запускается машиной data_save)<br />
<br />
[[Файл:w17.png|reference_values]]<br />
<br />
Машина result_game выводит текст на экран результатов с активными масками<br />
<br />
[[Файл:w18.png|result_game]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=Flyer&diff=9593Flyer2018-06-22T09:10:02Z<p>Arudaya: /* Основные параметры */</p>
<hr />
<div>[[Файл:flyer_fountain_property.JPG|right]]<br />
<br />
'''Flyers '''(флаеры, партиклы)- летающие картинки, при помощи этого [[Object|объекта]] можно реализовывать различные эффекты: взрывы, падающие снежинки, дождь, фонтан, огонь, летающая пыль, дым, пар и т.п.<br />
<br />
== Общие параметры ==<br />
<br />
(см. описание [[Object|Object]])<br />
*'''имя''' - Имя объекта Flyer в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта Flyer, который можно увидеть при наведении курсора на строку "имя".<br />
*'''синхронизация''' - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' - Если 1, то при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана). По умолчанию значение этого параметра 0.<br />
*'''тип''' - Тип флаера. Определяет его функциональное назначение и его свойства. Для флаера возможны следующие типы: "картинки", "текст". Выбирается подходящий тип из выпадающего списка. По умолчанию указан тип "картинки".<br />
<br />
== Основные параметры ==<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''картинка''' - Служит для рисования флаера в случае выбора типа флаера "картинки" В поле этого параметра находится имя графического ресурса (частицы), перетаскиваемого мышкой из редактора ресурсов (поле должно быть в состоянии редактирования). <br />
*'''текст''' - Служит для рисования флаера в случае выбора типа флаера "текст". <br />
<br />
При выборе типа флаера "картинки" параметр "текст" игнорируется и наоборот. Вместе текст и картинка не существуют.<br />
<br />
<br />
'''Группа - шрифт'''<br />
<br />
Служит для настройки внешнего вида текста в случае выбора типа флаера "текст".<br />
*'''имя''' - Номер шрифта - целое число, начиная с 0 (порядковый номер шрифта). <br />
*'''размер''' - Размер шрифта в пикселях. <br />
*'''цвет''' - Цвет шрифта.<br />
<br />
<br />
'''Группа - модификаторы'''<br />
<br />
*'''alpha''' ''(al)'' - Изменяет прозрачность используемого ресурса: от 0 (прозрачен) до 1 (не прозрачен).<br />
*'''blending''' ''(bl)'' - Alpha смешивание. Взаимодействие каждой новой частицы (source) с раннее отрисованными (dest). Значения данного параметра выбираются из выпадающего списка. Каждый отдельный цвет, который мы видим, создается с помощью комбинации трех цветов: красного (red), зеленого (green) и синего (blue). RGB - является их аббревиатурой . Разные значения модификатора "blending" отличаются способ вычисления значений RGB-каналов и значения прозрачности.<br />
<br />
''' blend ''' - смешивание.<br />
<br />
Rback = (Rsource * Ralpha) + (Rdest * (1 - Ralpha)) <br />
<br />
Gback = (Gsource * Galpha) + (Gdest * (1 - Galpha))<br />
<br />
Bback = (Bsource * Balpha) + (Bdest * (1 - Balpha)) <br />
<br />
Aback = (Asource * Aalpha) + (Adest * (1 - Aalpha))<br />
<br />
<br />
''' half ''' - деление пополам.<br />
<br />
Rback = (Rsource + Rdest) / 2 <br />
<br />
Gback = (Gsource + Gdest) / 2 <br />
<br />
Bback = (Bsource + Bdest) / 2 <br />
<br />
Aback = (Asource + Adest) / 2 <br />
<br />
<br />
''' add ''' - добавление.<br />
<br />
Rback = Rsource + Rdest <br />
<br />
Gback = Gsource + Gdest <br />
<br />
Bback = Bsource + Bdest <br />
<br />
Aback = Asource + Adest <br />
<br />
<br />
''' sub ''' - вычитание.<br />
<br />
Rback = Rsource - Rdest <br />
<br />
Gback = Gsource - Gdest <br />
<br />
Bback = Bsource - Bdest <br />
<br />
Aback = Asource - Adest <br />
<br />
<br />
''' none ''' - ничего не происходит.<br />
*'''angle''' ''(ang)'' - Изменяет угол наклона используемого ресурса. Отсчитывается по часовой стрелке. Против - отсчитываются отрицательные углы. <br />
*'''scaleX/scaleY''' ''(sx/sy)'' – Изменяют масштаб используемого ресурса, но при этом изменяет и положение точки рождения флаера, что делает использование данного модификатора крайне неудобным.<br />
<br />
Модификаторы становятся активными если установлен флаг «использовать модификаторы», в противном случае установленные параметры игнорируются.<br />
<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''звук''' - Звук, который будет запущен при переходе партиклов в состояние beg. Перетаскивается правой кнопки мышки из редактора ресурсов (поле должно быть в состоянии редактирования).<br />
*'''зациклить''' - Если 1, то звук будет зациклен. По умолчанию значение этого параметра 0.<br />
<br />
== Состояния ==<br />
<br />
*'''beg''' – Состояние в котором флаер начинает свой цикл жизни (включается).<br />
*'''end''' – Состояние которое выключает флаер.<br />
*'''stop_birth''' - Состояние заканчивает рождение. В по сути - "горшочек не вари"<br />
*'''start_birth''' - Начать рождения частиц (по сути отмена состояния - "stop_birth");<br />
*'''pause''' - Заморозить частицы - частицы не меняют свои параметры, но при этом остаются видимыми;<br />
*'''run''' - Вернуть частицам рабочее состояние ( снятие состояния "pause");<br />
<br />
== Дополнительные параметры ==<br />
<br />
<br />
'''Область рождения'''<br />
<br />
*'''только контур''' ''(frame)'' - Если 1, то частицы будут рождаться только по контуру, описанному параметрами. Если 0, то по всей площади.<br />
*'''радиус r''' ''(r)'' - Радиус области вокруг (х,у), где рождаются летуны.<br />
*'''горизонтальная rx''' ''(rx)'' - Горизонтальная область рождения. Летуны будут рождаться внутри прямоугольника с шириной 2*rx.<br />
*'''вертикальная ry''' ''(ry)'' - Вертикальная область рождения. Летуны будут рождаться внутри прямоугольника с высотой 2*ry.<br />
<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 />
<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 />
*'''на экране''' - Максимально количество летунов, которые видны на экране.<br />
*'''всего''' - Общее число созданных летунов (с учетом того, что они могут умирать и создаваться до числа "на экране").<br />
*'''каскадов''' - Число каскадных рождений (фейерверк).<br />
*'''время''' - Каждый флаер рождается, живет и умирает. Соответственно, можно задать три параметра (tmBorn, tmLife, tmDie) в ms.<br />
** ''' интенсивность ''' - Интенсивность рождения одного флаера в миллисекундах.<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 />
<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 />
Меню выбора ''Добавляемые параметры'' к объектам активируется по правой кнопки мыши. <br />
<br />
[[Файл:+.png]] '''картинка для рисования флаера''' <br />
*'''картинка для рисования флаера''' - Графический ресурс одного летуна. Перетаскивается мышкой из редактора ресурсов (поле должно быть в состоянии редактирования).<br />
*'''количество картинок этого типа''' - Чем больше это число, тем чаще будет встречаться картинка этого типа.<br />
<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 />
Как уже говорилось, применение к объекту Flyer модификатора '''scale x/scale y''' нежелательно, так как это изменяет положение точки рождения флаера.<br />
Возможное решение этой проблемы будет состоять в следующем: флаер сделать подобъектом другого объекта, например, объекта Image, и применять модификаторы уже к нему.<br />
<br />
== Примеры ==<br />
<br />
===Фонтан===<br />
<br />
[[Файл:flyer_fountain_property.JPG|200px]][[Файл:Fontan2.JPG]]<br />
<br />
===Рыбки ===<br />
<br />
[[Файл:Flyer fish property.JPG|200px]][[Файл:Ribki2.JPG]]<br />
<br />
===Дождь ===<br />
<br />
[[Файл:Flyer_rain1_property.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]]<br />
<br />
===Огонь ===<br />
<br />
[[Файл:Flyer fire 1 property.JPG|200px]][[Файл:Flyer_fire.JPG]]<br />
<br />
===Летящие листья ===<br />
<br />
[[Файл:Flyer leaf.JPG|200px]][[Файл:Flyer_leaf_2.JPG]]<br />
<br />
===Стекающие капли ===<br />
<br />
[[Файл:Flyer drop property.JPG|200px]][[Файл:Flyer_drop.JPG]]<br />
<br />
<br />
===Косой дождь ===<br />
<br />
Для изменения угла Flyer был сделан подобъектом объекта типа Image, к которому применялись модификаторы.<br />
<br />
[[Файл:Flyer_rain_2_property.JPG|200px]][[Файл:Flyer_rain_2.JPG]]<br />
<br />
===Парящие руны ===<br />
<br />
[[Файл:Flyer symbol propety.JPG|200px]][[Файл:Flyer_symbol.JPG]]<br />
<br />
===Летающий текст ===<br />
<br />
[[Файл:Flyer_text_propety.JPG|200px]][[Файл:Flyer_text.JPG]]<br />
<br />
Если текст разделить символом переноса строки "'''|'''", то летуны создадутся из указанных слов("слово1|слово2|слово3") или букв ("б|у|к|в|ы").<br />
<br />
===Использование модификатора ''"blending"'' ===<br />
<br />
В данном примере использовались первые три значения этого модификатора: blend, half, add. <br />
<br />
[[Файл:Flyer fire 3 property.JPG|200px]][[Файл:Flyer fire 3.JPG]]<br />
<br />
== Пример ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/flyer.rar Download]<br />
<br />
<br />
[[Category:Main objects]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&diff=9592Работа с эффектами2018-06-22T09:08:36Z<p>Arudaya: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Настройка миниигр|Урок 8]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Экспорт, импорт и релиз проекта|Урок 10]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' изучить возможности редактора на примере применения различных эффектов.<br />
<br />
'''Задачи:'''<br />
* Создать экран, на котором можно освоить работу с патиклами (объект flyer) и масками ;<br />
* Создать экран и настроить просмотр Видео<br />
* Настроить появление сцены с проявлением по альфе, переходить на следующий экран с проявлением по альфе<br />
* Настроить фоновую музыку.<br />
<br />
== Партиклы (Particles) ==<br />
<br />
'''Создание экрана и сцены в игровом проекте'''<br />
<br />
1. Запустить SceneEditor.<br />
<br />
2. В меню Проект → Загрузить → Learning.seproj. <br />
<br />
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.3, создать экран Lesson_09.<br />
<br />
4. В экране Lesson_09 создать новую сцены 09 , в которую (через Resources Editor) добавить графические ресурсы из папки Sources\Lesson_09 (см. подготовка к работе «Создание проекта»).<br />
<br />
[[Файл:Lesson9_1.jpg|350px]]<br />
<br />
'''Настройка объектов, работа с маской'''<br />
<br />
В этом уроке поработаем над использованием объекта flyer (Particles). Параллельно с этим научимся пользоваться хитрым приемом "маска". В редактор ресурсов вы подгрузили уже знакомую вам графику "лунного пейзажа" и две части слоненка. <br />
<br />
1. Разместим их на сцене как показано на рисунке.<br />
<br />
[[Файл:Lesson9_2.jpg|350px]]<br />
<br />
2. Сделаем из головы слоненка машину состояний. Голова должна вертеться из стороны в сторону с интервалом в 1 секунду. Запишем в состояниях машины следующие параметры.<br />
<br />
[[Файл:Lesson9_3.jpg|350px]]<br />
<br />
3. Посмотрите результат с помощью программы viewer. Слоненок будет мотать головой.<br />
<br />
4. Теперь мы хотим, чтобы клик на слоненка вызывал какое-то действие, например, чтобы шел снег. Можно сделать из туловища машину состояний, но туловище маленькое, а нам нужен именно весь слоненок. Для этого нам понадобится маска. Из редактора ресурсов перетащим на сцену графический ресурс mask и переместим ее на слоненка. Маска очень маленькая, чтобы закрывать всего слоненка, поэтому воспользуемся модификаторами. Увеличим маску и сделаем ей прозрачность (alpha) 0,01.<br />
<br />
[[Файл:Lesson9_4.jpg|350px]]<br />
<br />
На сцене вы можете увидеть вокруг слоненка рамку от маски. Саму маску не видно из-за прозрачности. Стоит обратить внимание на то, что прозрачность мы сделали 0,01. Если бы она была равна 0, то маска не воспринимала бы клик, а была бы полностью прозрачной.<br />
<br />
5. Как вы уже догадались, маска у нас будет машиной состояний, включающей другой объект. Этим другим объектом будет flyer. Флаеры (патиклы) используются для создания эффектов, когда один маленький объект размножается и совершает какие-либо действия, при этом все его частички ведут себя подобно.<br />
<br />
Перетащим из редактора ресурсов на сцену графический ресурс snow и разместим его на сцене посередине по оси x (x=0) и вверху, немного за сценой (y=-320). Сделайте объекту тип flyer.<br />
<br />
6. Параметры флаера настроим немного позже, а сейчас вернемся к нашей маске. Сделайте маске тип machine. И введите следующие параметры.<br />
<br />
[[Файл:Lesson9_5.jpg|350px]]<br />
<br />
В первом состоянии (начальном) машина передает объекту snow состояние end, а во втором - beg. У флаера есть два состояния end и beg, в которых он выключен и включен соответственно. Чтобы без нашего желания флаер не запускался, в свойствах snow в поле "состояние" запишем его начальное состояние end.<br />
<br />
[[Файл:Lesson9_6.jpg]]<br />
<br />
Подробно о свойствах флаера можно почитать [[Flyer|тут]]. Для того чтобы из него получился снег запишите следующие свойства.<br />
<br />
[[Файл:Lesson9_7.jpg]]<br />
<br />
7. Сохраните проект и проверьте его выполнение в программе viewer. При клике на слоненка начинает идти снег, а при повторном клике снег исчезает.<br />
<br />
8. Следующей нашей задачей будет создание разлетающегося кольца из звездочек вокруг желтой звезды на сцене, при клике на эту звезду. Представьте, что эта сцена у вас сейчас на экране мобильного телефона, а вам нужно дотронуться до звезды. Звезда очень маленькая, как следствие - по ней трудно попасть. Здесь нам на помощь опять явится маска. Снова перетащите ресурс mask на сцену из редактора ресурсов, переименуйте его в star_mask и поместите точно над звездой.<br />
<br />
9. Растягивать маску не нужно, она таких размеров, как нам нужно. В свойствах star_mask в модификаторах задайте alpha=0,01.<br />
<br />
10. Добавьте на сцену ресурс star из редактора ресурсов и поместите его точно на звезду.<br />
<br />
[[Файл:Lesson9_8.jpg]]<br />
<br />
11. Объекту star_mask нужно изменить тип на machine, а объекту star на flyer.<br />
<br />
[[Файл:Lesson9_9.jpg]]<br />
<br />
12. Задайте машине star_mask следующие состояния.<br />
<br />
[[Файл:Lesson9_10.jpg]]<br />
<br />
13. Флаеру star пропишите следующие свойства.<br />
<br />
[[Файл:Lesson9_11.jpg]]<br />
<br />
14. Сохраните проект и проверьте его выполнение в программе viewer. При клике на звезду флаер будет вести себя как взрыв сверхновой (или салют).<br />
<br />
=== Упражнения ===<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_09, создать новый экран Lesson_09.1<br />
<br />
2. Создать новую сцену с названием .<br />
<br />
3. Скопировать все объекты из сцены 09 (экрана Lesson_09).<br />
<br />
4. Вставить скопированые объекты в новую сцену (экрана Lesson_09.1).<br />
<br />
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:<br />
<br />
a) снег шел при клике на любую область экрана;<br />
b) изменить параметры флаера snow таким образом, чтобы он выглядел как дождь;<br />
с) поиграйтесь с параметрами флаера, чтобы прочувствовать зависимость поведения флаера от его параметров.<br />
<br />
<br />
== Использование Видео ==<br />
<br />
'''Создание экрана и сцены в игровом проекте'''<br />
<br />
1. Создайте еще один экран Lesson_9.2 после экрана Lesson_9.1.<br />
<br />
2. Добавьте сцену 09.<br />
<br />
3. Загрузите на сцену ресурсы к этому уроку из редактора ресурсов (bg, play).<br />
<br />
<br />
'''Настройка объектов, работа с видео'''<br />
<br />
1. Создайте на сцене новый объект и сделайте ему тип video. Переименуйте его в video.<br />
<br />
[[Файл:Lesson9_12.jpg|350px]]<br />
<br />
2. Из ресурса play сделайте машину состояний. Пропишите машине следующие состояния.<br />
<br />
[[Файл:Lesson9_13.jpg]]<br />
<br />
3. Объекту video выставляем следующие параметры. <br />
<br />
[[Файл:Lesson9_14.jpg]]<br />
<br />
Обратите внимание, что id видео перетаскивается мышкой из редактора ресурсов.<br />
<br />
4. Сохраните проект и посмотрите результат в программе viewer.<br />
<br />
== Звуки ==<br />
<br />
Для того, чтобы игра была веселее и живее в редакторе предусмотрена возможность использовать звуки. В этом уроке мы научимся ставить фоновую музыку.<br />
<br />
1. Вернитесь к экрану Lesson_09.<br />
<br />
2. Создайте на сцене 09 новый объект и назовите его music.<br />
<br />
[[Файл:Lesson9_12.jpg]]<br />
<br />
3. Сделайте из объекта music машину состояний и пропишите следующие состояния.<br />
<br />
[[Файл:Lesson9_15.jpg]]<br />
<br />
Согласно этих состояний, сразу после запуска экрана начинает играть музыка music_gaming_04. Через 60 секунд после начала машина идет в состояние stop, где дается команда mus_stop и проигрывание музыки останавливается. Музыку можно не останавливать, тогда она будет играть по кругу.<br />
<br />
<br />
=== Упражнения ===<br />
<br />
В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:<br />
<br />
a) после остановки проигрывания музыки можно кликом на слоненка снова ее запустить;<br />
<br />
b) чтобы музыка останавливалась кликом на слоненка.<br />
<br />
----<br />
{| width="100%" <br />
| width="40%"|[[Настройка миниигр|Урок 8]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Экспорт, импорт и релиз проекта|Урок 10]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Arudayahttps://wiki.appsalutecreator.com/index.php?title=%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=9591Создание игры «Hidden Object Game»2018-06-22T09:07:48Z<p>Arudaya: /* ПРОГРЕСС */</p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.<br />
<br />
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. <br />
<br />
== Создание экрана и сцены в игровом проекте ==<br />
<br />
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]<br />
В экране Lesson_7 создадим новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])<br />
<br />
* Для корректной работы на мобильном устройстве необходимо настроить параметр.<br />
<br />
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья».<br />
<br />
Создадим папку Lesson_7 в базе текстовых описаний с помощью TextEditor. Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи значение [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]], добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип "icon1". Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].<br />
<br />
== Общая настройка объектов ==<br />
<br />
1. Для всех поисковых графических объектов изменить тип с image на [[HiddenObject]].<br />
<br />
[[Файл:Lesson7_hidden_obj.png]]<br />
<br />
2. Создать специальные объекты [[Table]] и [[HiddenList]]. Для этого необходимо перенести графическое изображение table с последующим изменением типа с image на Table. Название объекта изменить на HOT**<br />
<br />
[[Файл:07 5.png]]<br />
<br />
3. Для объекта HiddenList перенести любое графическое изображение с последующим изменением типа с image на HiddenList и удалением графического ресурса из поля настроек (res)*. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HOL**<br />
<br />
[[Файл:Lesson7_HiddenList.png]]<br />
<br />
<br />
'''**''' Имена для специальных объектов могут использоваться любые.<br />
<br />
== Детальная настройка объектов ==<br />
<br />
'''1. Описание HiddenObject.'''<br />
<br />
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:07 7.png|right]]<br />
<br />
Необходимо выбрать используемый объект с именем HOL (тип HiddenObjectList) в поле list.<br />
<br />
<br />
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;<br />
<br />
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);<br />
<br />
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;<br />
<br />
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);<br />
<br />
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.<br />
<br />
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList.<br />
<br />
<br />
<br />
<br />
'''2. Описание HiddenObjectList.'''<br />
<br />
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:07 8.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле "объектов"). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле "количество".<br />
<br />
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они "перебивали" общие значения для всех.<br />
<br />
<br />
Подготовка спрятанных объектов: <br />
<br />
''num'' (поле "объектов") – максимальное количество объектов, участвующие в поиске. (int)<br />
<br />
''hide'' (поле "прятать") – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) <br />
<br />
Визуальные параметры списка: <br />
<br />
''table'' (поле "таблица") – идентификатор объекта Table. (objid)<br />
<br />
''kind'' (внешний вид - поле "тип списка") – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)<br />
<br />
''cross'' (внешний вид - поле "вычеркнуть") – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе "зачеркивается".(int).<br />
<br />
<br />
<br />
3. Описание Table<br />
<br />
<br />
[[Файл:Table lesson7.png]]<br />
<br />
хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица” , что бы настроить внешний вид , вспомогательную область для поиска предметов.<br />
<br />
6. Параметры, общие для всех спрятанных объектов:<br />
<br />
''die'' – тип исчезания при удачном клике на объект (если нет актера) (int): <br />
<br />
0: просто исчезает;<br />
<br />
1: летит к пункту с описанием в списке HiddenList;<br />
<br />
2: улетает в случайном направлении;<br />
<br />
3: улетает к заданным координатам (fx, fy).<br />
<br />
vm - скорость движения при полете к списку предметов после клика в px/sec (float) <br />
<br />
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) <br />
<br />
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) <br />
<br />
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. <br />
<br />
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) <br />
<br />
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)<br />
<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -> id игры; для теста заполним его любой строкой).<br />
</blockquote><br />
<br />
== Упражнения ==<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.<br />
<br />
2. Создать новую сцену (с названием stg_7_1).<br />
<br />
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7).<br />
<br />
4. Вставить скопированые объекты в новую сцену stg_7_1.<br />
<br />
[[Файл:07 11.png]]<br />
<br />
5. В новой сцене:<br />
<br />
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;<br />
<br />
b) разместить на местах предназначенных для их «Прятанья»;<br />
<br />
c) добавить текстовое описание в TextEditor;<br />
<br />
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.<br />
<br />
6. Модифицировать экран Lesson_7 в полноценный уровень с выводом количества очков, игрой на время и графикой.<br />
<br />
== Упражнение № 6 ==<br />
Экран lesson_7 необходимо модифицировать в полноценный уровень.<br />
<br />
Для этого первый экран дополняем 2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), машиной-комбо3 ([[machine]]) и прогрессом ([[progress]]). Второй экран с выводом очков составим позже.<br />
<br />
[[Файл:1.png]] <br />
<br />
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «progr» ([[progress]]) отображает уровень прохождения игры.<br />
<br />
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор, машину-комбо3 и прогресс в хиденлисте «HL_01» ([[hiddenList]]).<br />
<br />
== СЧЕТЧИК ==<br />
<br />
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. <br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её - это просто). Анимация создается с названием папки, в которой хранились картинки, избегайте кириллицы в названии папок.<br />
</blockquote><br />
<br />
[[Файл:Coun (5).png]] [[Файл:Coun (6).png]] [[Файл:Coun (7).png]] [[Файл:Coun (8).png]] [[Файл:Coun (9).png]] [[Файл:Coun_(10).png]] [[Файл:Coun (11).png]] [[Файл:Coun (1).png]] [[Файл:Coun (2).png]] [[Файл:Coun (3).png]] [[Файл:Coun (4).png]]<br />
<br />
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель перетаскиваем в отдельную графу без анимации. Настройки для счетчика:<br />
<br />
[[Файл:243.png]] [[Файл:33.png]]<br />
<br />
== ТАЙМЕР ==<br />
<br />
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (18000 = 18 сек.). <br />
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие. Настройки для таймера:<br />
<br />
[[Файл:444.png]]<br />
<br />
Также стоит обновить настройки , в HiddenObjectList , т.к. если мы его не укажем отсчет времени просто не начнется , и так же нужно помнить чтобы время таймера и время указанное в HiddenObjectList должны совпадать , иначе отсчет будет идти от меньшего времени вне зависимости указано оно в HOL или в таймере<br />
[[Файл:HOL_time.png]]<br />
<br />
<br />
== ПРОГРЕСС ==<br />
<br />
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходит уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую. <br />
Настройки для прогресса : <br />
<br />
[[Файл:555.png]]<br />
<br />
Графика для Progress: [[Файл:666.png]]<br />
<br />
Настройки для машины-Combo3c :<br />
<br />
[[Файл:777.png]]<br />
<br />
Во всех HiddenObject добавить свойство "изменить состояние объекта" combo3c [[Файл:1818.png]]<br />
<br />
Настройки для машины-блокатора «ban_H» (machine) :<br />
<br />
[[Файл:Ban h na max.png]]<br />
[[Файл:9.png]]<br />
<br />
Настройки для hiddenList:<br />
<br />
[[Файл:1010.png]] [[Файл:1011.png]]<br />
<br />
Группа - звезды combo num =1 Количество быстро найденных объектов, нужное для получения звезды Combo combo time = 3000 Интервал между кликами, считающимися быстрыми для Combo accuracy = 0,85 Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные) лимит ложных кликов =5 Лимит ложных кликов. Формула расчета количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
Для HiddenList и Counter пункт "сохранить в профиль" должен совпадать. Если в HiddenList указано "глобально", то и в Counter также необходимо установить "глобально".<br />
<br />
<br />
Создаем вторую сцену на которой формируем окно вывода результатов из ректангла (Rectangle), текстовых объектов и счетчиков, окно<br />
должно открываться по окончанию игры, при выигрыше показывать набранные очки и надпись об удаче,при проигрыше нулевые очки и надпись о неудаче.<br />
<br />
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]] <br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Rectangle black (Цвет задается в свойстве фон->цвет заливки) используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. <br />
</blockquote><br />
<br />
[[Файл:1012.png]] [[Файл:0102.png]] <br />
<br />
<br />
Далее копируем Rectangle black и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!).<br />
<br />
Создадим еще 5 счетчиков. Они нам понадобятся в конце игры для выведения бонусного счета.<br />
<br />
В свойствах счетчиков необходимо прописать уровень!<br />
<br />
1) счетчик 7_4_1 — игровые очки;<br />
<br />
уровень: last_game.score30_total<br />
<br />
2) счетчик 7_4_2 — бонус за время;<br />
<br />
уровень: last_game.score30_time<br />
<br />
3) счетчик 7_4_3 — бонус за аккуратность;<br />
<br />
уровень: last_game.score30_accuracy<br />
<br />
4) счетчик 7_4_4 — бонус за комбо;<br />
<br />
уровень: last_game.ecmbRowMax<br />
<br />
5) счетчик 7_4_5 — очки за уровень;<br />
<br />
уровень: last_game.score30_level<br />
<br />
Важный аспект:После того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.<br />
<br />
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).<br />
<br />
<br />
Настройки для машины — star1 <br />
(проверка в опциях параметра last_game.last_star_accuracy0, <br />
last_game.last_star_time0, )<br />
<br />
[[Файл:0303.png]]<br />
<br />
Настройки для машины — star2 <br />
(если параметр accuracy=0)<br />
<br />
[[Файл:0304.png]]<br />
<br />
Настройки для машины — star3 <br />
(если игра пройдена за указанное время)<br />
<br />
[[Файл:0305.png]]<br />
<br />
Настройки для машины — win<br />
<br />
[[Файл:0306.png]]<br />
<br />
<br />
Машина win считывает «read» показания счетчика и запускает star1 если игра пройдена.<br />
<br />
Также создаем кнопку close (button), которая должна закрывать окно результатов. Добавляем "изменить состояние объекта"; объект win, состояние close. <br />
<br />
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
----<br />
<br />
{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Arudaya