https://wiki.appsalutecreator.com/api.php?action=feedcontributions&user=Agava&feedformat=atomwiki.appsalutecreator.com - Вклад участника [ru]2024-03-29T05:39:27ZВклад участникаMediaWiki 1.31.15https://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9914Advertisement2020-07-09T10:53:15Z<p>Agava: /* GDPR */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
Этот параметр позволит нам использовать персональные данные игроков при выдаче рекламы.<br />
<br />
'''Внимание''': для триггера команды '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe");<br />
<br />
* нет информации о согласии игрока (в таком случае в опциях не будет значения gdpr) или мы вручную сбросили его согласие в игре (установив значение ниже -10).<br />
<br />
Так как рекламный конфиг у нас приезжает неизвестно когда, мы не должны открывать окно через этот параметр. Вместо этого мы делаем небольшую машину, которая будет ставить флажок, сигнализируюющий о необходимости запросить у игрока его согласие на обработку персональных данных. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при вызове этого состояния обьект '''advertisement''' запишет в параметр в опциях '''gdpr''' значение из '''param''' , которое мы передаем в сам обьект advertisement. Для стран, где действует GDPR, таргетированная реклама показывается, если мы установили значение параметра в 1, и нетаргетированная, если это значение установлено в 0.<br />
<br />
Это состояние мы не вызываем без ведома игрока! Оно должно вызываться, когда игрок принимает или отклоняет запрос о сборе персональных данных. Этот запрос мы представляем ему в виде окна с двумя кнопками и без возможности его закрыть. Также после принятия или отказа от сбора, игрок может изменить свое решение, например, через checkbox в настройках игры.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
param1_name=gdpr<br />
param1_value=-1<br />
<br />
Если этот параметр есть в app.icf, то мы даем игре знать, что хотим собирать персональные данные игрока. Тогда будет работать добавляемый параметр '''нужен запрос gdpr'''.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1, AdMob - 0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.<br />
<br />
==Подробное описание работы обьекта==<br />
<br />
Продолжение здесь: http://jira1:8090/pages/viewpage.action?pageId=23822337</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Esocial&diff=9910Esocial2020-01-19T22:56:33Z<p>Agava: /* Отправка подарка */</p>
<hr />
<div>[[Object|Объект]] '''Esocial''' обеспечивает связь между приложением и Facebook'ом.<br />
<br />
<br />
=Параметры=<br />
<br />
<br />
[[Файл:Esocial_full.jpg|right]]<br />
*'''facebook''' - ссылка на объект [[facebook]], с которым будет работать объект<br />
*'''esocialfriendsitem''' - ссылка на объект esocialfriendsitem, с которым будет работать объект<br />
*'''таблица друзей''' - ссылка на таблицу, в которую будем клонировать esocialfriendsitem.<br />
*'''индикатор активности''' - объект который видимый когда загружаются друзья. Видимость выключается, когда задача загрузки друзей выполнена (успех или провал не важно).<br />
*'''опции для facebook''' - поле в опциях, куда мы будем записывать 32битное целое: Уровень + Коллекции.ESocial добавит к ним число друзей и засабмит при вызове соотв. состояние<br />
*'''социальная сеть''' - выбор социальной сети с которой взаимодействовать. На данный момент можно выбрать facebook, google+ и обе.<br />
<br />
*'''специальные подарки'''<br />
**'''подарок энергия id''' - id предметы из экономики;<br />
**'''подарок энергия количество''' - количество;<br />
**'''учитывать максимум энергии''' - если да, то не будет начисляться энергия выше максимума;<br />
<br />
<br />
*'''Инвайт'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
<br />
<br />
*'''Успешный инвайт'''<br />
**'''Окно''' - Машина, открывающая форму, которая содержит информацию об успешно приглашенном друге. Должна иметь состояние show. На закрытие должна вызывать состояние next_inv объекту esocial<br />
**'''Портрет''' - Объект, в который будет сложена иконка друга, подтянутая с facebook<br />
**'''Имя''' - Объект, в который будет сложено имя друга, подтянутое с facebook<br />
<br />
<br />
*'''Запрос подарка'''<br />
**'''Текст''' - текстовый id, в котором будет хранится текст типа:"Мне нужны коллекционные предметы:". После ":" будут перечисляться предметы (названия будут браться из id коллекционных предметов), которые нужны игроку, через запятую.<br />
**'''Таблица''' - таблица, в которую будут сложены желаемые предметы из окна коллекции для последующего поста их на стену.<br />
<br />
<br />
*'''Отправка подарка'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Ограничение''' - максимальное количество отправленных подарков в день (может быть сброшено).<br />
<br />
<br />
*'''Окно дарения из окна коллекций'''<br />
**'''окно''' - машина состояния, которая будет показывать окно. Должна иметь состояние open.<br />
**'''иконка''' - объект, в который будет помещена иконка предмета, который мы хотим подарить другому игроку.<br />
**'''текст (объект)''' - текстовый объект, в который сложится название предмета, который мы хотим подарить другу.<br />
**'''описание (объект)''' - текстовый объект, в который сложится описание предмета, который мы хотим подарить другу.<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу в окне с подарком другу.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem.<br />
<br />
<br />
*'''Окно дарения с двумя списками'''<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу друзей.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem из поля выше.<br />
**'''esocialgiftitem ''' - объект типа esocialgiftitem (темплейт подарка в таблице), который заполнит таблицу подарков.<br />
**'''таблица подарков''' - ссылка на таблицу в которую мы клонируем объект esocialgiftitem из поля выше.<br />
<br />
<br />
*'''Изменить состояние объекта при принятии инвайта''' - при успешном принятии приглашения (друг установил приложение) переводит объект в состояние.<br />
*'''Изменить состояние объекта при успешном выполнении задачи''' - при успешном выполнении задачи переводит объект в состояние<br />
*'''Изменить состояние объекта при ошибке выполнения задачи''' - при ошибке выполнения задачи переводит объект в состояние<br />
*'''изменить состояние объекта - дарим энергию выше max''' - обработчик применения энергии, когда дошли за максимум (сработает если '''учитывать максимум энергии''');<br />
<br />
В опции пишутся параметры инвайтов:<br />
<br />
*'''esocial%d.max_invite_total''' - всего инвайтов отправлено<br />
*'''esocial%d.max_invite_this''' - за последнюю отправку<br />
<br />
вместо %d - айдишник объекта<br />
<br />
Можно проверять в "nst_invite_sent"<br />
<br />
=Состояния=<br />
<br />
<br />
*0. '''ready''' - состояние готовности<br />
*1. '''friends'''<br />
*2. '''friends_debug''' - добавляем фейковых друзей<br />
*3. '''friends_inst''' - заполнить таблицу друзьями с установленной игрой<br />
*4. '''friends_not_inst''' - заполнить таблицу друзьями с неустановленной игрой<br />
*5. '''report''' - заслать полезную информацию (32бита)<br />
*6. '''invite''' - показать окно инвайта<br />
*7. '''cancel''' - отменить весь стек задач<br />
*8. '''retry''' - повторить текущую задачу<br />
*9. '''continue_fb''' - пропустить текущую задачу и перейти к следующей<br />
*10. '''continue_google''' - пропустить текущую задачу и перейти к следующей<br />
*11. '''next_inv''' - следующее окошко успешного инвайта<br />
*12. '''gift''' - показать окно посылки подарка из окна коллекций<br />
*13. '''gift_confirm''' - в окне посылки гифта из окна коллекций нажали кнопку ок<br />
*14. '''wish''' - запостить на стену "попрошайку" <br />
*15. '''check_requests''' - проверить реквесты от других пользователей<br />
*16. '''next_gift''' - следующее окошко про полученный подарок17.<br />
*17. '''refresh_gifts''' - актуализировать содержимое таблицы гифтов<br />
*18. '''refresh_vip_gifts''' - актуализировать содержимое таблицы гифтов используя исключительно вип подарки<br />
*19. '''gift_send''' - послать подарок из окна с двумя таблицами<br />
*20. '''logout''' - разлогиниться из фейсбука удалив всю информацию о друзьях<br />
*21. '''clear_gifts''' - сбросить ограничения на число подарков<br />
*22. '''wish_table''' - добавить пожелание в таблицу пожеланий<br />
*23. '''wish_all''' - пожелать все содержимое таблицы в фейсбук //Теперь только в фейсбук, а для гугла состояние ниже<br />
*24. '''remove_gift''' - убрать подарок из таблицы<br />
*25. '''gift_fb''' - подарить текущий подарок через фейбук используя нативный интерфейс фейсбука (т.е. так как сейчас работает гугл, без таблицы друзей)<br />
*26. '''gift_info''' - Обновить информацию о текущих подарках в специальном окне<br />
*27. '''gift_lb''' - Показать окно подарка из лидерборда<br />
*28. '''gift_send_lb''' - Подтвердить отсылку подарка из лидерборда<br />
*29. '''gift_receive''' - Получить подарок из окна получения подарков<br />
*30. '''invite_lb''' - Послать приглашение другу из лидербордов<br />
*31. '''get_me_google''' - запросить информацию о себе с гугла<br />
*32. '''friends_inst_google''' - заполнить таблицу друзьями с установленной игрой<br />
*33. '''friends_not_inst_google''' - заполнить таблицу друзьями с неустановленной игрой<br />
*34. '''message_friend''' - послать другу уведомление<br />
*35. '''friends_random''' - заполнить таблицу случайных друзей<br />
*36. '''wish_all_google''' - пожелать все содержимое таблицы в гугл<br />
*37. '''get_me_fb''' - запросить информацию о себе с фейсбука<br />
*38. '''check_requests_fb''' - проверить реквесты от других пользователей для fb<br />
*39. '''check_requests_google''' - проверить реквесты от других пользователей для гугл<br />
*40. '''logout_google''' - разлогиниться из гугла, удалив всю информацию о друзьях<br />
*41. '''gift_parse''' - Показать окно подарка из парсовой таблицы друзей<br />
*42. '''gift_send_parse''' - Подтвердить отсылку подарка из парсовой таблицы друзей<br />
*43. '''gift_parse_energy''' - Показать окно подарка энергии из парсовой таблицы друзей<br />
*44. '''gift_parse_vip''' - Подарок вип-подарка из окна лидербордов<br />
*45. '''gift_parse_res1''' - Подарок монет из окна лидербордов<br />
*46. '''gift_receive_no_delete''' - Получить подарок из окна получения подарков без запроса<br />
*47. '''gift_reply_energy''' - Послать в ответ энергию.<br />
*48. '''gift_reply_more''' - Промотать таблицу подарков в клауде на нужного юзера<br />
*49. '''gift_reply_res1''' - Послать в ответ ресурс1.<br />
*50. '''gift_reply_universal''' - ответить тем же, что прислали<br />
*51. '''gift_reply_vip''' - Послать в ответ vip.<br />
*52. '''invite_parse''' - Послать приглашение другу из парса (но из общей таблицы, не из лидербордов)<br />
*53. '''gift_parse_res1_multiple''' - отправить множественный подарок в виде монет<br />
*54. '''gift_parse_item_multiple''' - отправить множественный подарок в виде предмета, взяв его из поля gift_param<br />
*55. '''post_story''' - фоновое сообщение<br />
*56. '''external_like''' - "внешнее" окошко лайка<br />
*57. '''clear_timeouts''' - обнулить таймауты для некоторых тасков<br />
*58. '''refresh_inv_gifts''' - актуализировать содержимое таблицы инвентарных гифтов<br />
*59. '''wish_inv_add''' - добавить предмет из таблицы инвентарных в вишлист<br />
*60. '''wish_inv_remove''' - убрать предмет из таблицы инвентарных в вишлист<br />
*61. '''gift_parse_refresh''' - Обновить информацию о подарке в соотв. иконках и каунтерах<br />
*62. '''check_requests_abs''' - проверить реквесты от других пользователей, но только parse<br />
*63. '''switch_social_network''' - переключить активную социальную сеть, взяв ее айдишник из param<br />
*64. '''invite_random''' - показать окно инвайта для случайных друзей<br />
<br />
*66. '''join_community''' - пригласиться к группе, задать в параметр ''joincommunity'' id группы (для ВК).<br />
<br />
=Debug=<br />
Для того, что бы отслеживать работу объекта Facebook в папке Documents создаются три файла, которые хранят в себе все знания относительно друзей данного пользователя, их коллекций и уровня:<br />
<br>- '''facebook_debug_e.xml''' - создается во время отправки приглашения и при вызове состояния ''invite''<br />
<br>- '''facebook_debug_s.xml''' - создается после фидбэка от Facebook'a.<br />
<br>- '''facebook_debug.xml''' - создается исключительно в дебажной версии во время отправки объекту Facebook состояния ''friends'' или ''friends_inst''<br />
Выглядит этот файл приблизительно вот так:<br />
[[Файл:17-03-2014 11-09-06.png|right]]<br />
Поля:<br> '''request''' означает отправлен ли запрос. <br>'''invite''' - принял ли запрос и поле <br> '''inst'''(возможна ошибка в названии) - установлено ли приложение у данного друга.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Задачи (команды) и ошибки=<br />
<br />
В опции пишется номер успешной задачи, неуспешной и номер ошибки<br />
*'''esocial%d.compl_task''' - поле в опциях, куда запишется номер успешно выполненной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_task''' - поле в опциях, куда запишется номер неуспешной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_code''' - поле в опциях, куда запишется номер ошибки. %d - id объекта esocial в проекте.<br />
<br />
<br />
==Задачи==<br />
<br />
При выполнении состояния Esocial пишет в лог следующее:<br />
<br />
''onComplete state = %d task = %d,''<br />
<br />
где номер таска берется из следующего списка (состояния Facebook):<br />
<br />
*0 - провести авторизацию<br />
*1 - закрыть текущую авторизованную сессию<br />
*2 - создать диалог для отправки на стену<br />
*3 - возвращает данные обо мне<br />
*4 - возвращает данные о друзьях<br />
*5 - возвращает данные о друзьях, которых можно пригласить в игру<br />
*6 - получить список игровых сообщений<br />
*7 - получить список групп пользователя<br />
*8 - лайкал пользователь приложение или нет<br />
*9 - обновить мои очки на facebook сервере<br />
*10 - отправить игровое сообщение<br />
*11 - удалить игровое сообщение на facebook сервере<br />
*12 - отправить фоновое сообщение в ленту пользователя<br />
<br />
След. сост. выполняются автоматически, если необходимо:<br />
*13 - (ST_AUTO_CHECK_USER_PERMISSIONS) - получить список прав которые пользователь предоставил преложению<br />
*14 - (ST_AUTO_CHECK_APP_PERMISSIONS) - получить список прав которые facebook предоставил преложению<br />
*15 - (ST_AUTO_GET_WRITE_PERMISSIONS) - запросить у пользователя права на запись<br />
*16 - (ST_AUTO_GET_READ_PERMISSIONS) - запросить у пользователя права на чтение<br />
*17 - (ST_AUTO_POST_APP_REQUEST) - отправить application request пользователю<br />
*18 - (ST_AUTO_CHECK_USER_ACHIEVEMENTS) - проверить текущие ачивки пользователя<br />
*19 - (ST_CHANGE_SOCIAL_NETWORK) - изменить соц сеть<br />
<br />
<br />
<br />
==Ошибки==<br />
Если ошибка на гугловом устройстве, то к коду добавляется 1000, к примеру ошибка с кодом 9 на гугле будет 1009.<br />
<br />
<br />
*0 - неизвестная ошибка<br />
*1 - неизвестная задача<br />
*2 - facebook не поддерживается<br />
*3 - нет интернета<br />
*4 - превышен лимит ожидания запроса<br />
*5 - не указаны параметры для выполнения задачи<br />
*6 - отмена диалогового окна пользователем<br />
*7 - ошибка логина<br />
*8 - ошибка авторизации<br />
*9 - ошибка прав доступа<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
<br />
<br />
'''Пример запроса:'''<br />
*подали запрос выполнить задачу (например ST_GET_FRIENDS)<br />
*сначала проверяем есть ли права у приложения facebook (ST_AUTO_CHECK_APP_PERMISSIONS)<br />
*потом проверяем есть ли права от пользователя (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если пользователь не давал прав, то просим (ST_AUTO_GET_READ_PERMISSIONS)<br />
*потом снова проверяем дал ли нам пользователь права (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если весь цикл прошел успешно, то возвращаемся к поставленной задаче (ST_GET_FRIENDS)<br />
<br />
'''ВАЖНО:'''<br />
Если в любом месте произошел сбой, то ты НЕ увидишь конкретное состояние, ты увидишь только что "ST_GET_FRIENDS" отработал с ошибкой "9" или словами "ERR_PERMISSION". Других логик или кодов там нет.<br />
<br />
==Слушатели заполнения таблиц==<br />
Чтобы узнать когда окончательно заполниться таблица, нужно подвязать слушателя в нужном месте:<br />
*Таблица лидеров: <br />
**'''Cloud.table ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены лидерборды'''; <br />
*Друзья и подарки: <br />
**'''Cloud.table_fr ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены друзья''';<br />
*Неиграющие друзья:<br />
** '''Esocial.friendsnotinst ''' - машинка-слушатель успеха объекта 'Esocial 'состояние '''5''' (изменить состояние объекта - успех задачи)<br />
*Окно приёма подарка ( заполненность таблицы проверям у объекта "esocial" параметры "new_gifts" и "all_gifts"): <br />
**'''Esocial.giftreceivetable ''' - машинка-слушатель объекта 'Esocial' (изменить состояние объекта - '''заполнена таблица с подарками''')<br />
<br />
<br />
=Записи в логах=<br />
==Отправка подарка==<br />
21/3/2017 13:8:59.800: I/GESocial state() state 42 <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 gift = 11674 starting to search usid <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 fb login = 1 gc login = 0 <br />
21/3/2017 13:8:59.800: I/GESocial state() state 13 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM gift = 11674 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM Got id from param, id = 258188181311449 <br />
21/3/2017 13:8:59.801: I/GESocial load() load curTime = 1492769339 saveTime = 1492769335 (curTime - saveTime) = 4 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM _giftsCur = 0, gift = 11674, id = 258188181311449, _giftsLimit = 50 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM soc_net == netFacebook id = 258188181311449, data = 3,241016273040597,11674 <br />
21/3/2017 13:8:59.805: I/GESocial state() Viber request gift urlId = -1, url = , text = <br />
21/3/2017 13:8:59.808: I/GFacebook stPostRequest() stPostRequest -> title = Gift!, message = Иван Козаченко: Here is a gift for you!, <br />
data = 3,241016273040597,11674, userId = 258188181311449, <br />
excludeUserIds = , frictionless = 1, type = 2, forcedLogin=1 <br />
<br />
<br />
<br />
[[Category:Facebook]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Esocial&diff=9909Esocial2020-01-19T22:56:24Z<p>Agava: /* Отправка подарка */</p>
<hr />
<div>[[Object|Объект]] '''Esocial''' обеспечивает связь между приложением и Facebook'ом.<br />
<br />
<br />
=Параметры=<br />
<br />
<br />
[[Файл:Esocial_full.jpg|right]]<br />
*'''facebook''' - ссылка на объект [[facebook]], с которым будет работать объект<br />
*'''esocialfriendsitem''' - ссылка на объект esocialfriendsitem, с которым будет работать объект<br />
*'''таблица друзей''' - ссылка на таблицу, в которую будем клонировать esocialfriendsitem.<br />
*'''индикатор активности''' - объект который видимый когда загружаются друзья. Видимость выключается, когда задача загрузки друзей выполнена (успех или провал не важно).<br />
*'''опции для facebook''' - поле в опциях, куда мы будем записывать 32битное целое: Уровень + Коллекции.ESocial добавит к ним число друзей и засабмит при вызове соотв. состояние<br />
*'''социальная сеть''' - выбор социальной сети с которой взаимодействовать. На данный момент можно выбрать facebook, google+ и обе.<br />
<br />
*'''специальные подарки'''<br />
**'''подарок энергия id''' - id предметы из экономики;<br />
**'''подарок энергия количество''' - количество;<br />
**'''учитывать максимум энергии''' - если да, то не будет начисляться энергия выше максимума;<br />
<br />
<br />
*'''Инвайт'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
<br />
<br />
*'''Успешный инвайт'''<br />
**'''Окно''' - Машина, открывающая форму, которая содержит информацию об успешно приглашенном друге. Должна иметь состояние show. На закрытие должна вызывать состояние next_inv объекту esocial<br />
**'''Портрет''' - Объект, в который будет сложена иконка друга, подтянутая с facebook<br />
**'''Имя''' - Объект, в который будет сложено имя друга, подтянутое с facebook<br />
<br />
<br />
*'''Запрос подарка'''<br />
**'''Текст''' - текстовый id, в котором будет хранится текст типа:"Мне нужны коллекционные предметы:". После ":" будут перечисляться предметы (названия будут браться из id коллекционных предметов), которые нужны игроку, через запятую.<br />
**'''Таблица''' - таблица, в которую будут сложены желаемые предметы из окна коллекции для последующего поста их на стену.<br />
<br />
<br />
*'''Отправка подарка'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Ограничение''' - максимальное количество отправленных подарков в день (может быть сброшено).<br />
<br />
<br />
*'''Окно дарения из окна коллекций'''<br />
**'''окно''' - машина состояния, которая будет показывать окно. Должна иметь состояние open.<br />
**'''иконка''' - объект, в который будет помещена иконка предмета, который мы хотим подарить другому игроку.<br />
**'''текст (объект)''' - текстовый объект, в который сложится название предмета, который мы хотим подарить другу.<br />
**'''описание (объект)''' - текстовый объект, в который сложится описание предмета, который мы хотим подарить другу.<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу в окне с подарком другу.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem.<br />
<br />
<br />
*'''Окно дарения с двумя списками'''<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу друзей.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem из поля выше.<br />
**'''esocialgiftitem ''' - объект типа esocialgiftitem (темплейт подарка в таблице), который заполнит таблицу подарков.<br />
**'''таблица подарков''' - ссылка на таблицу в которую мы клонируем объект esocialgiftitem из поля выше.<br />
<br />
<br />
*'''Изменить состояние объекта при принятии инвайта''' - при успешном принятии приглашения (друг установил приложение) переводит объект в состояние.<br />
*'''Изменить состояние объекта при успешном выполнении задачи''' - при успешном выполнении задачи переводит объект в состояние<br />
*'''Изменить состояние объекта при ошибке выполнения задачи''' - при ошибке выполнения задачи переводит объект в состояние<br />
*'''изменить состояние объекта - дарим энергию выше max''' - обработчик применения энергии, когда дошли за максимум (сработает если '''учитывать максимум энергии''');<br />
<br />
В опции пишутся параметры инвайтов:<br />
<br />
*'''esocial%d.max_invite_total''' - всего инвайтов отправлено<br />
*'''esocial%d.max_invite_this''' - за последнюю отправку<br />
<br />
вместо %d - айдишник объекта<br />
<br />
Можно проверять в "nst_invite_sent"<br />
<br />
=Состояния=<br />
<br />
<br />
*0. '''ready''' - состояние готовности<br />
*1. '''friends'''<br />
*2. '''friends_debug''' - добавляем фейковых друзей<br />
*3. '''friends_inst''' - заполнить таблицу друзьями с установленной игрой<br />
*4. '''friends_not_inst''' - заполнить таблицу друзьями с неустановленной игрой<br />
*5. '''report''' - заслать полезную информацию (32бита)<br />
*6. '''invite''' - показать окно инвайта<br />
*7. '''cancel''' - отменить весь стек задач<br />
*8. '''retry''' - повторить текущую задачу<br />
*9. '''continue_fb''' - пропустить текущую задачу и перейти к следующей<br />
*10. '''continue_google''' - пропустить текущую задачу и перейти к следующей<br />
*11. '''next_inv''' - следующее окошко успешного инвайта<br />
*12. '''gift''' - показать окно посылки подарка из окна коллекций<br />
*13. '''gift_confirm''' - в окне посылки гифта из окна коллекций нажали кнопку ок<br />
*14. '''wish''' - запостить на стену "попрошайку" <br />
*15. '''check_requests''' - проверить реквесты от других пользователей<br />
*16. '''next_gift''' - следующее окошко про полученный подарок17.<br />
*17. '''refresh_gifts''' - актуализировать содержимое таблицы гифтов<br />
*18. '''refresh_vip_gifts''' - актуализировать содержимое таблицы гифтов используя исключительно вип подарки<br />
*19. '''gift_send''' - послать подарок из окна с двумя таблицами<br />
*20. '''logout''' - разлогиниться из фейсбука удалив всю информацию о друзьях<br />
*21. '''clear_gifts''' - сбросить ограничения на число подарков<br />
*22. '''wish_table''' - добавить пожелание в таблицу пожеланий<br />
*23. '''wish_all''' - пожелать все содержимое таблицы в фейсбук //Теперь только в фейсбук, а для гугла состояние ниже<br />
*24. '''remove_gift''' - убрать подарок из таблицы<br />
*25. '''gift_fb''' - подарить текущий подарок через фейбук используя нативный интерфейс фейсбука (т.е. так как сейчас работает гугл, без таблицы друзей)<br />
*26. '''gift_info''' - Обновить информацию о текущих подарках в специальном окне<br />
*27. '''gift_lb''' - Показать окно подарка из лидерборда<br />
*28. '''gift_send_lb''' - Подтвердить отсылку подарка из лидерборда<br />
*29. '''gift_receive''' - Получить подарок из окна получения подарков<br />
*30. '''invite_lb''' - Послать приглашение другу из лидербордов<br />
*31. '''get_me_google''' - запросить информацию о себе с гугла<br />
*32. '''friends_inst_google''' - заполнить таблицу друзьями с установленной игрой<br />
*33. '''friends_not_inst_google''' - заполнить таблицу друзьями с неустановленной игрой<br />
*34. '''message_friend''' - послать другу уведомление<br />
*35. '''friends_random''' - заполнить таблицу случайных друзей<br />
*36. '''wish_all_google''' - пожелать все содержимое таблицы в гугл<br />
*37. '''get_me_fb''' - запросить информацию о себе с фейсбука<br />
*38. '''check_requests_fb''' - проверить реквесты от других пользователей для fb<br />
*39. '''check_requests_google''' - проверить реквесты от других пользователей для гугл<br />
*40. '''logout_google''' - разлогиниться из гугла, удалив всю информацию о друзьях<br />
*41. '''gift_parse''' - Показать окно подарка из парсовой таблицы друзей<br />
*42. '''gift_send_parse''' - Подтвердить отсылку подарка из парсовой таблицы друзей<br />
*43. '''gift_parse_energy''' - Показать окно подарка энергии из парсовой таблицы друзей<br />
*44. '''gift_parse_vip''' - Подарок вип-подарка из окна лидербордов<br />
*45. '''gift_parse_res1''' - Подарок монет из окна лидербордов<br />
*46. '''gift_receive_no_delete''' - Получить подарок из окна получения подарков без запроса<br />
*47. '''gift_reply_energy''' - Послать в ответ энергию.<br />
*48. '''gift_reply_more''' - Промотать таблицу подарков в клауде на нужного юзера<br />
*49. '''gift_reply_res1''' - Послать в ответ ресурс1.<br />
*50. '''gift_reply_universal''' - ответить тем же, что прислали<br />
*51. '''gift_reply_vip''' - Послать в ответ vip.<br />
*52. '''invite_parse''' - Послать приглашение другу из парса (но из общей таблицы, не из лидербордов)<br />
*53. '''gift_parse_res1_multiple''' - отправить множественный подарок в виде монет<br />
*54. '''gift_parse_item_multiple''' - отправить множественный подарок в виде предмета, взяв его из поля gift_param<br />
*55. '''post_story''' - фоновое сообщение<br />
*56. '''external_like''' - "внешнее" окошко лайка<br />
*57. '''clear_timeouts''' - обнулить таймауты для некоторых тасков<br />
*58. '''refresh_inv_gifts''' - актуализировать содержимое таблицы инвентарных гифтов<br />
*59. '''wish_inv_add''' - добавить предмет из таблицы инвентарных в вишлист<br />
*60. '''wish_inv_remove''' - убрать предмет из таблицы инвентарных в вишлист<br />
*61. '''gift_parse_refresh''' - Обновить информацию о подарке в соотв. иконках и каунтерах<br />
*62. '''check_requests_abs''' - проверить реквесты от других пользователей, но только parse<br />
*63. '''switch_social_network''' - переключить активную социальную сеть, взяв ее айдишник из param<br />
*64. '''invite_random''' - показать окно инвайта для случайных друзей<br />
<br />
*66. '''join_community''' - пригласиться к группе, задать в параметр ''joincommunity'' id группы (для ВК).<br />
<br />
=Debug=<br />
Для того, что бы отслеживать работу объекта Facebook в папке Documents создаются три файла, которые хранят в себе все знания относительно друзей данного пользователя, их коллекций и уровня:<br />
<br>- '''facebook_debug_e.xml''' - создается во время отправки приглашения и при вызове состояния ''invite''<br />
<br>- '''facebook_debug_s.xml''' - создается после фидбэка от Facebook'a.<br />
<br>- '''facebook_debug.xml''' - создается исключительно в дебажной версии во время отправки объекту Facebook состояния ''friends'' или ''friends_inst''<br />
Выглядит этот файл приблизительно вот так:<br />
[[Файл:17-03-2014 11-09-06.png|right]]<br />
Поля:<br> '''request''' означает отправлен ли запрос. <br>'''invite''' - принял ли запрос и поле <br> '''inst'''(возможна ошибка в названии) - установлено ли приложение у данного друга.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Задачи (команды) и ошибки=<br />
<br />
В опции пишется номер успешной задачи, неуспешной и номер ошибки<br />
*'''esocial%d.compl_task''' - поле в опциях, куда запишется номер успешно выполненной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_task''' - поле в опциях, куда запишется номер неуспешной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_code''' - поле в опциях, куда запишется номер ошибки. %d - id объекта esocial в проекте.<br />
<br />
<br />
==Задачи==<br />
<br />
При выполнении состояния Esocial пишет в лог следующее:<br />
<br />
''onComplete state = %d task = %d,''<br />
<br />
где номер таска берется из следующего списка (состояния Facebook):<br />
<br />
*0 - провести авторизацию<br />
*1 - закрыть текущую авторизованную сессию<br />
*2 - создать диалог для отправки на стену<br />
*3 - возвращает данные обо мне<br />
*4 - возвращает данные о друзьях<br />
*5 - возвращает данные о друзьях, которых можно пригласить в игру<br />
*6 - получить список игровых сообщений<br />
*7 - получить список групп пользователя<br />
*8 - лайкал пользователь приложение или нет<br />
*9 - обновить мои очки на facebook сервере<br />
*10 - отправить игровое сообщение<br />
*11 - удалить игровое сообщение на facebook сервере<br />
*12 - отправить фоновое сообщение в ленту пользователя<br />
<br />
След. сост. выполняются автоматически, если необходимо:<br />
*13 - (ST_AUTO_CHECK_USER_PERMISSIONS) - получить список прав которые пользователь предоставил преложению<br />
*14 - (ST_AUTO_CHECK_APP_PERMISSIONS) - получить список прав которые facebook предоставил преложению<br />
*15 - (ST_AUTO_GET_WRITE_PERMISSIONS) - запросить у пользователя права на запись<br />
*16 - (ST_AUTO_GET_READ_PERMISSIONS) - запросить у пользователя права на чтение<br />
*17 - (ST_AUTO_POST_APP_REQUEST) - отправить application request пользователю<br />
*18 - (ST_AUTO_CHECK_USER_ACHIEVEMENTS) - проверить текущие ачивки пользователя<br />
*19 - (ST_CHANGE_SOCIAL_NETWORK) - изменить соц сеть<br />
<br />
<br />
<br />
==Ошибки==<br />
Если ошибка на гугловом устройстве, то к коду добавляется 1000, к примеру ошибка с кодом 9 на гугле будет 1009.<br />
<br />
<br />
*0 - неизвестная ошибка<br />
*1 - неизвестная задача<br />
*2 - facebook не поддерживается<br />
*3 - нет интернета<br />
*4 - превышен лимит ожидания запроса<br />
*5 - не указаны параметры для выполнения задачи<br />
*6 - отмена диалогового окна пользователем<br />
*7 - ошибка логина<br />
*8 - ошибка авторизации<br />
*9 - ошибка прав доступа<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
<br />
<br />
'''Пример запроса:'''<br />
*подали запрос выполнить задачу (например ST_GET_FRIENDS)<br />
*сначала проверяем есть ли права у приложения facebook (ST_AUTO_CHECK_APP_PERMISSIONS)<br />
*потом проверяем есть ли права от пользователя (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если пользователь не давал прав, то просим (ST_AUTO_GET_READ_PERMISSIONS)<br />
*потом снова проверяем дал ли нам пользователь права (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если весь цикл прошел успешно, то возвращаемся к поставленной задаче (ST_GET_FRIENDS)<br />
<br />
'''ВАЖНО:'''<br />
Если в любом месте произошел сбой, то ты НЕ увидишь конкретное состояние, ты увидишь только что "ST_GET_FRIENDS" отработал с ошибкой "9" или словами "ERR_PERMISSION". Других логик или кодов там нет.<br />
<br />
==Слушатели заполнения таблиц==<br />
Чтобы узнать когда окончательно заполниться таблица, нужно подвязать слушателя в нужном месте:<br />
*Таблица лидеров: <br />
**'''Cloud.table ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены лидерборды'''; <br />
*Друзья и подарки: <br />
**'''Cloud.table_fr ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены друзья''';<br />
*Неиграющие друзья:<br />
** '''Esocial.friendsnotinst ''' - машинка-слушатель успеха объекта 'Esocial 'состояние '''5''' (изменить состояние объекта - успех задачи)<br />
*Окно приёма подарка ( заполненность таблицы проверям у объекта "esocial" параметры "new_gifts" и "all_gifts"): <br />
**'''Esocial.giftreceivetable ''' - машинка-слушатель объекта 'Esocial' (изменить состояние объекта - '''заполнена таблица с подарками''')<br />
<br />
<br />
=Записи в логах=<br />
==Отправка подарка==<br />
21/3/2017 13:8:59.800: I/GESocial state() state 42 <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 gift = 11674 starting to search usid <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 fb login = 1 gc login = 0 <br />
21/3/2017 13:8:59.800: I/GESocial state() state 13 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM gift = 11674 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM Got id from param, id = 258188181311449 <br />
21/3/2017 13:8:59.801: I/GESocial load() load curTime = 1492769339 saveTime = 1492769335 (curTime - saveTime) = 4 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM _giftsCur = 0, gift = 11674, id = 258188181311449, _giftsLimit = 50 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM soc_net == netFacebook id = 258188181311449, data = 3,241016273040597,11674 <br />
21/3/2017 13:8:59.805: I/GESocial state() Viber request gift urlId = -1, url = , text = <br />
21/3/2017 13:8:59.808: I/GFacebook stPostRequest() stPostRequest -> title = Gift!, message = Иван Козаченко: Here is a gift for you!, <br />
data = 3,241016273040597,11674, userId = 258188181311449, <br />
excludeUserIds = , frictionless = 1, type = 2, forcedLogin=1 <br />
<br />
<br />
<br />
[[Category:Facebook]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Esocial&diff=9878Esocial2019-12-18T07:54:10Z<p>Agava: /* Отправка подарка */</p>
<hr />
<div>[[Object|Объект]] '''Esocial''' обеспечивает связь между приложением и Facebook'ом.<br />
<br />
<br />
=Параметры=<br />
<br />
<br />
[[Файл:Esocial_full.jpg|right]]<br />
*'''facebook''' - ссылка на объект [[facebook]], с которым будет работать объект<br />
*'''esocialfriendsitem''' - ссылка на объект esocialfriendsitem, с которым будет работать объект<br />
*'''таблица друзей''' - ссылка на таблицу, в которую будем клонировать esocialfriendsitem.<br />
*'''индикатор активности''' - объект который видимый когда загружаются друзья. Видимость выключается, когда задача загрузки друзей выполнена (успех или провал не важно).<br />
*'''опции для facebook''' - поле в опциях, куда мы будем записывать 32битное целое: Уровень + Коллекции.ESocial добавит к ним число друзей и засабмит при вызове соотв. состояние<br />
*'''социальная сеть''' - выбор социальной сети с которой взаимодействовать. На данный момент можно выбрать facebook, google+ и обе.<br />
<br />
*'''специальные подарки'''<br />
**'''подарок энергия id''' - id предметы из экономики;<br />
**'''подарок энергия количество''' - количество;<br />
**'''учитывать максимум энергии''' - если да, то не будет начисляться энергия выше максимума;<br />
<br />
<br />
*'''Инвайт'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
<br />
<br />
*'''Успешный инвайт'''<br />
**'''Окно''' - Машина, открывающая форму, которая содержит информацию об успешно приглашенном друге. Должна иметь состояние show. На закрытие должна вызывать состояние next_inv объекту esocial<br />
**'''Портрет''' - Объект, в который будет сложена иконка друга, подтянутая с facebook<br />
**'''Имя''' - Объект, в который будет сложено имя друга, подтянутое с facebook<br />
<br />
<br />
*'''Запрос подарка'''<br />
**'''Текст''' - текстовый id, в котором будет хранится текст типа:"Мне нужны коллекционные предметы:". После ":" будут перечисляться предметы (названия будут браться из id коллекционных предметов), которые нужны игроку, через запятую.<br />
**'''Таблица''' - таблица, в которую будут сложены желаемые предметы из окна коллекции для последующего поста их на стену.<br />
<br />
<br />
*'''Отправка подарка'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Ограничение''' - максимальное количество отправленных подарков в день (может быть сброшено).<br />
<br />
<br />
*'''Окно дарения из окна коллекций'''<br />
**'''окно''' - машина состояния, которая будет показывать окно. Должна иметь состояние open.<br />
**'''иконка''' - объект, в который будет помещена иконка предмета, который мы хотим подарить другому игроку.<br />
**'''текст (объект)''' - текстовый объект, в который сложится название предмета, который мы хотим подарить другу.<br />
**'''описание (объект)''' - текстовый объект, в который сложится описание предмета, который мы хотим подарить другу.<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу в окне с подарком другу.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem.<br />
<br />
<br />
*'''Окно дарения с двумя списками'''<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу друзей.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem из поля выше.<br />
**'''esocialgiftitem ''' - объект типа esocialgiftitem (темплейт подарка в таблице), который заполнит таблицу подарков.<br />
**'''таблица подарков''' - ссылка на таблицу в которую мы клонируем объект esocialgiftitem из поля выше.<br />
<br />
<br />
*'''Изменить состояние объекта при принятии инвайта''' - при успешном принятии приглашения (друг установил приложение) переводит объект в состояние.<br />
*'''Изменить состояние объекта при успешном выполнении задачи''' - при успешном выполнении задачи переводит объект в состояние<br />
*'''Изменить состояние объекта при ошибке выполнения задачи''' - при ошибке выполнения задачи переводит объект в состояние<br />
*'''изменить состояние объекта - дарим энергию выше max''' - обработчик применения энергии, когда дошли за максимум (сработает если '''учитывать максимум энергии''');<br />
<br />
В опции пишутся параметры инвайтов:<br />
<br />
*'''esocial%d.max_invite_total''' - всего инвайтов отправлено<br />
*'''esocial%d.max_invite_this''' - за последнюю отправку<br />
<br />
вместо %d - айдишник объекта<br />
<br />
Можно проверять в "nst_invite_sent"<br />
<br />
=Состояния=<br />
<br />
<br />
*0. '''ready''' - состояние готовности<br />
*1. '''friends'''<br />
*2. '''friends_debug''' - добавляем фейковых друзей<br />
*3. '''friends_inst''' - заполнить таблицу друзьями с установленной игрой<br />
*4. '''friends_not_inst''' - заполнить таблицу друзьями с неустановленной игрой<br />
*5. '''report''' - заслать полезную информацию (32бита)<br />
*6. '''invite''' - показать окно инвайта<br />
*7. '''cancel''' - отменить весь стек задач<br />
*8. '''retry''' - повторить текущую задачу<br />
*9. '''continue_fb''' - пропустить текущую задачу и перейти к следующей<br />
*10. '''continue_google''' - пропустить текущую задачу и перейти к следующей<br />
*11. '''next_inv''' - следующее окошко успешного инвайта<br />
*12. '''gift''' - показать окно посылки подарка из окна коллекций<br />
*13. '''gift_confirm''' - в окне посылки гифта из окна коллекций нажали кнопку ок<br />
*14. '''wish''' - запостить на стену "попрошайку" <br />
*15. '''check_requests''' - проверить реквесты от других пользователей<br />
*16. '''next_gift''' - следующее окошко про полученный подарок17.<br />
*17. '''refresh_gifts''' - актуализировать содержимое таблицы гифтов<br />
*18. '''refresh_vip_gifts''' - актуализировать содержимое таблицы гифтов используя исключительно вип подарки<br />
*19. '''gift_send''' - послать подарок из окна с двумя таблицами<br />
*20. '''logout''' - разлогиниться из фейсбука удалив всю информацию о друзьях<br />
*21. '''clear_gifts''' - сбросить ограничения на число подарков<br />
*22. '''wish_table''' - добавить пожелание в таблицу пожеланий<br />
*23. '''wish_all''' - пожелать все содержимое таблицы в фейсбук //Теперь только в фейсбук, а для гугла состояние ниже<br />
*24. '''remove_gift''' - убрать подарок из таблицы<br />
*25. '''gift_fb''' - подарить текущий подарок через фейбук используя нативный интерфейс фейсбука (т.е. так как сейчас работает гугл, без таблицы друзей)<br />
*26. '''gift_info''' - Обновить информацию о текущих подарках в специальном окне<br />
*27. '''gift_lb''' - Показать окно подарка из лидерборда<br />
*28. '''gift_send_lb''' - Подтвердить отсылку подарка из лидерборда<br />
*29. '''gift_receive''' - Получить подарок из окна получения подарков<br />
*30. '''invite_lb''' - Послать приглашение другу из лидербордов<br />
*31. '''get_me_google''' - запросить информацию о себе с гугла<br />
*32. '''friends_inst_google''' - заполнить таблицу друзьями с установленной игрой<br />
*33. '''friends_not_inst_google''' - заполнить таблицу друзьями с неустановленной игрой<br />
*34. '''message_friend''' - послать другу уведомление<br />
*35. '''friends_random''' - заполнить таблицу случайных друзей<br />
*36. '''wish_all_google''' - пожелать все содержимое таблицы в гугл<br />
*37. '''get_me_fb''' - запросить информацию о себе с фейсбука<br />
*38. '''check_requests_fb''' - проверить реквесты от других пользователей для fb<br />
*39. '''check_requests_google''' - проверить реквесты от других пользователей для гугл<br />
*40. '''logout_google''' - разлогиниться из гугла, удалив всю информацию о друзьях<br />
*41. '''gift_parse''' - Показать окно подарка из парсовой таблицы друзей<br />
*42. '''gift_send_parse''' - Подтвердить отсылку подарка из парсовой таблицы друзей<br />
*43. '''gift_parse_energy''' - Показать окно подарка энергии из парсовой таблицы друзей<br />
*44. '''gift_parse_vip''' - Подарок вип-подарка из окна лидербордов<br />
*45. '''gift_parse_res1''' - Подарок монет из окна лидербордов<br />
*46. '''gift_receive_no_delete''' - Получить подарок из окна получения подарков без запроса<br />
*47. '''gift_reply_energy''' - Послать в ответ энергию.<br />
*48. '''gift_reply_more''' - Промотать таблицу подарков в клауде на нужного юзера<br />
*49. '''gift_reply_res1''' - Послать в ответ ресурс1.<br />
*50. '''gift_reply_universal''' - ответить тем же, что прислали<br />
*51. '''gift_reply_vip''' - Послать в ответ vip.<br />
*52. '''invite_parse''' - Послать приглашение другу из парса (но из общей таблицы, не из лидербордов)<br />
*53. '''gift_parse_res1_multiple''' - отправить множественный подарок в виде монет<br />
*54. '''gift_parse_item_multiple''' - отправить множественный подарок в виде предмета, взяв его из поля gift_param<br />
*55. '''post_story''' - фоновое сообщение<br />
*56. '''external_like''' - "внешнее" окошко лайка<br />
*57. '''clear_timeouts''' - обнулить таймауты для некоторых тасков<br />
*58. '''refresh_inv_gifts''' - актуализировать содержимое таблицы инвентарных гифтов<br />
*59. '''wish_inv_add''' - добавить предмет из таблицы инвентарных в вишлист<br />
*60. '''wish_inv_remove''' - убрать предмет из таблицы инвентарных в вишлист<br />
*61. '''gift_parse_refresh''' - Обновить информацию о подарке в соотв. иконках и каунтерах<br />
*62. '''check_requests_abs''' - проверить реквесты от других пользователей, но только parse<br />
*63. '''switch_social_network''' - переключить активную социальную сеть, взяв ее айдишник из param<br />
*64. '''invite_random''' - показать окно инвайта для случайных друзей<br />
<br />
*66. '''join_community''' - пригласиться к группе, задать в параметр ''joincommunity'' id группы (для ВК).<br />
<br />
=Debug=<br />
Для того, что бы отслеживать работу объекта Facebook в папке Documents создаются три файла, которые хранят в себе все знания относительно друзей данного пользователя, их коллекций и уровня:<br />
<br>- '''facebook_debug_e.xml''' - создается во время отправки приглашения и при вызове состояния ''invite''<br />
<br>- '''facebook_debug_s.xml''' - создается после фидбэка от Facebook'a.<br />
<br>- '''facebook_debug.xml''' - создается исключительно в дебажной версии во время отправки объекту Facebook состояния ''friends'' или ''friends_inst''<br />
Выглядит этот файл приблизительно вот так:<br />
[[Файл:17-03-2014 11-09-06.png|right]]<br />
Поля:<br> '''request''' означает отправлен ли запрос. <br>'''invite''' - принял ли запрос и поле <br> '''inst'''(возможна ошибка в названии) - установлено ли приложение у данного друга.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Задачи (команды) и ошибки=<br />
<br />
В опции пишется номер успешной задачи, неуспешной и номер ошибки<br />
*'''esocial%d.compl_task''' - поле в опциях, куда запишется номер успешно выполненной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_task''' - поле в опциях, куда запишется номер неуспешной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_code''' - поле в опциях, куда запишется номер ошибки. %d - id объекта esocial в проекте.<br />
<br />
<br />
==Задачи==<br />
<br />
При выполнении состояния Esocial пишет в лог следующее:<br />
<br />
''onComplete state = %d task = %d,''<br />
<br />
где номер таска берется из следующего списка (состояния Facebook):<br />
<br />
*0 - провести авторизацию<br />
*1 - закрыть текущую авторизованную сессию<br />
*2 - создать диалог для отправки на стену<br />
*3 - возвращает данные обо мне<br />
*4 - возвращает данные о друзьях<br />
*5 - возвращает данные о друзьях, которых можно пригласить в игру<br />
*6 - получить список игровых сообщений<br />
*7 - получить список групп пользователя<br />
*8 - лайкал пользователь приложение или нет<br />
*9 - обновить мои очки на facebook сервере<br />
*10 - отправить игровое сообщение<br />
*11 - удалить игровое сообщение на facebook сервере<br />
*12 - отправить фоновое сообщение в ленту пользователя<br />
<br />
След. сост. выполняются автоматически, если необходимо:<br />
*13 - (ST_AUTO_CHECK_USER_PERMISSIONS) - получить список прав которые пользователь предоставил преложению<br />
*14 - (ST_AUTO_CHECK_APP_PERMISSIONS) - получить список прав которые facebook предоставил преложению<br />
*15 - (ST_AUTO_GET_WRITE_PERMISSIONS) - запросить у пользователя права на запись<br />
*16 - (ST_AUTO_GET_READ_PERMISSIONS) - запросить у пользователя права на чтение<br />
*17 - (ST_AUTO_POST_APP_REQUEST) - отправить application request пользователю<br />
*18 - (ST_AUTO_CHECK_USER_ACHIEVEMENTS) - проверить текущие ачивки пользователя<br />
*19 - (ST_CHANGE_SOCIAL_NETWORK) - изменить соц сеть<br />
<br />
<br />
<br />
==Ошибки==<br />
Если ошибка на гугловом устройстве, то к коду добавляется 1000, к примеру ошибка с кодом 9 на гугле будет 1009.<br />
<br />
<br />
*0 - неизвестная ошибка<br />
*1 - неизвестная задача<br />
*2 - facebook не поддерживается<br />
*3 - нет интернета<br />
*4 - превышен лимит ожидания запроса<br />
*5 - не указаны параметры для выполнения задачи<br />
*6 - отмена диалогового окна пользователем<br />
*7 - ошибка логина<br />
*8 - ошибка авторизации<br />
*9 - ошибка прав доступа<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
<br />
<br />
'''Пример запроса:'''<br />
*подали запрос выполнить задачу (например ST_GET_FRIENDS)<br />
*сначала проверяем есть ли права у приложения facebook (ST_AUTO_CHECK_APP_PERMISSIONS)<br />
*потом проверяем есть ли права от пользователя (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если пользователь не давал прав, то просим (ST_AUTO_GET_READ_PERMISSIONS)<br />
*потом снова проверяем дал ли нам пользователь права (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если весь цикл прошел успешно, то возвращаемся к поставленной задаче (ST_GET_FRIENDS)<br />
<br />
'''ВАЖНО:'''<br />
Если в любом месте произошел сбой, то ты НЕ увидишь конкретное состояние, ты увидишь только что "ST_GET_FRIENDS" отработал с ошибкой "9" или словами "ERR_PERMISSION". Других логик или кодов там нет.<br />
<br />
==Слушатели заполнения таблиц==<br />
Чтобы узнать когда окончательно заполниться таблица, нужно подвязать слушателя в нужном месте:<br />
*Таблица лидеров: <br />
**'''Cloud.table ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены лидерборды'''; <br />
*Друзья и подарки: <br />
**'''Cloud.table_fr ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены друзья''';<br />
*Неиграющие друзья:<br />
** '''Esocial.friendsnotinst ''' - машинка-слушатель успеха объекта 'Esocial 'состояние '''5''' (изменить состояние объекта - успех задачи)<br />
*Окно приёма подарка ( заполненность таблицы проверям у объекта "esocial" параметры "new_gifts" и "all_gifts"): <br />
**'''Esocial.giftreceivetable ''' - машинка-слушатель объекта 'Esocial' (изменить состояние объекта - '''заполнена таблица с подарками''')<br />
<br />
<br />
=Записи в логах=<br />
==Отправка подарка==<br />
21/3/2017 13:8:59.800: I/GESocial state() state 42 <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 gift = 11674 starting to search usid <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 fb login = 1 gc login = 0 <br />
21/3/2017 13:8:59.800: I/GESocial state() state 13 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM gift = 11674 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM Got id from param, id = 258188181311449 <br />
21/3/2017 13:8:59.801: I/GESocial load() load curTime = 1492769339 saveTime = 1492769335 (curTime - saveTime) = 4 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM _giftsCur = 0, gift = 11674, id = 258188181311449, _giftsLimit = 50 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM soc_net == netFacebook id = 258188181311449, data = 3,241016273040597,11674 <br />
21/3/2017 13:8:59.805: I/GESocial state() Viber request gift urlId = -1, url = , text = <br />
21/3/2017 13:8:59.808: I/GFacebook stPostRequest() stPostRequest -> title = Gift!, message = Иван Козаченко: Here is a gift for you!, data = 3,241016273040597,11674, userId = 258188181311449, <br />
excludeUserIds = , frictionless = 1, type = 2, forcedLogin=1 <br />
<br />
<br />
<br />
[[Category:Facebook]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Esocial&diff=9877Esocial2019-12-18T07:53:58Z<p>Agava: /* Отправка подарка */</p>
<hr />
<div>[[Object|Объект]] '''Esocial''' обеспечивает связь между приложением и Facebook'ом.<br />
<br />
<br />
=Параметры=<br />
<br />
<br />
[[Файл:Esocial_full.jpg|right]]<br />
*'''facebook''' - ссылка на объект [[facebook]], с которым будет работать объект<br />
*'''esocialfriendsitem''' - ссылка на объект esocialfriendsitem, с которым будет работать объект<br />
*'''таблица друзей''' - ссылка на таблицу, в которую будем клонировать esocialfriendsitem.<br />
*'''индикатор активности''' - объект который видимый когда загружаются друзья. Видимость выключается, когда задача загрузки друзей выполнена (успех или провал не важно).<br />
*'''опции для facebook''' - поле в опциях, куда мы будем записывать 32битное целое: Уровень + Коллекции.ESocial добавит к ним число друзей и засабмит при вызове соотв. состояние<br />
*'''социальная сеть''' - выбор социальной сети с которой взаимодействовать. На данный момент можно выбрать facebook, google+ и обе.<br />
<br />
*'''специальные подарки'''<br />
**'''подарок энергия id''' - id предметы из экономики;<br />
**'''подарок энергия количество''' - количество;<br />
**'''учитывать максимум энергии''' - если да, то не будет начисляться энергия выше максимума;<br />
<br />
<br />
*'''Инвайт'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
<br />
<br />
*'''Успешный инвайт'''<br />
**'''Окно''' - Машина, открывающая форму, которая содержит информацию об успешно приглашенном друге. Должна иметь состояние show. На закрытие должна вызывать состояние next_inv объекту esocial<br />
**'''Портрет''' - Объект, в который будет сложена иконка друга, подтянутая с facebook<br />
**'''Имя''' - Объект, в который будет сложено имя друга, подтянутое с facebook<br />
<br />
<br />
*'''Запрос подарка'''<br />
**'''Текст''' - текстовый id, в котором будет хранится текст типа:"Мне нужны коллекционные предметы:". После ":" будут перечисляться предметы (названия будут браться из id коллекционных предметов), которые нужны игроку, через запятую.<br />
**'''Таблица''' - таблица, в которую будут сложены желаемые предметы из окна коллекции для последующего поста их на стену.<br />
<br />
<br />
*'''Отправка подарка'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Ограничение''' - максимальное количество отправленных подарков в день (может быть сброшено).<br />
<br />
<br />
*'''Окно дарения из окна коллекций'''<br />
**'''окно''' - машина состояния, которая будет показывать окно. Должна иметь состояние open.<br />
**'''иконка''' - объект, в который будет помещена иконка предмета, который мы хотим подарить другому игроку.<br />
**'''текст (объект)''' - текстовый объект, в который сложится название предмета, который мы хотим подарить другу.<br />
**'''описание (объект)''' - текстовый объект, в который сложится описание предмета, который мы хотим подарить другу.<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу в окне с подарком другу.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem.<br />
<br />
<br />
*'''Окно дарения с двумя списками'''<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу друзей.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem из поля выше.<br />
**'''esocialgiftitem ''' - объект типа esocialgiftitem (темплейт подарка в таблице), который заполнит таблицу подарков.<br />
**'''таблица подарков''' - ссылка на таблицу в которую мы клонируем объект esocialgiftitem из поля выше.<br />
<br />
<br />
*'''Изменить состояние объекта при принятии инвайта''' - при успешном принятии приглашения (друг установил приложение) переводит объект в состояние.<br />
*'''Изменить состояние объекта при успешном выполнении задачи''' - при успешном выполнении задачи переводит объект в состояние<br />
*'''Изменить состояние объекта при ошибке выполнения задачи''' - при ошибке выполнения задачи переводит объект в состояние<br />
*'''изменить состояние объекта - дарим энергию выше max''' - обработчик применения энергии, когда дошли за максимум (сработает если '''учитывать максимум энергии''');<br />
<br />
В опции пишутся параметры инвайтов:<br />
<br />
*'''esocial%d.max_invite_total''' - всего инвайтов отправлено<br />
*'''esocial%d.max_invite_this''' - за последнюю отправку<br />
<br />
вместо %d - айдишник объекта<br />
<br />
Можно проверять в "nst_invite_sent"<br />
<br />
=Состояния=<br />
<br />
<br />
*0. '''ready''' - состояние готовности<br />
*1. '''friends'''<br />
*2. '''friends_debug''' - добавляем фейковых друзей<br />
*3. '''friends_inst''' - заполнить таблицу друзьями с установленной игрой<br />
*4. '''friends_not_inst''' - заполнить таблицу друзьями с неустановленной игрой<br />
*5. '''report''' - заслать полезную информацию (32бита)<br />
*6. '''invite''' - показать окно инвайта<br />
*7. '''cancel''' - отменить весь стек задач<br />
*8. '''retry''' - повторить текущую задачу<br />
*9. '''continue_fb''' - пропустить текущую задачу и перейти к следующей<br />
*10. '''continue_google''' - пропустить текущую задачу и перейти к следующей<br />
*11. '''next_inv''' - следующее окошко успешного инвайта<br />
*12. '''gift''' - показать окно посылки подарка из окна коллекций<br />
*13. '''gift_confirm''' - в окне посылки гифта из окна коллекций нажали кнопку ок<br />
*14. '''wish''' - запостить на стену "попрошайку" <br />
*15. '''check_requests''' - проверить реквесты от других пользователей<br />
*16. '''next_gift''' - следующее окошко про полученный подарок17.<br />
*17. '''refresh_gifts''' - актуализировать содержимое таблицы гифтов<br />
*18. '''refresh_vip_gifts''' - актуализировать содержимое таблицы гифтов используя исключительно вип подарки<br />
*19. '''gift_send''' - послать подарок из окна с двумя таблицами<br />
*20. '''logout''' - разлогиниться из фейсбука удалив всю информацию о друзьях<br />
*21. '''clear_gifts''' - сбросить ограничения на число подарков<br />
*22. '''wish_table''' - добавить пожелание в таблицу пожеланий<br />
*23. '''wish_all''' - пожелать все содержимое таблицы в фейсбук //Теперь только в фейсбук, а для гугла состояние ниже<br />
*24. '''remove_gift''' - убрать подарок из таблицы<br />
*25. '''gift_fb''' - подарить текущий подарок через фейбук используя нативный интерфейс фейсбука (т.е. так как сейчас работает гугл, без таблицы друзей)<br />
*26. '''gift_info''' - Обновить информацию о текущих подарках в специальном окне<br />
*27. '''gift_lb''' - Показать окно подарка из лидерборда<br />
*28. '''gift_send_lb''' - Подтвердить отсылку подарка из лидерборда<br />
*29. '''gift_receive''' - Получить подарок из окна получения подарков<br />
*30. '''invite_lb''' - Послать приглашение другу из лидербордов<br />
*31. '''get_me_google''' - запросить информацию о себе с гугла<br />
*32. '''friends_inst_google''' - заполнить таблицу друзьями с установленной игрой<br />
*33. '''friends_not_inst_google''' - заполнить таблицу друзьями с неустановленной игрой<br />
*34. '''message_friend''' - послать другу уведомление<br />
*35. '''friends_random''' - заполнить таблицу случайных друзей<br />
*36. '''wish_all_google''' - пожелать все содержимое таблицы в гугл<br />
*37. '''get_me_fb''' - запросить информацию о себе с фейсбука<br />
*38. '''check_requests_fb''' - проверить реквесты от других пользователей для fb<br />
*39. '''check_requests_google''' - проверить реквесты от других пользователей для гугл<br />
*40. '''logout_google''' - разлогиниться из гугла, удалив всю информацию о друзьях<br />
*41. '''gift_parse''' - Показать окно подарка из парсовой таблицы друзей<br />
*42. '''gift_send_parse''' - Подтвердить отсылку подарка из парсовой таблицы друзей<br />
*43. '''gift_parse_energy''' - Показать окно подарка энергии из парсовой таблицы друзей<br />
*44. '''gift_parse_vip''' - Подарок вип-подарка из окна лидербордов<br />
*45. '''gift_parse_res1''' - Подарок монет из окна лидербордов<br />
*46. '''gift_receive_no_delete''' - Получить подарок из окна получения подарков без запроса<br />
*47. '''gift_reply_energy''' - Послать в ответ энергию.<br />
*48. '''gift_reply_more''' - Промотать таблицу подарков в клауде на нужного юзера<br />
*49. '''gift_reply_res1''' - Послать в ответ ресурс1.<br />
*50. '''gift_reply_universal''' - ответить тем же, что прислали<br />
*51. '''gift_reply_vip''' - Послать в ответ vip.<br />
*52. '''invite_parse''' - Послать приглашение другу из парса (но из общей таблицы, не из лидербордов)<br />
*53. '''gift_parse_res1_multiple''' - отправить множественный подарок в виде монет<br />
*54. '''gift_parse_item_multiple''' - отправить множественный подарок в виде предмета, взяв его из поля gift_param<br />
*55. '''post_story''' - фоновое сообщение<br />
*56. '''external_like''' - "внешнее" окошко лайка<br />
*57. '''clear_timeouts''' - обнулить таймауты для некоторых тасков<br />
*58. '''refresh_inv_gifts''' - актуализировать содержимое таблицы инвентарных гифтов<br />
*59. '''wish_inv_add''' - добавить предмет из таблицы инвентарных в вишлист<br />
*60. '''wish_inv_remove''' - убрать предмет из таблицы инвентарных в вишлист<br />
*61. '''gift_parse_refresh''' - Обновить информацию о подарке в соотв. иконках и каунтерах<br />
*62. '''check_requests_abs''' - проверить реквесты от других пользователей, но только parse<br />
*63. '''switch_social_network''' - переключить активную социальную сеть, взяв ее айдишник из param<br />
*64. '''invite_random''' - показать окно инвайта для случайных друзей<br />
<br />
*66. '''join_community''' - пригласиться к группе, задать в параметр ''joincommunity'' id группы (для ВК).<br />
<br />
=Debug=<br />
Для того, что бы отслеживать работу объекта Facebook в папке Documents создаются три файла, которые хранят в себе все знания относительно друзей данного пользователя, их коллекций и уровня:<br />
<br>- '''facebook_debug_e.xml''' - создается во время отправки приглашения и при вызове состояния ''invite''<br />
<br>- '''facebook_debug_s.xml''' - создается после фидбэка от Facebook'a.<br />
<br>- '''facebook_debug.xml''' - создается исключительно в дебажной версии во время отправки объекту Facebook состояния ''friends'' или ''friends_inst''<br />
Выглядит этот файл приблизительно вот так:<br />
[[Файл:17-03-2014 11-09-06.png|right]]<br />
Поля:<br> '''request''' означает отправлен ли запрос. <br>'''invite''' - принял ли запрос и поле <br> '''inst'''(возможна ошибка в названии) - установлено ли приложение у данного друга.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Задачи (команды) и ошибки=<br />
<br />
В опции пишется номер успешной задачи, неуспешной и номер ошибки<br />
*'''esocial%d.compl_task''' - поле в опциях, куда запишется номер успешно выполненной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_task''' - поле в опциях, куда запишется номер неуспешной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_code''' - поле в опциях, куда запишется номер ошибки. %d - id объекта esocial в проекте.<br />
<br />
<br />
==Задачи==<br />
<br />
При выполнении состояния Esocial пишет в лог следующее:<br />
<br />
''onComplete state = %d task = %d,''<br />
<br />
где номер таска берется из следующего списка (состояния Facebook):<br />
<br />
*0 - провести авторизацию<br />
*1 - закрыть текущую авторизованную сессию<br />
*2 - создать диалог для отправки на стену<br />
*3 - возвращает данные обо мне<br />
*4 - возвращает данные о друзьях<br />
*5 - возвращает данные о друзьях, которых можно пригласить в игру<br />
*6 - получить список игровых сообщений<br />
*7 - получить список групп пользователя<br />
*8 - лайкал пользователь приложение или нет<br />
*9 - обновить мои очки на facebook сервере<br />
*10 - отправить игровое сообщение<br />
*11 - удалить игровое сообщение на facebook сервере<br />
*12 - отправить фоновое сообщение в ленту пользователя<br />
<br />
След. сост. выполняются автоматически, если необходимо:<br />
*13 - (ST_AUTO_CHECK_USER_PERMISSIONS) - получить список прав которые пользователь предоставил преложению<br />
*14 - (ST_AUTO_CHECK_APP_PERMISSIONS) - получить список прав которые facebook предоставил преложению<br />
*15 - (ST_AUTO_GET_WRITE_PERMISSIONS) - запросить у пользователя права на запись<br />
*16 - (ST_AUTO_GET_READ_PERMISSIONS) - запросить у пользователя права на чтение<br />
*17 - (ST_AUTO_POST_APP_REQUEST) - отправить application request пользователю<br />
*18 - (ST_AUTO_CHECK_USER_ACHIEVEMENTS) - проверить текущие ачивки пользователя<br />
*19 - (ST_CHANGE_SOCIAL_NETWORK) - изменить соц сеть<br />
<br />
<br />
<br />
==Ошибки==<br />
Если ошибка на гугловом устройстве, то к коду добавляется 1000, к примеру ошибка с кодом 9 на гугле будет 1009.<br />
<br />
<br />
*0 - неизвестная ошибка<br />
*1 - неизвестная задача<br />
*2 - facebook не поддерживается<br />
*3 - нет интернета<br />
*4 - превышен лимит ожидания запроса<br />
*5 - не указаны параметры для выполнения задачи<br />
*6 - отмена диалогового окна пользователем<br />
*7 - ошибка логина<br />
*8 - ошибка авторизации<br />
*9 - ошибка прав доступа<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
<br />
<br />
'''Пример запроса:'''<br />
*подали запрос выполнить задачу (например ST_GET_FRIENDS)<br />
*сначала проверяем есть ли права у приложения facebook (ST_AUTO_CHECK_APP_PERMISSIONS)<br />
*потом проверяем есть ли права от пользователя (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если пользователь не давал прав, то просим (ST_AUTO_GET_READ_PERMISSIONS)<br />
*потом снова проверяем дал ли нам пользователь права (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если весь цикл прошел успешно, то возвращаемся к поставленной задаче (ST_GET_FRIENDS)<br />
<br />
'''ВАЖНО:'''<br />
Если в любом месте произошел сбой, то ты НЕ увидишь конкретное состояние, ты увидишь только что "ST_GET_FRIENDS" отработал с ошибкой "9" или словами "ERR_PERMISSION". Других логик или кодов там нет.<br />
<br />
==Слушатели заполнения таблиц==<br />
Чтобы узнать когда окончательно заполниться таблица, нужно подвязать слушателя в нужном месте:<br />
*Таблица лидеров: <br />
**'''Cloud.table ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены лидерборды'''; <br />
*Друзья и подарки: <br />
**'''Cloud.table_fr ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены друзья''';<br />
*Неиграющие друзья:<br />
** '''Esocial.friendsnotinst ''' - машинка-слушатель успеха объекта 'Esocial 'состояние '''5''' (изменить состояние объекта - успех задачи)<br />
*Окно приёма подарка ( заполненность таблицы проверям у объекта "esocial" параметры "new_gifts" и "all_gifts"): <br />
**'''Esocial.giftreceivetable ''' - машинка-слушатель объекта 'Esocial' (изменить состояние объекта - '''заполнена таблица с подарками''')<br />
<br />
<br />
=Записи в логах=<br />
==Отправка подарка==<br />
21/3/2017 13:8:59.800: I/GESocial state() state 42 <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 gift = 11674 starting to search usid <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 fb login = 1 gc login = 0 <br />
21/3/2017 13:8:59.800: I/GESocial state() state 13 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM gift = 11674 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM Got id from param, id = 258188181311449 <br />
21/3/2017 13:8:59.801: I/GESocial load() load curTime = 1492769339 saveTime = 1492769335 (curTime - saveTime) = 4 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM _giftsCur = 0, gift = 11674, id = 258188181311449, _giftsLimit = 50 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM soc_net == netFacebook id = 258188181311449, data = 3,241016273040597,11674 <br />
21/3/2017 13:8:59.805: I/GESocial state() Viber request gift urlId = -1, url = , text = <br />
21/3/2017 13:8:59.808: I/GFacebook stPostRequest() stPostRequest -> title = Gift!, message = Иван Козаченко: Here is a gift for you!, data = 3,241016273040597,11674, userId = 258188181311449, excludeUserIds = , frictionless = 1, type = 2, forcedLogin=1 <br />
<br />
<br />
<br />
[[Category:Facebook]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Esocial&diff=9876Esocial2019-12-18T07:53:48Z<p>Agava: /* Отправка подарка */</p>
<hr />
<div>[[Object|Объект]] '''Esocial''' обеспечивает связь между приложением и Facebook'ом.<br />
<br />
<br />
=Параметры=<br />
<br />
<br />
[[Файл:Esocial_full.jpg|right]]<br />
*'''facebook''' - ссылка на объект [[facebook]], с которым будет работать объект<br />
*'''esocialfriendsitem''' - ссылка на объект esocialfriendsitem, с которым будет работать объект<br />
*'''таблица друзей''' - ссылка на таблицу, в которую будем клонировать esocialfriendsitem.<br />
*'''индикатор активности''' - объект который видимый когда загружаются друзья. Видимость выключается, когда задача загрузки друзей выполнена (успех или провал не важно).<br />
*'''опции для facebook''' - поле в опциях, куда мы будем записывать 32битное целое: Уровень + Коллекции.ESocial добавит к ним число друзей и засабмит при вызове соотв. состояние<br />
*'''социальная сеть''' - выбор социальной сети с которой взаимодействовать. На данный момент можно выбрать facebook, google+ и обе.<br />
<br />
*'''специальные подарки'''<br />
**'''подарок энергия id''' - id предметы из экономики;<br />
**'''подарок энергия количество''' - количество;<br />
**'''учитывать максимум энергии''' - если да, то не будет начисляться энергия выше максимума;<br />
<br />
<br />
*'''Инвайт'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
<br />
<br />
*'''Успешный инвайт'''<br />
**'''Окно''' - Машина, открывающая форму, которая содержит информацию об успешно приглашенном друге. Должна иметь состояние show. На закрытие должна вызывать состояние next_inv объекту esocial<br />
**'''Портрет''' - Объект, в который будет сложена иконка друга, подтянутая с facebook<br />
**'''Имя''' - Объект, в который будет сложено имя друга, подтянутое с facebook<br />
<br />
<br />
*'''Запрос подарка'''<br />
**'''Текст''' - текстовый id, в котором будет хранится текст типа:"Мне нужны коллекционные предметы:". После ":" будут перечисляться предметы (названия будут браться из id коллекционных предметов), которые нужны игроку, через запятую.<br />
**'''Таблица''' - таблица, в которую будут сложены желаемые предметы из окна коллекции для последующего поста их на стену.<br />
<br />
<br />
*'''Отправка подарка'''<br />
**'''Заголовок''' - Заголовок сообщения, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Сообщение''' - Сообщение, которое увидит пользователь в фейсбуке, перетаскивается из текстового редактора<br />
**'''Ограничение''' - максимальное количество отправленных подарков в день (может быть сброшено).<br />
<br />
<br />
*'''Окно дарения из окна коллекций'''<br />
**'''окно''' - машина состояния, которая будет показывать окно. Должна иметь состояние open.<br />
**'''иконка''' - объект, в который будет помещена иконка предмета, который мы хотим подарить другому игроку.<br />
**'''текст (объект)''' - текстовый объект, в который сложится название предмета, который мы хотим подарить другу.<br />
**'''описание (объект)''' - текстовый объект, в который сложится описание предмета, который мы хотим подарить другу.<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу в окне с подарком другу.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem.<br />
<br />
<br />
*'''Окно дарения с двумя списками'''<br />
**'''esocialfrienditem ''' - объект типа esocialfriendsitem (темплейт друга в таблице), который заполнит таблицу друзей.<br />
**'''таблица друзей''' - ссылка на таблицу в которую мы клонируем объект esocialfriendsitem из поля выше.<br />
**'''esocialgiftitem ''' - объект типа esocialgiftitem (темплейт подарка в таблице), который заполнит таблицу подарков.<br />
**'''таблица подарков''' - ссылка на таблицу в которую мы клонируем объект esocialgiftitem из поля выше.<br />
<br />
<br />
*'''Изменить состояние объекта при принятии инвайта''' - при успешном принятии приглашения (друг установил приложение) переводит объект в состояние.<br />
*'''Изменить состояние объекта при успешном выполнении задачи''' - при успешном выполнении задачи переводит объект в состояние<br />
*'''Изменить состояние объекта при ошибке выполнения задачи''' - при ошибке выполнения задачи переводит объект в состояние<br />
*'''изменить состояние объекта - дарим энергию выше max''' - обработчик применения энергии, когда дошли за максимум (сработает если '''учитывать максимум энергии''');<br />
<br />
В опции пишутся параметры инвайтов:<br />
<br />
*'''esocial%d.max_invite_total''' - всего инвайтов отправлено<br />
*'''esocial%d.max_invite_this''' - за последнюю отправку<br />
<br />
вместо %d - айдишник объекта<br />
<br />
Можно проверять в "nst_invite_sent"<br />
<br />
=Состояния=<br />
<br />
<br />
*0. '''ready''' - состояние готовности<br />
*1. '''friends'''<br />
*2. '''friends_debug''' - добавляем фейковых друзей<br />
*3. '''friends_inst''' - заполнить таблицу друзьями с установленной игрой<br />
*4. '''friends_not_inst''' - заполнить таблицу друзьями с неустановленной игрой<br />
*5. '''report''' - заслать полезную информацию (32бита)<br />
*6. '''invite''' - показать окно инвайта<br />
*7. '''cancel''' - отменить весь стек задач<br />
*8. '''retry''' - повторить текущую задачу<br />
*9. '''continue_fb''' - пропустить текущую задачу и перейти к следующей<br />
*10. '''continue_google''' - пропустить текущую задачу и перейти к следующей<br />
*11. '''next_inv''' - следующее окошко успешного инвайта<br />
*12. '''gift''' - показать окно посылки подарка из окна коллекций<br />
*13. '''gift_confirm''' - в окне посылки гифта из окна коллекций нажали кнопку ок<br />
*14. '''wish''' - запостить на стену "попрошайку" <br />
*15. '''check_requests''' - проверить реквесты от других пользователей<br />
*16. '''next_gift''' - следующее окошко про полученный подарок17.<br />
*17. '''refresh_gifts''' - актуализировать содержимое таблицы гифтов<br />
*18. '''refresh_vip_gifts''' - актуализировать содержимое таблицы гифтов используя исключительно вип подарки<br />
*19. '''gift_send''' - послать подарок из окна с двумя таблицами<br />
*20. '''logout''' - разлогиниться из фейсбука удалив всю информацию о друзьях<br />
*21. '''clear_gifts''' - сбросить ограничения на число подарков<br />
*22. '''wish_table''' - добавить пожелание в таблицу пожеланий<br />
*23. '''wish_all''' - пожелать все содержимое таблицы в фейсбук //Теперь только в фейсбук, а для гугла состояние ниже<br />
*24. '''remove_gift''' - убрать подарок из таблицы<br />
*25. '''gift_fb''' - подарить текущий подарок через фейбук используя нативный интерфейс фейсбука (т.е. так как сейчас работает гугл, без таблицы друзей)<br />
*26. '''gift_info''' - Обновить информацию о текущих подарках в специальном окне<br />
*27. '''gift_lb''' - Показать окно подарка из лидерборда<br />
*28. '''gift_send_lb''' - Подтвердить отсылку подарка из лидерборда<br />
*29. '''gift_receive''' - Получить подарок из окна получения подарков<br />
*30. '''invite_lb''' - Послать приглашение другу из лидербордов<br />
*31. '''get_me_google''' - запросить информацию о себе с гугла<br />
*32. '''friends_inst_google''' - заполнить таблицу друзьями с установленной игрой<br />
*33. '''friends_not_inst_google''' - заполнить таблицу друзьями с неустановленной игрой<br />
*34. '''message_friend''' - послать другу уведомление<br />
*35. '''friends_random''' - заполнить таблицу случайных друзей<br />
*36. '''wish_all_google''' - пожелать все содержимое таблицы в гугл<br />
*37. '''get_me_fb''' - запросить информацию о себе с фейсбука<br />
*38. '''check_requests_fb''' - проверить реквесты от других пользователей для fb<br />
*39. '''check_requests_google''' - проверить реквесты от других пользователей для гугл<br />
*40. '''logout_google''' - разлогиниться из гугла, удалив всю информацию о друзьях<br />
*41. '''gift_parse''' - Показать окно подарка из парсовой таблицы друзей<br />
*42. '''gift_send_parse''' - Подтвердить отсылку подарка из парсовой таблицы друзей<br />
*43. '''gift_parse_energy''' - Показать окно подарка энергии из парсовой таблицы друзей<br />
*44. '''gift_parse_vip''' - Подарок вип-подарка из окна лидербордов<br />
*45. '''gift_parse_res1''' - Подарок монет из окна лидербордов<br />
*46. '''gift_receive_no_delete''' - Получить подарок из окна получения подарков без запроса<br />
*47. '''gift_reply_energy''' - Послать в ответ энергию.<br />
*48. '''gift_reply_more''' - Промотать таблицу подарков в клауде на нужного юзера<br />
*49. '''gift_reply_res1''' - Послать в ответ ресурс1.<br />
*50. '''gift_reply_universal''' - ответить тем же, что прислали<br />
*51. '''gift_reply_vip''' - Послать в ответ vip.<br />
*52. '''invite_parse''' - Послать приглашение другу из парса (но из общей таблицы, не из лидербордов)<br />
*53. '''gift_parse_res1_multiple''' - отправить множественный подарок в виде монет<br />
*54. '''gift_parse_item_multiple''' - отправить множественный подарок в виде предмета, взяв его из поля gift_param<br />
*55. '''post_story''' - фоновое сообщение<br />
*56. '''external_like''' - "внешнее" окошко лайка<br />
*57. '''clear_timeouts''' - обнулить таймауты для некоторых тасков<br />
*58. '''refresh_inv_gifts''' - актуализировать содержимое таблицы инвентарных гифтов<br />
*59. '''wish_inv_add''' - добавить предмет из таблицы инвентарных в вишлист<br />
*60. '''wish_inv_remove''' - убрать предмет из таблицы инвентарных в вишлист<br />
*61. '''gift_parse_refresh''' - Обновить информацию о подарке в соотв. иконках и каунтерах<br />
*62. '''check_requests_abs''' - проверить реквесты от других пользователей, но только parse<br />
*63. '''switch_social_network''' - переключить активную социальную сеть, взяв ее айдишник из param<br />
*64. '''invite_random''' - показать окно инвайта для случайных друзей<br />
<br />
*66. '''join_community''' - пригласиться к группе, задать в параметр ''joincommunity'' id группы (для ВК).<br />
<br />
=Debug=<br />
Для того, что бы отслеживать работу объекта Facebook в папке Documents создаются три файла, которые хранят в себе все знания относительно друзей данного пользователя, их коллекций и уровня:<br />
<br>- '''facebook_debug_e.xml''' - создается во время отправки приглашения и при вызове состояния ''invite''<br />
<br>- '''facebook_debug_s.xml''' - создается после фидбэка от Facebook'a.<br />
<br>- '''facebook_debug.xml''' - создается исключительно в дебажной версии во время отправки объекту Facebook состояния ''friends'' или ''friends_inst''<br />
Выглядит этот файл приблизительно вот так:<br />
[[Файл:17-03-2014 11-09-06.png|right]]<br />
Поля:<br> '''request''' означает отправлен ли запрос. <br>'''invite''' - принял ли запрос и поле <br> '''inst'''(возможна ошибка в названии) - установлено ли приложение у данного друга.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Задачи (команды) и ошибки=<br />
<br />
В опции пишется номер успешной задачи, неуспешной и номер ошибки<br />
*'''esocial%d.compl_task''' - поле в опциях, куда запишется номер успешно выполненной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_task''' - поле в опциях, куда запишется номер неуспешной задачи. %d - id объекта esocial в проекте.<br />
*'''esocial%d.err_code''' - поле в опциях, куда запишется номер ошибки. %d - id объекта esocial в проекте.<br />
<br />
<br />
==Задачи==<br />
<br />
При выполнении состояния Esocial пишет в лог следующее:<br />
<br />
''onComplete state = %d task = %d,''<br />
<br />
где номер таска берется из следующего списка (состояния Facebook):<br />
<br />
*0 - провести авторизацию<br />
*1 - закрыть текущую авторизованную сессию<br />
*2 - создать диалог для отправки на стену<br />
*3 - возвращает данные обо мне<br />
*4 - возвращает данные о друзьях<br />
*5 - возвращает данные о друзьях, которых можно пригласить в игру<br />
*6 - получить список игровых сообщений<br />
*7 - получить список групп пользователя<br />
*8 - лайкал пользователь приложение или нет<br />
*9 - обновить мои очки на facebook сервере<br />
*10 - отправить игровое сообщение<br />
*11 - удалить игровое сообщение на facebook сервере<br />
*12 - отправить фоновое сообщение в ленту пользователя<br />
<br />
След. сост. выполняются автоматически, если необходимо:<br />
*13 - (ST_AUTO_CHECK_USER_PERMISSIONS) - получить список прав которые пользователь предоставил преложению<br />
*14 - (ST_AUTO_CHECK_APP_PERMISSIONS) - получить список прав которые facebook предоставил преложению<br />
*15 - (ST_AUTO_GET_WRITE_PERMISSIONS) - запросить у пользователя права на запись<br />
*16 - (ST_AUTO_GET_READ_PERMISSIONS) - запросить у пользователя права на чтение<br />
*17 - (ST_AUTO_POST_APP_REQUEST) - отправить application request пользователю<br />
*18 - (ST_AUTO_CHECK_USER_ACHIEVEMENTS) - проверить текущие ачивки пользователя<br />
*19 - (ST_CHANGE_SOCIAL_NETWORK) - изменить соц сеть<br />
<br />
<br />
<br />
==Ошибки==<br />
Если ошибка на гугловом устройстве, то к коду добавляется 1000, к примеру ошибка с кодом 9 на гугле будет 1009.<br />
<br />
<br />
*0 - неизвестная ошибка<br />
*1 - неизвестная задача<br />
*2 - facebook не поддерживается<br />
*3 - нет интернета<br />
*4 - превышен лимит ожидания запроса<br />
*5 - не указаны параметры для выполнения задачи<br />
*6 - отмена диалогового окна пользователем<br />
*7 - ошибка логина<br />
*8 - ошибка авторизации<br />
*9 - ошибка прав доступа<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
<br />
<br />
'''Пример запроса:'''<br />
*подали запрос выполнить задачу (например ST_GET_FRIENDS)<br />
*сначала проверяем есть ли права у приложения facebook (ST_AUTO_CHECK_APP_PERMISSIONS)<br />
*потом проверяем есть ли права от пользователя (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если пользователь не давал прав, то просим (ST_AUTO_GET_READ_PERMISSIONS)<br />
*потом снова проверяем дал ли нам пользователь права (ST_AUTO_CHECK_USER_PERMISSIONS)<br />
*если весь цикл прошел успешно, то возвращаемся к поставленной задаче (ST_GET_FRIENDS)<br />
<br />
'''ВАЖНО:'''<br />
Если в любом месте произошел сбой, то ты НЕ увидишь конкретное состояние, ты увидишь только что "ST_GET_FRIENDS" отработал с ошибкой "9" или словами "ERR_PERMISSION". Других логик или кодов там нет.<br />
<br />
==Слушатели заполнения таблиц==<br />
Чтобы узнать когда окончательно заполниться таблица, нужно подвязать слушателя в нужном месте:<br />
*Таблица лидеров: <br />
**'''Cloud.table ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены лидерборды'''; <br />
*Друзья и подарки: <br />
**'''Cloud.table_fr ''' - добавляемое свойство объекту 'Cloud' '''успешно загружены друзья''';<br />
*Неиграющие друзья:<br />
** '''Esocial.friendsnotinst ''' - машинка-слушатель успеха объекта 'Esocial 'состояние '''5''' (изменить состояние объекта - успех задачи)<br />
*Окно приёма подарка ( заполненность таблицы проверям у объекта "esocial" параметры "new_gifts" и "all_gifts"): <br />
**'''Esocial.giftreceivetable ''' - машинка-слушатель объекта 'Esocial' (изменить состояние объекта - '''заполнена таблица с подарками''')<br />
<br />
<br />
=Записи в логах=<br />
==Отправка подарка==<br />
21/3/2017 13:8:59.800: I/GESocial state() state 42 <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 gift = 11674 starting to search usid <br />
21/3/2017 13:8:59.800: I/GESocial state() New social system state = 42 fb login = 1 gc login = 0 <br />
21/3/2017 13:8:59.800: I/GESocial state() state 13 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM gift = 11674 <br />
21/3/2017 13:8:59.800: I/GESocial state() STATE_GIFT_CONFIRM Got id from param, id = 258188181311449 <br />
21/3/2017 13:8:59.801: I/GESocial load() load curTime = 1492769339 saveTime = 1492769335 (curTime - saveTime) = 4 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM _giftsCur = 0, gift = 11674, id = 258188181311449, _giftsLimit = 50 <br />
21/3/2017 13:8:59.801: I/GESocial state() STATE_GIFT_CONFIRM soc_net == netFacebook id = 258188181311449, data = 3,241016273040597,11674 <br />
21/3/2017 13:8:59.805: I/GESocial state() Viber request gift urlId = -1, url = , text = <br />
21/3/2017 13:8:59.808: I/GFacebook stPostRequest() stPostRequest -> title = Gift!, message = Иван Козаченко: Here is a gift for you!, data = 3,241016273040597,11674, userId = 258188181311449, <br />
excludeUserIds = , frictionless = 1, type = 2, forcedLogin=1 <br />
<br />
<br />
<br />
[[Category:Facebook]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Store&diff=9873Store2019-09-24T07:16:47Z<p>Agava: /* Состояния */</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 />
В store setup для покупки можно установить следующие параметры:<br />
*'''id покупки''' - внутриигровой id. По этому id в опциях хранится информация о покупке, и по этому id она совершается при совершении in-app покупки из [[Machine#buy|машины]] или по кнопке;<br />
*'''числовой id''' - уникальный идентификатор, который не должен повторяться в покупках;<br />
*'''цена''' - стоимость покупки;<br />
*'''consumable''' - флаг, сообщающий о том, одноразовая покупка (покупается навсегда) или многоразовая (расходник);<br />
*'''Subscription''' - распространяется ли покупка по подписке (работает для Google Play);<br />
*'''Обьект и состояние (успех)''' - перевести заданную машину в заданное состояние, если покупка завершилась успешно;<br />
*'''Обьект и состояние (провал)''' - перевести заданную машину в заданное состояние, если покупка по какой-то причине не завершилась;<br />
*'''Обьект и состояние (restore)''' - перевести заданную машину в заданное состояние, если покупка успешно восстановлена;<br />
*'''/platfrom/ id''' - id заведенных покупок из всевозможных сторов.<br />
<br />
==Состояния==<br />
<br />
*'''purchase''' - совершить покупку, взяв ее идентификатор (внутренний id) из параметра ''productBundle''<br />
<br />
==Создание, совершение и восстановление покупок==<br />
<br />
===Создание===<br />
<br />
'''Шаг 1.''' Создание объекта Store.<br />
На глобальном экране (например, там, где находятся [[options]]) создать объект [[store]]. Для этого на сцене ПКМ (правой кнопкой мыши), из выпадающего меня выбрать "создать объект сцены в текущем объекте". У созданного объекта изменить тип объекта на [[store]]. В поле ''имя'' вводим уникальное имя (приучаем себя к порядку в проекте).<br />
<center><br />
[[Файл:store_new.png]]<br />
</center><br />
<br />
'''Шаг 2.''' Создание покупки.<br />
* Нажимаем дважды на обьект '''Store''' в дереве обьектов. Перед нами появляется окно с настройками покупок. Чтобы добавить новую покупку, нажмите на кнопку-плюсик в верхней части экрана рядом с выпадающим списком. Появится чистая незаполненная покупка.<br />
<br />
'''!!! Обязательным параметром является ''внутренний id покупки'' - это уникальный идентификатор покупки в проекте.!!!'''<br />
* В первом поле "'''id покупки'''" записываем строковый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки. '''!!!Недопустимо начинать внутренний id покупки с числа!!!'''<br />
* В следующем поле идет числовой id покупки, обычно он заполняется порядковым числом покупки.<br />
* В поле "Цена" мы заносим цену покупки.<br />
* В поле "Consumable" мы укзываем, является наша покупка расходуемым предметом или же она покупается на всю игру.<br />
* После идут обработчики событий типа "машина-состояние". События всего 3: успех покупки, ошибка при покупке, восстановление покупки. При одном из этих событий обьект Store установит указанную машину в указанное состояние. Это можно использовать, например, чтобы в состоянии начислить игроук предметы, открыть какое-то окно и т.д. <br />
* Далее, в примере "'''iOS id покупки'''", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем. Эти идентификаторы можно получить у маркетологов, или узнать в сторе, если вы сами делаете игру. Чтобы тестировать покупку во вьювере, пока идентификатора у вас нет, можно заполнить поля другими значениями, неавжно какими, но они должны быть уникальны для покупки, например, скопировать айдишник покупки в поля, на которые вы ориентируетесь.<br />
* Далее, таким же образом, добавляется следующий инап. '''!!!Недопустимо использовать одинаковый идентификатор инапа из стора в разных внутренних покупках!!!'''<br />
<center><br />
[[Файл:StoreNew.jpg]].<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 />
== Пример 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>Agavahttps://wiki.appsalutecreator.com/index.php?title=Store&diff=9872Store2019-09-24T07:16:12Z<p>Agava: /* Параметры объекта Store */</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 />
В store setup для покупки можно установить следующие параметры:<br />
*'''id покупки''' - внутриигровой id. По этому id в опциях хранится информация о покупке, и по этому id она совершается при совершении in-app покупки из [[Machine#buy|машины]] или по кнопке;<br />
*'''числовой id''' - уникальный идентификатор, который не должен повторяться в покупках;<br />
*'''цена''' - стоимость покупки;<br />
*'''consumable''' - флаг, сообщающий о том, одноразовая покупка (покупается навсегда) или многоразовая (расходник);<br />
*'''Subscription''' - распространяется ли покупка по подписке (работает для Google Play);<br />
*'''Обьект и состояние (успех)''' - перевести заданную машину в заданное состояние, если покупка завершилась успешно;<br />
*'''Обьект и состояние (провал)''' - перевести заданную машину в заданное состояние, если покупка по какой-то причине не завершилась;<br />
*'''Обьект и состояние (restore)''' - перевести заданную машину в заданное состояние, если покупка успешно восстановлена;<br />
*'''/platfrom/ id''' - id заведенных покупок из всевозможных сторов.<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 />
* Нажимаем дважды на обьект '''Store''' в дереве обьектов. Перед нами появляется окно с настройками покупок. Чтобы добавить новую покупку, нажмите на кнопку-плюсик в верхней части экрана рядом с выпадающим списком. Появится чистая незаполненная покупка.<br />
<br />
'''!!! Обязательным параметром является ''внутренний id покупки'' - это уникальный идентификатор покупки в проекте.!!!'''<br />
* В первом поле "'''id покупки'''" записываем строковый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки. '''!!!Недопустимо начинать внутренний id покупки с числа!!!'''<br />
* В следующем поле идет числовой id покупки, обычно он заполняется порядковым числом покупки.<br />
* В поле "Цена" мы заносим цену покупки.<br />
* В поле "Consumable" мы укзываем, является наша покупка расходуемым предметом или же она покупается на всю игру.<br />
* После идут обработчики событий типа "машина-состояние". События всего 3: успех покупки, ошибка при покупке, восстановление покупки. При одном из этих событий обьект Store установит указанную машину в указанное состояние. Это можно использовать, например, чтобы в состоянии начислить игроук предметы, открыть какое-то окно и т.д. <br />
* Далее, в примере "'''iOS id покупки'''", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем. Эти идентификаторы можно получить у маркетологов, или узнать в сторе, если вы сами делаете игру. Чтобы тестировать покупку во вьювере, пока идентификатора у вас нет, можно заполнить поля другими значениями, неавжно какими, но они должны быть уникальны для покупки, например, скопировать айдишник покупки в поля, на которые вы ориентируетесь.<br />
* Далее, таким же образом, добавляется следующий инап. '''!!!Недопустимо использовать одинаковый идентификатор инапа из стора в разных внутренних покупках!!!'''<br />
<center><br />
[[Файл:StoreNew.jpg]].<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 />
== Пример 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>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0&diff=9871Сборка проекта2019-09-11T06:40:20Z<p>Agava: </p>
<hr />
<div>==Сборка проекта с помощью Abs Deployer==<br />
<br />
===Запуск сборки APK из окна экспорта===<br />
<br />
Чтобы запустить окно сборки с уже настроенными параметрами, нужно в окне подготовки экспорта проекта поставить галочку "Launch default build after export". После окончания экспорта откроется окно Abs Deployer.<br />
<br />
[[Файл:123412341234.png]]<br />
<br />
''Окно Abs Deployer''<br />
<br />
<br />
Здесь можно наблюдать 3 поля ввода и большую кнопку "Build Android". Поля ввода:<br />
# Caption - название приложения<br />
# Version - версия приложения<br />
# Package - пак приложения для Google Play<br />
<br />
На большую кнопку нажимать пока рано, сначала нужно настроить сборку.<br />
Перейдем на вкладку Android:<br />
<br />
[[Файл:1234123412345.png]]<br />
<br />
''Вкладка Android''<br />
<br />
<br />
Некоторые поля, соответствующие первой вкладке, уже будут заполнены, остальные поля нам надо заполнить самим. Заполните поля TargetSDK и MinSDK как на скриншоте, а также пропишите пути к AndroidNDK и AndroidSDK. Два этих набора можно скачать, установив вместе с Android Studio, или же по отдельности: [https://developer.android.com/studio#command-tools Android SDK Tools], [https://developer.android.com/ndk/downloads Android NDK]. Разархивируйте скачанные файлы и поместите их на диске (убедитесь, что папка доступна для записи файлов).<br />
<br />
После настройки возвращаемся на вкладку и жмем на кнопку сборки. Логи сборки отражаются в последней вкладке. После сборки результирующую APK можно найти в папке ''папка с редактором''\system\project_build\data\build_android\app.<br />
<br />
==Запуск сборки через Marmalade SDK==<br />
Для того чтобы собрать проект необходимо:<br />
# Провести настройку проекта в соответствии с инструкциями указанными в <br />
# Установленный Marmalade SDK последней версии, для сборок ios, android, blackberry, windows marmalade, windows phone 8<br />
## Сборка для Windows Phone 8 возможна только на системе Windows 8, также необходимо наличие установленных Windows Phone 8 SDK и Visual Studio 2012 редакций Express Phone Edition или Professional<br />
## Для сборок flash и windows_absolutist Marmalade SDK не нужен<br />
# В редакторе сцен выбрать "проект" -> экспортировать проект<br />
# В появившемся окне выбрать необходимые настройки упаковки графики, каталог для экспорта указывать не надо <br> [[Файл:Export-deploy window.jpg]]<br />
# Выбрать платформу для сборки и нажать "ok"<br />
<br />
После этого начинается экспорт проекта и его подготовка для сборки в соответствии с настройками указанными в [[Proj_config.csv]].<br />
Ход формирования настроек можно увидеть в окне приложения Logger, которое запустится сразу по окончании экспорта проекта.<br />
Logger отображает ход выполнения настроек, python подготавливает сборку и запускает Marmalade Deploy Tool. Если Marmalade Deploy Tool не запускается длительное время - можно принудительно прервать сборку закрыв окно pyton и посмотреть в Logger-е какие проблемы произошли во время подготовки к сборке.<br />
<br />
[[Файл:Logger and python.jpg| 400px | окно Logger и окно python]]<br />
<br />
При необходимости лог из Logger-а можно сохранить в файл соответствующей кнопкой.<br />
<br />
После проведения всех настроек запустится Marmalade Deploy Tool в котором можно проверить правильность настроек, внести корректировки и запустить сборку.<br />
<span style="background-color:yellow">Важно! Корректировки внесённые в Marmalade Deploy Tool не будут сохранены для следующей сборки.</span><br />
<br />
Когда откроется окно Marmalade Deploy Tool с предложением выбрать архитектуру сборки - arm или x86. x86 необходимо выбирать только для сборки windows_marmalade, для остальных случаев выбираем платформу ARM GCC Release и нажимаем кнопку далее.<br />
<br />
<span style="background-color:yellow">Если навести курсор мышки на поле, то появится подсказка с информацией об этом поле и на что оно влияет.</span><br />
<br />
В следующем шаге необходимо выбрать конфигурацию проекта, который будет собираться. Снимаем отметку с настроек default и предыдущего собранного проекта, если отличается от текущего, и выбираем текущую настройку и нажимаем "Далее".<br />
<br />
[[Файл:Deploytool select build.jpg]]<br />
<br />
----<br />
<br />
На этом шаге идёт выбор платформы и платформенные настройки.<br />
Если перед экспортом выбрана платформа ios, то в окне выбора платформы платформа IOS будет выбрана автоматически, если android, amazon, samsung - то автоматически будет выбрана android, для windows_marmalade - windows, для blackberry необходимо выбрать самостоятельно playbook - если приложение для playbook и, или, blackberry 10 - если приложение для blackberry 10, для Windows phone 8 также необходимо выбрать самостоятельно её платформу. Когда указана правильно соответствующая платформа - нажимаем "Далее".<br />
<br />
[[Файл:Select platform.jpg|500px]]<br />
<br />
----<br />
<br />
На этом шаге можно проверить название приложения, название итогового файла, издателя, версию, также можно увидеть путь к файлу [[app.icf]], который будет использован - можно проверить те ли настройки в нём которые ожидаются. Если всё правильно - нажимаем "Далее" для перехода к платформенным настройкам.<br />
<br />
[[Файл:General settings.jpg|500px ]]<br />
<br />
<br />
<br />
==IOS==<br />
В этом шаге можно проверить правильность платформенных настроек: bundle id, иконок, сплэш-скринов, настройки региона для сборки, подписывать приложение или нет, профиль которым необходимо подписать приложение. Для подписи необходимо поставить отметку "Sign for distribution" и выбрать профиль в пункте "Provision profile". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Ios settings.jpg|500px]]<br />
<br />
<br />
<br />
==Android==<br />
В этом шаге можно проверить правильность платформенных настроек: package id, иконок, подписывать приложение или нет, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "Key Alias Name", "Private Key Password", "Application Keystore", "Keystore Password". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Android platform marmalade settings.jpg| 500px]]<br />
<br />
<br />
==Blackberry==<br />
В этом шаге можно проверить правильность платформенных настроек: Author Name, Author ID, иконок, пароль к хранилищу ключей, пароль к сервису Blackberry, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "BlackBerry CSK Password", "BlackBerry Keystore file", "BlackBerry Keystore Password".<br />
Поле Playbook Specific Icon и Blackberry 10 Specific Icon не рекомендованы к заполнению.<br />
Настройки для Blackberry 10 аналогичны.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
[[Файл:Blackberry settings.jpg|500px]]<br />
<br />
<br />
<br />
==Windows Marmalade==<br />
В этом шаге можно проверить правильность иконки.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
<br />
[[Файл:Win 32.jpg|500px]]<br />
<br />
==Сборка==<br />
На данном этапе остаётся только запустить сборку. Сборка запускается нажатием кнопки "Deploy All" <br><br />
[[Файл:Start deploy.jpg|500px]]<br />
<br />
Если в процессе сборки возникнут какие-то проблемы сборка остановится и в поле '''Progress''' будет написана ошибка, подробней узнать что пошло не так можно нажав на кнопку Log - откроется окно с логом хода сборки.<br><br />
[[Файл:Sdk error.jpg|500px]]<br />
<br />
Если всё прошло успешно - в поле '''Progress''' будет надпись Sucsess. Теперь можно нажать кнопку Explore - откроется проводник с каталогом в котором содержится готовый пакет, или закрыть окно Deploy Tool - после закрытия окна пакет скопируется в каталог AppsaluteCreatorBuilds в каталоге "Мои документы" текущего пользователя.<br><br />
[[Файл:Sucsess sdk.jpg|500px]]<br />
<br />
<br />
[[Category:Projects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0&diff=9870Сборка проекта2019-09-11T06:39:50Z<p>Agava: /* Сборка проекта с помощью Abs Deployer */</p>
<hr />
<div>==Сборка проекта с помощью Abs Deployer==<br />
<br />
===Запуск сборки APK из окна экспорта===<br />
<br />
Чтобы запустить окно сборки с уже настроенными параметрами, нужно в окне подготовки экспорта проекта поставить галочку "Launch default build after export". После окончания экспорта откроется окно Abs Deployer.<br />
<br />
[[Файл:123412341234.png]]<br />
<br />
''Окно Abs Deployer''<br />
<br />
<br />
Здесь можно наблюдать 3 поля ввода и большую кнопку "Build Android". Поля ввода:<br />
# Caption - название приложения<br />
# Version - версия приложения<br />
# Package - пак приложения для Google Play<br />
<br />
На большую кнопку нажимать пока рано, сначала нужно настроить сборку.<br />
Перейдем на вкладку Android:<br />
<br />
[[Файл:1234123412345.png]]<br />
<br />
''Вкладка Android''<br />
<br />
<br />
Некоторые поля, соответствующие первой вкладке, уже будут заполнены, остальные поля нам надо заполнить самим. Заполните поля TargetSDK и MinSDK как на скриншоте, а также пропишите пути к AndroidNDK и AndroidSDK. Два этих набора можно скачать, установив вместе с Android Studio, или же по отдельности: [https://developer.android.com/studio#command-tools Android SDK Tools], [https://developer.android.com/ndk/downloads Android NDK]. Разархивируйте скачанные файлы и поместите их на диске (убедитесь, что папка доступна для записи файлов).<br />
<br />
После настройки возвращаемся на вкладку и жмем на кнопку сборки. Логи сборки отражаются в последней вкладке. После сборки результирующую APK можно найти в папке ''папка с редактором''\system\project_build\data\build_android\app.<br />
<br />
==Запуск сборки==<br />
Для того чтобы собрать проект необходимо:<br />
# Провести настройку проекта в соответствии с инструкциями указанными в <br />
# Установленный Marmalade SDK последней версии, для сборок ios, android, blackberry, windows marmalade, windows phone 8<br />
## Сборка для Windows Phone 8 возможна только на системе Windows 8, также необходимо наличие установленных Windows Phone 8 SDK и Visual Studio 2012 редакций Express Phone Edition или Professional<br />
## Для сборок flash и windows_absolutist Marmalade SDK не нужен<br />
# В редакторе сцен выбрать "проект" -> экспортировать проект<br />
# В появившемся окне выбрать необходимые настройки упаковки графики, каталог для экспорта указывать не надо <br> [[Файл:Export-deploy window.jpg]]<br />
# Выбрать платформу для сборки и нажать "ok"<br />
<br />
После этого начинается экспорт проекта и его подготовка для сборки в соответствии с настройками указанными в [[Proj_config.csv]].<br />
Ход формирования настроек можно увидеть в окне приложения Logger, которое запустится сразу по окончании экспорта проекта.<br />
Logger отображает ход выполнения настроек, python подготавливает сборку и запускает Marmalade Deploy Tool. Если Marmalade Deploy Tool не запускается длительное время - можно принудительно прервать сборку закрыв окно pyton и посмотреть в Logger-е какие проблемы произошли во время подготовки к сборке.<br />
<br />
[[Файл:Logger and python.jpg| 400px | окно Logger и окно python]]<br />
<br />
При необходимости лог из Logger-а можно сохранить в файл соответствующей кнопкой.<br />
<br />
После проведения всех настроек запустится Marmalade Deploy Tool в котором можно проверить правильность настроек, внести корректировки и запустить сборку.<br />
<span style="background-color:yellow">Важно! Корректировки внесённые в Marmalade Deploy Tool не будут сохранены для следующей сборки.</span><br />
<br />
Когда откроется окно Marmalade Deploy Tool с предложением выбрать архитектуру сборки - arm или x86. x86 необходимо выбирать только для сборки windows_marmalade, для остальных случаев выбираем платформу ARM GCC Release и нажимаем кнопку далее.<br />
<br />
<span style="background-color:yellow">Если навести курсор мышки на поле, то появится подсказка с информацией об этом поле и на что оно влияет.</span><br />
<br />
В следующем шаге необходимо выбрать конфигурацию проекта, который будет собираться. Снимаем отметку с настроек default и предыдущего собранного проекта, если отличается от текущего, и выбираем текущую настройку и нажимаем "Далее".<br />
<br />
[[Файл:Deploytool select build.jpg]]<br />
<br />
----<br />
<br />
На этом шаге идёт выбор платформы и платформенные настройки.<br />
Если перед экспортом выбрана платформа ios, то в окне выбора платформы платформа IOS будет выбрана автоматически, если android, amazon, samsung - то автоматически будет выбрана android, для windows_marmalade - windows, для blackberry необходимо выбрать самостоятельно playbook - если приложение для playbook и, или, blackberry 10 - если приложение для blackberry 10, для Windows phone 8 также необходимо выбрать самостоятельно её платформу. Когда указана правильно соответствующая платформа - нажимаем "Далее".<br />
<br />
[[Файл:Select platform.jpg|500px]]<br />
<br />
----<br />
<br />
На этом шаге можно проверить название приложения, название итогового файла, издателя, версию, также можно увидеть путь к файлу [[app.icf]], который будет использован - можно проверить те ли настройки в нём которые ожидаются. Если всё правильно - нажимаем "Далее" для перехода к платформенным настройкам.<br />
<br />
[[Файл:General settings.jpg|500px ]]<br />
<br />
<br />
<br />
==IOS==<br />
В этом шаге можно проверить правильность платформенных настроек: bundle id, иконок, сплэш-скринов, настройки региона для сборки, подписывать приложение или нет, профиль которым необходимо подписать приложение. Для подписи необходимо поставить отметку "Sign for distribution" и выбрать профиль в пункте "Provision profile". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Ios settings.jpg|500px]]<br />
<br />
<br />
<br />
==Android==<br />
В этом шаге можно проверить правильность платформенных настроек: package id, иконок, подписывать приложение или нет, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "Key Alias Name", "Private Key Password", "Application Keystore", "Keystore Password". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Android platform marmalade settings.jpg| 500px]]<br />
<br />
<br />
==Blackberry==<br />
В этом шаге можно проверить правильность платформенных настроек: Author Name, Author ID, иконок, пароль к хранилищу ключей, пароль к сервису Blackberry, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "BlackBerry CSK Password", "BlackBerry Keystore file", "BlackBerry Keystore Password".<br />
Поле Playbook Specific Icon и Blackberry 10 Specific Icon не рекомендованы к заполнению.<br />
Настройки для Blackberry 10 аналогичны.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
[[Файл:Blackberry settings.jpg|500px]]<br />
<br />
<br />
<br />
==Windows Marmalade==<br />
В этом шаге можно проверить правильность иконки.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
<br />
[[Файл:Win 32.jpg|500px]]<br />
<br />
==Сборка==<br />
На данном этапе остаётся только запустить сборку. Сборка запускается нажатием кнопки "Deploy All" <br><br />
[[Файл:Start deploy.jpg|500px]]<br />
<br />
Если в процессе сборки возникнут какие-то проблемы сборка остановится и в поле '''Progress''' будет написана ошибка, подробней узнать что пошло не так можно нажав на кнопку Log - откроется окно с логом хода сборки.<br><br />
[[Файл:Sdk error.jpg|500px]]<br />
<br />
Если всё прошло успешно - в поле '''Progress''' будет надпись Sucsess. Теперь можно нажать кнопку Explore - откроется проводник с каталогом в котором содержится готовый пакет, или закрыть окно Deploy Tool - после закрытия окна пакет скопируется в каталог AppsaluteCreatorBuilds в каталоге "Мои документы" текущего пользователя.<br><br />
[[Файл:Sucsess sdk.jpg|500px]]<br />
<br />
<br />
[[Category:Projects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0&diff=9869Сборка проекта2019-09-11T06:39:40Z<p>Agava: /* Запуск сборки APK из окна экспорта */</p>
<hr />
<div>==Сборка проекта с помощью Abs Deployer==<br />
<br />
===Запуск сборки APK из окна экспорта===<br />
<br />
Чтобы запустить окно сборки с уже настроенными параметрами, нужно в окне подготовки экспорта проекта поставить галочку "Launch default build after export". После окончания экспорта откроется окно Abs Deployer.<br />
<br />
[[Файл:123412341234.png]]<br />
<br />
''Окно Abs Deployer''<br />
<br />
Здесь можно наблюдать 3 поля ввода и большую кнопку "Build Android". Поля ввода:<br />
# Caption - название приложения<br />
# Version - версия приложения<br />
# Package - пак приложения для Google Play<br />
<br />
На большую кнопку нажимать пока рано, сначала нужно настроить сборку.<br />
Перейдем на вкладку Android:<br />
<br />
[[Файл:1234123412345.png]]<br />
<br />
''Вкладка Android''<br />
<br />
Некоторые поля, соответствующие первой вкладке, уже будут заполнены, остальные поля нам надо заполнить самим. Заполните поля TargetSDK и MinSDK как на скриншоте, а также пропишите пути к AndroidNDK и AndroidSDK. Два этих набора можно скачать, установив вместе с Android Studio, или же по отдельности: [https://developer.android.com/studio#command-tools Android SDK Tools], [https://developer.android.com/ndk/downloads Android NDK]. Разархивируйте скачанные файлы и поместите их на диске (убедитесь, что папка доступна для записи файлов).<br />
<br />
После настройки возвращаемся на вкладку и жмем на кнопку сборки. Логи сборки отражаются в последней вкладке. После сборки результирующую APK можно найти в папке ''папка с редактором''\system\project_build\data\build_android\app.<br />
<br />
==Запуск сборки==<br />
Для того чтобы собрать проект необходимо:<br />
# Провести настройку проекта в соответствии с инструкциями указанными в <br />
# Установленный Marmalade SDK последней версии, для сборок ios, android, blackberry, windows marmalade, windows phone 8<br />
## Сборка для Windows Phone 8 возможна только на системе Windows 8, также необходимо наличие установленных Windows Phone 8 SDK и Visual Studio 2012 редакций Express Phone Edition или Professional<br />
## Для сборок flash и windows_absolutist Marmalade SDK не нужен<br />
# В редакторе сцен выбрать "проект" -> экспортировать проект<br />
# В появившемся окне выбрать необходимые настройки упаковки графики, каталог для экспорта указывать не надо <br> [[Файл:Export-deploy window.jpg]]<br />
# Выбрать платформу для сборки и нажать "ok"<br />
<br />
После этого начинается экспорт проекта и его подготовка для сборки в соответствии с настройками указанными в [[Proj_config.csv]].<br />
Ход формирования настроек можно увидеть в окне приложения Logger, которое запустится сразу по окончании экспорта проекта.<br />
Logger отображает ход выполнения настроек, python подготавливает сборку и запускает Marmalade Deploy Tool. Если Marmalade Deploy Tool не запускается длительное время - можно принудительно прервать сборку закрыв окно pyton и посмотреть в Logger-е какие проблемы произошли во время подготовки к сборке.<br />
<br />
[[Файл:Logger and python.jpg| 400px | окно Logger и окно python]]<br />
<br />
При необходимости лог из Logger-а можно сохранить в файл соответствующей кнопкой.<br />
<br />
После проведения всех настроек запустится Marmalade Deploy Tool в котором можно проверить правильность настроек, внести корректировки и запустить сборку.<br />
<span style="background-color:yellow">Важно! Корректировки внесённые в Marmalade Deploy Tool не будут сохранены для следующей сборки.</span><br />
<br />
Когда откроется окно Marmalade Deploy Tool с предложением выбрать архитектуру сборки - arm или x86. x86 необходимо выбирать только для сборки windows_marmalade, для остальных случаев выбираем платформу ARM GCC Release и нажимаем кнопку далее.<br />
<br />
<span style="background-color:yellow">Если навести курсор мышки на поле, то появится подсказка с информацией об этом поле и на что оно влияет.</span><br />
<br />
В следующем шаге необходимо выбрать конфигурацию проекта, который будет собираться. Снимаем отметку с настроек default и предыдущего собранного проекта, если отличается от текущего, и выбираем текущую настройку и нажимаем "Далее".<br />
<br />
[[Файл:Deploytool select build.jpg]]<br />
<br />
----<br />
<br />
На этом шаге идёт выбор платформы и платформенные настройки.<br />
Если перед экспортом выбрана платформа ios, то в окне выбора платформы платформа IOS будет выбрана автоматически, если android, amazon, samsung - то автоматически будет выбрана android, для windows_marmalade - windows, для blackberry необходимо выбрать самостоятельно playbook - если приложение для playbook и, или, blackberry 10 - если приложение для blackberry 10, для Windows phone 8 также необходимо выбрать самостоятельно её платформу. Когда указана правильно соответствующая платформа - нажимаем "Далее".<br />
<br />
[[Файл:Select platform.jpg|500px]]<br />
<br />
----<br />
<br />
На этом шаге можно проверить название приложения, название итогового файла, издателя, версию, также можно увидеть путь к файлу [[app.icf]], который будет использован - можно проверить те ли настройки в нём которые ожидаются. Если всё правильно - нажимаем "Далее" для перехода к платформенным настройкам.<br />
<br />
[[Файл:General settings.jpg|500px ]]<br />
<br />
<br />
<br />
==IOS==<br />
В этом шаге можно проверить правильность платформенных настроек: bundle id, иконок, сплэш-скринов, настройки региона для сборки, подписывать приложение или нет, профиль которым необходимо подписать приложение. Для подписи необходимо поставить отметку "Sign for distribution" и выбрать профиль в пункте "Provision profile". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Ios settings.jpg|500px]]<br />
<br />
<br />
<br />
==Android==<br />
В этом шаге можно проверить правильность платформенных настроек: package id, иконок, подписывать приложение или нет, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "Key Alias Name", "Private Key Password", "Application Keystore", "Keystore Password". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Android platform marmalade settings.jpg| 500px]]<br />
<br />
<br />
==Blackberry==<br />
В этом шаге можно проверить правильность платформенных настроек: Author Name, Author ID, иконок, пароль к хранилищу ключей, пароль к сервису Blackberry, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "BlackBerry CSK Password", "BlackBerry Keystore file", "BlackBerry Keystore Password".<br />
Поле Playbook Specific Icon и Blackberry 10 Specific Icon не рекомендованы к заполнению.<br />
Настройки для Blackberry 10 аналогичны.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
[[Файл:Blackberry settings.jpg|500px]]<br />
<br />
<br />
<br />
==Windows Marmalade==<br />
В этом шаге можно проверить правильность иконки.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
<br />
[[Файл:Win 32.jpg|500px]]<br />
<br />
==Сборка==<br />
На данном этапе остаётся только запустить сборку. Сборка запускается нажатием кнопки "Deploy All" <br><br />
[[Файл:Start deploy.jpg|500px]]<br />
<br />
Если в процессе сборки возникнут какие-то проблемы сборка остановится и в поле '''Progress''' будет написана ошибка, подробней узнать что пошло не так можно нажав на кнопку Log - откроется окно с логом хода сборки.<br><br />
[[Файл:Sdk error.jpg|500px]]<br />
<br />
Если всё прошло успешно - в поле '''Progress''' будет надпись Sucsess. Теперь можно нажать кнопку Explore - откроется проводник с каталогом в котором содержится готовый пакет, или закрыть окно Deploy Tool - после закрытия окна пакет скопируется в каталог AppsaluteCreatorBuilds в каталоге "Мои документы" текущего пользователя.<br><br />
[[Файл:Sucsess sdk.jpg|500px]]<br />
<br />
<br />
[[Category:Projects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0&diff=9868Сборка проекта2019-09-11T06:39:29Z<p>Agava: </p>
<hr />
<div>==Сборка проекта с помощью Abs Deployer==<br />
<br />
===Запуск сборки APK из окна экспорта===<br />
<br />
Чтобы запустить окно сборки с уже настроенными параметрами, нужно в окне подготовки экспорта проекта поставить галочку "Launch default build after export". После окончания экспорта откроется окно Abs Deployer.<br />
<br />
[[Файл:123412341234.png]]<br />
''Окно Abs Deployer''<br />
<br />
Здесь можно наблюдать 3 поля ввода и большую кнопку "Build Android". Поля ввода:<br />
# Caption - название приложения<br />
# Version - версия приложения<br />
# Package - пак приложения для Google Play<br />
<br />
На большую кнопку нажимать пока рано, сначала нужно настроить сборку.<br />
Перейдем на вкладку Android:<br />
<br />
[[Файл:1234123412345.png]]<br />
''Вкладка Android''<br />
<br />
Некоторые поля, соответствующие первой вкладке, уже будут заполнены, остальные поля нам надо заполнить самим. Заполните поля TargetSDK и MinSDK как на скриншоте, а также пропишите пути к AndroidNDK и AndroidSDK. Два этих набора можно скачать, установив вместе с Android Studio, или же по отдельности: [https://developer.android.com/studio#command-tools Android SDK Tools], [https://developer.android.com/ndk/downloads Android NDK]. Разархивируйте скачанные файлы и поместите их на диске (убедитесь, что папка доступна для записи файлов).<br />
<br />
После настройки возвращаемся на вкладку и жмем на кнопку сборки. Логи сборки отражаются в последней вкладке. После сборки результирующую APK можно найти в папке ''папка с редактором''\system\project_build\data\build_android\app.<br />
<br />
==Запуск сборки==<br />
Для того чтобы собрать проект необходимо:<br />
# Провести настройку проекта в соответствии с инструкциями указанными в <br />
# Установленный Marmalade SDK последней версии, для сборок ios, android, blackberry, windows marmalade, windows phone 8<br />
## Сборка для Windows Phone 8 возможна только на системе Windows 8, также необходимо наличие установленных Windows Phone 8 SDK и Visual Studio 2012 редакций Express Phone Edition или Professional<br />
## Для сборок flash и windows_absolutist Marmalade SDK не нужен<br />
# В редакторе сцен выбрать "проект" -> экспортировать проект<br />
# В появившемся окне выбрать необходимые настройки упаковки графики, каталог для экспорта указывать не надо <br> [[Файл:Export-deploy window.jpg]]<br />
# Выбрать платформу для сборки и нажать "ok"<br />
<br />
После этого начинается экспорт проекта и его подготовка для сборки в соответствии с настройками указанными в [[Proj_config.csv]].<br />
Ход формирования настроек можно увидеть в окне приложения Logger, которое запустится сразу по окончании экспорта проекта.<br />
Logger отображает ход выполнения настроек, python подготавливает сборку и запускает Marmalade Deploy Tool. Если Marmalade Deploy Tool не запускается длительное время - можно принудительно прервать сборку закрыв окно pyton и посмотреть в Logger-е какие проблемы произошли во время подготовки к сборке.<br />
<br />
[[Файл:Logger and python.jpg| 400px | окно Logger и окно python]]<br />
<br />
При необходимости лог из Logger-а можно сохранить в файл соответствующей кнопкой.<br />
<br />
После проведения всех настроек запустится Marmalade Deploy Tool в котором можно проверить правильность настроек, внести корректировки и запустить сборку.<br />
<span style="background-color:yellow">Важно! Корректировки внесённые в Marmalade Deploy Tool не будут сохранены для следующей сборки.</span><br />
<br />
Когда откроется окно Marmalade Deploy Tool с предложением выбрать архитектуру сборки - arm или x86. x86 необходимо выбирать только для сборки windows_marmalade, для остальных случаев выбираем платформу ARM GCC Release и нажимаем кнопку далее.<br />
<br />
<span style="background-color:yellow">Если навести курсор мышки на поле, то появится подсказка с информацией об этом поле и на что оно влияет.</span><br />
<br />
В следующем шаге необходимо выбрать конфигурацию проекта, который будет собираться. Снимаем отметку с настроек default и предыдущего собранного проекта, если отличается от текущего, и выбираем текущую настройку и нажимаем "Далее".<br />
<br />
[[Файл:Deploytool select build.jpg]]<br />
<br />
----<br />
<br />
На этом шаге идёт выбор платформы и платформенные настройки.<br />
Если перед экспортом выбрана платформа ios, то в окне выбора платформы платформа IOS будет выбрана автоматически, если android, amazon, samsung - то автоматически будет выбрана android, для windows_marmalade - windows, для blackberry необходимо выбрать самостоятельно playbook - если приложение для playbook и, или, blackberry 10 - если приложение для blackberry 10, для Windows phone 8 также необходимо выбрать самостоятельно её платформу. Когда указана правильно соответствующая платформа - нажимаем "Далее".<br />
<br />
[[Файл:Select platform.jpg|500px]]<br />
<br />
----<br />
<br />
На этом шаге можно проверить название приложения, название итогового файла, издателя, версию, также можно увидеть путь к файлу [[app.icf]], который будет использован - можно проверить те ли настройки в нём которые ожидаются. Если всё правильно - нажимаем "Далее" для перехода к платформенным настройкам.<br />
<br />
[[Файл:General settings.jpg|500px ]]<br />
<br />
<br />
<br />
==IOS==<br />
В этом шаге можно проверить правильность платформенных настроек: bundle id, иконок, сплэш-скринов, настройки региона для сборки, подписывать приложение или нет, профиль которым необходимо подписать приложение. Для подписи необходимо поставить отметку "Sign for distribution" и выбрать профиль в пункте "Provision profile". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Ios settings.jpg|500px]]<br />
<br />
<br />
<br />
==Android==<br />
В этом шаге можно проверить правильность платформенных настроек: package id, иконок, подписывать приложение или нет, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "Key Alias Name", "Private Key Password", "Application Keystore", "Keystore Password". Если всё правильно - нажимаем кнопку "Далее".<br />
[[Файл:Android platform marmalade settings.jpg| 500px]]<br />
<br />
<br />
==Blackberry==<br />
В этом шаге можно проверить правильность платформенных настроек: Author Name, Author ID, иконок, пароль к хранилищу ключей, пароль к сервису Blackberry, ключи, которыми необходимо подписать приложение. Для подписи необходимо заполнить поля "BlackBerry CSK Password", "BlackBerry Keystore file", "BlackBerry Keystore Password".<br />
Поле Playbook Specific Icon и Blackberry 10 Specific Icon не рекомендованы к заполнению.<br />
Настройки для Blackberry 10 аналогичны.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
[[Файл:Blackberry settings.jpg|500px]]<br />
<br />
<br />
<br />
==Windows Marmalade==<br />
В этом шаге можно проверить правильность иконки.<br />
Если всё правильно - нажимаем кнопку "Далее". <br><br />
<br />
[[Файл:Win 32.jpg|500px]]<br />
<br />
==Сборка==<br />
На данном этапе остаётся только запустить сборку. Сборка запускается нажатием кнопки "Deploy All" <br><br />
[[Файл:Start deploy.jpg|500px]]<br />
<br />
Если в процессе сборки возникнут какие-то проблемы сборка остановится и в поле '''Progress''' будет написана ошибка, подробней узнать что пошло не так можно нажав на кнопку Log - откроется окно с логом хода сборки.<br><br />
[[Файл:Sdk error.jpg|500px]]<br />
<br />
Если всё прошло успешно - в поле '''Progress''' будет надпись Sucsess. Теперь можно нажать кнопку Explore - откроется проводник с каталогом в котором содержится готовый пакет, или закрыть окно Deploy Tool - после закрытия окна пакет скопируется в каталог AppsaluteCreatorBuilds в каталоге "Мои документы" текущего пользователя.<br><br />
[[Файл:Sucsess sdk.jpg|500px]]<br />
<br />
<br />
[[Category:Projects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:1234123412345.png&diff=9867Файл:1234123412345.png2019-09-11T06:27:28Z<p>Agava: </p>
<hr />
<div></div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:123412341234.png&diff=9866Файл:123412341234.png2019-09-11T06:22:10Z<p>Agava: </p>
<hr />
<div></div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Machine&diff=9815Machine2019-06-20T07:22:04Z<p>Agava: /* if */</p>
<hr />
<div>{{TOC right}}<br />
[[Machine]] - [[Object|объект]] '''машина состояний''' (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.<br />
<br />
== Введение ==<br />
<br />
Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё<br />
<br />
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):<br />
<center><br />
[[Файл:def_states.png]]<br />
</center><br />
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.<br />
<br />
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.<br />
<br />
Все команды состояния, разбиваются на три группы:<br />
* '''[[#Инициализация|Инициализация]]''':<br />
** '''[[#draw|draw]]''' - установка графического ресурса;<br />
** '''[[#init|init]]''' - инициализация параметров машины (координаты и т.п.);<br />
** '''[[#set|set]]''' - установка состояния другого объекта;<br />
** '''[[#play|play]]''' - проиграть звук;<br />
** '''[[#var|var]]''' - переменная, которой присваивается значение параметра объекта;<br />
** '''[[#buy|buy]]''' - запуск процедуры in-app покупки;<br />
** '''[[#download|download]]''' - запуск процедуры закачки контента.<br />
* '''[[#Процессы|Процессы]]''':<br />
** '''[[#wait|wait]]''' - задержка по времени;<br />
** '''[[#move|move]]''' - равномерное движение;<br />
** '''[[#rot|rot]]''' - вращение вокруг точки пивота;<br />
** '''[[#alpha|alpha]]''' - изменение прозрачности;<br />
** '''[[#scale|scale]]''' - изменение размера;<br />
** '''[[#phys|phys]]''' - ускоренное движение;<br />
** '''[[#rgb|rgb]]''' - изменить rgb-каналы;<br />
** '''[[#spline|spline]]''' - движение по сплайну (по кривой).<br />
* '''[[#Воздействия|Воздействия]]''':<br />
** '''[[#click|click]]''' - что делать при клике на машине;<br />
** '''[[#drop|drop]]''' - на машине отпущена клавиша мыши;<br />
** '''[[#drag|drag]]''' - машину схватили и тащат;<br />
** '''[[#throw|throw]]''' - машину схватили и кинули;<br />
** '''[[#apply|apply]]''' - сработает при пересечении машины с линией или объектом;<br />
** '''[[#touch_in|touch_in]]''' - наведение мыши/пальца на машину, если палец "тащат" по экрану;<br />
** '''[[#touch_out|touch_out]]''' - выведение мыши из машины, если палец "тащат" по экрану;<br />
** '''[[#touch_up|touch_up]]''' - отжатие мыши от машины;<br />
** '''[[#tap|tap]]''' - умный тач;<br />
** '''[[#mouse_in|mouse_in]]''' - наведение мыши на машину даже если не нажата кнопка мыши;<br />
** '''[[#mouse_out|mouse_out]]''' - выведение мыши из машины даже если не нажата кнопка мыши.<br />
<br />
Кроме этого, есть команда '''[[#if|if]]''', вызываемая другими командами. В ней описываются некоторые логические условия, выполнение которых говорит команде (которая вызвала этот '''if'''), что можно завершать работу. Для разных команд использование этого параметра несколько '''отличается'''!<br />
<br />
Начальные понятия и методы работы с машинами состояний находятся в [[Learning|уроках]],<br />
начиная с [[Checkbox как машина состояний|третьего]].<br />
<br />
== Свойства ==<br />
<br />
Общие для всех объектов свойства описаны в документе [[Object|Object]].<br />
Дополнительные свойства:<br />
<br />
* '''в опции''' - да - машина будет сохранять свое состояние в опции и при следующей инициализации инициал-ся не в первом состоянии, а в состоянии, записанном в опциях.<br />
* '''Состояние''' - Состояние в котором будет находиться машина при инициализации. Если ничего не указано - первое состояние в списке состояний.<br />
* '''Хранить нажатость''' - нужно ли сбрасывать нажатость при изменении состояния.<br />
* '''res''' - графический ресурс машины. Может отсутствовать. Перетягивается из редактора ресурсов(поле должно быть в состоянии редактирования).<br />
* '''states''' - По двойному клику, или по нажатию на кнопку с тремя точками открывается список состояний.<br />
* '''отладка''' - Отображать в окне состояний текущий объект.<br />
* '''курсор''' - Графический ресурс курсора текущего и всех дочерних объектов.<br />
* '''прокликиваемая''' - 0 - машина не пропускает клик, 1 - машина пропускает клик, 2 - машина обрабатывает клик и пропускает его дальше.<br />
<br />
<br />
== Добавляемые параметры для LUA ==<br />
<br />
Все параметры доступны из LUA скрипта, привязанного к машинке.<br />
<br />
Далее во всех параметрах присутствуют:<br />
<br />
имя (name) - имя параметра, по которому он будет браться из скрипта.<br />
<br />
значение (val) - значение, которое прилетит в скрипт.<br />
<br />
описание (dsc) - описание параметра. Просто хинт для параметра, нигде не используется.<br />
<br />
<br />
* '''параметр для lua скрипта (строка)''' - строка, которая доступна из LUA скрипта через viewer.getParamS("param_name", [default]).<br />
* '''параметр для lua скрипта (целое)''' - целое число, которое доступно из LUA скрипта через viewer.getParamI("param_name", [default]).<br />
* '''параметр для lua скрипта (дробное)''' - дробное число, которое доступно из LUA скрипта через viewer.getParamF("param_name", [default]).<br />
* '''параметр для lua скрипта (id ресурса)''' - ресурс (перетаскивается из базы ресурсов), id доступен из LUA скрипта через viewer.getParamI("param_name", [default]).<br />
* '''параметр для lua скрипта (id звука)''' - звук (перетаскивается из базы ресурсов), id доступен из LUA скрипта через viewer.getParamI("param_name", [default]).<br />
* '''параметр для lua скрипта (id видео)''' - видео (перетаскивается из базы ресурсов), id доступен из LUA скрипта через viewer.getParamI("param_name", [default]).<br />
* '''параметр для lua скрипта (id объекта)''' - объект из layout, id доступен из LUA скрипта через viewer.getParamI("param_name", [default]).<br />
* '''параметр для lua скрипта (массив id объектов)''' - объекты из layout (добавляются через окошко, которое появляется при двойном нажатии на параметр), массив id доступен из LUA скрипта через viewer.getParamArrI("param_name", [default]).<br />
<br />
== Инициализация ==<br />
<br />
При попадании в состояние, сразу выполняются команды инициализации init, draw, set, buy, var. Если в этих командах нет параметра break, они все выполняются до запуска процессов. Параметр break (со значением 1) прерывает выполнение команд инициализации данного типа. Их можно перезапустить по окончанию команд процессов.<br />
<br />
'''''Замечание.''''' По возможности, нужно избегать передачи значений другим объектам, в начальном состоянии машины, так как такие команды будут выполнятся даже тогда, когда машина будет выключена на визуальной сцене.<br />
<br />
=== draw ===<br />
<br />
Команда определяет графический ресурс (картинку, которую надо рисовать в данном состоянии). Её параметры:<br />
<br />
* '''res''' - ресурс картинки (перетаскивается из редактора ресурсов);<br />
* '''f''' - начальный кадр;<br />
* '''ft''' - длительность кадра в миллисекундах;<br />
* '''loop''' - число повторов (зацикливаний анимации); если -1, то бесконечно; отсутствует или 0 - будет проигран один раз;<br />
* '''rev''' - играть анимацию в обратном порядке; 0 - прямой порядок проигрывания, 1 - обратный порядок проигрывания;<br />
* '''go''' - перейти в состояние;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия перехода; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Пустая команда draw (без параметров) "сбрасывает" текущую картинку и в этом состоянии ничего рисоваться не будет. Если в общих параметрах объекта (в базовой панеле свойств) задан ресурс рисования, и он во всех состояниях одинаков, то его можно в состоянии не задавать.<br />
<br />
Если параметра loop нет, кадры анимации проиграются один раз. Чтобы зациклить их, необходимо установить loop=-1 или нужное число раз. Аналогично параметру loop других команд, первый раз draw выполняется в любом случае. Дальнейшие её повторы определяются значением loop. Однако, в отличие от других команд, loop повторяет только '''данную''' команду draw (даже если она не первая).<br />
Для работы loop '''необходимо''' чтобы в редакторе ресурсов в настройках анимации '''было отключено''' зацикливание(looped).<br />
<br>Если есть анимация открывающейся и закрывающейся книги (коробки, двери и т.д.) не обязательно подгружать в проект две анимации, можно использовать одну, но запускать ее в обратном порядке, для этого есть параметр '''rev'''.<br />
<br />
=== init ===<br />
<br />
====Параметры объекта====<br />
<br />
* '''x''','''y''' - координата точки пивота относительно сцены или родительского объекта;<br />
* '''ang''' - угол поворота в градусах; отчитывается вниз от оси x, или вверх, если отрицательный;<br />
* '''al''' - Прозрачность: от 0 (прозрачен) до 1 (не прозрачен);<br />
* '''sx''','''sy''' - масштаб машины по осям (если 1, то это исходный размер; 0.5 - в два раза меньше);<br />
* '''vis''' - видимость - видимость машины (1 - видима, 0 - невидима), если vis = 0, это равноценно отключению объекта в редакторе;<br />
* '''z координата''' - координата машины по z.<br />
* '''z приращение''' - приращение координаты машины по z относительно текущего<br />
* '''прокликиваемая''' - если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то клик обрабатывается, но передается дальше;<br />
<br />
====Параметры движения====<br />
<br />
* '''v''' - скорость для команды move<br />
* '''vr''' - угловая скорость для команды rot<br />
* '''vx''','''vy''' - начальная скорость для команды phys<br />
* '''ax''','''ay''' - ускорение для команды phys<br />
<br />
====Системные действия====<br />
<br />
* '''показать рейтинг''' - значение 1 означает, что при выполнении этого инита будет показано окно iOS рейтинга.<br />
Если на девайсе была нажата кнопка "отрейтинговать", то в опции запишется параметр rating значение 1, если нажата кнопка "позже" - rating 2, "никогда" - rating 3.<br />
* '''закрыть приложение''' - значение 1 означает, что при выполнении этого инита приложение будет закрыто.<br />
* '''перезагрузить лэйаут''' - значение 1 означает, что при выполнении этого инита будет перезагружен лэйаут.<br />
* '''вернуться назад''' - начение 1 означает, что при выполнении этого инита произойдет возврат на предыдущий экран.<br />
* '''реклама AdMob''' - 1 - показать, 0 - спрятать, -1 - не изменять состояние.<br />
* '''курсор''' - меняет текущий курсор мыши на указанный графический ресурс. Перетягивается из редактора ресурсов, поле должно быть в состоянии редактирования.<br />
* '''id внешней ссылки в текстовой базе''' - Ссыслка будет взята из текстовой базы в соответствии с текущим маркетом.<br />
* '''[[#Clone|clone]]''' - Значение 1 означает, что в текущем местоположении машины будет создана ее копия, 2 - удалить все клоны, созданные данной машиной, 3 - удалить себя, если клон<br />
<br />
====Переходы и параметры выполнения====<br />
<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] для условия выполнения; можно использовать логические операторы (см. [[#if|if]]);<br />
* '''break''' - прервать команды.<br />
<br />
Так же, как и при инициализации картинки ('''draw'''), вызов команды ('''init''') переопределяет только те параметры, которые в ней указаны. Остальные параметры (заданные в других состояниях или в общих свойствах объекта) остаются без изменений<br />
<br />
=== set ===<br />
<br />
Перевод другого объекта в некоторое состояние или изменение его параметров.<br />
<br />
* '''obj''' - изменяемый объект (выбирается из списка объектов). В значении объекта можно указать this, это значит что машина сама себе пропишет какой то параметр или состояние.<br />
* '''scr_param''' - глобальный либо текущий экран, параметры которого меняем.<br />
* '''scr_state''' - экран, состояние которого меняем.<br />
* '''parent''' - Объект, который будет установлен в качестве родителя объекту из obj. Объект obj будет оторван от текущего своего родителя и добавлен в детей объекта parent. При этом у obj сбивается значение Z. Если оно должно быть отличным от нуля, то нужно установить заново после смены родителя.<br><br />
* '''st''' - состояние в которое переводится объект.<br><br />
* '''par''' - параметр объекта для установки, используется вместе с val, val_obj, val_txt, val_scr,val_vid,val_res,val_node.<br />
* '''mSt''' - Состояние машины в котором будем изменять параметр команды.<br />
* '''mCmd''' - Имя команды, параметр которой меняем.<br />
* '''mCmdN''' - Порядковый номер в перечне одноименных команд состояния.<br />
* '''mPar''' - Установить этот параметр команды в значение val.<br />
* '''val_obj''' - id объекта, будет записано в в par<br />
* '''val_txt''' - id текста, будет записано в в par(параметр для текстов "txtID")<br />
* '''val_vid''' - id video, будет записано в par(параметр для видео "video" - RGB, "videoA" - Alpha)<br />
* '''val_scr''' - id экрана, будет записано в в par<br />
* '''val_res''' - Новое значение графического ресурса (перетаскивается из редактора ресурсов). (пока не работает)<br />
* '''val_node''' - Новое нода графа (выбирается из списка, при заданном объекте)<br />
* '''val''' - значение параметра объекта для установки<br />
* '''var''' - имя переменной данной машины, значение которой присваивается в параметр par объекта obj<br />
* '''round''' - округлить значение, записываемое в val<br><br />
* '''position''' - объект указанный в поле '''obj''' будет отпозиционирован относительно указанного объекта в этом поле ( можно одновременно и задавать состояние '''st''' в которое перевести объект ( поле obj ) ); <br />
* '''pos_dx''' - смещение по оси X от точки пивоты объекта из поля выше ( если это поле не указывать, смещение будет = 0 );<br />
* '''pos_dy''' - смещение по оси Y от точки пивоты объекта из поля выше ( если это поле не указывать, смещение будет = 0 )<br />
* '''scr''' - экран на который мы хотим перейти<br />
* '''user''' - 1 - сохранять значения для текущего пользователя. Для всех типов объектов кроме options этот флаг игнорируется<br><br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] при выполнении которого происходит отработка команды set. <br />
* '''break''' - прервать выполнение команд set на этой команде (запустить их снова можно из команд процессов).<br />
<br />
Так как все объекты (не только машины) имеют состояния, то при помощи команды set можно их менять. Стоит обратить внимание на то, что когда в параметрах (любых команд) встречается st, речь идет о состоянии другого объекта, а если go, то данной машины состояний.<br />
<br />
=== play ===<br />
<br />
Проиграть звук<br />
<br />
*'''snd''' - Короткий звук (перетаскивается из редактора ресурсов);<br />
*'''voice''' - Голос (перетаскивается из редактора ресурсов);<br />
*'''mus''' - Длинный звук (перетаскивается из редактора ресурсов);<br />
*'''mus_field''' - Проиграть длинную музыку, id взяв из переменной машины, указанной в этом поле; (К примеру у машины есть параметр location_music=="7695" и в mus_field="location_music". То машина проиграет длинную музыку с id 7695)<br />
*'''preload''' - Указанный звук будет загружен в память, но не будет проигрываться прямо сейчас. Для ускорения его старта потом;<br />
*'''loop''' - Зациклить указанный звук. Использовать вместе с snd или voice;<br />
*'''mus_loop''' - Зациклить указанную музыку. По умолчанию музыка всегда зацикленна. То есть, фактически этой флаг используется, когда нужно убрать зацикливание.<br />
*'''repeat''' - Число повторов указанного звука при отключенном loop;<br />
*'''mus_stop''' - Остановить музыку. Если используется вместе с mus, то остановится указанная. Если нет - то вся текущая.<br />
*'''stop''' - Остановить указанный звук. Использовать вместе с snd или voice.<br />
*'''mus_fading''' - Время появления/затухания указанной музыки в ms. Использовать вместе с mus.<br />
*'''fading''' - Время появления/затухания указанного звука. Использовать вместе с snd или voice. <br />
*'''volume''' - Установить громкость для всех звуков данной машины - тех что уже играют и тех, что будут запущены впоследствии;<br />
*'''не выгружать''' - Позволяет продолжать проигрывание звука при смене экранов.<br />
*'''go''' - Выбор состояния, в которое нужно перейти после проигрывания музыки/звука/голоса.<br />
*'''if''' - Номер (начиная с нуля) условия перехода [[#if|if]].<br />
<br />
Особенности применения:<br />
<br />
1) Короткий звук (''snd'') нельзя запустить в первом (инитном) состоянии машины. Для того, чтобы запустить звук сразу при загрузке экрана, нужно в первом состоянии машины записать мгновенный переход во второе состояние мамашины (например, команда ''wait'', поле ''go'', в поле выбрать второе состояние), а во втором состоянии уже запустить звук.<br />
<br />
2) Если звук нужно зациклить и проигрывать какое-то количество раз (''loop=1,2,3,..,n'') или бесконечно (''loop=-1''), то нужно проследить чтобы состояние, в котором запускается звук, не вызывалось повторно во время проигрывания звука, иначе возникнет наложение звуков.<br />
<br />
3) Если во время проигрывания звука машина меняет свое состояние, звук продолжает играть.<br />
<br />
4) Если в одной машине почти одновременно воспроизводится несколько звуков, то они прерывают друг друга.<br />
<br />
5) Если каждый звук воспроизводится в отдельной машине, то они звучат параллельно.<br />
<br />
6) Если не указан звук и голос, то команда (''stop'') остановит все звуки, запущенные этой машиной.<br />
<br />
7) Музыка (''mus'') может быть формата .ogg или .mp3. На экране может воспроизводится только одна .mp3 музыка. Любой запуск .mp3 музыки независимо от того, в какой машине он осуществляется, будет прекращать проигрывание предыдущей .mp3 музыки. В тоже время может воспроизводиться несколько .ogg музыки.<br />
<br />
8) Музыка, которая проигрывается на глобальном экране, проигрывается на всех экранах проекта.<br />
<br />
=== var ===<br />
<br />
Переменная, которой присваивается значение параметра объекта<br />
<br />
*'''name''' - имя переменной;<br />
*'''tp''' - тип переменной;<br />
*'''obj''' - объект, используемый далее;<br />
*'''par''' - имя параметра, значение которого присваивается переменной;<br />
*'''val''' - значение переменной, если отсутствуют obj и par;<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
*'''func''' - в выпадающем списке можно выбрать функцию:<br />
**'''random''' - использует arg1 и arg2, возвращает случайное целое число в диапазоне arg1 .. arg2.<br />
**'''conc''' - объединяет 4 строки arg1,arg2,arg3,arg4. Возвращает строку, в которой соединены все строки<br />
**'''exp''' - экспонента от аргумента arg1.<br />
**'''ln''' - натуральный логарифм аргумента arg1.<br />
*'''arg1''' - аргумент функции<br />
*'''arg2''' - аргумент функции<br />
*'''arg3''' - аргумент функции<br />
*'''arg4''' - аргумент функции<br />
<br />
Обозначенная переменная существует (может использоваться) только в текущем состоянии. Переменная может определятся в одном состоянии только один раз. Если созданной переменной нужно изменить значение в рамках состояния, это можно сделать через другую переменную или через параметр опций ([[Options]]). Если ее значение нужно использовать в другом состоянии, то оно присваивается параметру опций, а затем заново считывается в новом состоянии. Переменные можно указывать в поле ''val'' с другими математическими действиями и цифрами, при этом каждое действие заключать в скобки. Если в поле ''val'' указать имя переменной ''А'' без скобок - воспримется строка ''А'', если указать в скобках - воспримется значение переменной.<br />
<br />
=== buy === <br />
<br />
'''(in-app совершить in-app покупку)'''<br />
<br />
При переходе в состояние, данная команда открывает системное окно с предложением совершить in-app покупку. В зависимости от действий игрока, покупка может произойти (успех) или не произойти (провал).<br />
<br />
* '''id покупки''' - внутренний id покупки для приложения, указывается в объекте [[Store]];<br />
* '''объект(успех)''' - объект, которому сообщается об удачной покупке;<br />
* '''состояние(успех)''' - состояние в которое переводится выбранный объект в случае успешной покупки;<br />
* '''объект(провал)''' - объект, которому сообщается о неудачной покупке;<br />
* '''состояние(провал)''' - состояние в которое переводится объект в случае неудачной покупки.<br />
<br />
=== download ===<br />
<br />
'''(скачать загружаемый контент)'''<br />
<br />
При переходе в состояние будет совершена попытку закачать контент.<br />
* '''url''' - ссылка на zip архив с контентом в интернете.<br />
* '''объект успех''' - объект, которому в случае успешной закачки будет задаваться указанное состояние.<br />
* '''состояние (успех)''' - состояние, которое будет устанавливаться выше указанному объекту, в случае успешной закачки.<br />
* '''объект (провал)''' -объект, которому, в случае неудачи закачки, будет устанавливаться указанное состояние.<br />
* '''состояние (провал)''' - состояние, которое, в случае неудачи закачки,будет устанавливаться выше указанному объекту.<br />
* '''счетчик прогресса''' - объект, типа счетчик, который отображает прогресс закачки контента. Крайне желательно, что бы он измерялся в диапазоне от 0 до 100.<br />
<br />
Существует несколько причин при которых вызывается состояние "провал". Для того что бы сообщить пользователю, по какой именно причине возник провал закачки, следует идентифицировать причины провала. Это возможно сделать с помощью параметра <br />
<pre><br />
downloadErrCode<br />
</pre><br />
Ниже приведены значение параметра которые помогут вывести нужное текстовое сообщение :<br />
<pre><br />
GCUSTOM_ERROR_CODE_ERROR_UNKNOWN = 1, //!< ошибка не классифицирована<br />
GCUSTOM_ERROR_CODE_WIFI_DISABLED = 2, //!< отключен WIFI<br />
GCUSTOM_ERROR_CODE_SDCARD_UNAVAILABLE = 3, //!< SD-карта недоступна<br />
GCUSTOM_ERROR_CODE_SDCARD_FULL = 4, //!< SD-карта переполнена перед закачкой<br />
GCUSTOM_ERROR_CODE_UNZIP_FAIL = 5 //!< ошибка при распаковки пака (скорее всего на SD-карте не<br />
хватает места для распаковки <br />
</pre><br />
<br />
== Процессы ==<br />
<br />
Все команды процессов, кроме параметров описанных ниже, могут содержать параметры, совпадающие с именами других команд. В этих параметрах указывается номер (начиная с нуля) команды, которую надо запустить на выполнение, после окончания действия данной команды процесса.<br />
<br />
Если в команде процесса есть условие '''[[#if|if]]''', то после окончания работы команды она ждет пока это условие не выполнится. Только после этого переходит к следующей команде этого же типа<br />
или в другое состояние (если есть параметр go).<br />
Исключением является команда wait, которая '''не''' ждёт срабатывания '''[[#if|if]]'''. Если он по окончанию wait сработал, то происходит переходит в другое состояние, если есть параметр go.<br />
Если параметра go нет, то в любом случае запускается следующий wait (т.е. if относится только к переходу go).<br />
<br />
=== wait ===<br />
<br />
Команда паузы (временной задержки). Если параметра '''t''' нет, то срабатывает сразу.<br />
Может также использоваться для логических ветвлений, случайных переходов в другие состояния и т.д.<br />
<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''dt''' - интервал от t-dt до t+dt, внутри которого команда может быть случайно прервана (при t>t+dt прерывается в любом случае);<br />
* '''p''' - вероятность срабатывания перехода в состояние, указываемое параметром go;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
Простейший набор параметров команды wait выглядит следующим образом:<br />
<pre><br />
<wait t="1000" go="next"/> // ждем 1000ms и покидаем состояние<br />
</pre><br />
Для программирования объектов со случайным поведением можно использовать последовательность команд wait с параметром вероятности перехода p (от 0 до 1):<br />
<pre><br />
<wait t="100" p="0.5" go="st1"/> // через t с вероятностью 1/2 перейдет в st1<br />
<wait go="st2"/> // иначе, перейдем в st2<br />
</pre><br />
Этот же синтаксис позволяет делать состояния с различным временем жизни:<br />
<pre><br />
<wait t="100" p="0.5" go="next"/> // с вероятностью 1/2 живем 100ms<br />
<wait t="100" go="next"/> // или 200ms<br />
</pre><br />
Впрочем, последнюю задачу можно решить при помощи указывания интервала dt, внутри которого произойдет окончание команды. Так, состояние, живущее от 800 до 1200ms, реализуется следующим образом:<br />
<pre><br />
<wait t="1000" dt="200" go="next"/><br />
</pre><br />
<br />
=== move ===<br />
<br />
Перемещение по сцене:<br />
* '''tx''', '''ty''' - целевые координаты в пикселях, к которым должен переместиться объект. Можно указывать переменные заданные с помощью [http://ge.absolutist.com/index.php/Machine#var_2 переменной var];<br />
* '''dx''', '''dy''' - величина смещения от текущей (если есть - tx,ty игнорируются); можно задавать смесь tx, dy или dx,ty;<br />
* '''v''' - скорость перемещения в пикселях в секунду; для фреймовой анимации, например, ходьбы скорость рассчитывается исходя из длительности одного кадра и числа кадров на фазу движения. Поэтому, в этом случае, удобнее задавать скорость;<br />
* '''t''' - время перемещения (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду move, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд move на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
В большинстве команд процессов, связанных с движением, величина изменения может быть задана в абсолютных или относительных величинах. Так, могут быть указаны целевые координаты tx, ty в которые надо переместиться, или смещение dx, dy относительно текущего положения объекта.<br />
<br />
Аналогично, скорость перемещения регулируется, либо явным заданием времени выполнения команды t, либо скоростью v. Исходя из требуемого расстояния, по этой скорости вычисляется необходимое время. Скорость задается в пикселях за секунду (а не миллисекунду!)<br />
<br />
=== rot ===<br />
<br />
Вращение объекта вокруг точки пивота с координатами px,py. Эти координаты задаются относительно верхнего левого угла объекта в общей секции описания параметров объекта или командой init в данном состоянии.<br />
* '''ta''' - целевой угол поворота объекта;<br />
* '''da''' - на сколько надо повернуться (ta игнорируется);<br />
* '''v''' - угловая скорость поворота в градусах в секунду;<br />
* '''t''' - время поворота (v игнорируется);<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду rot, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд движения с первой команды;<br />
* '''break''' - прервать команды - Прервать выполнение команд rot на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Угол отсчитывается от оси x. Если он положителен, то поворот происходит по часовой стрелке. Если отрицательный - против часовой.<br />
<br />
=== alpha ===<br />
<br />
Изменение прозрачности объекта. Меняется от 0 (полностью прозрачен) до 1 (непрозрачен)<br />
* '''ta''' - целевая прозрачность<br />
* '''da''' - на сколько надо изменить прозрачность от текущей (ta игнорируется)<br />
* '''v''' - скорость изменения прозрачности (в долях единицы в ms)<br />
* '''t''' - время изменения (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду alpha, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд alpha с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд alpha на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Если у объекта прозрачность ''al=0.00'', то он невидим для всякого взаимодействия. Если у объекта прозрачность ''al=0.01'', то он видим для клика, но невидим для дропа(команда drop на объект не видит объект с прозрачностью ''0.01''). Если у объекта ''al=0.02'', то он видим и для клика, и для дропа.<br />
<br />
=== scale ===<br />
<br />
Изменение размеров объекта<br />
* '''tx''', '''ty''' - целевой масштаб по каждой оси<br />
* '''dx''', '''dy''' - на сколько изменить масштаб по каждой оси<br />
* '''v''' - скорость изменения масштаба (в долях единицы в сек.)<br />
* '''t''' - длительность выполнения команды (v игнорируется)<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду scale, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд scale с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд scale на этой команде (запустить их сново можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== phys ===<br />
<br />
Команда phys позволяет имитировать простую физику. В ней задается начальная скорость и действующая на объект сила (ускорение).<br />
<br />
* '''vx''', '''vy''' - начальная скорость<br />
* '''ax''', '''ay''' - величина ускорения по каждой оси<br />
* '''a''' - полное ускорение<br />
* '''tvx''', '''tvy''' - целевая скорость<br />
* '''tx''', '''ty''' - целевая координата<br />
* '''go''' - новое состояние - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go; команда ждет срабатывания условия, и не запускает следующую команду phys, пока if не выполнится; <br />
* '''loop''' - зациклить команды - Начать выполнение команд phys с первой команды.<br />
* '''break''' - прервать команды - Прервать выполнение команд phys на этой команде (запустить их снова можно из команд процессов). <br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
Рассмотрим подпрыгивающий мячик, который при касании с землей деформируется (вертикально сплюскивается). Это можно сделать в 3 состояния (падаем, касаемся и взлетаем). Первоначально мячик находится в координате y=-100, и имеет высоту картинки w=60. Падает он до координаты ty=0. При касании с землёй, мяч сжимается на 20 процентов (sy=0.8). При этом его центр должен опуститься на dy=0.8*w/2 = 24.<br />
<pre><br />
<br />
<st id="down"> // падаем<br />
<phys vy="0" ay="20" ty="0" go="touch"/><br />
</st><br />
<br />
<st id="touch"> // касаемся земли<br />
<move dy="24" t="300"/> // опускаем центр при сжатии<br />
<scale ty="0.8" t="300"/> // сжимаемся<br />
<move dy="-24" t="300"/> // поднимаем центр при разжатии<br />
<scale ty="1" t="300" go="up"/> // разжимаемся<br />
</st><br />
<br />
<st id="up"> // взлетаем<br />
<phys vy="0" ty="-200" go="down"/><br />
</st><br />
<br />
</pre><br />
Напомним, что если объект имеет начальную скорость взлета, равную v=sqrt(2*ay*h), то он подпрыгнет на высоту h. Однако, в данном случае, вместо задания начальной скорости при взлете, мы задаем целевую координату (ty), до которой мяч должен подпрыгнуть.<br />
<br />
=== rgb ===<br />
<br />
* '''trgb''' - целевой эффект rgb; подразумевает под собой цвет в виде HEX-кода; по-умолчанию: FFFFFF;<br />
* '''t''' - длительность выполнения команды в ms;<br />
* '''go''' - состояние, в которое нужно перейти поле окончания времени и срабатывания условия [[#if|if]], если оно указано;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]], при выполнении которой происходит переход go;<br />
* '''loop''' - зациклить команды;<br />
* '''break''' - прервать выполнение команд wait на этой команде (запустить их снова можно из команд процессов).<br />
* '''init''', '''set''', '''draw''', '''move''', '''rot''', '''alpha''', '''scale''', '''phys''' - Номер запускаемой команды.<br />
<br />
=== spline ===<br />
<br />
Сплайн позволяет перемещать машину по заранее заданной траектории.<br />
<br />
====Параметры====<br />
<br />
*'''key''' - точки сплайна по которым движется <br />
*'''t''' - время движения по траектории<br />
*'''go''' - по окончанию переход в состояние<br />
*'''if''' - условие перехода<br />
*'''loop''' - количество повторений<br />
*'''break''' - прервать команды на этой<br />
*'''wait''' - номер запускаемого действия<br />
*'''init''' - номер запускаемого действия<br />
*'''alpha''' - номер запускаемого действия<br />
*'''rot''' - номер запускаемого действия<br />
*'''move''' - номер запускаемого действия<br />
*'''set''' - номер запускаемого действия<br />
*'''phys''' - номер запускаемого действия<br />
*'''scale''' - номер запускаемого действия<br />
*'''drow''' - номер запускаемого действия<br />
<br />
====Построение сплайна====<br />
<br />
# в состоянии машины добавляем правой кнопкой мыши действие "spline"<br />
# добавляем минимально необходимые параметры: '''key''' и '''t''', указываем время движения в '''t'''<br />
# выделяем для редактирования поле '''key'''<br />
# записываем координаты точек через запятую, сначала x потом y, например: -211,-248,-151,-248,-91,-247,59,-246,60,101,60,159,1,190<br />
Если записали все координаты вручную, то можно сохранить и проверять.<br />
Или можно в окне списка состояний нажать на кнопку "build spline" (справа вверху).<br />
[[Файл:Btn spline.jpg|500px]]<br />
<br />
Окно с списком состояний закроется, появится дополнительная панель с настройками сплайна и появится возможность указывать мышкой по экрану точки для сплайна.<br />
<br />
[[Файл:Spline panel.jpg|500px]]<br />
<br />
Точки сплайна указываются кликом левой кнопки мыши по экрану.<br />
<br />
Возможности редактирования:<br />
<br />
'''режимы:'''<br />
*'''add''' - по нажатию левой кнопкой мыши по экрану - будет добавлена новая точка, которая соединится с предыдущей<br />
*'''select''' - по нажатию левой кнопкой мыши по точке сплайна появится возможность отредактировать её положение перетащив её или поменяв её координаты в полях x и у<br />
*'''delete''' - по нажатию левой кнопкой мыши по точке сплайна точка удалится<br />
<br />
Чтобы удалить все точки сплайна необходимо нажать на кнопку "'''delete all knots'''"<br />
<br />
Сохранить сплайн можно нажав на кнопку "'''Save spline'''"<br />
<br />
====Дополнительные сведения====<br />
<br />
* Время движения между двумя соседними точками всегда одинаково, то есть чем дальше друг от друга соседние точки, тем быстрее будет двигаться объект, чем ближе - тем медленней.<br />
* Координаты сплайна просчитываются относительно точки пивота родительского объекта, если соответствующая машина является подобъектом. На координаты могут влиять модификаторы родительского объекта.<br />
<br />
== Воздействия ==<br />
<br />
=== click ===<br />
<br />
Команда вызывается, если на объект кликнули мышкой. Срабатывает на её нажатие.<br />
* '''go''' - состояние в которое при выполнении команды надо перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход go.<br />
<br />
По клику машина записывает координаты клика в параметры: clickX, clickY.<br />
<br />
=== touch_in ===<br />
<br />
Наведение мыши/пальца на машину, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== touch_out ===<br />
Выведение мыши/пальца из машины, если палец "тащат" по экрану.<br />
* '''go''' - состояние в которое при клике нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== touch_up ===<br />
<br />
Отжатие мыши от машины<br />
<br />
* '''go''' - состояние в которое при отжатии мыши нужно перейти;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при котором срабатывает переход ''go''.<br />
<br />
=== mouse_in ===<br />
<br />
Срабатывает при наведение мыши/пальца на машину даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== mouse_out ===<br />
Срабатывает при выведение мыши/пальца из машины даже если не нажата кнопка мыши, работает на desktop-ных системах (OSX, Windows)<br />
* '''go''' - состояние в которое при выполнении команды нужно перейти (если if нет, то в любом случае);<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]], при срабатывании которого, происходит переход ''go''.<br />
<br />
=== drag ===<br />
<br />
Данная команда позволяет "таскать" объект по сцене нажав и удерживая клавишу мишки или (палец в случае сенсорного устройства) на нем.Так же есть возможность ограничить разрешенную область таскания, за пределы которой объект вытащить невозможно. [[Файл:drag.jpg|right]]<br />
* '''x1''' - разрешено таскать, когда координата объекта правее;<br />
* '''x2''' - разрешено таскать, когда координата объекта левее;<br />
* '''y1''' - разрешено таскать, когда координата объекта ниже;<br />
* '''y2''' - разрешено таскать, когда координата объекта выше;<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''за пивот''' - "да" - таскать объект за пивот, "нет" - за ту точку, за которую схватили<br />
* '''приклеивать''' - приклеивать при клике к мышке.<br />
<br />
=== dragRot ===<br />
<br />
Данная команда позволяет вращать объект вокруг точки пивота. Нажав и удерживая клавишу мишки или палец (в случае сенсорного устройства) на нем, мы можем вращать его по часовой либо против часовой стрелки. При многократном вращении вокруг своей оси значение его угла не накапливается, а обнуляется выходя за границы [360 ; -360] градусов. [[Файл:dragRot.jpg|right]]<br />
* '''if''' - номер команды условия (начиная с нуля) разрешения таскания;<br />
* '''obj''' - объект у которого надо изменить состояние;<br />
* '''st''' - новое состояние объекта obj;<br />
* '''maxVel''' - Максимальная скорость вращения градус/сек;<br />
* '''objStart''' - объект при начале вращения;<br />
* '''stStart''' - его новое состояние;<br />
* '''objEnd''' - объект при завершении вращения;<br />
* '''stEnd''' - его новое состояние; <br />
'''''Замечание.''''' ('''dragRot''') и обычный ('''drag''') не работает если сцена таскаемая.<br />
<br />
=== drop ===<br />
<br />
Если нажатая кнопка мышки отпускается, вызывается эта команда. Обычно она используется в связке с командой drag<br />
* '''obj''' - объект, на который надо уронить таскаемый объект;<br />
* '''go''' - состояние в которое переходим при отпускании мышки;<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
Рассмотрим совместное применение команд drag и drop на следующей задаче. Пусть есть ключ и ящик. Ключ можно взять мышкой и перетащить, бросив на ящик. Ящик при этом должен постепенно стать прозрачным, а ключ уменьшиться до нуля. Машина состояний для ключа выглядит следующим образом:<br />
<pre><br />
<br />
<st id="drag"><br />
<drag x1="-350" x2="350" y1="-250" y2="250"/><br />
<drop obj="box" go="open"/><br />
</st><br />
<br />
<st id="open"><br />
<set obj="box" st="open"/><br />
<scale tx="0.01" ty="0.01" t="500" go="hide"/><br />
</st><br />
<br />
<st id="hide"><br />
<init x="268" y="30"/><br />
<scale tx="1" ty="1" t="500" go="drag"/><br />
</st><br />
<br />
<br />
</pre><br />
Ящик:<br />
<pre><br />
<br />
<st id="close"> // начальное состояние ящика<br />
<init al="1"/> // если его кто-то сюда переведет - он появится.<br />
</st><br />
<br />
<st id="open"> <br />
<alpha ta="0" t="500"/> // исчезает по прозрачности за 500 ms<br />
</st><br />
<br />
</pre><br />
<br />
====Использование свойства "Условие перехода" ====<br />
<br />
Можно прописать условие, при котором выполняется переход при дропе.<br />
[[Файл:Drop_if.png|300px|thumb|right]]<br />
<br />
С помощью этого условия мы можем научить наш объект выполнять разные задачи в зависимости от того, как именно его дропнули.<br />
Пусть есть объект который можно таскать. Когда объект не таскается должен быть включен флаер, привязанный к этому объекту. При клике на объект, он должен поворачиваться на 90 градусов. При дропе на соответствующую маску объект стает на свое место(Если выполнены условия, к примеру: установлен предыдущий объект и наш объект имеет правильный угол). Если дроп в любое другое место, то должен включится флаер.<br />
<br />
Для того, чтобы научить машину различать клик по ней и ее таскание сделаем следующее. Пропишем ей 2 состояния: click и drag, а также выставим ей параметр "хранить нажатость" = 1. В click будем вычислять координаты объекта и записывать объекту параметр допустимого смещения при котором таскание будет восприниматься как клик. (В данном примере эти параметры: cx, cy, vx, vy. А допустимое смещение составляет 10 пикселей.)<br />
<br />
В состоянии drag будем проверять попадает ли координата объекта при дропе в границы допустимого смещения. Для того чтобы сравнить параметр объекта с переменной, вычтем из нашего объекта, то что мы записали в click. В зависимости от условий и места дропа переходим в соответствующее состояние.<br />
<br />
[[Файл:Click.png|330px]] [[Файл:Drag st.png|630px]]<br />
<br />
=== throw ===<br />
<br />
Если на объект наступили мышкой, не отпуская кнопки, мышку оттащили и затем отпустили, вызывается команда throw со следующими параметрами:<br />
* '''go''' - состояние, в которое, при клике, надо перейти;<br />
* '''if''' - номер (начиная с нуля) команды [[#if|if]] разрешения бросания;<br />
* '''force''' - получаемая скорость равна разнице пикселей от начала бросания (мышь нажата) до его конца (мышь отжата), умноженная на этот параметр. По умолчанию он равен 1.<br />
<br />
Сработав, эта команда задает начальные значения скорости для команды phys, поэтому должна использоваться совместно с ней (см. ниже пример).<br />
<br />
=== tap ===<br />
<br />
* '''go''' - Состояние в которое нужно перейти после окончания времени.<br />
* '''if''' - номер (начиная с нуля) условия [[#if|if]] разрешения бросания.<br />
<br />
=== apply ===<br />
<br />
Вызывается, если данная машина пересеклась с другой. Обычно используется в совокупности с throw, move, phys, drag.<br />
* '''obj''' - сработает , если пересеклись с этим объектом;<br />
* '''rm''' - радиус этой машины (если rm=0, то она считается прямоугольной)<br />
* '''ro''' - радиус объекта obj (если ro=0, то он считается прямоугольным)<br />
* '''shape''' - сработает, если пересеклись формы обьектов (полезно для png);<br />
* '''x1''' - сработает, если центр объекта левее этого x-са;<br />
* '''x2''' - сработает, если центр объекта правее этого x-са;<br />
* '''y1''' - сработает, если центр объекта выше этого y-ка;<br />
* '''y2''' - сработает, если центр объекта ниже этого y-ка;<br />
* '''st''' - состояние, в которое надо перевести объект obj<br />
* '''go''' - состояние, в которое надо перейти при срабатывании;<br />
* '''if''' - номер (начиная с нуля) команды условия [[#if|if]] разрешения применения команды apply.<br />
<br />
[[Файл:Screen_apply.jpg|500px]]<br />
<br />
Блок схема работы '''apply'''<br />
<br />
[[Файл:Блок схема apply.png|500px]]<br />
<br />
* Сначала у нас проверяется координаты '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Далее проверяет если '''obj'''<br />
* Если '''obj''' нет, то идёт проверку, и выдаёт результат<br />
(если при этом если '''x1''', '''x2''', '''y1''', '''y2''' нет, то они считаются по ширине и высоте всего экрана.)<br />
* Если есть '''obj''', то проверяет есть ли радиусы '''rm''', '''ro'''.<br />
* Если он есть, то значит у нас '''apply''' по кругам<br />
* Если нет, то проверяем наличие '''x1''', '''x2''', '''y1''', '''y2'''.<br />
* Если они есть, то проверка и результат.<br />
* Если их нет, то проверка идёт по шейпам объектов, и выдаётся результат/<br />
Если не будет стоять ни каких галочек, то проверка будет идти по шейпам объектов.<br />
<br />
<br />
Пусть, например, есть снаряд, который при помощи мышки надо кинуть в "тыкву". Если мы промахнулись, снаряд должен вернуться обратно, а с тыквой ничего не произойти. Если мы в тыкву попадаем, снаряд также возвращается, а тыква "взрывается":<br />
<pre><br />
<br />
<st id="trow"><br />
<init x="-350" y="150"/> // начальное положение<br />
<throw go="fly"/> // бросаем<br />
</st><br />
<br />
<st id="fly"><br />
<phys ay="100"/> // летим<br />
<apply y2="300" go="throw"/> // с землей<br />
<apply obj="тыква" rm="8" ro="10" st="bang"/> // с тыквой<br />
</st><br />
<br />
</pre><br />
<br />
== Условия ==<br />
<br />
=== if ===<br />
<br />
В состоянии может быть произвольное число команд if. Их номера (начиная с нуля) указываются<br />
в параметре if других команд. Эти номера можно соединять при помощи логических связок:<br />
* '''&''' - логическое '''и''' (вместо значка '''&''' можно использовать запятую ''',''');<br />
* '''|''' - логическое '''или''';<br />
* '''!''' - логическое '''не'''.<br />
Пример записи логического выражения в поле if некоторой команды: '''(1&2)|(3&(!4))''',<br />
что означает: выполняется if под номером 1 и под номером 2, или под номером 3 и не под номером 4.<br />
<br />
'''!!!Важно:''' нужно использовать полную скобочную структуру : "((1&2)&3)" - правильно, "1,2,3" - не правильно ( не гарантируется 100% адекватная работа).<br />
<br />
Логические связки используются также как математической логике или любом языке программирования. <br />
Так:<br />
* A '''&''' B - истинно, если истинны оба условия A и B;<br />
* A '''|''' B - истинно, если истинно хотя бы одно условие (или оба);<br />
* '''!''' А - истинно, если условие A ложно.<br />
Скобки в логическом выражении определяют приоритет (порядок) выполнения логических операций.<br />
Отметим несколько тождеств, справедливых при формировании логических высказываний:<br />
* !(A & B) = (!A) | (!B)<br />
* !(A | B) = (!A) & (!B)<br />
* !(!A) = A<br />
<br />
Если при формировании условия (ниже) есть несколько проверок, то они соединены логическим '''и'''.<br />
Т.е., если хотя бы одна из них не выполняется, то считается, что условие не выполнилось.<br />
<br />
Параметры команды:<br />
* '''obj''' - находится ли объект obj в состоянии st или имеет ли его параметр par значение val. В этом поле можно указать this, это значит что if будет проводить проверку текущего объекта. Добавлено это вместе с параметром clone. Клоны рождаются и умирают в рамках одного экрана. Для различия клонов между собой машина имеет уникальный параметр "clone_num" у оригинала = -1, у клонов от 0 до N, собственно с помощью this машина может сама себя проверить клон ли она и если да то какой у нее номер;<br />
* '''st''' - имя состояния в котором может находиться объект obj;<br />
* '''par''' - имя параметра объекта obj, значение которого сравнивается с полем val;<br />
* '''val''' - значение параметра par, которое проверяется у объекта obj;<br />
* '''range''' - задание диапазона для par, от val до range. Должен присутствовать op (применится op для val и обратный op для range);<br />
* '''val_txt''' - Значение текстового параметра объекта для проверки условия;<br />
* '''val_res''' - Значение ресурсного параметра объекта для проверки условия;<br />
* '''val_obj''' - Значение id объекта для проверки условия;<br />
* '''op''' - операция сравнения par op val. Если операции нет, то предполагается проверка на равенство par=val. Иначе используются операторы:<br />
** '''<''' - меньше (par < val);<br />
** '''>''' - больше (par > val);<br />
** '''!=''' - не равно (par != val);<br />
** '''<>''' - не равно (par <> val);<br />
** '''>=''' - больше или равно (par >= val);<br />
** '''<=''' - меньше или равно (par <= val);<br />
* '''curScr''' - если текущий экран совпадает с этим, то условие выполнилось;<br />
* '''prScr''' - если предыдущий экран совпадает с этим, то условие выполнилось;<br />
* '''wasScr''' - если был (когда либо) этот экран, то условие выполнилось.<br />
* '''buy''' - был ли куплен данный inn-app (проверяется флаг поля в объекте [[Options]]);<br />
* '''url''' - валиден (правилен и может быть запущен) ли данный интернет-адрес; на ios ссылка должна выглядеть так comabsolutisttwilighttown://, т.е. в конце ссылки добавляем ://<br />
* '''is_mus''' - играет ли сейчас музыка (значение 1);<br />
* '''guest''' - объект который установил состояние (используется вместо параметра obj). Если указанный объект не менял состояние этой машины, то условие не срабатывает.<br />
<br />
Если использовать obj, par, val, то будет происходить проверка на равенство значения параметра объекта и значения записанного в поле val.<br />
Если же использовать obj, par, op, val, то будет происходить проверка в соответствии с операцией сравнения значения параметра объекта и значения записанного в поле val.<br />
<br />
Для проверки текущего значения прозрачности у объекта можно воспользоваться параметром ''cur_al''<br />
<br />
У машины (другой или самой себя) можно проверить текущее состояние '''st''' и предыдущее состояние '''prev_st''', эти параметры живут на время сессии.<br />
<br />
== Математика ==<br />
<br />
=== Основные математические операции ===<br />
Математика в appsalute creator представлена 6-ю основными операциями: (плюс), (минус), (умножить), (поделить), (целочисленное деление), (остаток от деления) <br><br />
Организована благодаря совместному использованию '''[[#var|var]]''' и '''[[#set|set]]'''. <br />
[[Файл:Example_mod.png|300px|right|Пример использования операции остатка от деления]]<br />
''(плюс)'' '''+'''<br><br />
''(минус)'' '''-'''<br><br />
''(умножить)'' '''*'''<br><br />
''(поделить)'' '''/'''<br><br />
''(целочисленное деление)'' '''\'''<br><br />
''(остаток от деления)'' '''%'''<br><br />
<br><br />
Примеры использования последних двух операций:<br><br />
5\2=2<br><br />
5%2=1<br><br />
<br />
=== var ===<br />
Благодаря использованию '''[[#var|var]]''' существует возможность cчитать любой числовой параметр любого объекта. Например: x - координату какой-то машины, текущее значение любого объекта counter или timer и конечно же считывание значения любого параметра из опций! Каким образом это устроено? Рассмотрим подробнее '''[[#var|var]]''': <br><br />
[[Файл:VAR.png|right]]<br />
*'''name''' - здесь выбираем имя для нашей будущей переменной, которой будем оперировать далее<br />
*'''obj''' - выбирается объект, параметры которого мы хотим считать<br />
*'''par''' - параметр, который нужно вычитать из объекта, указанного выше<br />
*'''val''' - указывается числовое значение, которое будет установлено по умолчанию в случае отсутствия obj и par<br />
*'''user''' - если стоит "1", то будет считываться с текущего профиля в опциях<br />
На изображении справа можно наблюдать каким образом организован '''[[#var|var]]'''. В данном случае объявлена переменная x_cor, которая считывает x-координату объекта actor_1, при этом считывание переменной происходит из текущего профиля, так, как в поле user установлено значение равное "1".<br />
<br />
=== set ===<br />
[[Файл:SET.png|right]]<br />
Использование '''[[#var|var]]''' без '''[[#set|set]]''' не имеет смысла. Так, как переменная создается, но не используется дальше. Рассмотрим следующий пример, где вычитаем x - координату из одного объекта и сохраним ее в опции, предварительно увеличив ее на 50 единиц (в данном случае 50 пикселей).<br />
На рисунке справа можно наблюдать, каким образом это сделано. В состоянии '''init''' объявляется переменная '''x_cor''', которая считывает координату '''x''' из объекта '''actor_1''', таким образом в переменную '''x_cor''' запишется положение по '''x''' объекта '''actor_1'''. Поле '''user''' в данном случае в '''1''' не обязательно устанавливать, так как работа ведется с машинами, а не с опциями. Если бы на месте '''actor_1''' оказался объект '''options''', то это было бы просто необходимо, иначе программа считает значение не из профиля. Далее в '''[[#set|set]]''' выбран объект '''options''', в параметр '''x_position''' которого будет сохранятся значение переменной '''x_cor''' увеличенной на 50. В поле '''round''' идет округление вычисляемого значения, если оно установлено в 1. Поле '''user ''' установлено в 1, это значит, что параметр '''x_position''' будет сохранен в профиль. После это выполняется сохранение опций путем задания объекту '''options''' состояния '''save'''.<br><br />
! ! !ВАЖНО: чтобы выполнить какие-то действия с '''[[#var|var]]''' его обязательно нужно указывать в поле '''val''' в '''set''', при этом, если он используется, то все выражение должно стоять в скобках. Если в поле '''val''' не используется переменная, то скобки необязательны.<br />
<br><br />
<br><br />
Существует также возможность использовать '''[[#var|var]]''' совместно с '''[[#if|if]]''', а также '''[[#var|var]]''' с '''[[#move|move]]'''<br />
<br><br />
Так же добавилась возможность записывать значение переменной в состояние "st", что значительно уменьшает<br />
необходимость в записи 1000 if-ов. При этом, тип переменной в '''[[#var|var]]''' должен быть "строка".<br />
И добавилась возможность записи переменной boolean: ((a)==(b)). true = 1, false = 0. Довольно полезная вещь,<br />
если не хотите забивать "память" ненужной математикой.<br />
<br />
=== var и if ===<br />
[[Файл:IF.png|right]]<br />
При подробном рассмотрении '''[[#if|if]]''' можно заметить, что в нем есть поле '''val''', соответственно в этом поле можно указать переменную. Таким образом в поле '''val''' необязательно указывать константу, а можно указать какую-то переменную, которая может постоянно изменяться. Например, существует два объекта, один находится состоянии покоя, а другой находится в движении. При этом первый объект (тот, который в состоянии покоя) постоянно опрашивает положение второго объекта, и в случае, если у объекта, который движется, '''х''' координата равна '''х''' координате первого объекта, то первый объект входит в состояние, где он начинает свое движение. На рисунке показан объект, который находится в состоянии покоя, рассмотрим его состояния:<br><br />
В данном объекте существует два состояния: '''init''' и '''move'''. В '''init''' объект опрашивает другой объект и в случае, когда условие срабатывает, то переходит в состояние '''move''', где начинает свое движение.<br />
В '''init''' создаем переменную, в которую записываем положение по '''x''' объекта '''actor_2''', в '''if''' проверяется условие на соответствие координат объектов '''actor_1''' и '''actor_2''', в данном случае координата объекта '''actor_2''' представлена в виде переменной '''x_cor'''. Если условие выполняется, то происходит переход в состояние '''move''', если нет, то заново проходим состояние '''init''' и повторяем вышеописанную последовательность действий.<br />
<br><br />
<br><br />
<br><br />
<br><br />
<br />
=== var и move ===<br />
Также с помощью '''[[#var|var]]''' есть возможность указать целевые координаты в '''[[#move|move]]'''. То есть, не обязательно указывать целевые координаты в виде констант, их можно указать теперь с помощью переменных. При использовании '''[[#var|var]]''' и '''[[#move|move]]''' можно организовать обмен двух объектов местами с анимацией движения. Для этого необходимо определять какой объект нажат первым, а какой вторым, сохранять их координаты через объект '''options''' и только потом менять их местами. На рисунке можно увидеть, как это организовано.<br />
[[Файл:var_move.png|1000px|thumb|center|]]<br />
Рассмотрим подробнее состояние данной машины:<br />
<br><br />
* '''init'''<br><br />
В этом состоянии ожидаем клик на объект и обнуляем параметр, который отвечает за то, какой по счету объект сейчас нажат. Так, как при обмене объектов, если мы делаем это по клику, важно знать, по какому кликнули первым, а по какому вторым.<br />
* '''check'''<br><br />
Проверяется параметр '''number''', если он равен '''0''', то это значит, что еще ничего не кликали и мы переходим в состояние, где в опции записываются координаты этого объекта, который считается нажатым первым. Если не равен '''0''', то считается, что этот объект нажат вторым и переходит в состояние, где в опции записываются координаты этого объекта, который считается нажатым вторым по счету.<br />
* '''first_object'''<br><br />
В этом состоянии записываются координаты объекта в опции. Чтобы записать координаты в опции используются '''[[#var|var]]''' и '''[[#set|set]]''' упоминаемые выше. В опции координаты первого нажатого объекта сохраняются под параметрами '''x_first''' и '''y_first'''. В конце параметру '''number''' присваиваем значение '''1''', чтобы указать, что следующий нажатый объект будет вторым по счету. <br />
* '''second_object'''<br><br />
В этом состоянии объект будет в том случае, если он будет нажатым вторым по счету, то есть после состояния '''check''' объект попадет в это состояние, где он запишет свои текущие координаты под параметрами '''x_second''' и '''y_second'''. Запись координат происходит таким же самым образом, что и в состоянии '''first_object'''. После этого он автоматически переходит в следующее состояние.<br />
* '''move_first'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат первым, поэтому он будет двигаться на место второго нажатого объекта, который сохранил свои координаты в параметры'''x_second''' и '''y_second'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты второго объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
* '''move_second'''<br><br />
В этом состоянии объект будет в том случае, если он был нажат вторым, поэтому он будет двигаться на место первого нажатого объекта, который сохранил свои координаты в параметры '''x_first''' и '''y_first'''. Движение происходит следующим образом: сперва в переменную вычитываем координаты первого объекта, а потом в '''move''' вместо целевых координат записываем переменные, которые обязательно должны быть взяты в скобки.<br />
<br />
В результате проделанных манипуляций с машинами по кликам на две машины, они обменяются местами с анимацией движения. Это может быть очень полезным во многих мини играх!!!<br />
<br />
=== Важно знать ===<br />
* Переменная действует в рамках одного состояния, если нужно, чтобы она была глобальной, нужно сохранить ее в опции и потом в нужный момент считывать ее из опций.<br />
* Если складываем два числа, то в поле '''val''' они должны быть записаны в скобках: (5+3).<br />
* Если возникает необходимость написать какое-то более сложное арифметическое вычисление, то следует помнить, что на одно действие приходятся одни скобки. Например: (((5+3)\2)*2).<br />
* Количество открывающих и закрывающих скобок должно быть одинаковым.<br />
* В скобках можно писать переменную, если она была объявлена выше: (5+a).<br />
* Переменная может состоять из цифр и букв и знака нижнего подчеркивания.<br />
* Иногда бывает необходимым использование '''round''' в '''set''', так например, если какой-то параметр получен с помощью арифметических вычислений и потом используется его в каком-то условии, и условие проверяет параметр, как целочисленное значение, то могут возникнуть ошибки. Так, как число будет записано в следующем виде 123.0000 и программа будет считать, что оно не целочисленное, а дробное. И чтобы избавится от лишних нулей в дробной части следует округлять число.<br />
* Действия, которые требуют времени, такие как move, rot, wait и другие перестают работать для уменьшения вычислительной нагрузки на устройство.<br />
* Действия, которые не требуют времени, такие как set, init и другие продолжают функционировать.<br />
<br />
<br />
<pre><br />
Если с помощью переменной менять объекту любой параметр, например, координату X, то она<br />
запомнится (запишется как значение по умолчанию).<br />
Тогда при повторном попадании на экран считается не тот X, который указан в свойствах,<br />
а тот, который установлен через переменную.<br />
Если нужно при ините экрана возвращать начальные значения параметров,<br />
то можно сделать это двумя способами:<br />
- не использовать переменную;<br />
- создать отдельное состояние, которое будет "вручную" устанавливать начальные значения<br />
параметрам при ините экрана.<br />
Если координата (или другой параметр) меняется другим способом, то будут автоматически<br />
при ините экрана подтягиваться значения из свойств объекта.<br />
</pre><br />
<br />
=== Примеры применений ===<br />
С помощью математики можно организовать следующее:<br />
* динамические опции (изменение звука и музыки с помощью ползунка);<br />
* анимацию каунтера в играх (по окончанию уровня можно наблюдать, как изменяются очки);<br />
* подсчет очков (гибкая система подсчета очков);<br />
* обмен объектов местами (использование var и move)<br />
* увеличение z-координаты любого объекта (когда необходимо, чтобы нажатый или таскаемый объект был выше других по z);<br />
* простейший калькулятор;<br />
* и много других.<br />
<br />
== Копирование машины состояния с сохранением ссылки на себя ==<br />
Довольно часто бывает, что машина состояний ссылается только на глобальные объекты и на саму себя. При этом, если мы просто скопируем объект, он будет ссылаться на свою предыдущую копию. Этого можно избежать, сделав 3 шага:<br />
1. Переместить объект в отдельную сцену<br />
2. Скопировать данную сцену(имеется в виду обычное копирование, без ссылки)<br />
3. Перенести объект и его копию обратно, в нужную сцену<br />
4. Созданные сцены можно удалить :)<br />
<br />
== Guest ==<br />
<br />
'''Guest (гость)''' - объект, который перевел машину в текущее состояние. Пример: кнопка ''btn1'' по клику переводит машину ''mch1'' в состояние ''st1'', в этом состоянии у машины ''mch1'' гостем является кнопка ''btn1''. Гостем может быть объект любого типа, если он может менять состояние другому объекту (например: хидден-объект по нахождению может менять состояние объекту, кнопка, машина, пэчворк и т.д.)<br />
<br />
В машине состояний можно считывать (проверять) и передавать параметры и состояния гостя. Любое поле ''obj'' в выпадающем списке содержит строку ''guest'', что позволяет работать с гостем, как с любым другим объектом.<br />
<br />
=== Пример использования ===<br />
<br />
[[Файл:Guest1.jpg|left]]<br />
Пускай экран содержит 3 кнопки (''btn1'', ''btn2'' и ''btn3'') и одну машину ''mch1''. Нужно сделать так, чтобы по клику на любую из кнопок машина перемещалась в ее координаты и переводила кнопку в состояние ''disable''. Так же по клику на кнопку ''btn2'', машина должна перейти в состояние ''bonus''.<br><br />
Всем трем кнопкам по клику пропишем передавать объекту ''mch1'' состояние ''check''.<br><br><br />
Создадим в машине три состояния: ''init'' - состояние в котором машина будет находиться по умолчанию, ''check'' - состояние, которое будет вызываться тремя кнопками, в этом состоянии у машины ''mch1'' одна из трех кнопок будет гостем, ''bonus'' - последнее состояние.<br><br />
Две команды ''var'' считывают у гостя координаты, т.к. мы не знаем, какая именно кнопка перевела машину ''mch1'' в состояние ''check'', то обращаемся к гостю, а не к кнопкам. За ними следует две команды ''set'', которые передают координаты гостя машине. Еще один ''set'' переводит гостя в состояние ''disable''. И через ''wait'' осуществляется переход в состояние ''bonus'', если гость ''btn2''.<br />
<br />
<pre><br />
При смене состояния гость сохраняется, т.е. в состоянии bonus гостем останется btn2.<br />
</pre><br />
<pre><br />
Если машина изначально сама себе меняет состояния, то у нее нет гостя.<br />
</pre><br />
<br />
[[Файл:Guest2.jpg]]<br />
<br />
== Массив (Array) ==<br />
<br />
В данном объекте реализован массив, имеющий максимальную длину в 20 элементов.<br />
<br />
=== Свойства объекта массив: ===<br />
<br />
len - длинна массива. Длинна массива может как считываться, так и записываться. Влияет на количество сохраняемых объектов в Options.<br />
<br />
index1 - индекс элемента. (данный массив можно расширить до многомерного и использовать несколько индексов)<br />
<br />
val - значение элемента массива, с индексом index1<br />
<br />
a1..a20 - внутренние элементы массива(обращаться можно через свойство par объекта). Предполагается, что пользователь редактора к ним обращаться напрямую не будет, однако иногда для удобства полезны.<br />
<br />
=== Состояния объекта массив: ===<br />
<br />
get - при вызове этого состояния во внутреннюю переменную val записывается значение элемента с индексом index1<br />
<br />
set - при вызове этого состояния во внутреннюю переменную a1..a20, соответствующую индексу index1 записывается значение val<br />
<br />
load - загрузить значения массива из xml.<br />
<br />
save - сохранить элементы массива от 1 до len<br />
<br />
=== Как использовать? ===<br />
<br />
1. Загружаем массив, переводя объект array в состояние load<br />
<br />
2. Записываем значения массива<br />
<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, в которую будет заноситься число)<br />
б). Задаём значение свойству val объекта array (устанавливаем значение, которое будет заноситься в ячейку<br />
с индексом index1)<br />
в). Переводим объект array в состояние set<br />
<br />
3. Считываем значения массива<br />
а). Задаём значение свойству index1 объекта array (устанавливаем индекс ячейки, из которой будет считываться число)<br />
б). Переводим объект array в состояние get<br />
в). Считываем значение из свойства val объекта array<br />
<br />
4. Сохраняем массив, переводя объект array в состояние save. Если хотите изменить количество сохраняемых элементов - предварительно измените параметр len.<br />
<br />
=== Копирование объекта ===<br />
<br />
При копировании, необходимо заменить в состояниях load и save array.имя_параметра на другое имя. Например, array2.имя_параметра. Копировать следует через использование доп. сцены (см. выше)<br />
<br />
=== Достоинства ===<br />
<br />
Позволяет избежать необходимости каждый раз создавать большое количество if-ов и set-ов, если необходимо работать с нумерованным списком. Можно один раз создать структуру и копировать её неограниченное количество раз<br />
<br />
=== Недостатки ===<br />
<br />
Данный объект содержит довольно большое количество кода, поэтому при большом их обилии/длине может занизить скорость работы сцены и скорость загрузки сцены.<br />
<br />
=== Исходный XML код===<br />
Прим. id="369" - идентификатор объекта Options, сохраняющего все переменные приложения. id="7845" - идентификатор объекта<br />
<br />
<pre><br />
<obj id="7845" type="machine" nm="array" sync="1" w="1" h="1"><br />
<st id="init"/><br />
<st id="get"><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="7845" par="val" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="val" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="val" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="val" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="val" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="val" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="val" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="val" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="val" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="val" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="val" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="val" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="val" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="val" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="val" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="val" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="val" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="val" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="val" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="val" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="set"><br />
<var nm="val" obj="7845" par="val"/><br />
<set obj="7845" par="a1" val="(val)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(val)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(val)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(val)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(val)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(val)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(val)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(val)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(val)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(val)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(val)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(val)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(val)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(val)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(val)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(val)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(val)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(val)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(val)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(val)" round="1" if="19"/><br />
<if obj="7845" par="index1" val="1"/><br />
<if obj="7845" par="index1" val="2"/><br />
<if obj="7845" par="index1" val="3"/><br />
<if obj="7845" par="index1" val="4"/><br />
<if obj="7845" par="index1" val="5"/><br />
<if obj="7845" par="index1" val="6"/><br />
<if obj="7845" par="index1" val="7"/><br />
<if obj="7845" par="index1" val="8"/><br />
<if obj="7845" par="index1" val="9"/><br />
<if obj="7845" par="index1" val="10"/><br />
<if obj="7845" par="index1" val="11"/><br />
<if obj="7845" par="index1" val="12"/><br />
<if obj="7845" par="index1" val="13"/><br />
<if obj="7845" par="index1" val="14"/><br />
<if obj="7845" par="index1" val="15"/><br />
<if obj="7845" par="index1" val="16"/><br />
<if obj="7845" par="index1" val="17"/><br />
<if obj="7845" par="index1" val="18"/><br />
<if obj="7845" par="index1" val="19"/><br />
<if obj="7845" par="index1" val="20"/><br />
</st><br />
<st id="load"><br />
<var nm="a1" obj="369" par="array.a1" user="1"/><br />
<var nm="a2" obj="369" par="array.a2" user="1"/><br />
<var nm="a3" obj="369" par="array.a3" user="1"/><br />
<var nm="a4" obj="369" par="array.a4" user="1"/><br />
<var nm="a5" obj="369" par="array.a5" user="1"/><br />
<var nm="a6" obj="369" par="array.a6" user="1"/><br />
<var nm="a7" obj="369" par="array.a7" user="1"/><br />
<var nm="a8" obj="369" par="array.a8" user="1"/><br />
<var nm="a9" obj="369" par="array.a9" user="1"/><br />
<var nm="a10" obj="369" par="array.a10" user="1"/><br />
<var nm="a11" obj="369" par="array.a11" user="1"/><br />
<var nm="a12" obj="369" par="array.a12" user="1"/><br />
<var nm="a13" obj="369" par="array.a13" user="1"/><br />
<var nm="a14" obj="369" par="array.a14" user="1"/><br />
<var nm="a15" obj="369" par="array.a15" user="1"/><br />
<var nm="a16" obj="369" par="array.a16" user="1"/><br />
<var nm="a17" obj="369" par="array.a17" user="1"/><br />
<var nm="a18" obj="369" par="array.a18" user="1"/><br />
<var nm="a19" obj="369" par="array.a19" user="1"/><br />
<var nm="a20" obj="369" par="array.a20" user="1"/><br />
<set obj="7845" par="a1" val="(a1)" round="1" if="0"/><br />
<set obj="7845" par="a2" val="(a2)" round="1" if="1"/><br />
<set obj="7845" par="a3" val="(a3)" round="1" if="2"/><br />
<set obj="7845" par="a4" val="(a4)" round="1" if="3"/><br />
<set obj="7845" par="a5" val="(a5)" round="1" if="4"/><br />
<set obj="7845" par="a6" val="(a6)" round="1" if="5"/><br />
<set obj="7845" par="a7" val="(a7)" round="1" if="6"/><br />
<set obj="7845" par="a8" val="(a8)" round="1" if="7"/><br />
<set obj="7845" par="a9" val="(a9)" round="1" if="8"/><br />
<set obj="7845" par="a10" val="(a10)" round="1" if="9"/><br />
<set obj="7845" par="a11" val="(a11)" round="1" if="10"/><br />
<set obj="7845" par="a12" val="(a12)" round="1" if="11"/><br />
<set obj="7845" par="a13" val="(a13)" round="1" if="12"/><br />
<set obj="7845" par="a14" val="(a14)" round="1" if="13"/><br />
<set obj="7845" par="a15" val="(a15)" round="1" if="14"/><br />
<set obj="7845" par="a16" val="(a16)" round="1" if="15"/><br />
<set obj="7845" par="a17" val="(a17)" round="1" if="16"/><br />
<set obj="7845" par="a18" val="(a18)" round="1" if="17"/><br />
<set obj="7845" par="a19" val="(a19)" round="1" if="18"/><br />
<set obj="7845" par="a20" val="(a20)" round="1" if="19"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
<st id="save"><br />
<var nm="len" obj="7845" par="len"/><br />
<var nm="a1" obj="7845" par="a1"/><br />
<var nm="a2" obj="7845" par="a2"/><br />
<var nm="a3" obj="7845" par="a3"/><br />
<var nm="a4" obj="7845" par="a4"/><br />
<var nm="a5" obj="7845" par="a5"/><br />
<var nm="a6" obj="7845" par="a6"/><br />
<var nm="a7" obj="7845" par="a7"/><br />
<var nm="a8" obj="7845" par="a8"/><br />
<var nm="a9" obj="7845" par="a9"/><br />
<var nm="a10" obj="7845" par="a10"/><br />
<var nm="a11" obj="7845" par="a11"/><br />
<var nm="a12" obj="7845" par="a12"/><br />
<var nm="a13" obj="7845" par="a13"/><br />
<var nm="a14" obj="7845" par="a14"/><br />
<var nm="a15" obj="7845" par="a15"/><br />
<var nm="a16" obj="7845" par="a16"/><br />
<var nm="a17" obj="7845" par="a17"/><br />
<var nm="a18" obj="7845" par="a18"/><br />
<var nm="a19" obj="7845" par="a19"/><br />
<var nm="a20" obj="7845" par="a20"/><br />
<set obj="369" par="array.a1" val="(a1)" round="1" user="1" if="0"/><br />
<set obj="369" par="array.a2" val="(a2)" round="1" user="1" if="1"/><br />
<set obj="369" par="array.a3" val="(a3)" round="1" user="1" if="2"/><br />
<set obj="369" par="array.a4" val="(a4)" round="1" user="1" if="3"/><br />
<set obj="369" par="array.a5" val="(a5)" round="1" user="1" if="4"/><br />
<set obj="369" par="array.a6" val="(a6)" round="1" user="1" if="5"/><br />
<set obj="369" par="array.a7" val="(a7)" round="1" user="1" if="6"/><br />
<set obj="369" par="array.a8" val="(a8)" round="1" user="1" if="7"/><br />
<set obj="369" par="array.a9" val="(a9)" round="1" user="1" if="8"/><br />
<set obj="369" par="array.a10" val="(a10)" round="1" user="1" if="9"/><br />
<set obj="369" par="array.a11" val="(a11)" round="1" user="1" if="10"/><br />
<set obj="369" par="array.a12" val="(a12)" round="1" user="1" if="11"/><br />
<set obj="369" par="array.a13" val="(a13)" round="1" user="1" if="12"/><br />
<set obj="369" par="array.a14" val="(a14)" round="1" user="1" if="13"/><br />
<set obj="369" par="array.a15" val="(a15)" round="1" user="1" if="14"/><br />
<set obj="369" par="array.a16" val="(a16)" round="1" user="1" if="15"/><br />
<set obj="369" par="array.a17" val="(a17)" round="1" user="1" if="16"/><br />
<set obj="369" par="array.a18" val="(a18)" round="1" user="1" if="17"/><br />
<set obj="369" par="array.a19" val="(a19)" round="1" user="1" if="18"/><br />
<set obj="369" par="array.a20" val="(a20)" round="1" user="1" if="19"/><br />
<set obj="369" par="array.len" val="(len)" round="1" user="1"/><br />
<if obj="7845" par="len" op="&gt;" val="0"/><br />
<if obj="7845" par="len" op="&gt;" val="1"/><br />
<if obj="7845" par="len" op="&gt;" val="2"/><br />
<if obj="7845" par="len" op="&gt;" val="3"/><br />
<if obj="7845" par="len" op="&gt;" val="4"/><br />
<if obj="7845" par="len" op="&gt;" val="5"/><br />
<if obj="7845" par="len" op="&gt;" val="6"/><br />
<if obj="7845" par="len" op="&gt;" val="7"/><br />
<if obj="7845" par="len" op="&gt;" val="8"/><br />
<if obj="7845" par="len" op="&gt;" val="9"/><br />
<if obj="7845" par="len" op="&gt;" val="10"/><br />
<if obj="7845" par="len" op="&gt;" val="11"/><br />
<if obj="7845" par="len" op="&gt;" val="12"/><br />
<if obj="7845" par="len" op="&gt;" val="13"/><br />
<if obj="7845" par="len" op="&gt;" val="14"/><br />
<if obj="7845" par="len" op="&gt;" val="15"/><br />
<if obj="7845" par="len" op="&gt;" val="16"/><br />
<if obj="7845" par="len" op="&gt;" val="17"/><br />
<if obj="7845" par="len" op="&gt;" val="18"/><br />
<if obj="7845" par="len" op="&gt;" val="19"/><br />
</st><br />
</obj><br />
</pre><br />
<br />
=== Машина состояний объекта ===<br />
[[Файл:array.jpg]]<br />
<br />
<br />
== Пример использования ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/machine.rar Download]<br />
<br />
== Clone ==<br />
Clone - параметр команды init в разделе "системные действия".<br />
<br />
[[Файл:Clone1.PNG]]<br />
<br />
<br />
Значение 1 означает, что в текущем местоположении машины будет создана ее копия.<br />
<br />
[[Файл:Clone2.PNG]]<br />
<br />
=== Свойства ===<br />
<br />
1) Клонированная машина состояний имеет все свойства, состояния и параметры исходного объекта клонирования.<br />
<br />
2) Клоны рождаются и умирают в рамках одного экрана.<br />
<br />
3) Клоны отличаются друг от друга лишь параметром '''clone_num''', который у оригинала равен "-1", а у клонов от 0 до N.<br />
<br />
4) Нежелательно применять клонирование к клону во избежание путаницы значений параметра '''clone_num'''.<br />
<br />
5) Если при проверке условия [[#if|if]] в поле '''obj''' указать this, это значит что if будет проводить проверку текущего объекта. Таким образом машина может сама себя проверить по параметру '''clone_num''' клон ли она и если да то какой у нее номер;<br />
<br />
=== Пример использования ===<br />
<br />
По ссылке пример использования с подробным описанием машин.<br />
<br />
[http://fs5.absolutist.com/files/wikisample/Clone.zip Download]<br />
<br />
== Параметр команды машины состояний ==<br />
<br />
В случае, когда необходимо изменить значение какого-либо параметра в командах машины состояний (например v в команде move) в процессе работы приложения, можно использовать блок "Параметр команды машины состояний" в команде ''set'' машины состояний. Приведу пример использования этого блока.<br />
<br />
Пусть есть 2 машины: управляющая и управляемая.<br />
<br />
[[Файл:Stm1.jpg|300px]][[Файл:Stm2.jpg|300px]]<br />
<br />
Управляемая машина практически пустая и не содержит каких либо данных о движении, но тем не менее при запуске она будет двигаться, меняя направление. Это движение - заслуга управляющей машины, которая на ходу изменяет параметры движения управляемой. Рассмотрим более детально ее состояния.<br />
<br />
В первом состоянии "wait" мы пытаемся изменить скорость движения управляемой машины. Для этого указали объект (sun), состояние в котором хотим поменять параметр (у машины sun это состояние move), имя команды в которой меняем параметр (в данном случае это move), номер команды (если таких команд несколько, то нужно указать порядковый номер начиная с 0; в нашем случае команда одна), имя параметра (мы хотим изменить скорость, поэтому имя параметра v) и значение (указали значение 200). После этого переходим в следующее состояние.<br />
<br />
В состоянии "1" управляющей машины сначала мы вывели объект sun из состояния move, изменили параметр целевой координаты x на 512 и затем вернули в состояние move, чтобы применить изменения параметров. Таким образом управляемая машина начала движение в x=512 со скоростью 200. Через 2 секунды мы переводим управляющую машину в состояние "2", где аналогичным образом изменяется целевая координата на -512.<br />
<br />
Такой способ задания параметров может найти применение в случае, когда параметры нужно задавать переменными.<br />
<br />
==Запись в viewer.log ==<br />
<br />
Во время работы приложения, машина состояний может писать информацию о своей работе в viewer.log. Для этого параметр '''Level''', в разделе '''[GameTrace]''' файла '''app.icf''' должен быть выставлен в значение '''Verbose'''.<br />
<br />
При этом нужно иметь ввиду, что приложение работает более медленно, чем при обычном использовании. При настройке процессов, привязанных к времени (анимация и т.д.) логирование нужно отключать, путем установки флага '''Level''' в значение '''Info'''.<br />
<br />
Ниже приведен пример записи из viewer.log. Жирным шрифтом выделено полезную информацию. <br />
<br />
*Machine::state() state machine '''stat_google_gold (id:30818)''' from '''enough_coins''' to '''enough_coins''' through object '''c_current_gold (id:8807)''' from state '''inc''' - машина с именем и id: '''stat_google_gold (id:30818)''' перешла из состояния: '''enough_coins''' в: '''enough_coins'''; ее состояние изменил объект с именем и id: '''c_current_gold (id:8807)''' из состояния: '''inc'''.<br />
*GMachine::Set::init() GMachine'''(id:28076)'''::Set::init '''set id:17''' - машина с id '''(id:28076)''' начала выполнять команду '''set id:17'''; сначала проверяется истинно ли условие выполнения команды (if).<br />
*GMachine::Command::calcExpr() GMachine::Command::calcExpr ((0|(!1))|(!2)) '''checkIf(0)=no''' - имеем некоторое сложное условие, проверяем его составляющие; if(0) не выполняется (имеет значение false).<br />
*GMachine::Command::calcExpr() GMachine::Command::calcExpr ((0|(!1))|(!2)) '''checkIf(1)=yes''' - условие if(1) выполняется (имеет значение true).<br />
*GMachine::Command::calcExpr() GMachine::Command::calcExpr ((0|(!1))|(!2)) '''checkIf(2)=yes''' - условие if(2) выполняется (имеет значение true).<br />
*GMachine::Command::checkIf() GMachine'''(id:28076)'''::Command::'''checkIf id:17 expr:((0|(!1))|(!2)) res:false''' - проверяется все выражение; общий результат false, set(17) не выполняется.<br />
*GMachine::Set::init() GMachine'''(id:28076)'''::Set::init '''set id:18''' - машина с id '''(id:28076)''' начала выполнять команду '''set id:18''', в данном set условие if отсутствует.<br />
*GMachine::Command::checkIf() GMachine'''(id:28076)'''::Command::'''checkIf id:18 expr: res:true''' - в команде set(18) условие '''checkIf id:18 expr: res:true''' есть истинно (точнее - не есть ложным, так как оно отсутствует); set(18) будет выполнен.<br />
*GMachine::Set::init() GMachine'''(id:28076)'''::Set::init '''set id:18 checkIf success''' - проверка условия прошла успешно, выполняем set(18).<br />
*GMachine::Set::init() GMachine'''(id:28076)'''::Set::init '''set id:18 obj:16039 -> par:param_name val:bundle_coins us:0''' - результат выполнения set(18) - объекту '''obj:16039''' устанавливаем параметр '''par:param_name val:bundle_coins''' равным '''us:0'''.<br />
*GMachine::Command::getVarValue() Command::'''getVarValue(bundle_item): float result = 0.00''' - вычитываем переменную с помощью команды var; вычитываем параметр '''bundle_item''', результат операции '''float result = 0.00'''.<br />
*GMachine::Set::init() Set::init: Expression: '''(bundle_coins)=0.000000(float)''' - используем значение переменной в команде set; переменная вчитывается в момент обращения к ней из другой команды (set, move и др.).<br />
<br />
==Использование скриптов Lua ==<br />
В машине состояний можно использовать скрипты [[Lua]]<br />
<br />
<br />
==Окно==<br />
В свойствах машины состояний есть 2 новых поля:<br />
*'''окно''' - если ''да'', то машина считает себя окном. При включении данного параметра с момента постановки окна в очередь ''statesmanager'а'' и до вызова ''back'' в текущей машине блокируются внешние воздействия и переход между состояниями.<br />
*'''тип окна''' - обычное; по альфе - при открытии отключает все нижние сцены по альфе; с фото - при открытии отключает все нижние сцены по альфе, предварительно делая фото этих сцен. Выключение сцен ''по альфе'' и ''с фото'' используются для больших окон основной очереди.<br />
[[mwindow]]<br />
<br />
[[Category:Main objects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9809Advertisement2019-05-29T11:31:29Z<p>Agava: </p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
Этот параметр позволит нам использовать персональные данные игроков при выдаче рекламы.<br />
<br />
'''Внимание''': для триггера команды '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe");<br />
<br />
* нет информации о согласии игрока (в таком случае в опциях не будет значения gdpr) или мы вручную сбросили его согласие в игре (установив значение ниже -10).<br />
<br />
Так как рекламный конфиг у нас приезжает неизвестно когда, мы не должны открывать окно через этот параметр. Вместо этого мы делаем небольшую машину, которая будет ставить флажок, сигнализируюющий о необходимости запросить у игрока его согласие на обработку персональных данных. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при вызове этого состояния обьект '''advertisement''' запишет в параметр в опциях '''gdpr''' значение из '''param''' , которое мы передаем в сам обьект advertisement. Для стран, где действует GDPR, таргетированная реклама показывается, если мы установили значение параметра в 1, и нетаргетированная, если это значение установлено в 0.<br />
<br />
Это состояние мы не вызываем без ведома игрока! Оно должно вызываться, когда игрок принимает или отклоняет запрос о сборе персональных данных. Этот запрос мы представляем ему в виде окна с двумя кнопками и без возможности его закрыть. Также после принятия или отказа от сбора, игрок может изменить свое решение, например, через checkbox в настройках игры.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
Если этот параметр есть в app.icf, то мы даем игре знать, что хотим собирать персональные данные игрока. Тогда будет работать добавляемый параметр '''нужен запрос gdpr'''.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1, AdMob - 0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.<br />
<br />
==Подробное описание работы обьекта==<br />
<br />
Продолжение здесь: http://jira1:8090/pages/viewpage.action?pageId=23822337</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Notification&diff=9808Notification2019-05-02T08:25:08Z<p>Agava: /* Основные параметры */</p>
<hr />
<div>{{TOC right}}<br />
[[Object|Объект]] '''Notification''' предназначен для показа push уведомлений на IOS устройствах.<br />
<br />
==Параметры объекта==<br />
<br />
===Основные параметры===<br />
<br />
*'''имя события''' (''name'') - Имя события. Если у двух событий одинаковые имена - сохранится первое. Не обязательный параметр. Перетягивается из редактора текстов. Поле должно быть в состоянии редактирования.<br />
<br />
*'''сообщение''' (''message'') - Основной текст события. Перетягивается из редактора текстов. Поле должно быть в состоянии редактирования.<br />
<br />
*'''большая картинка''' (''big_picture'') - Имя файла с большой картинкой. Должен лежать не в ресурсах, а рядом с app.icf. Поле затирается после регистрации уведомления<br />
<br />
*'''год''' (''year'') - Год, когда сработает оповещение. Минимальное значение - 1971 .<br />
<br />
*'''месяц''' (''month'') - Месяц, когда сработает оповещение. Минимальное значение - 0, максимальное - 11 .<br />
<br />
*'''день''' (''day'') - День, когда сработает оповещение. Минимальное значение - 1, максимальное - 31 .<br />
<br />
*'''час''' (''hour'') - Час, когда сработает оповещение. Минимальное значение - 0, максимальное - 23 .<br />
<br />
*'''минута''' (''min'') - Минута, когда сработает оповещение. Минимальное значение - 0, максимальное - 59 .<br />
<br />
*'''секунда''' (''sec'') - Секунда, когда сработает оповещение. Минимальное значение - 0, максимальное - 59 .<br />
<br />
*'''задержка''' (''delay'') - Задержка от текущего времени до оповещения. Если задана не -1 - то используется вместо даты.<br />
<br />
*'''перед первым init экстеншена''' (''delayInit'') - Задержка в секундах до первой инициализации расширения<br />
<br />
*'''блокировать экстеншен''' (''locked'') - Блокировать показ всплывающих окон с пермишеном на уведомления на время, указанное в предыдущем поле. Нужно для ios.<br />
<br />
*'''цвет заголовка''' (''colorTitle'') - Цвет заголовка - только для кастомных нотификейшенов<br />
<br />
*'''цвет текста''' (''colorText'') - Цвет текста - только для кастомных нотификейшенов<br />
<br />
===Firebase Cloud Messaging===<br />
<br />
*'''Обработчик бандлов''' (''fcmBundleHandler'') - Объект, в который будут записаны параметры бандла и который будет переведен в состояние eventID бандла при fcm_check_bundle (см. дальше)<br />
<br />
==Состояния объекта==<br />
<br />
*'''set''' - устанавливает нотификацию в очередь<br />
<br />
*'''clear''' - очищает очередь нотификации<br />
<br />
*'''erase''' - очищает очередь нотификации от уведомления с указаннным ID темы и ID сообщения<br />
<br />
*'''fcm_subscribe_topic''' - Firebase only! Подписаться на топик из поля topic<br />
<br />
*'''fcm_unsubscribe_topic''' - Firebase only! Отписаться от топика из поля topic<br />
<br />
*'''fcm_check_bundle''' - Firebase only! Проверить наличие fcm бандлов<br />
<br />
Установка уведомлений (объект notification):<br />
Состояние<br />
"set", - оба способа<br />
"set_native", - устройство<br />
"set_parse", - парс<br />
или через параметр<br />
<property name="отсылать в" type="enum" value="0" id="send" hint="отсылать в" regexp="обе службы=0,только локальный пуш=1,только парс=2" /> (тогда состояние set)<br />
<br />
==Пример применения==<br />
<br />
Пусть через 5 минут после нажатия на кнопку у пользователя появиится уведомление с текстом "message of notification".<br />
<br />
Для этого разместим на сцене объект notification и установим ему следующие параметры:<br />
<br />
* задержка - 300<br />
<br />
[[Файл:Notification 01.jpg |upright=0.5]]<br />
<br />
<br />
В текстовую базу занесём новые записи с названием события нотификации и текстом нотификации.<br />
<br />
Далее добавим на сцену кнопку, которая будет передавать параметры объекту "notification" и переводить объект "notification" в состояние "set".<br />
<br />
[[Файл:Notification 02.jpg |upright=0.5 ]]<br />
<br />
Теперь при нажатии на кнопку в очередь будет поставлено извещение, которое покажет система через 5 минут.<br />
На устройстве это выглядит так:<br />
<br />
<div class="tleft" style="clear:none"> [[Файл:IMG 0043.PNG | мини |200пкс ]] </div><br />
<div class="tleft" style="clear:none"> [[Файл:IMG 0046.PNG | мини |200пкс ]] </div><br />
<br />
<br clear="all" /><br />
<br />
==Информация в логах==<br />
<br />
<pre><br />
I/GNotification GNotification::aviable() GNotification::aviable() - уведомления разрешены<br />
I/GNotification GNotification::state() state(ST_CLEAR) clear all notifications - очистилась<br />
вся очередь уведомлений<br />
I/GNotification GNotification::state() state(ST_SET) - уведомление поставлено в очередь<br />
I/GNotification GNotification::EraseNotification() EraseNotification erase notification title: - уведомление<br />
удалено из очереди<br />
</pre><br />
<br />
==Примечания==<br />
<br />
В обычном случае по нажатию на сообщение открывается приложение на экране котором были, или на изначальном экране в зависимости от настроек.<br />
У объекта [[options]] можно задать параметр '''notifScrID''' (значение параметра - id экрана). Если параметр задан, то при открытии приложения из уведомления откроется выбранный экран.<br />
<br />
==Firebase Cloud Messaging==<br />
<br />
Firebase Cloud Messaging позволяет рассылать кастомные уведомления с определенным набором доп. параметров, которые в последствии будут переданы во вьювер и сохранены в опциях (fcm бандлы).<br />
<br />
===Подготовка проекта===<br />
<br />
: 1. Создайте и настройте проект в Firebase консоли ([https://console.firebase.google.com/project/ Link])<br />
: 2. Скачайте из консоли файл конфигураций проекта google-services.json<br />
: 3. Перенесите параметры из ''google-services.json'' в ''project\conf\pom\sdl\google_params.json'' в поле ''extra_strings''<br />
google_app_id >> {YOUR_CLIENT}/client_info/mobilesdk_app_id<br />
gcm_defaultSenderId >> project_info/project_number<br />
default_web_client_id >> {YOUR_CLIENT}/oauth_client/client_id (client_type == 3)<br />
ga_trackingId >> {YOUR_CLIENT}/services/analytics-service/analytics_property/tracking_id<br />
firebase_database_url >> project_info/firebase_url<br />
google_api_key >> {YOUR_CLIENT}/api_key/current_key<br />
google_crash_reporting_api_key >> {YOUR_CLIENT}/api_key/current_key<br />
project_id >> project_info/project_id<br />
google_storage_bucket >> project_info/storage_bucket<br />
: 4. В app.icf сборки добавить раздел '''[Firebase]''', дабы при сборке подтянулся нужный экстеншн.<br />
<br />
===Структура сообщений===<br />
Сообщения firebase имеют два основных блока:<br />
* '''notification''' - стандартный пуш, содержит заголовок и текст сообщения;<br />
* '''data payload''' - содержит произвольный набор параметров ключ-зачение (с ограничением 4Кб в firebase и 50 штук в наших реалиях)<br />
<br />
Сообщение может содержать либо один из этих блоков, либо оба сразу.<br />
<br />
При наличии в сообщении блока '''notification''' оно автоматически трактуется системой как пуш и при получении такого на устройстве - сразу закидывает его в системный трей (т.е. без нашей обработки). Мы никак не властны над подобными сообщениями и их параметрами (с параметрами то отдельная тема), а значит никаких кастомизаций в виде цветного шрифта и/или картинки не будет.<br />
<br />
Если сообщение имеет только '''data payload''' - оно всецело обрабатывается нашим движком, а значит мы имеем полный контроль над его отображением и всеми его параметрами. '''Но''' такие сообщения невозможно отправить из firebase консоли (т.к. там всегда должен присутствовать текст пуша), только скриптом (либо из нашей одминки).<br />
<br />
Для корректной работы всегда нужно использовать только '''data payload''' со структурой:<br />
<br />
Тело пуша: # блок параметров, необходимых для отображения пуша<br />
"eventName" : "EVENT_TITLE", # заголовок сообщения, ОБЯЗАТЕЛЬНО для отображения пуша<br />
"eventMessage" : "EVENT_BODY", # текст сообщения, ОБЯЗАТЕЛЬНО для отображения пуша<br />
"eventType" : "1", # 0 - показать только заголовок и сообщение; 1 - показать красивое сообщение со всеми плюшками<br />
"eventPriority" : "2" # приоритет пуша [-2:2], по дефолту 2<br />
"eventTime" : "1541507205" # время запуска пуша в UTC секундах (если отсутствует или меньше текущего времени - сразу показать)<br />
"evetBigPicture" : "https://apps.absolutist.com/images/profile/no_avatar.png", # бекграунд пуша - НЕ имя ресурса, НЕ id ресурса, ТОЛЬКО ссылка<br />
"eventTitleColor" : "#FF0000FF", # ARGB цвет заголовка<br />
"eventTextColor" : "#FFFF0000", # ARGB цвет текста<br />
Тело данных<br />
"eventID" : "EVENT_ID", # id ивента, машинка-обработчик будет переведена в это состояние (это обязательное поле, если хотите как-то обработать пуш в приложении)<br />
Далее может быть произвольный набор параметров-значений, которые будут переданы в машинку-обработчик<br />
<br />
===Отправка и получение сообщения приложением===<br />
''(Далее речь идет только про data payload)''<br />
<br />
Отправлять сообщения пользователям можно несколькими способами:<br />
* всем пользователям (вообще всем)<br />
* избирательно по каким-либо критериям/параметрам пользователя: уровень, категория (платящий/неплатящий), язык, регион, возраст и т.п.<br />
* рассылка по топикам (для получения такой рассылки пользователь должен быть подписан на соответствующий топик)<br />
<br />
Приложение получает сообщения '''только''' если оно запущено или работает в фоне (т.е. мы его не убили в диспетчере задач / настройках).<br />
<br />
При получении приложением сообщения, если заполнено тело пуша (хотя бы параметры eventName и eventMessage), будет показано пуш-уведомление. Если при этом приложение работало в фоне - все дополнительные параметры будут переданы в приложение при его запуске. Если оно уже было запущено - все параметры немедленно будут обработаны.<br />
<br />
Все доп. параметры сообщения будут сохранены в опции в виде бандлов:<br />
<br />
[[Файл:Notification_bundle_struct.png]]<br />
<br />
===Топики: подписка и отписка===<br />
Дабы игрок мог получать сообщения по рассылке он должен подписаться на топик.<br />
Если нужно перестать получать сообщения по рассылке - отписаться.<br />
<br />
'''Подписка/отписка:'''<br />
* Записать объекту '''Notification''' в параметр '''topic''' имя топика, на который хотим подписаться/отписаться;<br />
* Вызвать объекту '''Notification''' состояние '''subscribe''' (для подписки) либо '''unsubscribe''' (для отписки)<br />
* Всё.<br />
<br />
'''Подписка на необходимые топики должна происходить в каждой сессии, т.к. она не сохраняется после закрытия приложения!'''<br />
<br />
===Обработка в редакторе===<br />
<br />
: 0. Определиться, какие евенты вы хотите обрабатывать (поле '''eventID''' в пуше) и с какими параметрами ('''эт важно!''')<br />
: 1. Создать объект '''Notifications''', т.к. вся коммуникация идет через него<br />
: 2. Создать машинку-обработчик и указать её в поле ''Обработчик бандлов (fcmBundleHandler)'' объекта '''Notifications'''<br />
: 3. Создать машинку, которая будет раз в определенный период дёргать '''Notifications''' в состояние '''fcm_check_bundle'''<br />
: 4. В состоянии ''fcm_check_bundle'' объект '''Notifications''' проверяет опции на наличие бандлов из firebase сообщений.<br />
: Если бандл имеется - '''Notifications''' переводит машинку ''fcmBundleHandler'' в состояние из параметра '''eventID''' бандла.<br />
: Все параметры бандла будут записаны в машинку ''fcmBundleHandler'' с приставкой "'''fcm_'''"<br />
Например имеем сообщение:<br />
"eventID" : "items_message",<br />
"customTitle" : "FCM RULES",<br />
"customText" : "SuperBananaDebugging 322"<br />
При ''fcm_check_bundle'' машинка-обработчик будет переведена в состояние ''custom_message'' и в неё будут добавлены 2 поля: ''fcm_customTitle'' (отмечено цифрой 1 на скриншоте) и ''fcm_customText'' (2) с соответствующими значениями.<br />
<br />
[[Файл:Firebase handler.jpg]]<br />
<br />
При начислении монет или предметов мы также указываем их количество (и txtID для предмета) (3)(4).<br />
Экономике в случае начисления ресурсов/монет передаем параметр res_source = 13, как у redeem_message.<br />
<br />
'''!ВАЖНО!'''<br />
После использования параметров их нужно вручную обнулить (очистить), дабы у вас же не возникало лишних проблем. (5)<br />
<br />
== Пример ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/notification.rar Notifications]<br />
<br />
[http://wiki.appsalutecreator.com/images/c/cb/FCM_Notifications_example.zip Firebase cloud messaging] - содержит проект и сприпт для отправки пушей в топик (без ключа приложения)<br />
<br />
[[Category:Options]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9802Advertisement2019-03-21T09:04:59Z<p>Agava: /* GDPR */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
Этот параметр позволит нам использовать персональные данные игроков при выдаче рекламы.<br />
<br />
'''Внимание''': для триггера команды '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe");<br />
<br />
* нет информации о согласии игрока (в таком случае в опциях не будет значения gdpr) или мы вручную сбросили его согласие в игре (установив значение ниже -10).<br />
<br />
Так как рекламный конфиг у нас приезжает неизвестно когда, мы не должны открывать окно через этот параметр. Вместо этого мы делаем небольшую машину, которая будет ставить флажок, сигнализируюющий о необходимости запросить у игрока его согласие на обработку персональных данных. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при вызове этого состояния обьект '''advertisement''' запишет в параметр в опциях '''gdpr''' значение из '''param''' , которое мы передаем в сам обьект advertisement. Для стран, где действует GDPR, таргетированная реклама показывается, если мы установили значение параметра в 1, и нетаргетированная, если это значение установлено в 0.<br />
<br />
Это состояние мы не вызываем без ведома игрока! Оно должно вызываться, когда игрок принимает или отклоняет запрос о сборе персональных данных. Этот запрос мы представляем ему в виде окна с двумя кнопками и без возможности его закрыть. Также после принятия или отказа от сбора, игрок может изменить свое решение, например, через checkbox в настройках игры.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
Если этот параметр есть в app.icf, то мы даем игре знать, что хотим собирать персональные данные игрока. Тогда будет работать добавляемый параметр '''нужен запрос gdpr'''.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1, AdMob - 0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9801Advertisement2019-03-21T09:03:05Z<p>Agava: /* Состояния */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
Этот параметр позволит нам использовать персональные данные игроков при выдаче рекламы.<br />
<br />
'''Внимание''': для триггера команды '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe");<br />
<br />
* нет информации о согласии игрока (в таком случае в опциях не будет значения gdpr) или мы вручную сбросили его согласие в игре (установив значение ниже -10).<br />
<br />
Так как рекламный конфиг у нас приезжает неизвестно когда, мы не должны открывать окно через этот параметр. Вместо этого мы делаем небольшую машину, которая будет ставить флажок, сигнализируюющий о необходимости запросить у игрока его согласие на обработку персональных данных. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при вызове этого состояния обьект '''advertisement''' запишет в параметр в опциях '''gdpr''' значение из '''param''' , которое мы передаем в сам обьект advertisement. Для стран, где действует GDPR, таргетированная реклама показывается, если мы установили значение параметра в 1, и нетаргетированная, если это значение установлено в 0.<br />
<br />
Это состояние мы не вызываем без ведома игрока! Оно должно вызываться, когда игрок принимает или отклоняет запрос о сборе персональных данных. Этот запрос мы представляем ему в виде окна с двумя кнопками и без возможности его закрыть. Также после принятия или отказа от сбора, игрок может изменить свое решение, например, через checkbox в настройках игры.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9800Advertisement2019-03-21T08:57:24Z<p>Agava: /* Добавляемые параметры */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
Этот параметр позволит нам использовать персональные данные игроков при выдаче рекламы.<br />
<br />
'''Внимание''': для триггера команды '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe");<br />
<br />
* нет информации о согласии игрока (в таком случае в опциях не будет значения gdpr) или мы вручную сбросили его согласие в игре (установив значение ниже -10).<br />
<br />
Так как рекламный конфиг у нас приезжает неизвестно когда, мы не должны открывать окно через этот параметр. Вместо этого мы делаем небольшую машину, которая будет ставить флажок, сигнализируюющий о необходимости запросить у игрока его согласие на обработку персональных данных. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9799Advertisement2019-03-21T08:51:38Z<p>Agava: /* Добавляемые параметры */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr''' [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85]<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr или его значение меньше -10)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9798Advertisement2019-03-21T08:51:22Z<p>Agava: /* Состояния */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr или его значение меньше -10)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr.<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9797Advertisement2019-03-21T08:19:20Z<p>Agava: /* GDPR */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr или его значение меньше -10)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85].<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект -1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9796Advertisement2019-03-21T08:19:11Z<p>Agava: /* GDPR */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr или его значение меньше -10)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85].<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=-1<br />
<br />
После этого обработчик '''"нужен запрос gdpr"''' сработает, если он установлен.<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9795Advertisement2019-03-21T08:17:27Z<p>Agava: /* Добавляемые параметры */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr или его значение меньше -10)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85].<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=1<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9794Advertisement2019-03-21T08:16:40Z<p>Agava: /* Состояния */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует gdpr [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85].<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=1<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9793Advertisement2019-03-21T08:16:24Z<p>Agava: /* Состояния */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
*'''startCache''' - запустить предварительное кеширование (для проектов с отложенным кешированием)<br />
<br />
*'''gdpr''' - при запуске этого состояния берем значение из параметра '''param''' обьекта '''advertisement''' и устанавливаем его в опциях. После применения этого состояния начнет или прекратит показываться таргет реклама в зонах, где действует [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D1%80%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85|gdpr].<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=1<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9792Advertisement2019-03-21T08:13:41Z<p>Agava: /* Добавляемые параметры */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr)<br />
<br />
В таком случае состояние указанной машины отработает, НО: '''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=1<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Advertisement&diff=9791Advertisement2019-03-21T08:13:31Z<p>Agava: /* Добавляемые параметры */</p>
<hr />
<div>[[Object|Объект]] '''Advertisement''' позволяет отображать рекламу разных типов. Объект должен находиться на экране, на котором необходимо показать рекламу, либо на глобальном экране. Данный объект предназначен для соблюдения условий запуска рекламы. Огромный плюс, что большинство настроек, могут задавать удалённо маркетологи.<br />
<br />
<br />
==Параметры==<br />
<br />
<br />
*'''синхронизация''' - не синхронизировать=0, синхронизировать=1;<br />
<br />
*'''сохранение параметров''' - нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3;<br />
<br />
*'''placement''' - Идентификатор места показа рекламы в игре.<br />
<br />
<br />
==Добавляемые параметры==<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
<br />
[[Файл:+.png]] '''реклама готова к показу: изменить свойство объекта'''<br />
<br />
*'''объект''' - Объект, свойство которого нужно изменить; '''!!! Объект должен находиться выше по дереву, чтобы успеть проинициализироваться до готовности рекламы !!!'''<br />
<br />
*'''свойство''' - Свойство, которое нужно изменить.<br />
<br />
*'''значение''' - Новое значение свойства.<br />
<br />
<br />
[[Файл:+.png]] '''реклама успешно показана: изменить состояние объекта'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
[[Файл:+.png]] '''нужен запрос gdpr'''<br />
<br />
*'''объект''' - Объект, состояние которого нужно изменить;<br />
<br />
*'''состояние''' - Новое состояние объекта.<br />
<br />
'''Внимание''': для триггера команда '''"нужен запрос gdpr"''' нужно, чтобы выли выполнены следующие условия:<br />
<br />
* Приехал рекламный конфиг из Европы (в логе "type":"Europe")<br />
<br />
* еще не дан ответ на запрос gdpr (в опциях не прописан gdpr)<br />
<br />
В таком случае состояние указанной машины отработает, НО: ''''рекламный конфиг приезжает еще до загрузки экрана''', поэтому открыть окно у вас не получится! Поэтому вместо этого мы делаем небольшую машину, в которой ставим флаг, который будет означать, что мы запросили gdpr. А уже в самой логике игры мы можем вызывать окно на согласие о сборе персональной информации тогда, когда нам нужно, опираясь на этот флаг.<br />
<br />
==Состояния==<br />
<br />
*'''show''' - показать рекламу.<br />
<br />
<br />
==Коды ошибок==<br />
<br />
*'''0''' - ''AD_ERROR_NONE = 0'' - все хорошо, ошибок нет;<br />
*'''1''' - ''AD_ERROR_SKIP = 1'' - показывать нечего (нет ни одного активного провайдера рекламы, нужно спрятать кнопки показа, пользовательские окна при этой ошибке показывать не нужно!!!);<br />
*'''2''' - ''AD_ERROR_INTERNET = 2'' - ошибка отсутствия интернета;<br />
*'''3''' - ''AD_ERROR_NOT_FOUND = 3'' - запрос на показ рекламы был отправлен, но реклама по данному запросу отсутствует;<br />
*'''4''' - ''AD_ERROR_CANCELED = 4'' - показ рекламы был отменен пользователем.<br />
*'''5''' - ''AD_ERROR_UNKNOWN = 5'' - неизвестная ошибка.<br />
<br />
Для обработки ошибок использовать [[Errormanager|ErrorManager]].<br />
<br />
==Симулятор==<br />
<br />
Для работы симулятора рекламы на редакторном вьювере необходимо добавить в app.icf параметры:<br />
<br />
[Game]<br />
bundle="%id_game"<br />
[Game]<br />
VersionMain=%m<br />
VersionGraphic=%g<br />
VersionLogic=%l<br />
<br />
где:<br />
%id_game - бандл игры, соответствующий файлу конфигурации рекламы,<br />
%m, %g, %l - номер версии игры, соответствующий файлу конфигурации рекламы.<br />
<br />
При вызове состояния ''show'' объекту на экране появится черный прямоугольник с названием placement'а вызванной рекламы. Esc симулирует закрытие рекламы и вызов ''ошибки 4'' (показ рекламы отменен пользователем). Enter симулирует закрытие рекламы и вызов обработчика ''реклама успешно показана''.<br />
<br />
<br />
[[Category:Options]]<br />
[[Category:Реклама]]<br />
<br />
==GDPR==<br />
<br />
Некоторые провайдеры требуют согласия на сбор и обработку персональных данных в европейских странах. Для корректной работы необходимо в app.icf добавить параметр:<br />
<br />
[Parameters]<br />
gdpr=1<br />
<br />
Значения, которые может принимать параметр: -1 - не известно, 0 - не согласен, 1 - согласен (Провайдер AppLovin воспринимает 0/1, Chartboost -1/0/1).<br />
Значение по-умолчанию, с которым собирать проект 1.</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=HiddenList&diff=9790HiddenList2019-02-22T08:53:49Z<p>Agava: /* Дополнительные параметры */</p>
<hr />
<div>{{TOC right}}<br />
HiddenList является менеджером поисковых [[Object|объектов]]. На сегодня HiddenList не просто управляет объектами на сцене - он отвечает за все штрафы и поощрения. В связке с такими объектами как [[HiddenHint]] + [[Effect]] HiddenList дает возможность реализовать систему подсказок, а также такие графические эффекты как: "ночь", "трансформация цвета" и т.д. с одним набором графики.<br />
<br />
==Общие параметры==<br />
(см. описание [[Object|Object]])<br />
<br />
[[Файл:HOList_1.jpg|right]]<br />
<br />
*'''имя''' ('' nm '') - Имя объекта HiddenList в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта HiddenList, который можно увидеть в строке "имя" либо при наведении курсора на неё.<br />
*'''синхронизация''' ('' sync '') - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' ('' sv '') - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' ('' z '') - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' ('' memo ''):<br />
:'''1''' - при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
:'''0''' - обновит свои параметры, при повторном открытии экрана.<br />
*'''группа''' ('' gr '') - Группа, в которую входит текущий объект.<br />
<br />
У листа также есть группы стандартных параметров такие как '''положение''', '''размер''', '''модификаторы'''. Но, по сути, они не важны. Главное, чтобы лист не перекрывал на сцене другие объекты. Поэтому ему лучше находиться за пределами сцены. <br />
<br />
==Основные параметры==<br />
<br />
*'''Картинка''' ('' res '') - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Обычно не используется, а применяется для отображения table;<br><br />
*'''Таблица''' ('' table '') - Объект типа [[table]], который является визуальным отображением списка. '''Должна быть обязательно''';<br><br />
*'''Подсказка''' ('' hint '') — объект типа [[HiddenHint]], который является менеджером хинтов;<br><br />
*'''highlighter''' ('' hl '') — объект типа [[HiddenHighLighter|hiddenhighlighter]], который подсвечивает не найденные объекты.;<br><br />
*'''Счетчик''' ('' hdncnt '') — объект типа [[Counter]], который отображает количество найденных объектов.<br><br />
В самом счетчике в параметрах нужно указать val = 0, поскольку изначально нет найденных объектов;<br />
*'''Таймер''' ('' timer '') — объект типа [[Timer]], который отображает время игры.<br />
При инициализации листа он передаст состояние "start" таймеру.<br />
*'''отладка''' ('' trace '') — Отображать в окне состояний текущий объект.<br />
<br />
<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''вычеркнуть''' ('' cross ''):<br />
:'''1''' - найденный объект вычеркивается, оставаясь в списке(таблице);<br />
:'''число''' - найденный объект удаляется из списка;<br />
*'''листать''' ('' scroll '')<br />
:'''1''' - список можно листать (скролировать);<br />
:'''число''' - ищутся только те объекты, которые видны в списке (таблице);<br />
*'''тип списка''' ('' kind '') - Тип поиска объектов:<br />
:'''1''' - слово;<br />
:'''2''' - предложение;<br />
:'''3''' - удаляемая пиктограмма;<br />
:'''4''' - пиктограмма;<br />
:'''5''' - поиск различий.<br />
*'''поиск пар''' ('' pair '') - Если 1, то идет поиска пар объектов с одинаковым типом, иначе обычный режим<br />
:'''пары''' - поиск пар;<br />
:'''одиночные''' - поиск по одному объекту.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''обычный''' ('' sndNrm '') - Звук при нахождении обычного [[HiddenObject]].<br />
*'''коллекционный''' ('' sndCol '') - Звук при нахождении коллекционного [[HiddenObject]](объекту должна быть установлена коллекция).<br />
<br />
<br />
<br />
'''Группа - параметры поиска'''<br />
<br />
*'''объектов''' ('' num '') - Максимальное количество доступных для поиска объектов в одной игровой сессии. (ВАЖНО!!! Таблице нужно установить общее количество ячеек равное(или больше) количеству доступных для поиска объектов).<br />
*'''активных объектов''' ('' numact '') - Максимальное количество активных объектов в одной игровой сессии.<br />
*'''видимых объектов''' ('' numvis'') - Максимальное количество видимых объектов в одной игровой сессии.<br />
*'''одного типа''' ('' max ''):<br />
:'''число''' - Максимальное количество объектов одного типа - поле тип в [[hiddenObject]] или хидден объекты с одинаковыми текстовыми ID могут считаться объектами одного типа;<br />
:'''-1''' - игнорируется.<br />
*'''прятать''' ('' hide '') - Делать невидимыми объекты, не участвующие в поиске.<br />
*'''оставлять''' ('' stay '') - Оставлять найденный объект на месте (вызывая только флаеры) при удачном клике.<br />
*'''актёр-иконка''' ('' actorIco '') - если "да", то во время полёта найденного хидден-объекта вместо него летит иконка которая помечена как "main picture" и указана в текстовом id хидден-объекта.<br><br />
*'''актер''' ('' actor '') - машина состояний, которая управляет процессом полета к таблице найденных [[HiddenObject]] .<br />
*'''z актера''' ('' actorZ '') - z актера. Будет применено только если не равен 0.<br />
*'''актер стартует из таблицы''' ('' actorTable '') - если настройка включена, то актер стартует не из позиции хиддена, а из ячейки таблицы .<br />
*'''целевой объект''' (''trg'') - Если задан, [[HiddenObject]] после нахождения летит не в ячейку таблицы, а к нему.<br />
<br />
<br />
<br />
'''Группа - скорость'''<br />
<br />
Отвечают за скорость перемещения найденного объекта.<br />
*'''полета''' ('' vf '') - Скорость полета в пикселях в секунду.<br />
*'''вращения''' ('' vr '') - Скорость вращения в градусах в секунду.<br />
<br />
<br />
<br />
'''Группа - равномерное распределение'''<br />
<br />
*'''включить''' ('' undist '') - Равномерно распределять объекты по площади сцены.<br />
*'''дополнительные сортировки''' ('' addit_algo '') - Использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами)<br />
<br />
'''Группа - итерационное распределение'''<br />
<br />
*'''включить''' ('' altern_algo '') - Использовать итерационный алгоритм поиска равномерного распределения объектов<br />
*'''учитывать сложности''' ('' process_diff '') - Учитывать сложности предметов при распределении<br />
*'''количество объектов''' ('' hiddens_num_threshold '') - Максимальное количество активных предметов на сцене для которых будут учитываться сложности (max = 24)<br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - Максимальное количество итераций фикса перекрытия объектов.<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - Максимальная допустимая площадь перекрытия в пикселях.<br />
*'''ключ распределения''' ('' distribution_seed '') - Ключ для случайного выбора заменяемого предмета (только для мультиплеера)<br />
*'''удалять перекрытия''' ('' del_after_fix '') - Удалять оставшиеся перекрытия после последней итерации фикса.<br />
<br />
Рекомендации по использованию:<br />
<br />
*Если включать "Удалять перекрытия", то нужно для счетчика кол-ва оставшихся хидденов считывать значение из "num".<br />
*Оптимальное значение максимальной площади - 1024 пикселей, т.е. допускаем перекрытие в 32 на 32 пикселя, что совсем не влияет на визуальное перекрытие объектов.<br />
*Количество итераций можем ставить 20-50. Если перекрытий не останется раньше, то фикс перекрытий остановится, если выполнится все количество - отобразится количество перекрытий в логах. Большое количество итераций фикса негативно сказывается на скорости загрузки сцены.<br />
<br />
Логи:<br />
<br />
<pre><br />
"Deleting a hidden object with textID: %i" - удаление объекта с текстовым ID<br />
"Overlapping detected! Area: %f px" - обнаружения перекрытия в столько-то пикселей<br />
"fixOverlapping() Iterations num: %i / %i; Overlaps num: %i" - итерации, итоговое количество перекрытий<br />
</pre><br />
<br />
==Дополнительные параметры==<br />
<br />
*'''скалирование объектов''' ('' scale_object '') - При нахождении во время полета объект будет скалироватся: <br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''пропадание объектов''' ('' alpha_object '') - При нахождении во время полета объект будет менять альфу:<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''реагировать на отпускание''' ('' touch_up '') - Объекты связанные с этим хидденлистом будут реагировать на отпускание, а не на нажатие:<br />
:'''0''' - отключено;<br />
:'''1''' - включено (То есть реагировать на четкий клик, если кликнули и сместили область клика объект не реагирует!).<br />
*'''реагировать на finger tap''' ('' finger_tap '') - Объекты, связанные с этим хидденлистом, будут реагировать на отпускание после ожидания даблтача.<br />
*'''задержка срабатывания''' ('' touch_delay '') - только для реакции на нажатие. Время между нажатием и реакцией списка объектов.<br />
*'''объединять одинаковые тексты''' ('' same_txt '') - Объекты с одинаковым текстом будут жить в одной ячейке таблицы с добавлением множителя xN.<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''множитель для иконок''' ('' ico_res '') - Графический ресурс(анимация) для отображения множителя у иконок для типа списка 4(поиск по иконкам) и включенного объединения одинаковых текстов. Первый фрейм - х2, второй - х3 и т.д.<br />
*'''исключать одинаковые тексты''' ('' unTxtID '') - исключает или не исключает из поиска объекты с одинаковыми txtID, используется совместно с '''одного типа'''.<br />
*'''показывать один объект игр''' ('' unTxtRep '') - Количество игр, в течении которых будет выбран один объект из данного набора. 0 - не использовать механизм<br />
*'''силуэты после слов''' ('' picsAfterWords '') - Стараться в силуэтах использовать то, что находилось в словах<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один<br />
*'''находить много одним кликом''' ('' canFoundMultiple '') - 1 - если тап попал на несколько объектов, то найдем все. 0 - только один<br />
*'''вероятность пассивного предпочитаемого объекта''' ('' prefProb '') - вероятность выпадения пассивного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''вероятность активного предпочитаемого объекта''' ('' prefProbAct '') - вероятность выпадения активного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''реагировать на невидимые''' ('' canInvis '') - реагировать или нет на объекты, которые в момент игры не видны в таблице. (Кликаются только те [[hiddenObject]] которые отображены в таблице, остальные нет!).<br />
<br />
<br />
'''Группа - равномерное распределение''' - в настоящее время не рекомендуется включать параметры из этой группы. Логика устарела и может конфликтовать со следующей группой итерационного распределения. Эта группа оставлена для возможной доработки в будущем. <br />
*'''включить''' ('' undist '') - равномерно распределять объекты по площади сцены. Да/нет. <br />
*'''дополнительные сортировки''' (''addit_algo'') - использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами). Да/нет. <br />
<br />
<br />
'''Группа - итерационное распределение''' - на данный момент лучший алгоритм равномерного распределения.<br />
*'''включить''' ('' altern_algo '') - использовать итерационный алгоритм поиска равномерного распределения объектов. Да/нет. <br />
*'''учитывать сложности''' ('' process_diff '') - учитывать сложности объектов при распределении. Подробнее о сложностях в описании соответствующего параметра в [[hiddenObject]]. Да/нет. <br />
*'''количество объектов''' ('' hiddens_num_threshold '') - максимальное количество активных предметов на сцене, для которых будут учитываться сложности. <br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - максимальное количество итераций фикса перекрытия объектов. По умолчанию 50, min="0" max="100".<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - максимальная допустимая площадь перекрытия в пикселях. По умолчанию 1024, min="0" max="2048". <br />
*'''ключ распределения''' ('' distribution_seed '') - ключ для случайного выбора заменяемого предмета (только для мультиплеера). min="0" max="32768".<br />
*'''удалять перекрытия''' ('' del_after_fix '') - удалять оставшиеся перекрытия после последней итерации фикса. Количество объектов получать из num, нет=0, да=1. <br />
<br />
<br />
*'''прятать актеров при старте''' ('' hideact '') - Устанавливать актерам видимость false при старте (по умолчанию - да)(То есть всем актерам которые находятся на сцене при запуске принудительно установиться vis = 0).<br />
*'''аномалия''' ('' anom '') - для всех аномалий кроме текстовой [[HiddenObject]] и игровой фон должны быть подобъектами [[Effect]]):<br />
:'''0''' - нет;<br />
:'''1''' - текстовая;<br />
:'''2''' - ночь; В машине которая выставляет эффект ночь, должны передавать сцене с объектом аномалия ( obj="scene"; par="drag"; val="0" ) и ( obj="scene"; st="update");<br />
:'''3''' - трансформация цвета;<br />
:'''4''' - дым.<br />
При применении аномалии "блитц" через объект [[Economics]] набор параметров: anom="0", is_blitz="1".<br />
*'''флурри''' ('' flurry '') - Нужно ли отправлять статистику флурри "regexp=":<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''вероятность инверсии''' ('' invProb '') - Вероятность того, что сцена будет перевернута по x;<br />
*'''набор''' ('' kit '') - Набор, из которого берутся объекты.<br />
*'''поведение дифференсов''' (''difbeh'') - Поведение найденных объектов в режиме поиск отличий.<br />
*'''сортировать по приоритету''' (''priorsort'') - Сортировать итоговый список по полю приоритет объекта. Высокий приоритет - сначала.<br />
*'''не давать ходить игроку''' (''botonly'') - Если включена - то хидден будет работать, но не будет принимать клики от игрока.<br />
*'''предметов по заданию не более''' (''taskless'') - Предметов по заданию не более заданного числа. -1 - без ограничений<br />
*'''неактивные улики как фон''' (''cluesbg'') - Если включена, то в хидденах связанные предметы, для которых есть неактивные таски, будут видны на фоне.<br />
<br />
<br />
'''Группа - появление новых объектов'''<br />
<br />
*'''время''' ('' acttm '') - Время появления объекта (мс);<br />
*'''начальный скейл''' ('' actsc '') - Начальный скейл;<br />
*'''начальная альфа''' ('' actal '') - Начальная альфа.<br />
<br />
<br />
<br />
'''Группа - сессии'''<br />
<br />
*'''сессионность''' ('' ses ''):<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''ограничение сессий''' ('' sesLim '') - Максимальное количество сессий, в которые можно играть.<br />
*'''набор объектов''' ('' sesSet '') - Набор объектов при заходе в хидден после последней сессии:<br />
:'''0''' - случайный;<br />
:'''1''' - последний фон;<br />
:'''2''' - пустой.<br />
<br />
<br />
<br />
'''Группа - цвета'''<br />
<br />
*'''Цвет обязательных''' ('' c_forced '') — цвет текста для обязательных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Цвет найденных''' ('' c_found '') — цвет текста для найденных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Время перехода''' ('' c_time '') - Время изменения цвета.<br />
<br />
<br />
<br />
'''Группа - время'''<br />
<br />
*'''игры''' ('' tmGm '') - Общее время игры. Если оно истекает, идет переход на экран [время вышло] (см.ниже):<br />
:'''-1''' - игнорируется;<br />
:'''число''' - время игры.<br />
*'''прерывать''' ('' tmInt ''):<br />
:'''1''' - по окончанию времени игра будет прервана;<br />
:'''0''' - по окончанию времени игра продолжится, но переход все равно будет на неудачную ветку.<br />
*'''паузы''' ('' tmWt '') - Время перед закрытием окна после разбора (для осмысления результата);<br />
*'''полета актера''' ('' tmActor '') - Время работы актера, после которого обрабатываются ячейки таблицы;<br />
*'''перед исчезновением''' ('' tmWtHide '') - Время, в течение которого объект остается видимым после обработки.<br />
*'''жизни актера''' ('' tmActorLife '') - Время жизни клона актера, после которого он будет удален меньше либо рано 0 - не удалять по времени<br />
<br />
<br />
<br />
'''Группа - ошибки'''<br />
<br />
*'''flyer при ошибке''' ('' fl '') - обычно объект типа flyer (летуны которых надо показать в точке клика, если этот клик ошибочный). Можно в принципе любой объект который обладает состоянием "beg". Ошибочный клик - все клики мимо [[hiddenObject]].<br />
*'''вычет времени при ошибке''' ('' tmPen '') - Сколько отнять миллисекунд за ошибочный клик.<br />
<br />
<br />
<br />
'''Группа - переход'''<br />
<br />
*'''при разборе''' ('' scrOk '') - Экран на который надо перейти, если все объекты найдены.<br />
*'''время вышло''' ('' scrOv '') - Экран на который надо перейти если время вышло, а не все объекты найдены.<br />
<br />
<br />
<br />
'''Группа - система очков'''<br />
<br />
*'''Счетчик''' ('' score_counter '') — счетчик, отображающий набранные очки.<br />
*'''счетчик (test)''' ('' score_counter_test '') — счетчик, отображающий набранные очки.<br />
*'''ID пака''' ('' pack_id '') — строковый идентификатор пака(для записи набранных очков в [[options]] должен быть заполнен); используется для вытаскивания суммарных очков в счетчики и дальнейшего их отображения.<br />
*'''ID игры''' ('' game_id '') — строковый идентификатор игры (сцены).<br />
'''Обязательно должен иметь префикс ID пака. Например, если pack_id = "pack1", то game_id = "pack1.game1"'''.<br />
*'''мультипликатор очков''' ('' scoreM '') — Мультипликатор очков за объект, если все собрано за отведенное время.<br />
*'''Очки''' ('' score '') — количество очков, которые даются за каждый найденный [[hiddenObject]].<br />
*'''Бонус за скорость''' ('' bonusS '') — бонус за быстро найденный [[hiddenObject]].<br />
*'''Бонусный интервал''' ('' bonusT '') — время, за которое нужно найти [[hiddenObject]] для получения бонуса.<br />
*'''бонус за время''' ('' bonusTime '') - бонус за оставшееся время игры = коэффициент который введем * оставшееся время таймера.<br />
*'''Бонусный мультипликатор''' ('' grow ''):<br />
:'''1''' - умножать очки за второй быстро найденный предмет на 2, за третий на 3, и т. д.<br />
:'''0''' - не умножать.<br />
*'''Количество кликов для штрафа''' ('' wrngC '') — количество неверных кликов, после которых запустится блокатор (см. ниже).<br />
*'''Интервал для штрафа''' ('' wrngT '') — время, за которое нужно совершить неверные клики.<br />
*'''Штраф (очки)''' ('' delS '') — Сколько отнимаем очков за ошибочный клик.<br />
*'''Штраф (время)''' ('' delT '') — Сколько отнимаем времени за ошибочный клик.<br />
*'''блокатор''' ('' blockImg '') - Объект, блокирующий сцену при серии ошибочных кликов. (Обычно маска растянутая на весь экран. '''ДОЛЖНА иметь состояние "beg"''').<br />
*'''время блокировки''' ('' blockTime '') - Время блокировки при серии ошибочных кликов по истечении переводит "блокатор" в состояние '''end'''.<br />
*'''порог touch move''' ('' mvSens '') - Порог, начиная с которого движение пальца воспринимается как мув и сбрасываются неправильные клики.<br />
*'''touch move как штраф''' ('' tchMvPen '') - Считать ли touch move за ложное попадание:<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''клик на найденный как штраф''' ('' clkFndPen '') - Считать ли клик на найденный объект за ложное попадание(актуально если объекты остаются на сцене).<br />
*'''аниматор очков''' ('' scoreAnim '') - машина, которая анимирует полученные очки, должна иметь состояние '''anim'''.<br />
*'''коэффициент комбо''' ('' cmbCoef '') - коэффициент для расчёта комбо очков по формуле s(n) = k * n * (n + 1).<br />
*'''счётчик очков за объект''' ('' objScCnt '') - счётчик который показывает очки за последний полученный объект (учитывая бонусы).<br />
*'''счётчик комбо-очков''' ('' cmbScCnt '') - счётчик очков полученных за комбо-серию.<br />
*'''счётчик комбо-серий''' ('' cmbRwCnt '') - счётчик который показывает комбо-серию (комбо из 2-х, 3-х и т.д. найденных объектов).<br />
*'''комбо2 прогресс''' ('' cmb2Pr '') - комбо2 прогресс;<br />
*'''комбо2 время''' ('' cmb2Tm '') - комбо2 время;<br />
*'''комбо2 кол-во''' ('' cmb2Num '') - комбо2 кол-во.<br />
*'''очки 3.0''' (''score30'') - Использовать систему очков, придуманную Степановым в августе 2015.<br />
*'''очки 3.0 коэф. комбо''' (''score30lc'') - в конце комбо даем за него очков n * s * l * (n-1) - где n число предметов в комбо, s - очки за один предмет, l - этот коэффициент<br />
*'''очки 3.0 коэф. аккуратности''' (''score30la'') - в конце игры начисляем очки за точность по формуле s * la / (1 + Nmiss / N)<br />
*'''очки 3.0 коэф. времени 1 (l)''' (''score30lt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки 3.0 коэф. времени 2 (t)''' (''score30tt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки детектив макс. комбо''' (''scoreDetMaxCombo'') - максимальное значение комбо для очков по системе детектива, используется при состоянии хидден-листа max_combo. Если в настройках хидден-листа очковая система "очки 3.0", то scoreDetMaxCombo должно быть равно <property name="комбо2 кол-во" id="cmb2Num" hint="комбо2 кол-во" type="int" label="комбо2 кол-во" value="1"/> +1. То есть, на 1 больше, чем значение комбо2 кол-во ('' cmb2Num '').<br />
*'''держать max_combo до тапа''' (''keepMaxCombo'') - Будет ли максимальное значение комбо после вызова max_combo храниться до тапа (да) или уменьшаться сразу (нет). Флаг используется только для состояния max_combo, обычный хидден останется прежним. Флаг обеспечит max_combo до первого тапа. То есть, чтобы комбо убывало по времени, но после первого тапа.<br />
<br />
<br />
'''Группа - звезды'''<br />
<br />
*'''combo num''' ('' comboNum '') - Количество быстро найденных объектов, нужное для получения звезды Combo.<br />
*'''combo time''' ('' comboInt '') - Интервал между кликами, считающимися быстрыми для Combo.<br />
*'''accuracy''' ('' accuracy '') - Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные).<br />
*'''лимит ложных кликов''' ('' starWrAcc '') - Лимит ложных кликов.<br />
Формула расчета проста, количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
'''Группа - новейшая адаптивность'''<br />
<br />
*'''включить''' ('' newAdOn '') - включить или выключить новый алгоритм адаптивности.<br />
*'''default T''' ('' newAdDefault '') - изначальное время, выданное игроку на нахождение одного хиддена. Указывается в миллисекундах.<br />
*'''относительное отклонение''' ('' newAdTimes '') - массив коэффициэнтов, применяемых к изначальному времени. Коэффициенты указываются в float и перечисляются через запятую.<br />
Первое число в массиве отвечает за переход на 0 сложностей, следующее на 1, на 2 и так далее. Более детальный алгоритм описан здесь: http://jira1:8090/pages/viewpage.action?pageId=18677822.<br />
<br />
==Параметры бота и мультиплеера==<br />
<br />
'''Группа - Хидден бот'''<br />
<br />
*'''тип бота''' - тип бота:<br />
:'''нет''' - обычная одиночная игра, бот выключен;<br />
:'''на одном поле''' - игра с ботом на одном поле, у обоих одинаковый список предметов;<br />
:'''с маленьким полем''' - бот будет играть на отдельном поле (??????);<br />
:'''горячий стул''' - hotsit, игра двух живых игроков на одном девайсе, передача хода по очереди;<br />
:'''мультиплеер''' - игра через сервер с живым оппонентом;<br />
*'''файл уровня''' - xml файл с настройками сложности бота ([[HiddenList#Настройка сложности бота|пример]]);<br />
*'''номер уровня''' - номер уровня в файле (начиная с 0);<br />
*'''номер уровня max''' - если задан больше предыдущего номера - выбирается рандомное значение;<br />
*'''multiplayer''' - объект мультиплеера;<br />
*'''кнопка хинта''' - кнопка хинта для 2го игрока \ бота;<br />
*'''проверять интернет''' - проверять интернет при игре с ботом (так же, как при игре с живым игроком);<br />
*'''первый ход (вероятность)''' - вероятность первого хода игрока при игре с ботом (в процентах);<br />
*'''t min abs ms''' - самая минимальная задержка между ходами бота;<br />
*'''t1 min ms''' - минимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 max ms''' - максимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 prob %''' - вероятность быстрого нахождения предмета ботом;<br />
*'''t2 min ms''' - минимальное время для нахождения предмета ботом;<br />
*'''t2 max ms''' - максимальное время для нахождения предмета ботом;<br />
*'''t coef delta''' - коэффициент сложности (кажется от -1 до 1, могу ошибаться);<br />
*'''t wrong min ms''' - минимальное время между ложными кликами (мимо объекта) бота;<br />
*'''t wrong max ms''' - максимальное время между ложными кликами бота;<br />
*'''bot hint chance (percent)''' - шанс бота использовать хинт (в процентах);<br />
*'''bot hint num''' - максимальное кол-во использования хинтов ботом на игру;<br />
*'''доп. поле x''' - координаты доп. поля по Х;<br />
*'''доп. поле y''' - координаты доп. поля по Y;<br />
*'''доп. поле sx''' - масштаб доп. поля;<br />
*'''доп. поле sy''' - масштаб доп. поля;<br />
*'''указатель хода''' - указатель хода бота\оппонента. Должен иметь состояние ''beg'' и находитсья в сцене с хидденами;<br />
*'''родитель''' - родитель, в который поместим клонированную сцену (доп. поле);<br />
*'''счетчик очков бота''' - счетчик, выводящий очки;<br />
*'''счетчик без бонусов бота''' - счетчик, выводящий очки без бонусов за время и точность;<br />
*'''комбо2 прогресс бота''' - комбо2 прогресс;<br />
*'''аниматор очков бота''' - машина, которая при нахождении хиддена анимирует полученные очки;<br />
*'''счетчик очков за объект бот''' - счетчик, выводящий очки за объект;<br />
*'''счетчик комбо-серий (макс) бот''' - счетчик, выводящий макс. количество комбо-серий;<br />
*'''счетчик комбо-серий (тек) бот''' - счетчик, выводящий текущее количество комбо-серий;<br />
*'''flyer при ошибке''' - объект типа ''flyer'' который надо показать в точке клика, если этот клик ошибочный;<br />
*'''таймер хода бота''' - таймер хода бота;<br />
*'''таймер хода игрока''' - таймер хода игрока;<br />
*'''длительность хода ms''' - длительность хода игрока \ бота. Если задан 0 - игроки ходят одновременно;<br />
*'''длительность паузы между ходами ms''' - длительность паузы при смене хода игрока\бота.<br />
<br />
=== Настройка сложности бота ===<br />
<br />
Файл уровней для хидден-бота должен иметь такую структуру:<br />
<bots><br />
<obj id="0"><br />
<bot weight="3" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="21000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
<obj id="1"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="10000" t2max="25000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="7000" twrongmax="10000" /><br />
</obj><br />
<obj id="2"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="7000" t2max="21000" twrongmax="10000" /><br />
<bot weight="2" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
</bots><br />
<br />
*bots - основной таг<br />
*obj > id - номер уровня<br />
*bot - содержит те же параметры, что и настройки бота в хидден листе<br />
<br />
==Режим "блиц" с бесконечными объектами==<br />
<br />
'''Правила аномалии "блиц"''':<br />
<br />
*Блиц заканчивается победой, если игрок нашел хотя бы один предмет за отведенное время игры блиц.<br />
*Если время вышло, но не было найдено ни одного предмета, то засчитывается поражение.<br />
*В аномалии блиц количество возможных предметов ограничивается максимальным количеством уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num). А количество видимых предметов ограничивается количеством предметов, заданных на уровне мастерства локации. При постепенном разборе предметов добавляются новые пока не будет разобрано максимальное количество предметов на хидден сцене, либо, пока не закончится время, но одновременно видно предметов не больше, чем заданных на конкретном уровне мастерства локации.<br />
<br />
Для включения такого режима блиц используем поле в настройках хидден-листа:<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один. (да - использовать режим, нет - не использовать).<br />
<br />
Если в этом поле настройка "нет", то режим блиц работает по-старому: объектов столько, сколько указано в уровне мастерства.<br />
<br />
Прочитать, находится ли хидден в режиме блиц можно из поля "is_blitz" хидден листа (возможные значения - 0 или 1). Заполняется экономикой в момент старта локации.<br />
<br />
Для отображения в счетчике максимального количества уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num) вычитывать измененный num можно ТОЛЬКО ПОСЛЕ прихода start hiddenlist, т.е. не в ините.<br />
<br />
В экономике указываем блиц, как отдельную аномалию.<br />
<br />
==Состояния==<br />
<br />
Состояния которые есть у листа. Мы можем передавать их с помощью различных объектов:<br />
<br />
*'''init''' - инициализация хидден-листа;<br />
*'''invert''' - горизонтально отображает изображение;<br />
*'''run''' - переводит хидден в состояние активности, если до этого был на паузе;<br />
*'''pause''' - переводит хидден в состояние паузы, объекты не кликаются, таймер не идет;<br />
*'''pause_timer''' - объекты кликаются, но таймер не идет;<br />
*'''resume_timer''' - продолжить работу таймера, который был остановлен в состоянии ''pause_timer'';<br />
*'''add_time''' - добавить игрового времени (перед этим надо передать в param количество времени в ms)<br />
*'''swap_hiddens''' - меняет отображаемые в таблице поисковые объекты на случайные другие.<br />
*'''get_visible_ho''' - вернуть id активного HO объекта (объект пишет в себя два параметра - '''randomHO_id''' и '''randomHO_vis''' (id объекта и виден ли он сейчас юзеру)); Приоритет выбора HO объекта: с начала видимые юзеру, если таких нет - выводим невидимый на текущий момент HO (до предмета нужно фокусировать сцену);<br />
*'''max_combo''' - хидден начинается с максимальным значением комбо;<br />
*'''putback''' - вернуть случайный уже найденный обьект на экран и в список;<br />
*'''restart_no_anomaly''' - перезапустить хидден без аномалии;<br />
*'''finish''' - принудительно завершить игру.<br />
<br />
==Примечания==<br />
<br />
*HiddenList должен располагаться в дереве проекта ниже всех своих поисковых объектов.<br />
<br />
*Единственный '''обязательный объект''' о котором должен знать лист это [[Table]] для отображения списка поиска, даже если таблица не будет использоваться быть все равно должна!<br />
<br />
*После завершения хидден-игры (по разбору или по времени)при переходе на другой экран HiddenList записывает данные в опции в два места: первое - это то, которое указано у настройках (ID пака, ID уровня, тип списка), для каждой локации свое; а второе - это last_game. <br><br />
Например, <br><br />
'''last_game.time_spent''' (либо же '''pck_N.lvl_N.kind_N.time_spent''') - время последней игры, <br> <br />
'''last_game.clicks''' (либо же '''pck_N.lvl_N.kind_N.clicks''') - количество найденных объектов и т.д. <br><br />
Все их можно увидеть в опциях. last_game был придуман для того, чтобы было удобно задавать счетчики в окне результатов. Также эти данные могут быть сохранены в опциях, если задать листу состояние '''wait'''.<br />
<br />
*Для проверки кликабельности хидденобъектов можно воспользоваться следующими настройками в app.icf:<br />
<br />
<pre><br />
[GHiddenList]<br />
HitTest=0<br />
HitTestDx=1 - шаг по х<br />
HitTestDy=1 - шаг по y<br />
</pre><br />
<br />
в результате после перехода на сцену с хидденом появится файл, в котором будет казан объекты и координаты в которых они не тапаются.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''появляется новый объект: изменить состояние объекта''' ('' actst ''):<br />
:'''объект''' ('' obj '') - Объект, состояние которого нужно изменить;<br />
:'''состояние''' ('' st '') - Новое состояние объекта.<br />
<br />
[[Файл:HOList_3.jpg|right]]<br />
<br />
[[Файл:+.png]] '''разбор: если был экран''' ('' wscrOk '') - При нахождении всех объектов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''разбор: изменить состояние объекта''' ('' nstOk '') - При нахождении всех объектов, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''разбор: изменить параметр объекта''' ('' chgOk '') - При нахождении всех объектов, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '') - Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''нет предметов (при создании из динамического конфига)''' ('' nstNoObjects '') - при загрузке локации без хидден-объектов (например не подтянулся пак либо нет локализации) перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: если был экран''' ('' wscrOv '') - Если вышло время, а объекты не найдены, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''не успел: изменить состояние объекта''' ('' nstOv '') - Если вышло время, а объекты не найдены, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: изменить параметр объекта''' ('' chgOv '') - Если вышло время, а объекты не найдены, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '')- Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''счетчик очков''' ('' scoreCnt ''):<br />
:'''счетчик''' ('' cnt '') - Каунтер, которому приходят очки.<br />
<br />
[[Файл:+.png]] '''группа extra bonus''' ('' extraBonus ''). Используется для economics, при нахождении объекта с некой вероятностью может выпасть бонус. Объект который анимирует появление бонуса должен иметь состояние show, время на анимацию бонуса - 10 секунд:<br />
:'''монетки объект''' ('' coinsObj '') - объект который анимирует получение монет;<br />
:'''монетки вероятность''' ('' coinsProb '') - вероятность по нахождению объекта получить дополнительно монетки;<br />
:'''опыт объект''' ('' expObj '') - объект который анимирует получение опыта;<br />
:'''опыт вероятность''' ('' expProb '') - вероятность по нахождению объекта получить дополнительно опыт;<br />
:'''энергия объект''' ('' energyObj '') - объект который анимирует получение энергии;<br />
:'''энергия вероятность''' ('' energyProb '') - вероятность по нахождению объекта получить дополнительно энергию.<br />
<br />
[[Файл:+.png]] '''Объект, который срабатывает, если долго не находить хидден''' ('' notfnd ''):<br />
:'''объект''' ('' obj '') - Объект, который переводится в указанное состояние, если долго не находить хидден;<br />
:'''состояние''' ('' st '') - Состояние, в которое переводится объект;<br />
:'''время''' ('' tm '') - Время от последнего нахождения хиддена, после которого срабатывает объект.<br />
<br />
[[Файл:+.png]] '''параметры аномалии с исчезновением букв''' ('' hlPars ''):<br />
:'''оставшиеся буквы''' ('' min '') - Минимальное количество оставшихся букв в предложении;<br />
:'''задержка''' ('' wait '') - Момент времени, начиная с которого аномалия будет проявляться;<br />
:'''задержка 2''' ('' wait2 '') - Задержка для появившихся слов, изначально недоступных;<br />
:'''время''' ('' time '') - Время, за которое должны исчезнуть все буквы (если -1, то до конца времени в хиддене);<br />
:'''промежутки''' ('' dt '') - промежутки времени между каждой итерацией;<br />
:'''флайер''' ('' fl '') - Флайер, анимирующий исчезающую букву (должен иметь '''текстовый''' тип).<br />
<br />
[[Файл:+.png]] '''параметры аномалии ночь''' ('' nightPars ''): <br />
:'''effect''' ('' ef '') - эффект, управляющий трансформацией цвета;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего ночь.<br />
<br />
[[Файл:+.png]] '''параметры аномалии трансформации цвета''' ('' colInvPars ''):<br />
:'''effect''' ('' ef '') - Эффект, управляющий трансформацией цвета;<br />
:'''tags''' ('' eftags '') - Теги эффектов, реализующих трансформацию цвета, из которых будет выбран один.<br />
<br />
[[Файл:+.png]] '''параметры аномалии дым''' ('' smokePars ''): <br />
:'''effect''' ('' ef '') - Машина, управляющая эффектом дыма;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего дым.<br />
<br />
Все аномалии кроме текстовой должны быть настроены с помощью объекта [[Effect]]<br />
<br />
== Get Started==<br />
Минимальный набор ресурсов:<br />
* Фоновая картинка для поисковой сцены<br />
* Комплект картинок, с которых будут сделаны поисковые [[HiddenObject|объекты]]<br />
* Текстовые объекты для идентификации спрятанных объектов<br />
<br />
Минимальный набор объектов редактора:<br />
* [[Image]] который будет изменен в хидден-лист<br />
* [[Table|Таблица]] в которой будут отображаться тексты/картинки (зависит от режима) спрятанных объектов.<br />
* По одному [[Image]] для каждого спрятанного объекта (будут созданы автоматически при добавлении картинок из базы ресурсов на сцену)<br />
<br />
Наши действия:<br />
# откроем [[Интерфейс_ScenceEditor|редактор сцен]] и создадим новый проект,<br />
# добавим новый экран с именем ''scrHList''<br />
# создадим в этом экране сцену ''stgHList''<br />
# перейдём в [[Интерфейс_ResourceEditor|редактор ресурсов]]<br />
## создаём папку ''HList''<br />
## добавим в ней картинку для фона и картинки для спрятанных объектов.<br />
## выделим все картинки в дереве ресурсов и перенесем их на нашу сцену ''stgHList'', при этом для каждой картинки автоматически создастся объект [[Image]].<br />
## закроем редактор ресурсов<br />
# перейдём в [[Интерфейс_TextEditor|редактор текстов]]<br />
## создаём папку ''HListText''<br />
## добавим в нее текстовые объекты, по одному на каждый поисковый объект.<br />
## сохраним внесенные изменения.<br />
# перейдём в редактор сцен.<br />
# создадим в сцене stgHList объект [[Table]] и назовем его HOT<br />
## настроим размер и положение таблицы, согласно нашего дизайна<br />
## установим параметры колонок = "50", колонок видно = "5", строчек = "5", строчек видно = "1" (таким образом в таблице будут отображаться 5 поисковых предметов, а максимальное количество объектов для поиска будет равно 250)<br />
## установим параметры скорость листания = "650", добавлять по строкам = "0", центрировать = "растянуть", сдвигать ячейки при удалении ="да"<br />
# создадим в сцене stgHList объект '''HiddenList''', напоминаем что его размер и положение на сцене не имеют значения, по этому расположим его где-нибудь за границей экрана. <br>'''Важно''' В дереве проекта хидден-лист должен быть ниже всех своих поисковых объектов.<br />
## в поле таблица указываем нашу HOT<br />
## установим параметр объектов = "10"<br />
## установим параметр пропадание объектов = "да"<br />
## установим параметр реагировать на отпускание = "да"<br />
## установим параметр реагировать на невидимые = "нет"<br />
## установим параметр набор = "1"<br />
# Настроим объекты, которые будут прятаться. Для этого выделим картинки поисковых объектов, добавленные нами ранее, и изменим им тип на "hiddenObject". Оставляя группу этих объектов выделенной, настроим им параметры:<br />
## в поле list укажем наш HiddenList<br />
## параметр набор = "1"<br />
## Теперь снимаем выделение и каждому объекту в поле текстID перетаскиваем мышкой соответствующий текстовый объект из текстовой базы (поле текстID должно быть активно для редактирования - по нему нужно кликнуть мышкой)<br />
# сохраним проект<br />
# запустим [[Интерфейс_Viewer|вьювер]]<br />
<br />
== Динамический HG==<br />
Функционал позволяет генерировать HL самостоятельно HO объекты из файла конфига. <br />
<br />
П.С. - вся графика д.б. динамической. Данные файлы может создавать HO_Manager [http://wiki/index.php/HO_Manager Wiki HO_manager] <br />
[https://docs.google.com/document/d/13UUOKf_iJNzFx0PjU4JQIfYDX7NhK7dyfJAR3I-SWlQ/edit#heading=h.4pd8h5jdvqj4 Документ по динамических пакам]<br />
<br />
[[Файл:D485ecbbbb.jpg|right]]<br />
*'''файл уровня''' ('' configFile'') — указываем путь к файлу конфигу, где перечисляем файлы с HG. <br />
*'''список графических ресурсов''' — служебное, пока не используется;<br />
*'''список текстовых ресурсов''' — служебное, пока не используется;<br />
*'''номер уровня''' ('' hiddenLevelNum '') — номер уровня из файла;<br />
*'''образец хиддена''' ('' hiddenTemplate '') — obj_id HO объект, должен иметь нужные параметры (остальные возьмутся из конфига) ;<br />
*'''образец нашлёпки''' ('' hiddenPatchTempl '') — obj_id нашлёпки на HO объект, должна иметь нужные параметры (остальные возьмутся из конфига);<br />
*'''корневой объект''' ('' hiddenRoot '') — obj_id корневого объект в который сложим всех клонов;<br />
*'''точечный спецэффект''' ('' hiddenEffect '') — ;<br />
*'''фоновый объект ''' ('' hiddenBG '') — obj_id объекта которому поменяем ресурс;<br />
<br />
Требования, вся графика HO,BG отрисовывается без учёта пивоты;<br />
<br />
Файлы конфиги имеют вид:<br />
Файл уровня имеет вид:<br />
{<br />
"levels": [<br />
{<br />
"file": "ViewerFiles/DynHid/hidden0.cfg",<br />
"pack":3<br />
}<br />
]<br />
}<br />
<br />
:Где "levels" - линки на файлы уровней. <br />
:::"file" - путь к файлу;<br />
:::"pack" - пак в который попадут ресурсы;<br />
<br />
<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
"bg": {<br />
"src": "bg.png",<br />
"w": 2048,<br />
"h": 1151,<br />
"id": 16,<br />
"color": "#ffffff",<br />
"tile": ""<br />
},<br />
"hiddens": [<br />
{<br />
"id": 1022,<br />
"nm": "bucket_01",<br />
"res": 129,<br />
"bg": 666,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
},<br />
"objs": [{<br />
"res": 1488,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
}<br />
}],<br />
}, <br />
{<br />
"x": 1537,<br />
"y": 409,<br />
"id": 1023,<br />
"res": 329,<br />
"nm": "bucket_02",<br />
"rect": {<br />
"x": 1493,<br />
"y": 366,<br />
"w": 81,<br />
"h": 87<br />
}<br />
}<br />
],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
}<br />
}<br />
<br />
:Где "bg" - настройки фона. <br />
:::"src" - сорс графического файла в ресурсной базе;<br />
:::"color" - цвет которым будет залито под фоном, нужное если фон имеет дырки;<br />
:::"tile" - тайлинг фона;<br />
:::"id" - id ресурса из ресурсной базы;<br />
::"hiddens" - перечень HO с их настройками<br />
::::"id" - TxtId;<br />
::::"nm" - имя HO;<br />
::::"res" - графический ресурс HO;<br />
::::"bg" - графический ресурс тени;<br />
::::"rect" - настройки "res";<br />
:::::"x" - координата x, в координатах корневого объекта;<br />
:::::"y" - координата y, в координатах корневого объекта;<br />
:::::"w" - ширина;<br />
:::::"h" - высота;<br />
::::"objs" - перечень нашлёпок;<br />
:::::"res" - графический ресурс нашлёпки;<br />
:::::"rect" - настройки графического ресурса нашлёпки;<br />
::::::"x" - координата x, в координатах HO;<br />
::::::"y" - координата y, в координатах HO;<br />
::::::"w" - ширина;<br />
::::::"h" - высота;<br />
::"res" - ресурсы которые входят в пак уровня ( будут вырезаны при экспорте в пак уровня)<br />
::::"images" - перечень графических ресурсов<br />
::::"texts" - перечень текстовых ресурсов<br />
::::"sounds" - перечень звуковых ресурсов<br />
<br />
== Кроссворд ==<br />
Данный функционал базируется на динамических HG и настраивается в файле динамического уровня.<br />
<br />
=== Мода 2 - слова с мусором ===<br />
[[Файл:Crossword mode2.jpg|right|500x500px]]<br />
Данная мода представляет собой HO объекты и текстовую таблицу, при нахождении предмета, в текстовой таблице подсвечиваются буквы слова.<br />
<br />
Настройка в HiddenList указывается в теге '''кроссворд - мода 2 - слова с мусором''' ('''_G_17'''):<br />
* '''режим кроссворда''' ('''cwon''') - использовать/не использовать режим;<br />
* '''подуровень''' ('''sub_level''') - подуровень;<br />
* '''root''' ('''cw2root''') - родитель текстового поля, координаты будут установлены согласно параметрам "x","y";<br />
* '''text''' ('''cw2text''') - линк на текстовый объект, в котором будем отображать текстовое поле; <br />
* '''цвет найденных''' ('''colorFound''') - цвет букв найденных слов в нашем текстовом поле;<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
...<br />
"hiddens": [ ... ],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
},<br />
"mode2" : {<br />
"en" : [<br />
{<br />
"ids" : [ 3032, 4480, 4491, 4493, 4494, 4499 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 414,<br />
"x" : -682,<br />
"y" : -300<br />
},<br />
"string_check" : "XObatHWZIF|RJLhacksaw|QVPNsaddle|AECGDaxeYU|doveSlante|rnBMTKGEAQ",<br />
"string_display" : "XOBATHWZIF|RJLHACKSAW|QVPNSADDLE|AECGDAXEYU|DOVESLANTE|RNBMTKGEAQ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 4485, 4487, 4490, 4495, 4502, 17112 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "FskatesNTH|ALMboomera|ngWERODrad|ioSKBZoarP|tableGball|oonJXCUIYV",<br />
"string_display" : "FSKATESNTH|ALMBOOMERA|NGWERODRAD|IOSKBZOARP|TABLEGBALL|OONJXCUIYV",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
],<br />
"ru" : [<br />
{<br />
"ids" : [ 4481, 4485, 4490, 4495, 4500, 4508 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ЕконькиМЭк|олокольчик|ХАрадиоШве|слоВбабочк|аЖИЛкастрю|ляУЯРТНСКЮ",<br />
"string_display" : "ЕКОНЬКИМЭК|ОЛОКОЛЬЧИК|ХАРАДИОШВЕ|СЛОВБАБОЧК|АЖИЛКАСТРЮ|ЛЯУЯРТНСКЮ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 3053, 4480, 4487, 4494, 4502, 4507 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ШЩЧУГЮДзве|здаНОМТЕХб|умерангИЪс|толЗЖЪбита|УфонарьЮпо|дарокХПЭБТ",<br />
"string_display" : "ШЩЧУГЮДЗВЕ|ЗДАНОМТЕХБ|УМЕРАНГИЪС|ТОЛЗЖЪБИТА|УФОНАРЬЮПО|ДАРОКХПЭБТ",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
]<br />
}<br />
<br />
:где "mode2" - настройки моды 2;<br />
:::"en", "ru" - языковые локали;<br />
::::"ids" - массив textID активных HO;<br />
::::"nm" - имя уровня - для нашего удобства;<br />
::::"num" - количество активных объектов == размеру массива '''ids''';<br />
::::"numvis" - количество всего объектов,используем для задания фоновых объектов (количество которых == numvis - num);<br />
::::"rect_field" - ректангл активной зоны (пока не используется);<br />
::::"rect_text" - ректангл текстового поля(пока не используется);<br />
::::"string_check" - текстовое поле регистро-зависимое - для HL; <br />
::::"string_display" - текстовое поле для отображения;<br />
::::"x" - координата x родительского объекта для текста;<br />
::::"y" - координата y родительского объекта для текста;<br />
<br />
П.С. данную моду генерирует программа HGcrossword (https://docs.google.com/document/d/1RXSNUxNePF4qEibAPoCgfdiQycxoggc6Hu7a9VUjxSI/edit#)<br />
<br />
== Авто тест HL ==<br />
Для запуска автотеста, нам нужно указать в app.icf параметры:<br />
<br />
[GHiddenList]<br />
:'''HitTest''' - мода автотеста; (0- выкл.; 1 - разовая логика, пишется в файл раз в сессию для одного хидден листа ; 2 - при каждом init любого хидн листа дописывается статистика в файл);<br />
:'''HitTestDx''' = 5 - шаг с которым проходит автокликер по X;<br />
:'''HitTestDy''' = 5 - шаг с которым проходит автокликер по Y;<br />
<br />
Для HitTest==2, очень помогает параметр "allow_background". Остаётся только написать скриптулину, которая ходит сама между экранами.<br />
<br />
== Пример ==<br />
<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample<br />
<br />
HiddenList.rar<br />
<br />
[[Category:Game mechanic]]<br />
<br />
[[Category:Get Started]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=HiddenList&diff=9789HiddenList2019-02-22T08:53:20Z<p>Agava: /* Дополнительные параметры */</p>
<hr />
<div>{{TOC right}}<br />
HiddenList является менеджером поисковых [[Object|объектов]]. На сегодня HiddenList не просто управляет объектами на сцене - он отвечает за все штрафы и поощрения. В связке с такими объектами как [[HiddenHint]] + [[Effect]] HiddenList дает возможность реализовать систему подсказок, а также такие графические эффекты как: "ночь", "трансформация цвета" и т.д. с одним набором графики.<br />
<br />
==Общие параметры==<br />
(см. описание [[Object|Object]])<br />
<br />
[[Файл:HOList_1.jpg|right]]<br />
<br />
*'''имя''' ('' nm '') - Имя объекта HiddenList в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта HiddenList, который можно увидеть в строке "имя" либо при наведении курсора на неё.<br />
*'''синхронизация''' ('' sync '') - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' ('' sv '') - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' ('' z '') - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' ('' memo ''):<br />
:'''1''' - при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
:'''0''' - обновит свои параметры, при повторном открытии экрана.<br />
*'''группа''' ('' gr '') - Группа, в которую входит текущий объект.<br />
<br />
У листа также есть группы стандартных параметров такие как '''положение''', '''размер''', '''модификаторы'''. Но, по сути, они не важны. Главное, чтобы лист не перекрывал на сцене другие объекты. Поэтому ему лучше находиться за пределами сцены. <br />
<br />
==Основные параметры==<br />
<br />
*'''Картинка''' ('' res '') - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Обычно не используется, а применяется для отображения table;<br><br />
*'''Таблица''' ('' table '') - Объект типа [[table]], который является визуальным отображением списка. '''Должна быть обязательно''';<br><br />
*'''Подсказка''' ('' hint '') — объект типа [[HiddenHint]], который является менеджером хинтов;<br><br />
*'''highlighter''' ('' hl '') — объект типа [[HiddenHighLighter|hiddenhighlighter]], который подсвечивает не найденные объекты.;<br><br />
*'''Счетчик''' ('' hdncnt '') — объект типа [[Counter]], который отображает количество найденных объектов.<br><br />
В самом счетчике в параметрах нужно указать val = 0, поскольку изначально нет найденных объектов;<br />
*'''Таймер''' ('' timer '') — объект типа [[Timer]], который отображает время игры.<br />
При инициализации листа он передаст состояние "start" таймеру.<br />
*'''отладка''' ('' trace '') — Отображать в окне состояний текущий объект.<br />
<br />
<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''вычеркнуть''' ('' cross ''):<br />
:'''1''' - найденный объект вычеркивается, оставаясь в списке(таблице);<br />
:'''число''' - найденный объект удаляется из списка;<br />
*'''листать''' ('' scroll '')<br />
:'''1''' - список можно листать (скролировать);<br />
:'''число''' - ищутся только те объекты, которые видны в списке (таблице);<br />
*'''тип списка''' ('' kind '') - Тип поиска объектов:<br />
:'''1''' - слово;<br />
:'''2''' - предложение;<br />
:'''3''' - удаляемая пиктограмма;<br />
:'''4''' - пиктограмма;<br />
:'''5''' - поиск различий.<br />
*'''поиск пар''' ('' pair '') - Если 1, то идет поиска пар объектов с одинаковым типом, иначе обычный режим<br />
:'''пары''' - поиск пар;<br />
:'''одиночные''' - поиск по одному объекту.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''обычный''' ('' sndNrm '') - Звук при нахождении обычного [[HiddenObject]].<br />
*'''коллекционный''' ('' sndCol '') - Звук при нахождении коллекционного [[HiddenObject]](объекту должна быть установлена коллекция).<br />
<br />
<br />
<br />
'''Группа - параметры поиска'''<br />
<br />
*'''объектов''' ('' num '') - Максимальное количество доступных для поиска объектов в одной игровой сессии. (ВАЖНО!!! Таблице нужно установить общее количество ячеек равное(или больше) количеству доступных для поиска объектов).<br />
*'''активных объектов''' ('' numact '') - Максимальное количество активных объектов в одной игровой сессии.<br />
*'''видимых объектов''' ('' numvis'') - Максимальное количество видимых объектов в одной игровой сессии.<br />
*'''одного типа''' ('' max ''):<br />
:'''число''' - Максимальное количество объектов одного типа - поле тип в [[hiddenObject]] или хидден объекты с одинаковыми текстовыми ID могут считаться объектами одного типа;<br />
:'''-1''' - игнорируется.<br />
*'''прятать''' ('' hide '') - Делать невидимыми объекты, не участвующие в поиске.<br />
*'''оставлять''' ('' stay '') - Оставлять найденный объект на месте (вызывая только флаеры) при удачном клике.<br />
*'''актёр-иконка''' ('' actorIco '') - если "да", то во время полёта найденного хидден-объекта вместо него летит иконка которая помечена как "main picture" и указана в текстовом id хидден-объекта.<br><br />
*'''актер''' ('' actor '') - машина состояний, которая управляет процессом полета к таблице найденных [[HiddenObject]] .<br />
*'''z актера''' ('' actorZ '') - z актера. Будет применено только если не равен 0.<br />
*'''актер стартует из таблицы''' ('' actorTable '') - если настройка включена, то актер стартует не из позиции хиддена, а из ячейки таблицы .<br />
*'''целевой объект''' (''trg'') - Если задан, [[HiddenObject]] после нахождения летит не в ячейку таблицы, а к нему.<br />
<br />
<br />
<br />
'''Группа - скорость'''<br />
<br />
Отвечают за скорость перемещения найденного объекта.<br />
*'''полета''' ('' vf '') - Скорость полета в пикселях в секунду.<br />
*'''вращения''' ('' vr '') - Скорость вращения в градусах в секунду.<br />
<br />
<br />
<br />
'''Группа - равномерное распределение'''<br />
<br />
*'''включить''' ('' undist '') - Равномерно распределять объекты по площади сцены.<br />
*'''дополнительные сортировки''' ('' addit_algo '') - Использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами)<br />
<br />
'''Группа - итерационное распределение'''<br />
<br />
*'''включить''' ('' altern_algo '') - Использовать итерационный алгоритм поиска равномерного распределения объектов<br />
*'''учитывать сложности''' ('' process_diff '') - Учитывать сложности предметов при распределении<br />
*'''количество объектов''' ('' hiddens_num_threshold '') - Максимальное количество активных предметов на сцене для которых будут учитываться сложности (max = 24)<br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - Максимальное количество итераций фикса перекрытия объектов.<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - Максимальная допустимая площадь перекрытия в пикселях.<br />
*'''ключ распределения''' ('' distribution_seed '') - Ключ для случайного выбора заменяемого предмета (только для мультиплеера)<br />
*'''удалять перекрытия''' ('' del_after_fix '') - Удалять оставшиеся перекрытия после последней итерации фикса.<br />
<br />
Рекомендации по использованию:<br />
<br />
*Если включать "Удалять перекрытия", то нужно для счетчика кол-ва оставшихся хидденов считывать значение из "num".<br />
*Оптимальное значение максимальной площади - 1024 пикселей, т.е. допускаем перекрытие в 32 на 32 пикселя, что совсем не влияет на визуальное перекрытие объектов.<br />
*Количество итераций можем ставить 20-50. Если перекрытий не останется раньше, то фикс перекрытий остановится, если выполнится все количество - отобразится количество перекрытий в логах. Большое количество итераций фикса негативно сказывается на скорости загрузки сцены.<br />
<br />
Логи:<br />
<br />
<pre><br />
"Deleting a hidden object with textID: %i" - удаление объекта с текстовым ID<br />
"Overlapping detected! Area: %f px" - обнаружения перекрытия в столько-то пикселей<br />
"fixOverlapping() Iterations num: %i / %i; Overlaps num: %i" - итерации, итоговое количество перекрытий<br />
</pre><br />
<br />
==Дополнительные параметры==<br />
<br />
*'''скалирование объектов''' ('' scale_object '') - При нахождении во время полета объект будет скалироватся: <br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''пропадание объектов''' ('' alpha_object '') - При нахождении во время полета объект будет менять альфу:<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''реагировать на отпускание''' ('' touch_up '') - Объекты связанные с этим хидденлистом будут реагировать на отпускание, а не на нажатие:<br />
:'''0''' - отключено;<br />
:'''1''' - включено (То есть реагировать на четкий клик, если кликнули и сместили область клика объект не реагирует!).<br />
*'''реагировать на finger tap''' ('' finger_tap '') - Объекты, связанные с этим хидденлистом, будут реагировать на отпускание после ожидания даблтача.<br />
*'''задержка срабатывания''' ('' touch_delay '') - только для реакции на нажатие. Время между нажатием и реакцией списка объектов.<br />
*'''объединять одинаковые тексты''' ('' same_txt '') - Объекты с одинаковым текстом будут жить в одной ячейке таблицы с добавлением множителя xN.<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''множитель для иконок''' ('' ico_res '') - Графический ресурс(анимация) для отображения множителя у иконок для типа списка 4(поиск по иконкам) и включенного объединения одинаковых текстов. Первый фрейм - х2, второй - х3 и т.д.<br />
*'''исключать одинаковые тексты''' ('' unTxtID '') - исключает или не исключает из поиска объекты с одинаковыми txtID, используется совместно с '''одного типа'''.<br />
*'''показывать один объект игр''' ('' unTxtRep '') - Количество игр, в течении которых будет выбран один объект из данного набора. 0 - не использовать механизм<br />
*'''силуэты после слов''' ('' picsAfterWords '') - Стараться в силуэтах использовать то, что находилось в словах<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один<br />
*'''находить много одним кликом''' ('' canFoundMultiple '') - 1 - если тап попал на несколько объектов, то найдем все. 0 - только один<br />
*'''вероятность пассивного предпочитаемого объекта''' ('' prefProb '') - вероятность выпадения пассивного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''вероятность активного предпочитаемого объекта''' ('' prefProbAct '') - вероятность выпадения активного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''реагировать на невидимые''' ('' canInvis '') - реагировать или нет на объекты, которые в момент игры не видны в таблице. (Кликаются только те [[hiddenObject]] которые отображены в таблице, остальные нет!).<br />
<br />
<br />
'''Группа - равномерное распределение''' - в настоящее время не рекомендуется включать параметры из этой группы. Логика устарела и может конфликтовать со следующей группой итерационного распределения. Эта группа оставлена для возможной доработки в будущем. <br />
*'''включить''' ('' undist '') - равномерно распределять объекты по площади сцены. Да/нет. <br />
*'''дополнительные сортировки''' (''addit_algo'') - использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами). Да/нет. <br />
<br />
<br />
'''Группа - итерационное распределение''' - на данный момент лучший алгоритм равномерного распределения.<br />
*'''включить''' ('' altern_algo '') - использовать итерационный алгоритм поиска равномерного распределения объектов. Да/нет. <br />
*'''учитывать сложности''' ('' process_diff '') - учитывать сложности объектов при распределении. Подробнее о сложностях в описании соответствующего параметра в [[hiddenObject]]. Да/нет. <br />
*'''количество объектов''' ('' hiddens_num_threshold '') - максимальное количество активных предметов на сцене, для которых будут учитываться сложности. <br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - максимальное количество итераций фикса перекрытия объектов. По умолчанию 50, min="0" max="100".<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - максимальная допустимая площадь перекрытия в пикселях. По умолчанию 1024, min="0" max="2048". <br />
*'''ключ распределения''' ('' distribution_seed '') - ключ для случайного выбора заменяемого предмета (только для мультиплеера). min="0" max="32768".<br />
*'''удалять перекрытия''' ('' del_after_fix '') - удалять оставшиеся перекрытия после последней итерации фикса. Количество объектов получать из num, нет=0, да=1. <br />
<br />
<br />
*'''прятать актеров при старте''' ('' hideact '') - Устанавливать актерам видимость false при старте (по умолчанию - да)(То есть всем актерам которые находятся на сцене при запуске принудительно установиться vis = 0).<br />
*'''аномалия''' ('' anom '') - для всех аномалий кроме текстовой [[HiddenObject]] и игровой фон должны быть подобъектами [[Effect]]):<br />
:'''0''' - нет;<br />
:'''1''' - текстовая;<br />
:'''2''' - ночь; В машине которая выставляет эффект ночь, должны передавать сцене с объектом аномалия ( obj="scene"; par="drag"; val="0" ) и ( obj="scene"; st="update");<br />
:'''3''' - трансформация цвета;<br />
:'''4''' - дым.<br />
При применении аномалии "блитц" через объект [[Economics]] набор параметров: anom="0", is_blitz="1".<br />
*'''флурри''' ('' flurry '') - Нужно ли отправлять статистику флурри "regexp=":<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''вероятность инверсии''' ('' invProb '') - Вероятность того, что сцена будет перевернута по x;<br />
*'''набор''' ('' kit '') - Набор, из которого берутся объекты.<br />
*'''поведение дифференсов''' (''difbeh'') - Поведение найденных объектов в режиме поиск отличий.<br />
*'''сортировать по приоритету''' (''priorsort'') - Сортировать итоговый список по полю приоритет объекта. Высокий приоритет - сначала.<br />
*'''не давать ходить игроку''' (''botonly'') - Если включена - то хидден будет работать, но не будет принимать клики от игрока.<br />
*'''предметов по заданию не более''' (''taskless'') - Предметов по заданию не более заданного числа. -1 - без ограничений<br />
*'''неактивные улики как фон''' (''cluesbg'') - Если включена, то в хидденах связанные предметы, для которых есть неактивные таски, будут видны на фоне.<br />
<br />
<br />
'''Группа - появление новых объектов'''<br />
<br />
*'''время''' ('' acttm '') - Время появления объекта (мс);<br />
*'''начальный скейл''' ('' actsc '') - Начальный скейл;<br />
*'''начальная альфа''' ('' actal '') - Начальная альфа.<br />
<br />
<br />
<br />
'''Группа - сессии'''<br />
<br />
*'''сессионность''' ('' ses ''):<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''ограничение сессий''' ('' sesLim '') - Максимальное количество сессий, в которые можно играть.<br />
*'''набор объектов''' ('' sesSet '') - Набор объектов при заходе в хидден после последней сессии:<br />
:'''0''' - случайный;<br />
:'''1''' - последний фон;<br />
:'''2''' - пустой.<br />
<br />
<br />
<br />
'''Группа - цвета'''<br />
<br />
*'''Цвет обязательных''' ('' c_forced '') — цвет текста для обязательных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Цвет найденных''' ('' c_found '') — цвет текста для найденных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Время перехода''' ('' c_time '') - Время изменения цвета.<br />
<br />
<br />
<br />
'''Группа - время'''<br />
<br />
*'''игры''' ('' tmGm '') - Общее время игры. Если оно истекает, идет переход на экран [время вышло] (см.ниже):<br />
:'''-1''' - игнорируется;<br />
:'''число''' - время игры.<br />
*'''прерывать''' ('' tmInt ''):<br />
:'''1''' - по окончанию времени игра будет прервана;<br />
:'''0''' - по окончанию времени игра продолжится, но переход все равно будет на неудачную ветку.<br />
*'''паузы''' ('' tmWt '') - Время перед закрытием окна после разбора (для осмысления результата);<br />
*'''полета актера''' ('' tmActor '') - Время работы актера, после которого обрабатываются ячейки таблицы;<br />
*'''перед исчезновением''' ('' tmWtHide '') - Время, в течение которого объект остается видимым после обработки.<br />
*'''жизни актера''' ('' tmActorLife '') - Время жизни клона актера, после которого он будет удален меньше либо рано 0 - не удалять по времени<br />
<br />
<br />
<br />
'''Группа - ошибки'''<br />
<br />
*'''flyer при ошибке''' ('' fl '') - обычно объект типа flyer (летуны которых надо показать в точке клика, если этот клик ошибочный). Можно в принципе любой объект который обладает состоянием "beg". Ошибочный клик - все клики мимо [[hiddenObject]].<br />
*'''вычет времени при ошибке''' ('' tmPen '') - Сколько отнять миллисекунд за ошибочный клик.<br />
<br />
<br />
<br />
'''Группа - переход'''<br />
<br />
*'''при разборе''' ('' scrOk '') - Экран на который надо перейти, если все объекты найдены.<br />
*'''время вышло''' ('' scrOv '') - Экран на который надо перейти если время вышло, а не все объекты найдены.<br />
<br />
<br />
<br />
'''Группа - система очков'''<br />
<br />
*'''Счетчик''' ('' score_counter '') — счетчик, отображающий набранные очки.<br />
*'''счетчик (test)''' ('' score_counter_test '') — счетчик, отображающий набранные очки.<br />
*'''ID пака''' ('' pack_id '') — строковый идентификатор пака(для записи набранных очков в [[options]] должен быть заполнен); используется для вытаскивания суммарных очков в счетчики и дальнейшего их отображения.<br />
*'''ID игры''' ('' game_id '') — строковый идентификатор игры (сцены).<br />
'''Обязательно должен иметь префикс ID пака. Например, если pack_id = "pack1", то game_id = "pack1.game1"'''.<br />
*'''мультипликатор очков''' ('' scoreM '') — Мультипликатор очков за объект, если все собрано за отведенное время.<br />
*'''Очки''' ('' score '') — количество очков, которые даются за каждый найденный [[hiddenObject]].<br />
*'''Бонус за скорость''' ('' bonusS '') — бонус за быстро найденный [[hiddenObject]].<br />
*'''Бонусный интервал''' ('' bonusT '') — время, за которое нужно найти [[hiddenObject]] для получения бонуса.<br />
*'''бонус за время''' ('' bonusTime '') - бонус за оставшееся время игры = коэффициент который введем * оставшееся время таймера.<br />
*'''Бонусный мультипликатор''' ('' grow ''):<br />
:'''1''' - умножать очки за второй быстро найденный предмет на 2, за третий на 3, и т. д.<br />
:'''0''' - не умножать.<br />
*'''Количество кликов для штрафа''' ('' wrngC '') — количество неверных кликов, после которых запустится блокатор (см. ниже).<br />
*'''Интервал для штрафа''' ('' wrngT '') — время, за которое нужно совершить неверные клики.<br />
*'''Штраф (очки)''' ('' delS '') — Сколько отнимаем очков за ошибочный клик.<br />
*'''Штраф (время)''' ('' delT '') — Сколько отнимаем времени за ошибочный клик.<br />
*'''блокатор''' ('' blockImg '') - Объект, блокирующий сцену при серии ошибочных кликов. (Обычно маска растянутая на весь экран. '''ДОЛЖНА иметь состояние "beg"''').<br />
*'''время блокировки''' ('' blockTime '') - Время блокировки при серии ошибочных кликов по истечении переводит "блокатор" в состояние '''end'''.<br />
*'''порог touch move''' ('' mvSens '') - Порог, начиная с которого движение пальца воспринимается как мув и сбрасываются неправильные клики.<br />
*'''touch move как штраф''' ('' tchMvPen '') - Считать ли touch move за ложное попадание:<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''клик на найденный как штраф''' ('' clkFndPen '') - Считать ли клик на найденный объект за ложное попадание(актуально если объекты остаются на сцене).<br />
*'''аниматор очков''' ('' scoreAnim '') - машина, которая анимирует полученные очки, должна иметь состояние '''anim'''.<br />
*'''коэффициент комбо''' ('' cmbCoef '') - коэффициент для расчёта комбо очков по формуле s(n) = k * n * (n + 1).<br />
*'''счётчик очков за объект''' ('' objScCnt '') - счётчик который показывает очки за последний полученный объект (учитывая бонусы).<br />
*'''счётчик комбо-очков''' ('' cmbScCnt '') - счётчик очков полученных за комбо-серию.<br />
*'''счётчик комбо-серий''' ('' cmbRwCnt '') - счётчик который показывает комбо-серию (комбо из 2-х, 3-х и т.д. найденных объектов).<br />
*'''комбо2 прогресс''' ('' cmb2Pr '') - комбо2 прогресс;<br />
*'''комбо2 время''' ('' cmb2Tm '') - комбо2 время;<br />
*'''комбо2 кол-во''' ('' cmb2Num '') - комбо2 кол-во.<br />
*'''очки 3.0''' (''score30'') - Использовать систему очков, придуманную Степановым в августе 2015.<br />
*'''очки 3.0 коэф. комбо''' (''score30lc'') - в конце комбо даем за него очков n * s * l * (n-1) - где n число предметов в комбо, s - очки за один предмет, l - этот коэффициент<br />
*'''очки 3.0 коэф. аккуратности''' (''score30la'') - в конце игры начисляем очки за точность по формуле s * la / (1 + Nmiss / N)<br />
*'''очки 3.0 коэф. времени 1 (l)''' (''score30lt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки 3.0 коэф. времени 2 (t)''' (''score30tt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки детектив макс. комбо''' (''scoreDetMaxCombo'') - максимальное значение комбо для очков по системе детектива, используется при состоянии хидден-листа max_combo. Если в настройках хидден-листа очковая система "очки 3.0", то scoreDetMaxCombo должно быть равно <property name="комбо2 кол-во" id="cmb2Num" hint="комбо2 кол-во" type="int" label="комбо2 кол-во" value="1"/> +1. То есть, на 1 больше, чем значение комбо2 кол-во ('' cmb2Num '').<br />
*'''держать max_combo до тапа''' (''keepMaxCombo'') - Будет ли максимальное значение комбо после вызова max_combo храниться до тапа (да) или уменьшаться сразу (нет). Флаг используется только для состояния max_combo, обычный хидден останется прежним. Флаг обеспечит max_combo до первого тапа. То есть, чтобы комбо убывало по времени, но после первого тапа.<br />
<br />
<br />
'''Группа - звезды'''<br />
<br />
*'''combo num''' ('' comboNum '') - Количество быстро найденных объектов, нужное для получения звезды Combo.<br />
*'''combo time''' ('' comboInt '') - Интервал между кликами, считающимися быстрыми для Combo.<br />
*'''accuracy''' ('' accuracy '') - Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные).<br />
*'''лимит ложных кликов''' ('' starWrAcc '') - Лимит ложных кликов.<br />
Формула расчета проста, количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
'''Группа - новейшая адаптивность'''<br />
<br />
*'''включить''' ('' newAdOn '') - включить или выключить новый алгоритм адаптивности.<br />
*'''default T''' ('' newAdDefault '') - изначальное время, выданное игроку на нахождение одного хиддена. Указывается в миллисекундах.<br />
*'''относительное отклонение''' ('' newAdTimes '') - массив коэффициэнтов, применяемых к изначальному времени. Коэффициенты указываются в float и перечисляются через запятую.<br />
Первое число в массиве отвечает за переход на 0 сложностей, следующее на 1, на 2 и так далее. Более детальный алгоритм описан [здесь|http://jira1:8090/pages/viewpage.action?pageId=18677822].<br />
<br />
==Параметры бота и мультиплеера==<br />
<br />
'''Группа - Хидден бот'''<br />
<br />
*'''тип бота''' - тип бота:<br />
:'''нет''' - обычная одиночная игра, бот выключен;<br />
:'''на одном поле''' - игра с ботом на одном поле, у обоих одинаковый список предметов;<br />
:'''с маленьким полем''' - бот будет играть на отдельном поле (??????);<br />
:'''горячий стул''' - hotsit, игра двух живых игроков на одном девайсе, передача хода по очереди;<br />
:'''мультиплеер''' - игра через сервер с живым оппонентом;<br />
*'''файл уровня''' - xml файл с настройками сложности бота ([[HiddenList#Настройка сложности бота|пример]]);<br />
*'''номер уровня''' - номер уровня в файле (начиная с 0);<br />
*'''номер уровня max''' - если задан больше предыдущего номера - выбирается рандомное значение;<br />
*'''multiplayer''' - объект мультиплеера;<br />
*'''кнопка хинта''' - кнопка хинта для 2го игрока \ бота;<br />
*'''проверять интернет''' - проверять интернет при игре с ботом (так же, как при игре с живым игроком);<br />
*'''первый ход (вероятность)''' - вероятность первого хода игрока при игре с ботом (в процентах);<br />
*'''t min abs ms''' - самая минимальная задержка между ходами бота;<br />
*'''t1 min ms''' - минимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 max ms''' - максимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 prob %''' - вероятность быстрого нахождения предмета ботом;<br />
*'''t2 min ms''' - минимальное время для нахождения предмета ботом;<br />
*'''t2 max ms''' - максимальное время для нахождения предмета ботом;<br />
*'''t coef delta''' - коэффициент сложности (кажется от -1 до 1, могу ошибаться);<br />
*'''t wrong min ms''' - минимальное время между ложными кликами (мимо объекта) бота;<br />
*'''t wrong max ms''' - максимальное время между ложными кликами бота;<br />
*'''bot hint chance (percent)''' - шанс бота использовать хинт (в процентах);<br />
*'''bot hint num''' - максимальное кол-во использования хинтов ботом на игру;<br />
*'''доп. поле x''' - координаты доп. поля по Х;<br />
*'''доп. поле y''' - координаты доп. поля по Y;<br />
*'''доп. поле sx''' - масштаб доп. поля;<br />
*'''доп. поле sy''' - масштаб доп. поля;<br />
*'''указатель хода''' - указатель хода бота\оппонента. Должен иметь состояние ''beg'' и находитсья в сцене с хидденами;<br />
*'''родитель''' - родитель, в который поместим клонированную сцену (доп. поле);<br />
*'''счетчик очков бота''' - счетчик, выводящий очки;<br />
*'''счетчик без бонусов бота''' - счетчик, выводящий очки без бонусов за время и точность;<br />
*'''комбо2 прогресс бота''' - комбо2 прогресс;<br />
*'''аниматор очков бота''' - машина, которая при нахождении хиддена анимирует полученные очки;<br />
*'''счетчик очков за объект бот''' - счетчик, выводящий очки за объект;<br />
*'''счетчик комбо-серий (макс) бот''' - счетчик, выводящий макс. количество комбо-серий;<br />
*'''счетчик комбо-серий (тек) бот''' - счетчик, выводящий текущее количество комбо-серий;<br />
*'''flyer при ошибке''' - объект типа ''flyer'' который надо показать в точке клика, если этот клик ошибочный;<br />
*'''таймер хода бота''' - таймер хода бота;<br />
*'''таймер хода игрока''' - таймер хода игрока;<br />
*'''длительность хода ms''' - длительность хода игрока \ бота. Если задан 0 - игроки ходят одновременно;<br />
*'''длительность паузы между ходами ms''' - длительность паузы при смене хода игрока\бота.<br />
<br />
=== Настройка сложности бота ===<br />
<br />
Файл уровней для хидден-бота должен иметь такую структуру:<br />
<bots><br />
<obj id="0"><br />
<bot weight="3" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="21000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
<obj id="1"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="10000" t2max="25000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="7000" twrongmax="10000" /><br />
</obj><br />
<obj id="2"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="7000" t2max="21000" twrongmax="10000" /><br />
<bot weight="2" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
</bots><br />
<br />
*bots - основной таг<br />
*obj > id - номер уровня<br />
*bot - содержит те же параметры, что и настройки бота в хидден листе<br />
<br />
==Режим "блиц" с бесконечными объектами==<br />
<br />
'''Правила аномалии "блиц"''':<br />
<br />
*Блиц заканчивается победой, если игрок нашел хотя бы один предмет за отведенное время игры блиц.<br />
*Если время вышло, но не было найдено ни одного предмета, то засчитывается поражение.<br />
*В аномалии блиц количество возможных предметов ограничивается максимальным количеством уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num). А количество видимых предметов ограничивается количеством предметов, заданных на уровне мастерства локации. При постепенном разборе предметов добавляются новые пока не будет разобрано максимальное количество предметов на хидден сцене, либо, пока не закончится время, но одновременно видно предметов не больше, чем заданных на конкретном уровне мастерства локации.<br />
<br />
Для включения такого режима блиц используем поле в настройках хидден-листа:<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один. (да - использовать режим, нет - не использовать).<br />
<br />
Если в этом поле настройка "нет", то режим блиц работает по-старому: объектов столько, сколько указано в уровне мастерства.<br />
<br />
Прочитать, находится ли хидден в режиме блиц можно из поля "is_blitz" хидден листа (возможные значения - 0 или 1). Заполняется экономикой в момент старта локации.<br />
<br />
Для отображения в счетчике максимального количества уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num) вычитывать измененный num можно ТОЛЬКО ПОСЛЕ прихода start hiddenlist, т.е. не в ините.<br />
<br />
В экономике указываем блиц, как отдельную аномалию.<br />
<br />
==Состояния==<br />
<br />
Состояния которые есть у листа. Мы можем передавать их с помощью различных объектов:<br />
<br />
*'''init''' - инициализация хидден-листа;<br />
*'''invert''' - горизонтально отображает изображение;<br />
*'''run''' - переводит хидден в состояние активности, если до этого был на паузе;<br />
*'''pause''' - переводит хидден в состояние паузы, объекты не кликаются, таймер не идет;<br />
*'''pause_timer''' - объекты кликаются, но таймер не идет;<br />
*'''resume_timer''' - продолжить работу таймера, который был остановлен в состоянии ''pause_timer'';<br />
*'''add_time''' - добавить игрового времени (перед этим надо передать в param количество времени в ms)<br />
*'''swap_hiddens''' - меняет отображаемые в таблице поисковые объекты на случайные другие.<br />
*'''get_visible_ho''' - вернуть id активного HO объекта (объект пишет в себя два параметра - '''randomHO_id''' и '''randomHO_vis''' (id объекта и виден ли он сейчас юзеру)); Приоритет выбора HO объекта: с начала видимые юзеру, если таких нет - выводим невидимый на текущий момент HO (до предмета нужно фокусировать сцену);<br />
*'''max_combo''' - хидден начинается с максимальным значением комбо;<br />
*'''putback''' - вернуть случайный уже найденный обьект на экран и в список;<br />
*'''restart_no_anomaly''' - перезапустить хидден без аномалии;<br />
*'''finish''' - принудительно завершить игру.<br />
<br />
==Примечания==<br />
<br />
*HiddenList должен располагаться в дереве проекта ниже всех своих поисковых объектов.<br />
<br />
*Единственный '''обязательный объект''' о котором должен знать лист это [[Table]] для отображения списка поиска, даже если таблица не будет использоваться быть все равно должна!<br />
<br />
*После завершения хидден-игры (по разбору или по времени)при переходе на другой экран HiddenList записывает данные в опции в два места: первое - это то, которое указано у настройках (ID пака, ID уровня, тип списка), для каждой локации свое; а второе - это last_game. <br><br />
Например, <br><br />
'''last_game.time_spent''' (либо же '''pck_N.lvl_N.kind_N.time_spent''') - время последней игры, <br> <br />
'''last_game.clicks''' (либо же '''pck_N.lvl_N.kind_N.clicks''') - количество найденных объектов и т.д. <br><br />
Все их можно увидеть в опциях. last_game был придуман для того, чтобы было удобно задавать счетчики в окне результатов. Также эти данные могут быть сохранены в опциях, если задать листу состояние '''wait'''.<br />
<br />
*Для проверки кликабельности хидденобъектов можно воспользоваться следующими настройками в app.icf:<br />
<br />
<pre><br />
[GHiddenList]<br />
HitTest=0<br />
HitTestDx=1 - шаг по х<br />
HitTestDy=1 - шаг по y<br />
</pre><br />
<br />
в результате после перехода на сцену с хидденом появится файл, в котором будет казан объекты и координаты в которых они не тапаются.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''появляется новый объект: изменить состояние объекта''' ('' actst ''):<br />
:'''объект''' ('' obj '') - Объект, состояние которого нужно изменить;<br />
:'''состояние''' ('' st '') - Новое состояние объекта.<br />
<br />
[[Файл:HOList_3.jpg|right]]<br />
<br />
[[Файл:+.png]] '''разбор: если был экран''' ('' wscrOk '') - При нахождении всех объектов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''разбор: изменить состояние объекта''' ('' nstOk '') - При нахождении всех объектов, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''разбор: изменить параметр объекта''' ('' chgOk '') - При нахождении всех объектов, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '') - Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''нет предметов (при создании из динамического конфига)''' ('' nstNoObjects '') - при загрузке локации без хидден-объектов (например не подтянулся пак либо нет локализации) перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: если был экран''' ('' wscrOv '') - Если вышло время, а объекты не найдены, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''не успел: изменить состояние объекта''' ('' nstOv '') - Если вышло время, а объекты не найдены, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: изменить параметр объекта''' ('' chgOv '') - Если вышло время, а объекты не найдены, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '')- Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''счетчик очков''' ('' scoreCnt ''):<br />
:'''счетчик''' ('' cnt '') - Каунтер, которому приходят очки.<br />
<br />
[[Файл:+.png]] '''группа extra bonus''' ('' extraBonus ''). Используется для economics, при нахождении объекта с некой вероятностью может выпасть бонус. Объект который анимирует появление бонуса должен иметь состояние show, время на анимацию бонуса - 10 секунд:<br />
:'''монетки объект''' ('' coinsObj '') - объект который анимирует получение монет;<br />
:'''монетки вероятность''' ('' coinsProb '') - вероятность по нахождению объекта получить дополнительно монетки;<br />
:'''опыт объект''' ('' expObj '') - объект который анимирует получение опыта;<br />
:'''опыт вероятность''' ('' expProb '') - вероятность по нахождению объекта получить дополнительно опыт;<br />
:'''энергия объект''' ('' energyObj '') - объект который анимирует получение энергии;<br />
:'''энергия вероятность''' ('' energyProb '') - вероятность по нахождению объекта получить дополнительно энергию.<br />
<br />
[[Файл:+.png]] '''Объект, который срабатывает, если долго не находить хидден''' ('' notfnd ''):<br />
:'''объект''' ('' obj '') - Объект, который переводится в указанное состояние, если долго не находить хидден;<br />
:'''состояние''' ('' st '') - Состояние, в которое переводится объект;<br />
:'''время''' ('' tm '') - Время от последнего нахождения хиддена, после которого срабатывает объект.<br />
<br />
[[Файл:+.png]] '''параметры аномалии с исчезновением букв''' ('' hlPars ''):<br />
:'''оставшиеся буквы''' ('' min '') - Минимальное количество оставшихся букв в предложении;<br />
:'''задержка''' ('' wait '') - Момент времени, начиная с которого аномалия будет проявляться;<br />
:'''задержка 2''' ('' wait2 '') - Задержка для появившихся слов, изначально недоступных;<br />
:'''время''' ('' time '') - Время, за которое должны исчезнуть все буквы (если -1, то до конца времени в хиддене);<br />
:'''промежутки''' ('' dt '') - промежутки времени между каждой итерацией;<br />
:'''флайер''' ('' fl '') - Флайер, анимирующий исчезающую букву (должен иметь '''текстовый''' тип).<br />
<br />
[[Файл:+.png]] '''параметры аномалии ночь''' ('' nightPars ''): <br />
:'''effect''' ('' ef '') - эффект, управляющий трансформацией цвета;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего ночь.<br />
<br />
[[Файл:+.png]] '''параметры аномалии трансформации цвета''' ('' colInvPars ''):<br />
:'''effect''' ('' ef '') - Эффект, управляющий трансформацией цвета;<br />
:'''tags''' ('' eftags '') - Теги эффектов, реализующих трансформацию цвета, из которых будет выбран один.<br />
<br />
[[Файл:+.png]] '''параметры аномалии дым''' ('' smokePars ''): <br />
:'''effect''' ('' ef '') - Машина, управляющая эффектом дыма;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего дым.<br />
<br />
Все аномалии кроме текстовой должны быть настроены с помощью объекта [[Effect]]<br />
<br />
== Get Started==<br />
Минимальный набор ресурсов:<br />
* Фоновая картинка для поисковой сцены<br />
* Комплект картинок, с которых будут сделаны поисковые [[HiddenObject|объекты]]<br />
* Текстовые объекты для идентификации спрятанных объектов<br />
<br />
Минимальный набор объектов редактора:<br />
* [[Image]] который будет изменен в хидден-лист<br />
* [[Table|Таблица]] в которой будут отображаться тексты/картинки (зависит от режима) спрятанных объектов.<br />
* По одному [[Image]] для каждого спрятанного объекта (будут созданы автоматически при добавлении картинок из базы ресурсов на сцену)<br />
<br />
Наши действия:<br />
# откроем [[Интерфейс_ScenceEditor|редактор сцен]] и создадим новый проект,<br />
# добавим новый экран с именем ''scrHList''<br />
# создадим в этом экране сцену ''stgHList''<br />
# перейдём в [[Интерфейс_ResourceEditor|редактор ресурсов]]<br />
## создаём папку ''HList''<br />
## добавим в ней картинку для фона и картинки для спрятанных объектов.<br />
## выделим все картинки в дереве ресурсов и перенесем их на нашу сцену ''stgHList'', при этом для каждой картинки автоматически создастся объект [[Image]].<br />
## закроем редактор ресурсов<br />
# перейдём в [[Интерфейс_TextEditor|редактор текстов]]<br />
## создаём папку ''HListText''<br />
## добавим в нее текстовые объекты, по одному на каждый поисковый объект.<br />
## сохраним внесенные изменения.<br />
# перейдём в редактор сцен.<br />
# создадим в сцене stgHList объект [[Table]] и назовем его HOT<br />
## настроим размер и положение таблицы, согласно нашего дизайна<br />
## установим параметры колонок = "50", колонок видно = "5", строчек = "5", строчек видно = "1" (таким образом в таблице будут отображаться 5 поисковых предметов, а максимальное количество объектов для поиска будет равно 250)<br />
## установим параметры скорость листания = "650", добавлять по строкам = "0", центрировать = "растянуть", сдвигать ячейки при удалении ="да"<br />
# создадим в сцене stgHList объект '''HiddenList''', напоминаем что его размер и положение на сцене не имеют значения, по этому расположим его где-нибудь за границей экрана. <br>'''Важно''' В дереве проекта хидден-лист должен быть ниже всех своих поисковых объектов.<br />
## в поле таблица указываем нашу HOT<br />
## установим параметр объектов = "10"<br />
## установим параметр пропадание объектов = "да"<br />
## установим параметр реагировать на отпускание = "да"<br />
## установим параметр реагировать на невидимые = "нет"<br />
## установим параметр набор = "1"<br />
# Настроим объекты, которые будут прятаться. Для этого выделим картинки поисковых объектов, добавленные нами ранее, и изменим им тип на "hiddenObject". Оставляя группу этих объектов выделенной, настроим им параметры:<br />
## в поле list укажем наш HiddenList<br />
## параметр набор = "1"<br />
## Теперь снимаем выделение и каждому объекту в поле текстID перетаскиваем мышкой соответствующий текстовый объект из текстовой базы (поле текстID должно быть активно для редактирования - по нему нужно кликнуть мышкой)<br />
# сохраним проект<br />
# запустим [[Интерфейс_Viewer|вьювер]]<br />
<br />
== Динамический HG==<br />
Функционал позволяет генерировать HL самостоятельно HO объекты из файла конфига. <br />
<br />
П.С. - вся графика д.б. динамической. Данные файлы может создавать HO_Manager [http://wiki/index.php/HO_Manager Wiki HO_manager] <br />
[https://docs.google.com/document/d/13UUOKf_iJNzFx0PjU4JQIfYDX7NhK7dyfJAR3I-SWlQ/edit#heading=h.4pd8h5jdvqj4 Документ по динамических пакам]<br />
<br />
[[Файл:D485ecbbbb.jpg|right]]<br />
*'''файл уровня''' ('' configFile'') — указываем путь к файлу конфигу, где перечисляем файлы с HG. <br />
*'''список графических ресурсов''' — служебное, пока не используется;<br />
*'''список текстовых ресурсов''' — служебное, пока не используется;<br />
*'''номер уровня''' ('' hiddenLevelNum '') — номер уровня из файла;<br />
*'''образец хиддена''' ('' hiddenTemplate '') — obj_id HO объект, должен иметь нужные параметры (остальные возьмутся из конфига) ;<br />
*'''образец нашлёпки''' ('' hiddenPatchTempl '') — obj_id нашлёпки на HO объект, должна иметь нужные параметры (остальные возьмутся из конфига);<br />
*'''корневой объект''' ('' hiddenRoot '') — obj_id корневого объект в который сложим всех клонов;<br />
*'''точечный спецэффект''' ('' hiddenEffect '') — ;<br />
*'''фоновый объект ''' ('' hiddenBG '') — obj_id объекта которому поменяем ресурс;<br />
<br />
Требования, вся графика HO,BG отрисовывается без учёта пивоты;<br />
<br />
Файлы конфиги имеют вид:<br />
Файл уровня имеет вид:<br />
{<br />
"levels": [<br />
{<br />
"file": "ViewerFiles/DynHid/hidden0.cfg",<br />
"pack":3<br />
}<br />
]<br />
}<br />
<br />
:Где "levels" - линки на файлы уровней. <br />
:::"file" - путь к файлу;<br />
:::"pack" - пак в который попадут ресурсы;<br />
<br />
<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
"bg": {<br />
"src": "bg.png",<br />
"w": 2048,<br />
"h": 1151,<br />
"id": 16,<br />
"color": "#ffffff",<br />
"tile": ""<br />
},<br />
"hiddens": [<br />
{<br />
"id": 1022,<br />
"nm": "bucket_01",<br />
"res": 129,<br />
"bg": 666,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
},<br />
"objs": [{<br />
"res": 1488,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
}<br />
}],<br />
}, <br />
{<br />
"x": 1537,<br />
"y": 409,<br />
"id": 1023,<br />
"res": 329,<br />
"nm": "bucket_02",<br />
"rect": {<br />
"x": 1493,<br />
"y": 366,<br />
"w": 81,<br />
"h": 87<br />
}<br />
}<br />
],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
}<br />
}<br />
<br />
:Где "bg" - настройки фона. <br />
:::"src" - сорс графического файла в ресурсной базе;<br />
:::"color" - цвет которым будет залито под фоном, нужное если фон имеет дырки;<br />
:::"tile" - тайлинг фона;<br />
:::"id" - id ресурса из ресурсной базы;<br />
::"hiddens" - перечень HO с их настройками<br />
::::"id" - TxtId;<br />
::::"nm" - имя HO;<br />
::::"res" - графический ресурс HO;<br />
::::"bg" - графический ресурс тени;<br />
::::"rect" - настройки "res";<br />
:::::"x" - координата x, в координатах корневого объекта;<br />
:::::"y" - координата y, в координатах корневого объекта;<br />
:::::"w" - ширина;<br />
:::::"h" - высота;<br />
::::"objs" - перечень нашлёпок;<br />
:::::"res" - графический ресурс нашлёпки;<br />
:::::"rect" - настройки графического ресурса нашлёпки;<br />
::::::"x" - координата x, в координатах HO;<br />
::::::"y" - координата y, в координатах HO;<br />
::::::"w" - ширина;<br />
::::::"h" - высота;<br />
::"res" - ресурсы которые входят в пак уровня ( будут вырезаны при экспорте в пак уровня)<br />
::::"images" - перечень графических ресурсов<br />
::::"texts" - перечень текстовых ресурсов<br />
::::"sounds" - перечень звуковых ресурсов<br />
<br />
== Кроссворд ==<br />
Данный функционал базируется на динамических HG и настраивается в файле динамического уровня.<br />
<br />
=== Мода 2 - слова с мусором ===<br />
[[Файл:Crossword mode2.jpg|right|500x500px]]<br />
Данная мода представляет собой HO объекты и текстовую таблицу, при нахождении предмета, в текстовой таблице подсвечиваются буквы слова.<br />
<br />
Настройка в HiddenList указывается в теге '''кроссворд - мода 2 - слова с мусором''' ('''_G_17'''):<br />
* '''режим кроссворда''' ('''cwon''') - использовать/не использовать режим;<br />
* '''подуровень''' ('''sub_level''') - подуровень;<br />
* '''root''' ('''cw2root''') - родитель текстового поля, координаты будут установлены согласно параметрам "x","y";<br />
* '''text''' ('''cw2text''') - линк на текстовый объект, в котором будем отображать текстовое поле; <br />
* '''цвет найденных''' ('''colorFound''') - цвет букв найденных слов в нашем текстовом поле;<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
...<br />
"hiddens": [ ... ],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
},<br />
"mode2" : {<br />
"en" : [<br />
{<br />
"ids" : [ 3032, 4480, 4491, 4493, 4494, 4499 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 414,<br />
"x" : -682,<br />
"y" : -300<br />
},<br />
"string_check" : "XObatHWZIF|RJLhacksaw|QVPNsaddle|AECGDaxeYU|doveSlante|rnBMTKGEAQ",<br />
"string_display" : "XOBATHWZIF|RJLHACKSAW|QVPNSADDLE|AECGDAXEYU|DOVESLANTE|RNBMTKGEAQ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 4485, 4487, 4490, 4495, 4502, 17112 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "FskatesNTH|ALMboomera|ngWERODrad|ioSKBZoarP|tableGball|oonJXCUIYV",<br />
"string_display" : "FSKATESNTH|ALMBOOMERA|NGWERODRAD|IOSKBZOARP|TABLEGBALL|OONJXCUIYV",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
],<br />
"ru" : [<br />
{<br />
"ids" : [ 4481, 4485, 4490, 4495, 4500, 4508 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ЕконькиМЭк|олокольчик|ХАрадиоШве|слоВбабочк|аЖИЛкастрю|ляУЯРТНСКЮ",<br />
"string_display" : "ЕКОНЬКИМЭК|ОЛОКОЛЬЧИК|ХАРАДИОШВЕ|СЛОВБАБОЧК|АЖИЛКАСТРЮ|ЛЯУЯРТНСКЮ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 3053, 4480, 4487, 4494, 4502, 4507 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ШЩЧУГЮДзве|здаНОМТЕХб|умерангИЪс|толЗЖЪбита|УфонарьЮпо|дарокХПЭБТ",<br />
"string_display" : "ШЩЧУГЮДЗВЕ|ЗДАНОМТЕХБ|УМЕРАНГИЪС|ТОЛЗЖЪБИТА|УФОНАРЬЮПО|ДАРОКХПЭБТ",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
]<br />
}<br />
<br />
:где "mode2" - настройки моды 2;<br />
:::"en", "ru" - языковые локали;<br />
::::"ids" - массив textID активных HO;<br />
::::"nm" - имя уровня - для нашего удобства;<br />
::::"num" - количество активных объектов == размеру массива '''ids''';<br />
::::"numvis" - количество всего объектов,используем для задания фоновых объектов (количество которых == numvis - num);<br />
::::"rect_field" - ректангл активной зоны (пока не используется);<br />
::::"rect_text" - ректангл текстового поля(пока не используется);<br />
::::"string_check" - текстовое поле регистро-зависимое - для HL; <br />
::::"string_display" - текстовое поле для отображения;<br />
::::"x" - координата x родительского объекта для текста;<br />
::::"y" - координата y родительского объекта для текста;<br />
<br />
П.С. данную моду генерирует программа HGcrossword (https://docs.google.com/document/d/1RXSNUxNePF4qEibAPoCgfdiQycxoggc6Hu7a9VUjxSI/edit#)<br />
<br />
== Авто тест HL ==<br />
Для запуска автотеста, нам нужно указать в app.icf параметры:<br />
<br />
[GHiddenList]<br />
:'''HitTest''' - мода автотеста; (0- выкл.; 1 - разовая логика, пишется в файл раз в сессию для одного хидден листа ; 2 - при каждом init любого хидн листа дописывается статистика в файл);<br />
:'''HitTestDx''' = 5 - шаг с которым проходит автокликер по X;<br />
:'''HitTestDy''' = 5 - шаг с которым проходит автокликер по Y;<br />
<br />
Для HitTest==2, очень помогает параметр "allow_background". Остаётся только написать скриптулину, которая ходит сама между экранами.<br />
<br />
== Пример ==<br />
<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample<br />
<br />
HiddenList.rar<br />
<br />
[[Category:Game mechanic]]<br />
<br />
[[Category:Get Started]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=HiddenList&diff=9788HiddenList2019-02-22T08:51:39Z<p>Agava: /* Дополнительные параметры */</p>
<hr />
<div>{{TOC right}}<br />
HiddenList является менеджером поисковых [[Object|объектов]]. На сегодня HiddenList не просто управляет объектами на сцене - он отвечает за все штрафы и поощрения. В связке с такими объектами как [[HiddenHint]] + [[Effect]] HiddenList дает возможность реализовать систему подсказок, а также такие графические эффекты как: "ночь", "трансформация цвета" и т.д. с одним набором графики.<br />
<br />
==Общие параметры==<br />
(см. описание [[Object|Object]])<br />
<br />
[[Файл:HOList_1.jpg|right]]<br />
<br />
*'''имя''' ('' nm '') - Имя объекта HiddenList в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта HiddenList, который можно увидеть в строке "имя" либо при наведении курсора на неё.<br />
*'''синхронизация''' ('' sync '') - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' ('' sv '') - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' ('' z '') - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' ('' memo ''):<br />
:'''1''' - при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
:'''0''' - обновит свои параметры, при повторном открытии экрана.<br />
*'''группа''' ('' gr '') - Группа, в которую входит текущий объект.<br />
<br />
У листа также есть группы стандартных параметров такие как '''положение''', '''размер''', '''модификаторы'''. Но, по сути, они не важны. Главное, чтобы лист не перекрывал на сцене другие объекты. Поэтому ему лучше находиться за пределами сцены. <br />
<br />
==Основные параметры==<br />
<br />
*'''Картинка''' ('' res '') - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Обычно не используется, а применяется для отображения table;<br><br />
*'''Таблица''' ('' table '') - Объект типа [[table]], который является визуальным отображением списка. '''Должна быть обязательно''';<br><br />
*'''Подсказка''' ('' hint '') — объект типа [[HiddenHint]], который является менеджером хинтов;<br><br />
*'''highlighter''' ('' hl '') — объект типа [[HiddenHighLighter|hiddenhighlighter]], который подсвечивает не найденные объекты.;<br><br />
*'''Счетчик''' ('' hdncnt '') — объект типа [[Counter]], который отображает количество найденных объектов.<br><br />
В самом счетчике в параметрах нужно указать val = 0, поскольку изначально нет найденных объектов;<br />
*'''Таймер''' ('' timer '') — объект типа [[Timer]], который отображает время игры.<br />
При инициализации листа он передаст состояние "start" таймеру.<br />
*'''отладка''' ('' trace '') — Отображать в окне состояний текущий объект.<br />
<br />
<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''вычеркнуть''' ('' cross ''):<br />
:'''1''' - найденный объект вычеркивается, оставаясь в списке(таблице);<br />
:'''число''' - найденный объект удаляется из списка;<br />
*'''листать''' ('' scroll '')<br />
:'''1''' - список можно листать (скролировать);<br />
:'''число''' - ищутся только те объекты, которые видны в списке (таблице);<br />
*'''тип списка''' ('' kind '') - Тип поиска объектов:<br />
:'''1''' - слово;<br />
:'''2''' - предложение;<br />
:'''3''' - удаляемая пиктограмма;<br />
:'''4''' - пиктограмма;<br />
:'''5''' - поиск различий.<br />
*'''поиск пар''' ('' pair '') - Если 1, то идет поиска пар объектов с одинаковым типом, иначе обычный режим<br />
:'''пары''' - поиск пар;<br />
:'''одиночные''' - поиск по одному объекту.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''обычный''' ('' sndNrm '') - Звук при нахождении обычного [[HiddenObject]].<br />
*'''коллекционный''' ('' sndCol '') - Звук при нахождении коллекционного [[HiddenObject]](объекту должна быть установлена коллекция).<br />
<br />
<br />
<br />
'''Группа - параметры поиска'''<br />
<br />
*'''объектов''' ('' num '') - Максимальное количество доступных для поиска объектов в одной игровой сессии. (ВАЖНО!!! Таблице нужно установить общее количество ячеек равное(или больше) количеству доступных для поиска объектов).<br />
*'''активных объектов''' ('' numact '') - Максимальное количество активных объектов в одной игровой сессии.<br />
*'''видимых объектов''' ('' numvis'') - Максимальное количество видимых объектов в одной игровой сессии.<br />
*'''одного типа''' ('' max ''):<br />
:'''число''' - Максимальное количество объектов одного типа - поле тип в [[hiddenObject]] или хидден объекты с одинаковыми текстовыми ID могут считаться объектами одного типа;<br />
:'''-1''' - игнорируется.<br />
*'''прятать''' ('' hide '') - Делать невидимыми объекты, не участвующие в поиске.<br />
*'''оставлять''' ('' stay '') - Оставлять найденный объект на месте (вызывая только флаеры) при удачном клике.<br />
*'''актёр-иконка''' ('' actorIco '') - если "да", то во время полёта найденного хидден-объекта вместо него летит иконка которая помечена как "main picture" и указана в текстовом id хидден-объекта.<br><br />
*'''актер''' ('' actor '') - машина состояний, которая управляет процессом полета к таблице найденных [[HiddenObject]] .<br />
*'''z актера''' ('' actorZ '') - z актера. Будет применено только если не равен 0.<br />
*'''актер стартует из таблицы''' ('' actorTable '') - если настройка включена, то актер стартует не из позиции хиддена, а из ячейки таблицы .<br />
*'''целевой объект''' (''trg'') - Если задан, [[HiddenObject]] после нахождения летит не в ячейку таблицы, а к нему.<br />
<br />
<br />
<br />
'''Группа - скорость'''<br />
<br />
Отвечают за скорость перемещения найденного объекта.<br />
*'''полета''' ('' vf '') - Скорость полета в пикселях в секунду.<br />
*'''вращения''' ('' vr '') - Скорость вращения в градусах в секунду.<br />
<br />
<br />
<br />
'''Группа - равномерное распределение'''<br />
<br />
*'''включить''' ('' undist '') - Равномерно распределять объекты по площади сцены.<br />
*'''дополнительные сортировки''' ('' addit_algo '') - Использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами)<br />
<br />
'''Группа - итерационное распределение'''<br />
<br />
*'''включить''' ('' altern_algo '') - Использовать итерационный алгоритм поиска равномерного распределения объектов<br />
*'''учитывать сложности''' ('' process_diff '') - Учитывать сложности предметов при распределении<br />
*'''количество объектов''' ('' hiddens_num_threshold '') - Максимальное количество активных предметов на сцене для которых будут учитываться сложности (max = 24)<br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - Максимальное количество итераций фикса перекрытия объектов.<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - Максимальная допустимая площадь перекрытия в пикселях.<br />
*'''ключ распределения''' ('' distribution_seed '') - Ключ для случайного выбора заменяемого предмета (только для мультиплеера)<br />
*'''удалять перекрытия''' ('' del_after_fix '') - Удалять оставшиеся перекрытия после последней итерации фикса.<br />
<br />
Рекомендации по использованию:<br />
<br />
*Если включать "Удалять перекрытия", то нужно для счетчика кол-ва оставшихся хидденов считывать значение из "num".<br />
*Оптимальное значение максимальной площади - 1024 пикселей, т.е. допускаем перекрытие в 32 на 32 пикселя, что совсем не влияет на визуальное перекрытие объектов.<br />
*Количество итераций можем ставить 20-50. Если перекрытий не останется раньше, то фикс перекрытий остановится, если выполнится все количество - отобразится количество перекрытий в логах. Большое количество итераций фикса негативно сказывается на скорости загрузки сцены.<br />
<br />
Логи:<br />
<br />
<pre><br />
"Deleting a hidden object with textID: %i" - удаление объекта с текстовым ID<br />
"Overlapping detected! Area: %f px" - обнаружения перекрытия в столько-то пикселей<br />
"fixOverlapping() Iterations num: %i / %i; Overlaps num: %i" - итерации, итоговое количество перекрытий<br />
</pre><br />
<br />
==Дополнительные параметры==<br />
<br />
*'''скалирование объектов''' ('' scale_object '') - При нахождении во время полета объект будет скалироватся: <br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''пропадание объектов''' ('' alpha_object '') - При нахождении во время полета объект будет менять альфу:<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''реагировать на отпускание''' ('' touch_up '') - Объекты связанные с этим хидденлистом будут реагировать на отпускание, а не на нажатие:<br />
:'''0''' - отключено;<br />
:'''1''' - включено (То есть реагировать на четкий клик, если кликнули и сместили область клика объект не реагирует!).<br />
*'''реагировать на finger tap''' ('' finger_tap '') - Объекты, связанные с этим хидденлистом, будут реагировать на отпускание после ожидания даблтача.<br />
*'''задержка срабатывания''' ('' touch_delay '') - только для реакции на нажатие. Время между нажатием и реакцией списка объектов.<br />
*'''объединять одинаковые тексты''' ('' same_txt '') - Объекты с одинаковым текстом будут жить в одной ячейке таблицы с добавлением множителя xN.<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''множитель для иконок''' ('' ico_res '') - Графический ресурс(анимация) для отображения множителя у иконок для типа списка 4(поиск по иконкам) и включенного объединения одинаковых текстов. Первый фрейм - х2, второй - х3 и т.д.<br />
*'''исключать одинаковые тексты''' ('' unTxtID '') - исключает или не исключает из поиска объекты с одинаковыми txtID, используется совместно с '''одного типа'''.<br />
*'''показывать один объект игр''' ('' unTxtRep '') - Количество игр, в течении которых будет выбран один объект из данного набора. 0 - не использовать механизм<br />
*'''силуэты после слов''' ('' picsAfterWords '') - Стараться в силуэтах использовать то, что находилось в словах<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один<br />
*'''находить много одним кликом''' ('' canFoundMultiple '') - 1 - если тап попал на несколько объектов, то найдем все. 0 - только один<br />
*'''вероятность пассивного предпочитаемого объекта''' ('' prefProb '') - вероятность выпадения пассивного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''вероятность активного предпочитаемого объекта''' ('' prefProbAct '') - вероятность выпадения активного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''реагировать на невидимые''' ('' canInvis '') - реагировать или нет на объекты, которые в момент игры не видны в таблице. (Кликаются только те [[hiddenObject]] которые отображены в таблице, остальные нет!).<br />
<br />
<br />
'''Группа - равномерное распределение''' - в настоящее время не рекомендуется включать параметры из этой группы. Логика устарела и может конфликтовать со следующей группой итерационного распределения. Эта группа оставлена для возможной доработки в будущем. <br />
*'''включить''' ('' undist '') - равномерно распределять объекты по площади сцены. Да/нет. <br />
*'''дополнительные сортировки''' (''addit_algo'') - использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами). Да/нет. <br />
<br />
<br />
'''Группа - итерационное распределение''' - на данный момент лучший алгоритм равномерного распределения.<br />
*'''включить''' ('' altern_algo '') - использовать итерационный алгоритм поиска равномерного распределения объектов. Да/нет. <br />
*'''учитывать сложности''' ('' process_diff '') - учитывать сложности объектов при распределении. Подробнее о сложностях в описании соответствующего параметра в [[hiddenObject]]. Да/нет. <br />
*'''количество объектов''' ('' hiddens_num_threshold '') - максимальное количество активных предметов на сцене, для которых будут учитываться сложности. <br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - максимальное количество итераций фикса перекрытия объектов. По умолчанию 50, min="0" max="100".<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - максимальная допустимая площадь перекрытия в пикселях. По умолчанию 1024, min="0" max="2048". <br />
*'''ключ распределения''' ('' distribution_seed '') - ключ для случайного выбора заменяемого предмета (только для мультиплеера). min="0" max="32768".<br />
*'''удалять перекрытия''' ('' del_after_fix '') - удалять оставшиеся перекрытия после последней итерации фикса. Количество объектов получать из num, нет=0, да=1. <br />
<br />
<br />
*'''прятать актеров при старте''' ('' hideact '') - Устанавливать актерам видимость false при старте (по умолчанию - да)(То есть всем актерам которые находятся на сцене при запуске принудительно установиться vis = 0).<br />
*'''аномалия''' ('' anom '') - для всех аномалий кроме текстовой [[HiddenObject]] и игровой фон должны быть подобъектами [[Effect]]):<br />
:'''0''' - нет;<br />
:'''1''' - текстовая;<br />
:'''2''' - ночь; В машине которая выставляет эффект ночь, должны передавать сцене с объектом аномалия ( obj="scene"; par="drag"; val="0" ) и ( obj="scene"; st="update");<br />
:'''3''' - трансформация цвета;<br />
:'''4''' - дым.<br />
При применении аномалии "блитц" через объект [[Economics]] набор параметров: anom="0", is_blitz="1".<br />
*'''флурри''' ('' flurry '') - Нужно ли отправлять статистику флурри "regexp=":<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''вероятность инверсии''' ('' invProb '') - Вероятность того, что сцена будет перевернута по x;<br />
*'''набор''' ('' kit '') - Набор, из которого берутся объекты.<br />
*'''поведение дифференсов''' (''difbeh'') - Поведение найденных объектов в режиме поиск отличий.<br />
*'''сортировать по приоритету''' (''priorsort'') - Сортировать итоговый список по полю приоритет объекта. Высокий приоритет - сначала.<br />
*'''не давать ходить игроку''' (''botonly'') - Если включена - то хидден будет работать, но не будет принимать клики от игрока.<br />
*'''предметов по заданию не более''' (''taskless'') - Предметов по заданию не более заданного числа. -1 - без ограничений<br />
*'''неактивные улики как фон''' (''cluesbg'') - Если включена, то в хидденах связанные предметы, для которых есть неактивные таски, будут видны на фоне.<br />
<br />
<br />
'''Группа - появление новых объектов'''<br />
<br />
*'''время''' ('' acttm '') - Время появления объекта (мс);<br />
*'''начальный скейл''' ('' actsc '') - Начальный скейл;<br />
*'''начальная альфа''' ('' actal '') - Начальная альфа.<br />
<br />
<br />
<br />
'''Группа - сессии'''<br />
<br />
*'''сессионность''' ('' ses ''):<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''ограничение сессий''' ('' sesLim '') - Максимальное количество сессий, в которые можно играть.<br />
*'''набор объектов''' ('' sesSet '') - Набор объектов при заходе в хидден после последней сессии:<br />
:'''0''' - случайный;<br />
:'''1''' - последний фон;<br />
:'''2''' - пустой.<br />
<br />
<br />
<br />
'''Группа - цвета'''<br />
<br />
*'''Цвет обязательных''' ('' c_forced '') — цвет текста для обязательных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Цвет найденных''' ('' c_found '') — цвет текста для найденных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Время перехода''' ('' c_time '') - Время изменения цвета.<br />
<br />
<br />
<br />
'''Группа - время'''<br />
<br />
*'''игры''' ('' tmGm '') - Общее время игры. Если оно истекает, идет переход на экран [время вышло] (см.ниже):<br />
:'''-1''' - игнорируется;<br />
:'''число''' - время игры.<br />
*'''прерывать''' ('' tmInt ''):<br />
:'''1''' - по окончанию времени игра будет прервана;<br />
:'''0''' - по окончанию времени игра продолжится, но переход все равно будет на неудачную ветку.<br />
*'''паузы''' ('' tmWt '') - Время перед закрытием окна после разбора (для осмысления результата);<br />
*'''полета актера''' ('' tmActor '') - Время работы актера, после которого обрабатываются ячейки таблицы;<br />
*'''перед исчезновением''' ('' tmWtHide '') - Время, в течение которого объект остается видимым после обработки.<br />
*'''жизни актера''' ('' tmActorLife '') - Время жизни клона актера, после которого он будет удален меньше либо рано 0 - не удалять по времени<br />
<br />
<br />
<br />
'''Группа - ошибки'''<br />
<br />
*'''flyer при ошибке''' ('' fl '') - обычно объект типа flyer (летуны которых надо показать в точке клика, если этот клик ошибочный). Можно в принципе любой объект который обладает состоянием "beg". Ошибочный клик - все клики мимо [[hiddenObject]].<br />
*'''вычет времени при ошибке''' ('' tmPen '') - Сколько отнять миллисекунд за ошибочный клик.<br />
<br />
<br />
<br />
'''Группа - переход'''<br />
<br />
*'''при разборе''' ('' scrOk '') - Экран на который надо перейти, если все объекты найдены.<br />
*'''время вышло''' ('' scrOv '') - Экран на который надо перейти если время вышло, а не все объекты найдены.<br />
<br />
<br />
<br />
'''Группа - система очков'''<br />
<br />
*'''Счетчик''' ('' score_counter '') — счетчик, отображающий набранные очки.<br />
*'''счетчик (test)''' ('' score_counter_test '') — счетчик, отображающий набранные очки.<br />
*'''ID пака''' ('' pack_id '') — строковый идентификатор пака(для записи набранных очков в [[options]] должен быть заполнен); используется для вытаскивания суммарных очков в счетчики и дальнейшего их отображения.<br />
*'''ID игры''' ('' game_id '') — строковый идентификатор игры (сцены).<br />
'''Обязательно должен иметь префикс ID пака. Например, если pack_id = "pack1", то game_id = "pack1.game1"'''.<br />
*'''мультипликатор очков''' ('' scoreM '') — Мультипликатор очков за объект, если все собрано за отведенное время.<br />
*'''Очки''' ('' score '') — количество очков, которые даются за каждый найденный [[hiddenObject]].<br />
*'''Бонус за скорость''' ('' bonusS '') — бонус за быстро найденный [[hiddenObject]].<br />
*'''Бонусный интервал''' ('' bonusT '') — время, за которое нужно найти [[hiddenObject]] для получения бонуса.<br />
*'''бонус за время''' ('' bonusTime '') - бонус за оставшееся время игры = коэффициент который введем * оставшееся время таймера.<br />
*'''Бонусный мультипликатор''' ('' grow ''):<br />
:'''1''' - умножать очки за второй быстро найденный предмет на 2, за третий на 3, и т. д.<br />
:'''0''' - не умножать.<br />
*'''Количество кликов для штрафа''' ('' wrngC '') — количество неверных кликов, после которых запустится блокатор (см. ниже).<br />
*'''Интервал для штрафа''' ('' wrngT '') — время, за которое нужно совершить неверные клики.<br />
*'''Штраф (очки)''' ('' delS '') — Сколько отнимаем очков за ошибочный клик.<br />
*'''Штраф (время)''' ('' delT '') — Сколько отнимаем времени за ошибочный клик.<br />
*'''блокатор''' ('' blockImg '') - Объект, блокирующий сцену при серии ошибочных кликов. (Обычно маска растянутая на весь экран. '''ДОЛЖНА иметь состояние "beg"''').<br />
*'''время блокировки''' ('' blockTime '') - Время блокировки при серии ошибочных кликов по истечении переводит "блокатор" в состояние '''end'''.<br />
*'''порог touch move''' ('' mvSens '') - Порог, начиная с которого движение пальца воспринимается как мув и сбрасываются неправильные клики.<br />
*'''touch move как штраф''' ('' tchMvPen '') - Считать ли touch move за ложное попадание:<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''клик на найденный как штраф''' ('' clkFndPen '') - Считать ли клик на найденный объект за ложное попадание(актуально если объекты остаются на сцене).<br />
*'''аниматор очков''' ('' scoreAnim '') - машина, которая анимирует полученные очки, должна иметь состояние '''anim'''.<br />
*'''коэффициент комбо''' ('' cmbCoef '') - коэффициент для расчёта комбо очков по формуле s(n) = k * n * (n + 1).<br />
*'''счётчик очков за объект''' ('' objScCnt '') - счётчик который показывает очки за последний полученный объект (учитывая бонусы).<br />
*'''счётчик комбо-очков''' ('' cmbScCnt '') - счётчик очков полученных за комбо-серию.<br />
*'''счётчик комбо-серий''' ('' cmbRwCnt '') - счётчик который показывает комбо-серию (комбо из 2-х, 3-х и т.д. найденных объектов).<br />
*'''комбо2 прогресс''' ('' cmb2Pr '') - комбо2 прогресс;<br />
*'''комбо2 время''' ('' cmb2Tm '') - комбо2 время;<br />
*'''комбо2 кол-во''' ('' cmb2Num '') - комбо2 кол-во.<br />
*'''очки 3.0''' (''score30'') - Использовать систему очков, придуманную Степановым в августе 2015.<br />
*'''очки 3.0 коэф. комбо''' (''score30lc'') - в конце комбо даем за него очков n * s * l * (n-1) - где n число предметов в комбо, s - очки за один предмет, l - этот коэффициент<br />
*'''очки 3.0 коэф. аккуратности''' (''score30la'') - в конце игры начисляем очки за точность по формуле s * la / (1 + Nmiss / N)<br />
*'''очки 3.0 коэф. времени 1 (l)''' (''score30lt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки 3.0 коэф. времени 2 (t)''' (''score30tt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки детектив макс. комбо''' (''scoreDetMaxCombo'') - максимальное значение комбо для очков по системе детектива, используется при состоянии хидден-листа max_combo. Если в настройках хидден-листа очковая система "очки 3.0", то scoreDetMaxCombo должно быть равно <property name="комбо2 кол-во" id="cmb2Num" hint="комбо2 кол-во" type="int" label="комбо2 кол-во" value="1"/> +1. То есть, на 1 больше, чем значение комбо2 кол-во ('' cmb2Num '').<br />
*'''держать max_combo до тапа''' (''keepMaxCombo'') - Будет ли максимальное значение комбо после вызова max_combo храниться до тапа (да) или уменьшаться сразу (нет). Флаг используется только для состояния max_combo, обычный хидден останется прежним. Флаг обеспечит max_combo до первого тапа. То есть, чтобы комбо убывало по времени, но после первого тапа.<br />
<br />
<br />
'''Группа - звезды'''<br />
<br />
*'''combo num''' ('' comboNum '') - Количество быстро найденных объектов, нужное для получения звезды Combo.<br />
*'''combo time''' ('' comboInt '') - Интервал между кликами, считающимися быстрыми для Combo.<br />
*'''accuracy''' ('' accuracy '') - Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные).<br />
*'''лимит ложных кликов''' ('' starWrAcc '') - Лимит ложных кликов.<br />
Формула расчета проста, количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
'''Группа - новейшая адаптивность'''<br />
<br />
*'''включить''' ('' newAdOn '') - включить или выключить новый алгоритм адаптивности.<br />
*'''default T''' ('' newAdDefault '') - изначальное время, выданное игроку на нахождение одного хиддена. Указывается в миллисекундах.<br />
*'''относительное отклонение''' ('' newAdTimes '') - массив коэффициэнтов, применяемых к изначальному времени. Коэффициенты указываются в float и перечисляются через запятую.<br />
Первое число в массиве отвечает за переход на 0 сложностей, следующее на 1, на 2 и так далее. Более детальный алгоритм описан здесь: http://jira1:8090/pages/viewpage.action?pageId=18677822<br />
<br />
==Параметры бота и мультиплеера==<br />
<br />
'''Группа - Хидден бот'''<br />
<br />
*'''тип бота''' - тип бота:<br />
:'''нет''' - обычная одиночная игра, бот выключен;<br />
:'''на одном поле''' - игра с ботом на одном поле, у обоих одинаковый список предметов;<br />
:'''с маленьким полем''' - бот будет играть на отдельном поле (??????);<br />
:'''горячий стул''' - hotsit, игра двух живых игроков на одном девайсе, передача хода по очереди;<br />
:'''мультиплеер''' - игра через сервер с живым оппонентом;<br />
*'''файл уровня''' - xml файл с настройками сложности бота ([[HiddenList#Настройка сложности бота|пример]]);<br />
*'''номер уровня''' - номер уровня в файле (начиная с 0);<br />
*'''номер уровня max''' - если задан больше предыдущего номера - выбирается рандомное значение;<br />
*'''multiplayer''' - объект мультиплеера;<br />
*'''кнопка хинта''' - кнопка хинта для 2го игрока \ бота;<br />
*'''проверять интернет''' - проверять интернет при игре с ботом (так же, как при игре с живым игроком);<br />
*'''первый ход (вероятность)''' - вероятность первого хода игрока при игре с ботом (в процентах);<br />
*'''t min abs ms''' - самая минимальная задержка между ходами бота;<br />
*'''t1 min ms''' - минимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 max ms''' - максимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 prob %''' - вероятность быстрого нахождения предмета ботом;<br />
*'''t2 min ms''' - минимальное время для нахождения предмета ботом;<br />
*'''t2 max ms''' - максимальное время для нахождения предмета ботом;<br />
*'''t coef delta''' - коэффициент сложности (кажется от -1 до 1, могу ошибаться);<br />
*'''t wrong min ms''' - минимальное время между ложными кликами (мимо объекта) бота;<br />
*'''t wrong max ms''' - максимальное время между ложными кликами бота;<br />
*'''bot hint chance (percent)''' - шанс бота использовать хинт (в процентах);<br />
*'''bot hint num''' - максимальное кол-во использования хинтов ботом на игру;<br />
*'''доп. поле x''' - координаты доп. поля по Х;<br />
*'''доп. поле y''' - координаты доп. поля по Y;<br />
*'''доп. поле sx''' - масштаб доп. поля;<br />
*'''доп. поле sy''' - масштаб доп. поля;<br />
*'''указатель хода''' - указатель хода бота\оппонента. Должен иметь состояние ''beg'' и находитсья в сцене с хидденами;<br />
*'''родитель''' - родитель, в который поместим клонированную сцену (доп. поле);<br />
*'''счетчик очков бота''' - счетчик, выводящий очки;<br />
*'''счетчик без бонусов бота''' - счетчик, выводящий очки без бонусов за время и точность;<br />
*'''комбо2 прогресс бота''' - комбо2 прогресс;<br />
*'''аниматор очков бота''' - машина, которая при нахождении хиддена анимирует полученные очки;<br />
*'''счетчик очков за объект бот''' - счетчик, выводящий очки за объект;<br />
*'''счетчик комбо-серий (макс) бот''' - счетчик, выводящий макс. количество комбо-серий;<br />
*'''счетчик комбо-серий (тек) бот''' - счетчик, выводящий текущее количество комбо-серий;<br />
*'''flyer при ошибке''' - объект типа ''flyer'' который надо показать в точке клика, если этот клик ошибочный;<br />
*'''таймер хода бота''' - таймер хода бота;<br />
*'''таймер хода игрока''' - таймер хода игрока;<br />
*'''длительность хода ms''' - длительность хода игрока \ бота. Если задан 0 - игроки ходят одновременно;<br />
*'''длительность паузы между ходами ms''' - длительность паузы при смене хода игрока\бота.<br />
<br />
=== Настройка сложности бота ===<br />
<br />
Файл уровней для хидден-бота должен иметь такую структуру:<br />
<bots><br />
<obj id="0"><br />
<bot weight="3" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="21000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
<obj id="1"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="10000" t2max="25000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="7000" twrongmax="10000" /><br />
</obj><br />
<obj id="2"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="7000" t2max="21000" twrongmax="10000" /><br />
<bot weight="2" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
</bots><br />
<br />
*bots - основной таг<br />
*obj > id - номер уровня<br />
*bot - содержит те же параметры, что и настройки бота в хидден листе<br />
<br />
==Режим "блиц" с бесконечными объектами==<br />
<br />
'''Правила аномалии "блиц"''':<br />
<br />
*Блиц заканчивается победой, если игрок нашел хотя бы один предмет за отведенное время игры блиц.<br />
*Если время вышло, но не было найдено ни одного предмета, то засчитывается поражение.<br />
*В аномалии блиц количество возможных предметов ограничивается максимальным количеством уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num). А количество видимых предметов ограничивается количеством предметов, заданных на уровне мастерства локации. При постепенном разборе предметов добавляются новые пока не будет разобрано максимальное количество предметов на хидден сцене, либо, пока не закончится время, но одновременно видно предметов не больше, чем заданных на конкретном уровне мастерства локации.<br />
<br />
Для включения такого режима блиц используем поле в настройках хидден-листа:<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один. (да - использовать режим, нет - не использовать).<br />
<br />
Если в этом поле настройка "нет", то режим блиц работает по-старому: объектов столько, сколько указано в уровне мастерства.<br />
<br />
Прочитать, находится ли хидден в режиме блиц можно из поля "is_blitz" хидден листа (возможные значения - 0 или 1). Заполняется экономикой в момент старта локации.<br />
<br />
Для отображения в счетчике максимального количества уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num) вычитывать измененный num можно ТОЛЬКО ПОСЛЕ прихода start hiddenlist, т.е. не в ините.<br />
<br />
В экономике указываем блиц, как отдельную аномалию.<br />
<br />
==Состояния==<br />
<br />
Состояния которые есть у листа. Мы можем передавать их с помощью различных объектов:<br />
<br />
*'''init''' - инициализация хидден-листа;<br />
*'''invert''' - горизонтально отображает изображение;<br />
*'''run''' - переводит хидден в состояние активности, если до этого был на паузе;<br />
*'''pause''' - переводит хидден в состояние паузы, объекты не кликаются, таймер не идет;<br />
*'''pause_timer''' - объекты кликаются, но таймер не идет;<br />
*'''resume_timer''' - продолжить работу таймера, который был остановлен в состоянии ''pause_timer'';<br />
*'''add_time''' - добавить игрового времени (перед этим надо передать в param количество времени в ms)<br />
*'''swap_hiddens''' - меняет отображаемые в таблице поисковые объекты на случайные другие.<br />
*'''get_visible_ho''' - вернуть id активного HO объекта (объект пишет в себя два параметра - '''randomHO_id''' и '''randomHO_vis''' (id объекта и виден ли он сейчас юзеру)); Приоритет выбора HO объекта: с начала видимые юзеру, если таких нет - выводим невидимый на текущий момент HO (до предмета нужно фокусировать сцену);<br />
*'''max_combo''' - хидден начинается с максимальным значением комбо;<br />
*'''putback''' - вернуть случайный уже найденный обьект на экран и в список;<br />
*'''restart_no_anomaly''' - перезапустить хидден без аномалии;<br />
*'''finish''' - принудительно завершить игру.<br />
<br />
==Примечания==<br />
<br />
*HiddenList должен располагаться в дереве проекта ниже всех своих поисковых объектов.<br />
<br />
*Единственный '''обязательный объект''' о котором должен знать лист это [[Table]] для отображения списка поиска, даже если таблица не будет использоваться быть все равно должна!<br />
<br />
*После завершения хидден-игры (по разбору или по времени)при переходе на другой экран HiddenList записывает данные в опции в два места: первое - это то, которое указано у настройках (ID пака, ID уровня, тип списка), для каждой локации свое; а второе - это last_game. <br><br />
Например, <br><br />
'''last_game.time_spent''' (либо же '''pck_N.lvl_N.kind_N.time_spent''') - время последней игры, <br> <br />
'''last_game.clicks''' (либо же '''pck_N.lvl_N.kind_N.clicks''') - количество найденных объектов и т.д. <br><br />
Все их можно увидеть в опциях. last_game был придуман для того, чтобы было удобно задавать счетчики в окне результатов. Также эти данные могут быть сохранены в опциях, если задать листу состояние '''wait'''.<br />
<br />
*Для проверки кликабельности хидденобъектов можно воспользоваться следующими настройками в app.icf:<br />
<br />
<pre><br />
[GHiddenList]<br />
HitTest=0<br />
HitTestDx=1 - шаг по х<br />
HitTestDy=1 - шаг по y<br />
</pre><br />
<br />
в результате после перехода на сцену с хидденом появится файл, в котором будет казан объекты и координаты в которых они не тапаются.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''появляется новый объект: изменить состояние объекта''' ('' actst ''):<br />
:'''объект''' ('' obj '') - Объект, состояние которого нужно изменить;<br />
:'''состояние''' ('' st '') - Новое состояние объекта.<br />
<br />
[[Файл:HOList_3.jpg|right]]<br />
<br />
[[Файл:+.png]] '''разбор: если был экран''' ('' wscrOk '') - При нахождении всех объектов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''разбор: изменить состояние объекта''' ('' nstOk '') - При нахождении всех объектов, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''разбор: изменить параметр объекта''' ('' chgOk '') - При нахождении всех объектов, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '') - Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''нет предметов (при создании из динамического конфига)''' ('' nstNoObjects '') - при загрузке локации без хидден-объектов (например не подтянулся пак либо нет локализации) перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: если был экран''' ('' wscrOv '') - Если вышло время, а объекты не найдены, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''не успел: изменить состояние объекта''' ('' nstOv '') - Если вышло время, а объекты не найдены, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: изменить параметр объекта''' ('' chgOv '') - Если вышло время, а объекты не найдены, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '')- Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''счетчик очков''' ('' scoreCnt ''):<br />
:'''счетчик''' ('' cnt '') - Каунтер, которому приходят очки.<br />
<br />
[[Файл:+.png]] '''группа extra bonus''' ('' extraBonus ''). Используется для economics, при нахождении объекта с некой вероятностью может выпасть бонус. Объект который анимирует появление бонуса должен иметь состояние show, время на анимацию бонуса - 10 секунд:<br />
:'''монетки объект''' ('' coinsObj '') - объект который анимирует получение монет;<br />
:'''монетки вероятность''' ('' coinsProb '') - вероятность по нахождению объекта получить дополнительно монетки;<br />
:'''опыт объект''' ('' expObj '') - объект который анимирует получение опыта;<br />
:'''опыт вероятность''' ('' expProb '') - вероятность по нахождению объекта получить дополнительно опыт;<br />
:'''энергия объект''' ('' energyObj '') - объект который анимирует получение энергии;<br />
:'''энергия вероятность''' ('' energyProb '') - вероятность по нахождению объекта получить дополнительно энергию.<br />
<br />
[[Файл:+.png]] '''Объект, который срабатывает, если долго не находить хидден''' ('' notfnd ''):<br />
:'''объект''' ('' obj '') - Объект, который переводится в указанное состояние, если долго не находить хидден;<br />
:'''состояние''' ('' st '') - Состояние, в которое переводится объект;<br />
:'''время''' ('' tm '') - Время от последнего нахождения хиддена, после которого срабатывает объект.<br />
<br />
[[Файл:+.png]] '''параметры аномалии с исчезновением букв''' ('' hlPars ''):<br />
:'''оставшиеся буквы''' ('' min '') - Минимальное количество оставшихся букв в предложении;<br />
:'''задержка''' ('' wait '') - Момент времени, начиная с которого аномалия будет проявляться;<br />
:'''задержка 2''' ('' wait2 '') - Задержка для появившихся слов, изначально недоступных;<br />
:'''время''' ('' time '') - Время, за которое должны исчезнуть все буквы (если -1, то до конца времени в хиддене);<br />
:'''промежутки''' ('' dt '') - промежутки времени между каждой итерацией;<br />
:'''флайер''' ('' fl '') - Флайер, анимирующий исчезающую букву (должен иметь '''текстовый''' тип).<br />
<br />
[[Файл:+.png]] '''параметры аномалии ночь''' ('' nightPars ''): <br />
:'''effect''' ('' ef '') - эффект, управляющий трансформацией цвета;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего ночь.<br />
<br />
[[Файл:+.png]] '''параметры аномалии трансформации цвета''' ('' colInvPars ''):<br />
:'''effect''' ('' ef '') - Эффект, управляющий трансформацией цвета;<br />
:'''tags''' ('' eftags '') - Теги эффектов, реализующих трансформацию цвета, из которых будет выбран один.<br />
<br />
[[Файл:+.png]] '''параметры аномалии дым''' ('' smokePars ''): <br />
:'''effect''' ('' ef '') - Машина, управляющая эффектом дыма;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего дым.<br />
<br />
Все аномалии кроме текстовой должны быть настроены с помощью объекта [[Effect]]<br />
<br />
== Get Started==<br />
Минимальный набор ресурсов:<br />
* Фоновая картинка для поисковой сцены<br />
* Комплект картинок, с которых будут сделаны поисковые [[HiddenObject|объекты]]<br />
* Текстовые объекты для идентификации спрятанных объектов<br />
<br />
Минимальный набор объектов редактора:<br />
* [[Image]] который будет изменен в хидден-лист<br />
* [[Table|Таблица]] в которой будут отображаться тексты/картинки (зависит от режима) спрятанных объектов.<br />
* По одному [[Image]] для каждого спрятанного объекта (будут созданы автоматически при добавлении картинок из базы ресурсов на сцену)<br />
<br />
Наши действия:<br />
# откроем [[Интерфейс_ScenceEditor|редактор сцен]] и создадим новый проект,<br />
# добавим новый экран с именем ''scrHList''<br />
# создадим в этом экране сцену ''stgHList''<br />
# перейдём в [[Интерфейс_ResourceEditor|редактор ресурсов]]<br />
## создаём папку ''HList''<br />
## добавим в ней картинку для фона и картинки для спрятанных объектов.<br />
## выделим все картинки в дереве ресурсов и перенесем их на нашу сцену ''stgHList'', при этом для каждой картинки автоматически создастся объект [[Image]].<br />
## закроем редактор ресурсов<br />
# перейдём в [[Интерфейс_TextEditor|редактор текстов]]<br />
## создаём папку ''HListText''<br />
## добавим в нее текстовые объекты, по одному на каждый поисковый объект.<br />
## сохраним внесенные изменения.<br />
# перейдём в редактор сцен.<br />
# создадим в сцене stgHList объект [[Table]] и назовем его HOT<br />
## настроим размер и положение таблицы, согласно нашего дизайна<br />
## установим параметры колонок = "50", колонок видно = "5", строчек = "5", строчек видно = "1" (таким образом в таблице будут отображаться 5 поисковых предметов, а максимальное количество объектов для поиска будет равно 250)<br />
## установим параметры скорость листания = "650", добавлять по строкам = "0", центрировать = "растянуть", сдвигать ячейки при удалении ="да"<br />
# создадим в сцене stgHList объект '''HiddenList''', напоминаем что его размер и положение на сцене не имеют значения, по этому расположим его где-нибудь за границей экрана. <br>'''Важно''' В дереве проекта хидден-лист должен быть ниже всех своих поисковых объектов.<br />
## в поле таблица указываем нашу HOT<br />
## установим параметр объектов = "10"<br />
## установим параметр пропадание объектов = "да"<br />
## установим параметр реагировать на отпускание = "да"<br />
## установим параметр реагировать на невидимые = "нет"<br />
## установим параметр набор = "1"<br />
# Настроим объекты, которые будут прятаться. Для этого выделим картинки поисковых объектов, добавленные нами ранее, и изменим им тип на "hiddenObject". Оставляя группу этих объектов выделенной, настроим им параметры:<br />
## в поле list укажем наш HiddenList<br />
## параметр набор = "1"<br />
## Теперь снимаем выделение и каждому объекту в поле текстID перетаскиваем мышкой соответствующий текстовый объект из текстовой базы (поле текстID должно быть активно для редактирования - по нему нужно кликнуть мышкой)<br />
# сохраним проект<br />
# запустим [[Интерфейс_Viewer|вьювер]]<br />
<br />
== Динамический HG==<br />
Функционал позволяет генерировать HL самостоятельно HO объекты из файла конфига. <br />
<br />
П.С. - вся графика д.б. динамической. Данные файлы может создавать HO_Manager [http://wiki/index.php/HO_Manager Wiki HO_manager] <br />
[https://docs.google.com/document/d/13UUOKf_iJNzFx0PjU4JQIfYDX7NhK7dyfJAR3I-SWlQ/edit#heading=h.4pd8h5jdvqj4 Документ по динамических пакам]<br />
<br />
[[Файл:D485ecbbbb.jpg|right]]<br />
*'''файл уровня''' ('' configFile'') — указываем путь к файлу конфигу, где перечисляем файлы с HG. <br />
*'''список графических ресурсов''' — служебное, пока не используется;<br />
*'''список текстовых ресурсов''' — служебное, пока не используется;<br />
*'''номер уровня''' ('' hiddenLevelNum '') — номер уровня из файла;<br />
*'''образец хиддена''' ('' hiddenTemplate '') — obj_id HO объект, должен иметь нужные параметры (остальные возьмутся из конфига) ;<br />
*'''образец нашлёпки''' ('' hiddenPatchTempl '') — obj_id нашлёпки на HO объект, должна иметь нужные параметры (остальные возьмутся из конфига);<br />
*'''корневой объект''' ('' hiddenRoot '') — obj_id корневого объект в который сложим всех клонов;<br />
*'''точечный спецэффект''' ('' hiddenEffect '') — ;<br />
*'''фоновый объект ''' ('' hiddenBG '') — obj_id объекта которому поменяем ресурс;<br />
<br />
Требования, вся графика HO,BG отрисовывается без учёта пивоты;<br />
<br />
Файлы конфиги имеют вид:<br />
Файл уровня имеет вид:<br />
{<br />
"levels": [<br />
{<br />
"file": "ViewerFiles/DynHid/hidden0.cfg",<br />
"pack":3<br />
}<br />
]<br />
}<br />
<br />
:Где "levels" - линки на файлы уровней. <br />
:::"file" - путь к файлу;<br />
:::"pack" - пак в который попадут ресурсы;<br />
<br />
<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
"bg": {<br />
"src": "bg.png",<br />
"w": 2048,<br />
"h": 1151,<br />
"id": 16,<br />
"color": "#ffffff",<br />
"tile": ""<br />
},<br />
"hiddens": [<br />
{<br />
"id": 1022,<br />
"nm": "bucket_01",<br />
"res": 129,<br />
"bg": 666,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
},<br />
"objs": [{<br />
"res": 1488,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
}<br />
}],<br />
}, <br />
{<br />
"x": 1537,<br />
"y": 409,<br />
"id": 1023,<br />
"res": 329,<br />
"nm": "bucket_02",<br />
"rect": {<br />
"x": 1493,<br />
"y": 366,<br />
"w": 81,<br />
"h": 87<br />
}<br />
}<br />
],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
}<br />
}<br />
<br />
:Где "bg" - настройки фона. <br />
:::"src" - сорс графического файла в ресурсной базе;<br />
:::"color" - цвет которым будет залито под фоном, нужное если фон имеет дырки;<br />
:::"tile" - тайлинг фона;<br />
:::"id" - id ресурса из ресурсной базы;<br />
::"hiddens" - перечень HO с их настройками<br />
::::"id" - TxtId;<br />
::::"nm" - имя HO;<br />
::::"res" - графический ресурс HO;<br />
::::"bg" - графический ресурс тени;<br />
::::"rect" - настройки "res";<br />
:::::"x" - координата x, в координатах корневого объекта;<br />
:::::"y" - координата y, в координатах корневого объекта;<br />
:::::"w" - ширина;<br />
:::::"h" - высота;<br />
::::"objs" - перечень нашлёпок;<br />
:::::"res" - графический ресурс нашлёпки;<br />
:::::"rect" - настройки графического ресурса нашлёпки;<br />
::::::"x" - координата x, в координатах HO;<br />
::::::"y" - координата y, в координатах HO;<br />
::::::"w" - ширина;<br />
::::::"h" - высота;<br />
::"res" - ресурсы которые входят в пак уровня ( будут вырезаны при экспорте в пак уровня)<br />
::::"images" - перечень графических ресурсов<br />
::::"texts" - перечень текстовых ресурсов<br />
::::"sounds" - перечень звуковых ресурсов<br />
<br />
== Кроссворд ==<br />
Данный функционал базируется на динамических HG и настраивается в файле динамического уровня.<br />
<br />
=== Мода 2 - слова с мусором ===<br />
[[Файл:Crossword mode2.jpg|right|500x500px]]<br />
Данная мода представляет собой HO объекты и текстовую таблицу, при нахождении предмета, в текстовой таблице подсвечиваются буквы слова.<br />
<br />
Настройка в HiddenList указывается в теге '''кроссворд - мода 2 - слова с мусором''' ('''_G_17'''):<br />
* '''режим кроссворда''' ('''cwon''') - использовать/не использовать режим;<br />
* '''подуровень''' ('''sub_level''') - подуровень;<br />
* '''root''' ('''cw2root''') - родитель текстового поля, координаты будут установлены согласно параметрам "x","y";<br />
* '''text''' ('''cw2text''') - линк на текстовый объект, в котором будем отображать текстовое поле; <br />
* '''цвет найденных''' ('''colorFound''') - цвет букв найденных слов в нашем текстовом поле;<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
...<br />
"hiddens": [ ... ],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
},<br />
"mode2" : {<br />
"en" : [<br />
{<br />
"ids" : [ 3032, 4480, 4491, 4493, 4494, 4499 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 414,<br />
"x" : -682,<br />
"y" : -300<br />
},<br />
"string_check" : "XObatHWZIF|RJLhacksaw|QVPNsaddle|AECGDaxeYU|doveSlante|rnBMTKGEAQ",<br />
"string_display" : "XOBATHWZIF|RJLHACKSAW|QVPNSADDLE|AECGDAXEYU|DOVESLANTE|RNBMTKGEAQ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 4485, 4487, 4490, 4495, 4502, 17112 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "FskatesNTH|ALMboomera|ngWERODrad|ioSKBZoarP|tableGball|oonJXCUIYV",<br />
"string_display" : "FSKATESNTH|ALMBOOMERA|NGWERODRAD|IOSKBZOARP|TABLEGBALL|OONJXCUIYV",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
],<br />
"ru" : [<br />
{<br />
"ids" : [ 4481, 4485, 4490, 4495, 4500, 4508 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ЕконькиМЭк|олокольчик|ХАрадиоШве|слоВбабочк|аЖИЛкастрю|ляУЯРТНСКЮ",<br />
"string_display" : "ЕКОНЬКИМЭК|ОЛОКОЛЬЧИК|ХАРАДИОШВЕ|СЛОВБАБОЧК|АЖИЛКАСТРЮ|ЛЯУЯРТНСКЮ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 3053, 4480, 4487, 4494, 4502, 4507 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ШЩЧУГЮДзве|здаНОМТЕХб|умерангИЪс|толЗЖЪбита|УфонарьЮпо|дарокХПЭБТ",<br />
"string_display" : "ШЩЧУГЮДЗВЕ|ЗДАНОМТЕХБ|УМЕРАНГИЪС|ТОЛЗЖЪБИТА|УФОНАРЬЮПО|ДАРОКХПЭБТ",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
]<br />
}<br />
<br />
:где "mode2" - настройки моды 2;<br />
:::"en", "ru" - языковые локали;<br />
::::"ids" - массив textID активных HO;<br />
::::"nm" - имя уровня - для нашего удобства;<br />
::::"num" - количество активных объектов == размеру массива '''ids''';<br />
::::"numvis" - количество всего объектов,используем для задания фоновых объектов (количество которых == numvis - num);<br />
::::"rect_field" - ректангл активной зоны (пока не используется);<br />
::::"rect_text" - ректангл текстового поля(пока не используется);<br />
::::"string_check" - текстовое поле регистро-зависимое - для HL; <br />
::::"string_display" - текстовое поле для отображения;<br />
::::"x" - координата x родительского объекта для текста;<br />
::::"y" - координата y родительского объекта для текста;<br />
<br />
П.С. данную моду генерирует программа HGcrossword (https://docs.google.com/document/d/1RXSNUxNePF4qEibAPoCgfdiQycxoggc6Hu7a9VUjxSI/edit#)<br />
<br />
== Авто тест HL ==<br />
Для запуска автотеста, нам нужно указать в app.icf параметры:<br />
<br />
[GHiddenList]<br />
:'''HitTest''' - мода автотеста; (0- выкл.; 1 - разовая логика, пишется в файл раз в сессию для одного хидден листа ; 2 - при каждом init любого хидн листа дописывается статистика в файл);<br />
:'''HitTestDx''' = 5 - шаг с которым проходит автокликер по X;<br />
:'''HitTestDy''' = 5 - шаг с которым проходит автокликер по Y;<br />
<br />
Для HitTest==2, очень помогает параметр "allow_background". Остаётся только написать скриптулину, которая ходит сама между экранами.<br />
<br />
== Пример ==<br />
<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample<br />
<br />
HiddenList.rar<br />
<br />
[[Category:Game mechanic]]<br />
<br />
[[Category:Get Started]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Tool&diff=9785Tool2019-02-07T15:54:29Z<p>Agava: /* Описание для чего используется объект Tool */</p>
<hr />
<div>{{TOC right}}<br />
[[Object|Объект]] '''Tool''' - "применение" - объект, который можно применить для других игровых объектов.<br />
<br />
== Описание для чего используется объект Tool==<br />
<br />
Объект '''Tool''' — это игровой объект, который мы можем добавить в инвентарь, извлечь из инвентаря, применять на другие объекты, изменять им состояние, вернуть в инвентарь и удалить из инвентаря.<br />
При этом не требуется описание сложных машин, где задавались состояния для инвентаря: add (добавление в инвентарь), extract (извлечение из инвентаря и последующего его использования), return (возвращение в инвентарь), remove (удаление объекта и удаление из инвентаря).<br />
Объект Tool существует и имеет область применения в рамках всех существующих (или заданных) экранов.<br />
<br />
Например: <br />
<br />
[[Файл:Tt.PNG|1000px]]<br />
<br />
<br />
'''Общие параметры'''<br />
(см. описание [[Object|Object]])<br />
<br />
*'''[[прокликиваемая]]''' - Если 1, то кнопка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то кнопка сама обрабатывает клик, но и пропускает его дальше;<br />
*'''память''' - Если 1, то при повторном открытии экрана объект не обновляет свое состояние (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
*'''курсор''' - Графический ресурс курсора текущего и всех дочерних объектов.<br />
*'''сохранение параметров''' - Сохранение параметров" regexp="нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3.<br />
*'''состояние''' - Начальное состояние инструмента. Если его нет будет установлено состояние add - по клику добавляться в инвентарь.<br />
<br />
[[Файл:Descr.JPG|thumb|400px|right|Пример подписи при drag]]<br />
<br />
== Основные параметры ==<br />
[[Файл:Tool1.png|thumb|250px|right|Настройки подписи]]<br />
* '''Инвентарь''' - обязательно в свойствах должен быть указан инвентарь с которым связан объект, а с инвентарем — таблица, в ячейках которой хранятся объекты (см. свойства объекта [[Inventory|Inventory]])<br />
* '''Флаер''' - Флаер, который тул будет использовать для подсветки при состоянии hint.<br />
* '''Машина для полета в инвентарь''' - Машина для реализации кастомной анимации полета. Должна иметь состояния beg - начать полет, будет вызвано инвентарем и end - полет завершен, будет проверяться инвентарем. <br />
* '''Приклеивать''' - "нет"- не приклеивать (по умолчанию), "если есть move" - приклеивать при клике к мышкой, "всегда" - разрешит ему приклеиваться, даже если отключено получение событий движения мыши при отпущенной кнопке (в app.icf должен быть прописан mouseOver=1).<br />
* '''В центр при дропе''' - Ставить в центр при дропе.<br />
* '''Хранить масштаб''' - Сохранять масштаб при добавлении в инвентарь и восстанавливать после извлечения.<br />
* '''Подпись''' - Текстовый объект, который тул будет отображать при таскании.<br />
* '''Текст''' - Айди текстового ресурса, который будет отображаться при таскании.<br />
* '''Время''' - Время видимости текстового хинта. 0 - хинт не исчезает.<br />
'''Группа - Положение подписи'''<br />
*'''txt_x''' - Положение по оси х объекта с подписью. Отсчитывается от точки пивота тула.<br />
*'''txt_y''' - Положение по оси y объекта с подписью. Отсчитывается от точки пивота тула.<br />
'''Группа - Статистика'''<br />
*'''id_item''' - ID тула для статистики.<br />
*'''событие на add''' - Имя события на добавления тула в инвентарь.<br />
*'''add один раз''' - Посылать событие добавления предмета только один раз.<br />
*'''событие на успешный дроп''' - Событие на успешный дроп.<br />
*'''вкл. выкл. хинта кликом''' - да/нет - включить/выключить по клику на тул текстовую подпись.<br />
<br />
Например: необходимо, чтобы при клике мышкой на объект Tool выводилось текстовое сообщение от этом объекте. Для этого необходимо сначала создать текстовый объект (см. рисунок - txt_ax) и текстовый id в базе ресурсов с текстом, открыть его в параметре "Подпись" (1), перетянуть текстовый id из базы ресурсов в параметр "Текст"(2) и указать время отображения и положение относительно точки пивота объекта Tool.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''Add''' - состояние объекта, в котором он по клику на него добавит себя в инвентарь. В этом состоянии можно изменить другой объект:<br />
* объект - При добавлении объекта в инвентарь перевести объект в состояние из следующего поля;<br />
* состояние - Новое состояние для объекта из предыдущего поля;<br />
* свойство - Параметр, который мы изменяем;<br />
* значение - Новое значение параметра.<br />
<br />
[[Файл:Tool2.png|thumb|300px|right|Настройки подписи]]<br />
<br />
[[Файл:+.png]] '''Fail drop''' - неудачный дроп, т.е. объект Tool применили не к тому объекту. При этом можно можно изменить другой объект:<br />
* объект - При неудачном дропе объекта перевести объект в состояние из следующего поля;<br />
* состояние - Новое состояние для объекта из предыдущего поля;<br />
* свойство - Параметр, который мы изменяем;<br />
* значение - Новое значение параметра.<br />
<br />
[[Файл:+.png]]'''Drag'''- если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект "прилипнет" к мышке, и будет за ней таскаться. Параметры команды:<br />
* x1 - разрешено таскать, когда координата объекта правее; <br />
* x2 - разрешено таскать, когда координата объекта левее; <br />
* y1 - разрешено таскать, когда координата объекта ниже; <br />
* y2 - разрешено таскать, когда координата объекта выше;<br />
* obj -у какого объекта надо изменить состояние st (следующее поле);<br />
* st - на какое надо изменить состояние объекта obj (предыдущее поле);<br />
* за пивот - таскать объект за пивот, 0 - за ту точку, за которую схватили.<br />
<br />
[[Файл:+.png]] '''Drop''' - если нажатая кнопка мышки отпускается, вызывается эта команда, используется вместе с командой drop. <br />
Параметры команды:<br />
* obj - объект, на который надо уронить таскаемый;<br />
* obj2go - объект, который в результате дропа изменит состояние;<br />
* go — состояние в которое нужно перейти после окончания времени, т.е. новое состояние объекта obj2go;<br />
* свойство — параметр, который мы изменяем;<br />
* значение — новое значение параметра;<br />
* del — если 1 — объект Tool удаляется из инвентаря сразу после применения на объект obj, т.е. при использовании объект сам себе установит состояние remove, если 0 - объект Tool не удаляется из инвентаря после применения на объект obj. <br />
: Примечание: Если Tool не удаляется после применения, то он остается лежать поверху объекта, на который был совершен дроп. Если Tool перетащить за пределы объекта, на который был дроп, то при отпускании Tool вернется в инвентарь. Чтобы после применения Tool самостоятельно вернулся в инвентарь, нужно передать объекту Tool состояние return или в поле del указать значение 1. Если в дальнейшем Tool нужно будет удалить, то его необходимо перевести в состояние remove.<br />
<br />
== Состояния объекта Tool ==<br />
<br />
У объекта '''Tool''' есть 6 состояний, которые можно задавать машиной:<br />
<br />
* '''idle''' - дефолтное состояние, объект на клики, драг, дроп не реагирует;<br />
* '''add''' - объект лежит, но по клику на него добавит себя в инвентарь;<br />
* '''hint''' - подсветить себя. Если объект находится в таблице - то пролистает таблицу к этому объекту и подсветит его;<br />
* '''forced_add''' - объект добавляет себя в инвентарь (сразу по вызову состояния, безо всяких кликов), при этом срабатывает обработчик add, который может переводить различные объекты в другое состояние.<br />
После любого из этих двух состояний объект переходит в состояние:<br />
* '''extract''' - объект лежит в инвентаре и ждет пока его вытащат;<br />
* '''return''' - объект возвращается в инвентарь, где бы он ни был;<br />
* '''remove''' - объект удаляется из инвентаря навсегда, но при этом остается на сцене.<br />
* '''delete''' - объект удаляется из инвентаря навсегда и при этом становится невидимым.<br />
<br />
== Пример использования объекта Tool ==<br />
В данном примере используется объект Топор, который имеет тип Tool, со следующими параметрами.<br />
<br />
[[Файл:Tool3.png|700px]] [[Файл:Tool8.png|300px]]<br />
<br />
По клику на объект (Топор) - в машине ax_clone вызывается состояние off, где объект Tool (ах) переходит в состояние forced_add, т.е. добавляется в инвентарь.<br />
<br />
[[Файл:Tool4_1.jpg|500px]] [[Файл:Tool5.jpg|500px]] <br />
<br />
Если мы вытаскиваем объект из инвентаря (т.е. выполняем Drag) и никуда не применяем (т.е. не выполняем команду Drop), объект автоматически возвращается в инвентарь. Когда объект (Топор) роняем на объект Стул (машина Maska_stul2), то объект Maska_stul2 принимает новое состояние:<br />
1) потащили Топор на Стул;<br />
2) вызвали новое состояние объекта Maska_stul2 (топор стал рубить стул).<br />
<br />
[[Файл:Tool6.jpg|500px]] [[Файл:Tool7_1.jpg|500px]]<br />
<br />
<br />
[[Category:Game mechanic]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Tool&diff=9784Tool2019-02-07T15:47:26Z<p>Agava: /* Пример использования объекта Tool */</p>
<hr />
<div>{{TOC right}}<br />
[[Object|Объект]] '''Tool''' - "применение" - объект, который можно применить для других игровых объектов.<br />
<br />
== Описание для чего используется объект Tool==<br />
<br />
Объект '''Tool''' — это игровой объект, который мы можем добавить в инвентарь, извлечь из инвентаря, применять на другие объекты, изменять им состояние, вернуть в инвентарь и удалить из инвентаря.<br />
При этом не требуется описание сложных машин, где задавались состояния для инвентаря: add (добавление в инвентарь), extract (извлечение из инвентаря и последующего его использования), return (возвращение в инвентарь), remove (удаление объекта и удаление из инвентаря).<br />
Объект Tool существует и имеет область применения в рамках всех существующих (или заданных) экранов.<br />
<br />
Например: <br />
[[Файл:Tt.PNG|1000px]]<br />
<br />
<br />
'''Общие параметры'''<br />
(см. описание [[Object|Object]])<br />
<br />
*'''[[прокликиваемая]]''' - Если 1, то кнопка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то кнопка сама обрабатывает клик, но и пропускает его дальше;<br />
*'''память''' - Если 1, то при повторном открытии экрана объект не обновляет свое состояние (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
*'''курсор''' - Графический ресурс курсора текущего и всех дочерних объектов.<br />
*'''сохранение параметров''' - Сохранение параметров" regexp="нет=0, только объект=1, объект с подобъектами=2, только подобъекты=3.<br />
*'''состояние''' - Начальное состояние инструмента. Если его нет будет установлено состояние add - по клику добавляться в инвентарь.<br />
<br />
[[Файл:Descr.JPG|thumb|400px|right|Пример подписи при drag]]<br />
== Основные параметры ==<br />
[[Файл:Tool1.png|thumb|250px|right|Настройки подписи]]<br />
* '''Инвентарь''' - обязательно в свойствах должен быть указан инвентарь с которым связан объект, а с инвентарем — таблица, в ячейках которой хранятся объекты (см. свойства объекта [[Inventory|Inventory]])<br />
* '''Флаер''' - Флаер, который тул будет использовать для подсветки при состоянии hint.<br />
* '''Машина для полета в инвентарь''' - Машина для реализации кастомной анимации полета. Должна иметь состояния beg - начать полет, будет вызвано инвентарем и end - полет завершен, будет проверяться инвентарем. <br />
* '''Приклеивать''' - "нет"- не приклеивать (по умолчанию), "если есть move" - приклеивать при клике к мышкой, "всегда" - разрешит ему приклеиваться, даже если отключено получение событий движения мыши при отпущенной кнопке (в app.icf должен быть прописан mouseOver=1).<br />
* '''В центр при дропе''' - Ставить в центр при дропе.<br />
* '''Хранить масштаб''' - Сохранять масштаб при добавлении в инвентарь и восстанавливать после извлечения.<br />
* '''Подпись''' - Текстовый объект, который тул будет отображать при таскании.<br />
* '''Текст''' - Айди текстового ресурса, который будет отображаться при таскании.<br />
* '''Время''' - Время видимости текстового хинта. 0 - хинт не исчезает.<br />
'''Группа - Положение подписи'''<br />
*'''txt_x''' - Положение по оси х объекта с подписью. Отсчитывается от точки пивота тула.<br />
*'''txt_y''' - Положение по оси y объекта с подписью. Отсчитывается от точки пивота тула.<br />
'''Группа - Статистика'''<br />
*'''id_item''' - ID тула для статистики.<br />
*'''событие на add''' - Имя события на добавления тула в инвентарь.<br />
*'''add один раз''' - Посылать событие добавления предмета только один раз.<br />
*'''событие на успешный дроп''' - Событие на успешный дроп.<br />
*'''вкл. выкл. хинта кликом''' - да/нет - включить/выключить по клику на тул текстовую подпись.<br />
<br />
Например: необходимо, чтобы при клике мышкой на объект Tool выводилось текстовое сообщение от этом объекте. Для этого необходимо сначала создать текстовый объект (см. рисунок - txt_ax) и текстовый id в базе ресурсов с текстом, открыть его в параметре "Подпись" (1), перетянуть текстовый id из базы ресурсов в параметр "Текст"(2) и указать время отображения и положение относительно точки пивота объекта Tool.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''Add''' - состояние объекта, в котором он по клику на него добавит себя в инвентарь. В этом состоянии можно изменить другой объект:<br />
* объект - При добавлении объекта в инвентарь перевести объект в состояние из следующего поля;<br />
* состояние - Новое состояние для объекта из предыдущего поля;<br />
* свойство - Параметр, который мы изменяем;<br />
* значение - Новое значение параметра.<br />
<br />
[[Файл:Tool2.png|thumb|300px|right|Настройки подписи]]<br />
<br />
[[Файл:+.png]] '''Fail drop''' - неудачный дроп, т.е. объект Tool применили не к тому объекту. При этом можно можно изменить другой объект:<br />
* объект - При неудачном дропе объекта перевести объект в состояние из следующего поля;<br />
* состояние - Новое состояние для объекта из предыдущего поля;<br />
* свойство - Параметр, который мы изменяем;<br />
* значение - Новое значение параметра.<br />
<br />
[[Файл:+.png]]'''Drag'''- если на объект наступили мышкой, и не отпуская его, начали перемещать, то при наличии этой команды, объект "прилипнет" к мышке, и будет за ней таскаться. Параметры команды:<br />
* x1 - разрешено таскать, когда координата объекта правее; <br />
* x2 - разрешено таскать, когда координата объекта левее; <br />
* y1 - разрешено таскать, когда координата объекта ниже; <br />
* y2 - разрешено таскать, когда координата объекта выше;<br />
* obj -у какого объекта надо изменить состояние st (следующее поле);<br />
* st - на какое надо изменить состояние объекта obj (предыдущее поле);<br />
* за пивот - таскать объект за пивот, 0 - за ту точку, за которую схватили.<br />
<br />
[[Файл:+.png]] '''Drop''' - если нажатая кнопка мышки отпускается, вызывается эта команда, используется вместе с командой drop. <br />
Параметры команды:<br />
* obj - объект, на который надо уронить таскаемый;<br />
* obj2go - объект, который в результате дропа изменит состояние;<br />
* go — состояние в которое нужно перейти после окончания времени, т.е. новое состояние объекта obj2go;<br />
* свойство — параметр, который мы изменяем;<br />
* значение — новое значение параметра;<br />
* del — если 1 — объект Tool удаляется из инвентаря сразу после применения на объект obj, т.е. при использовании объект сам себе установит состояние remove, если 0 - объект Tool не удаляется из инвентаря после применения на объект obj. <br />
: Примечание: Если Tool не удаляется после применения, то он остается лежать поверху объекта, на который был совершен дроп. Если Tool перетащить за пределы объекта, на который был дроп, то при отпускании Tool вернется в инвентарь. Чтобы после применения Tool самостоятельно вернулся в инвентарь, нужно передать объекту Tool состояние return или в поле del указать значение 1. Если в дальнейшем Tool нужно будет удалить, то его необходимо перевести в состояние remove.<br />
<br />
== Состояния объекта Tool ==<br />
<br />
У объекта '''Tool''' есть 6 состояний, которые можно задавать машиной:<br />
<br />
* '''idle''' - дефолтное состояние, объект на клики, драг, дроп не реагирует;<br />
* '''add''' - объект лежит, но по клику на него добавит себя в инвентарь;<br />
* '''hint''' - подсветить себя. Если объект находится в таблице - то пролистает таблицу к этому объекту и подсветит его;<br />
* '''forced_add''' - объект добавляет себя в инвентарь (сразу по вызову состояния, безо всяких кликов), при этом срабатывает обработчик add, который может переводить различные объекты в другое состояние.<br />
После любого из этих двух состояний объект переходит в состояние:<br />
* '''extract''' - объект лежит в инвентаре и ждет пока его вытащат;<br />
* '''return''' - объект возвращается в инвентарь, где бы он ни был;<br />
* '''remove''' - объект удаляется из инвентаря навсегда, но при этом остается на сцене.<br />
* '''delete''' - объект удаляется из инвентаря навсегда и при этом становится невидимым.<br />
<br />
== Пример использования объекта Tool ==<br />
В данном примере используется объект Топор, который имеет тип Tool, со следующими параметрами.<br />
<br />
[[Файл:Tool3.png|700px]] [[Файл:Tool8.png|300px]]<br />
<br />
По клику на объект (Топор) - в машине ax_clone вызывается состояние off, где объект Tool (ах) переходит в состояние forced_add, т.е. добавляется в инвентарь.<br />
<br />
[[Файл:Tool4_1.jpg|500px]] [[Файл:Tool5.jpg|500px]] <br />
<br />
Если мы вытаскиваем объект из инвентаря (т.е. выполняем Drag) и никуда не применяем (т.е. не выполняем команду Drop), объект автоматически возвращается в инвентарь. Когда объект (Топор) роняем на объект Стул (машина Maska_stul2), то объект Maska_stul2 принимает новое состояние:<br />
1) потащили Топор на Стул;<br />
2) вызвали новое состояние объекта Maska_stul2 (топор стал рубить стул).<br />
<br />
[[Файл:Tool6.jpg|500px]] [[Файл:Tool7_1.jpg|500px]]<br />
<br />
<br />
[[Category:Game mechanic]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Options&diff=9782Options2019-01-11T13:56:12Z<p>Agava: /* Внешние команды */</p>
<hr />
<div>{{TOC right}}<br />
'''Options''' - [[Object|объект]], который используется для хранения и управления глобальными параметрами приложения. Также '''Options''' позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
== Общие параметры ==<br />
Смотреть описание [[Object|Object]].<br />
<br />
== Основные параметры ==<br />
[[Файл:opt2.jpg|right]]<br />
*'''язык''' ''(lang)'' - Язык, принудительно используемый приложением.<br />
*'''url обновлений''' ''(surl)'' - url, по которому ищем обновления опций.<br />
*'''sound''' ''(sound)'' - Громкость звука:<br />
:'''1''' - максимальный,<br />
:'''0''' - отключен.<br />
*'''music''' ''(music)''- Громкость музыки:<br />
:'''1''' - максимальная,<br />
:'''0''' - отключена.<br />
*'''voice''' ''(voice)'' - Голос рассказчика:<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''ambient''' ''(ambient)'' - Громкость окружающих звуков (шелест листьев, шум дождя, пения птиц и т.д.):<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''курсор''' ''(curs)'' - Графический ресурс курсора по умолчанию для всего проекта.<br />
*'''page''' ''(page)'' - Номер страницы для книги.<br />
*'''fullScreen''' ''(fullScreen)'' - Полноэкранный режим, используется в приложениях для PC: <br />
:'''1''' - на весь экран, <br />
:'''0''' - в окне.<br />
*'''immersive mode''' ''(immersive)'' -<br />
*'''activity''' ''(activity)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bg''' ''(fl_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bar''' ''(fl_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''аниматор загрузки''' - аниматор загрузки динамических ресурсов для flash. Должен иметь состояния ''start'' и ''progress'', а также графический ресурс аниматора ('''он обязательно должен быть статическим!!!'''), который будет рисоваться в месте загружаемого динамического ресурса.<br />
*'''show progress''' ''(progr)'' - 1 - Отображать не только крутилку activity, но и прогрессбар (кастомный или беленький программный).<br />
*'''loading bg''' ''(res_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''loading bar''' ''(res_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''поле ввода''' ''(edit)'' - Объект типа edit, из которого будет браться имя при добавлении/редактировании профилей (состояние add у опций).<br />
*'''таблица''' ''(table)'' - Объект типа table, в который мы будем складывать все профиля (состояние update у опций).<br />
*'''разрешить рекламу''' ''(ad)'' - Разрешить или нет показ рекламы объектом [[Advertisement]]:<br />
:'''1''' - разрешить,<br />
:'''0''' - запретить<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:opt.jpg|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по нажатию правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''ввод пустого имени''' - При попытке добавить пустое имя состоянием add будет изменено состояние заданного объекта.<br />
*'''объект''' - При попытке добавить пустое имя перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''ввод существующего имени''' - Когда будет введено существующее имя, изменить состояние заданного объекта.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Back''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Menu''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Windows - кнопка ESC''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - успех''' - При успешном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - ошибка''' - При ошибочном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из паузы''' - При возврате из паузы перевести объект в новое состояние.<br />
*'''объект''' - При возврате из паузы перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Переход в полноэкранный режим''' - При переходе в полноэкранный режим перевести объект в новое состояние.<br />
*'''объект''' - При переходе в полноэкранный режим перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из полноэкранного режима''' - При выходе из полноэкранного режима перевести объект в новое состояние.<br />
*'''объект''' - При выходе из полноэкранного режима перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<br />
[[Файл:+.png]] '''Смена разрешения''' - При смене разрешения перевести объект в новое состояние.<br />
*'''объект''' - При смене разрешения перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<pre><br />
При смене разрешения объект переведётся в новое состояние уже после записи новых resh, resw, а не как при возврате из <br />
(переходе в) полноэкранный режим.<br />
</pre><br />
<br />
<pre><br />
!!! Если в машине, которая вызывается по нажатию на Android-кнопку, есть обращение к опциям, то это обращение нужно писать в другом<br />
состоянии, через команду '''wait'''<br />
</pre><br />
<br />
<pre><br />
!!! Машину, которая вызывается по нажатию на Android-кнопку, нужно размещать на расшариной сцене, если в ней есть команда '''wait'''<br />
потому, что эта команда работает, если прописана на текущем экране, а не на фоновом (глобальном, не текущем).<br />
</pre><br />
<br />
[[Файл:+.png]] '''одинаковые имена''' - Когда будет введено существующее имя (в поле edit), перевести объект в состояние из следующего поля.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
== Дополнительные стандартные параметры ==<br />
<br />
* '''rlang''' - Текущий язык устройства, если не указан принудительно какой-либо язык (параметр ''lang'').'''При каждом запуске вьювера этот параметр будет перебиваться, в зависимости от системной локализации'''.<br />
* '''r_install''' - Дата и время установки в секундах.<br />
* '''r_hours''' - Время прошедшее с момента установки в часах.<br />
* '''r_playtime''' - Время нахождения в игре в минутах.<br />
* '''r_launches''' - Количество запусков игры.<br />
* '''r_days''' - Сколько дней подряд запускалась игра, если пропускается хотя бы день, то сбрасывается. <br />
* '''r_lastlaunch''' - Дата и время последнего запуска в секундах.<br />
* '''downloadErrCode''' - Код ошибки возвращаемый при неудачной загрузке:<br />
:'''1''' - неизвестная ошибка (возможно нет интернета),<br />
:'''2''' - отключён wi-fi,<br />
:'''3''' - недоступна карта памяти,<br />
:'''4''' - недостаточно места на карте памяти для загрузки,<br />
:'''5''' - ошибка при распаковке архива (чаще всего, не хватает места для распаковки архива).<br />
* '''reloadScrID''' - id экрана, на который мы перейдем после перегрузки лейаута. Перегрузка вызывается в команде init в машине состояний.<br />
* '''curScrID''' - id текущего экрана.<br />
* '''prevScrID''' - id предыдущего экрана.<br />
<br />
== Состояния ==<br />
Объект '''Options''' обладает рядом состояний:<br />
*'''init''' - Инициализация опций.<br />
*'''add''' - Добавить новый профиль из заданного поля ввода и сделать его текущим.<br />
*'''update''' - Заполнить заданную таблицу списком профилей.<br />
*'''change''' - Сменить профиль на выбранный на данный момент в таблице.<br />
*'''delete''' - Удалить выбранный профиль (выбранный в таблице профилей).<br />
*'''generate''' - Генерирует имя профиля по умолчанию при создании нового профиля.<br />
*'''save''' - Сохранение всех параметров в опции. Это состояние вызывается автоматически при переходе между экранами, выгрузки и закрытии приложения. При его вызове приложение физически открывает файл options.xml и записывает туда данные. Частое обращение к этому файлу снизит быстродействие нашего приложения.<br />
*'''edit''' - С текущего поля ввода считывает имя и устанавливает его для текущего профиля.<br />
*'''reset''' - Заменяет файл Options файлом Options_default, то есть сбрасываются все параметры и устанавливаются все параметры по умолчанию<br />
*'''clear_cur_player''' - Удаляет весь текущий прогресс по выбранному профилю, таким образом можно организовать прохождение игры заново для одного и того же профиля.<br />
*'''delete_node''' - Удаляет ''ноду'' в опциях, вычитав ее название из поля ''param''.<br />
*'''readCursor''' - Считать новый ресурс курсора из объекта опций. <br />
*'''updateCursor''' - Обновить курсор над объектом, который под мышкой.<br />
*'''invariantCursor''' - Курсор не изменяется при наведении над объектами с переопределенным курсором.<br />
*'''variableCursor''' - Курсор меняется при наведении над объектами с переопределенным курсором.<br />
*'''disableCursor''' - Курсор отключается полностью. <br />
*'''check_server''' - Запросить обновление опций с сервера. <br />
*'''send_options''' - Отправить опции на сервер. <br />
*'''sendExtCommand''' - Отправить внешнюю команду.<br />
*'''updateVolumes''' - Обновить уровень громкости музыки и звуков.<br />
*'''setGroupMember''' - устанавливаем группе ( id из поля '''groupID'''), единственного члена группы ( id из поля '''groupMemID'''), важно: к группе не должен быть подвязан ни один объект [[Group#Ручное управление группой|Детальнее]].<br />
*'''checkInternet''' - проверяет подключение к интернету, вызывает обработчики '''internetYES''' при наличии интернета и '''internetNO''' при его отсутствии.<br />
*'''calculateDate''' - вычисляет календарную дату времени (текущее игровое время + добавляет время из поля param (в секундах)), выводит информацию в параметры "dateDay", "dateMonth", "dateYear".<br />
<br />
== Испольозвание опций для хранения настроек ==<br />
<br />
Рассмотрим маленькие примеры, которые часто встречаются в окнах с настройками игры.<br />
<br />
[[Файл:Opt 4.jpg|right]]<br />
<br />
1. Отправить письмо <br><br />
<br />
Для объекта типа ''"button"'' следует прописать следующее:<br />
<br />
[[Файл:Opt 5.jpg]]<br />
<br />
2. Сменить язык <br><br />
Организовывается с помощью объектов типа ''"groupbox"'' и ''"checkbox"'':<br><br />
<br />
[[Файл:Opt 6.jpg]]<br />
<br />
Благодаря такой конструкции при выборе одного (в данном случае) языка снимается галочка со второго. В самом чекбоксе следует прописать следующее:<br><br />
<br />
[[Файл:Opt 7.jpg]]<br />
<br />
Изначально следует проверить язык устройства и установить соответствующий чекбокс:<br><br />
<br />
[[Файл:Opt 8.jpg]]<br />
<br />
== Использование Options ==<br />
<br />
Options могут быть использованы, чтобы записывать переменные и опции игрока, которые будут использоваться между сессиями.<br />
Чтобы записать переменную в Options, нужно сделать set с галочками obj, par и val.<br />
В obj мы заносим наш обьект Options, в par - название переменной, а в val - ее значение.<br />
<br />
[[Файл:Setopt.JPG]]<br />
<br />
Переменные хранятся в файле options.xml в папке, которая находится по пути C:\Users\agava\AppData\Roaming\Absolutist\(название игры).<br />
Можно записывать переменные через точки - они определяют вложенность переменной в xml-файле.<br />
Например, запись p0.tutorial.tutorial_all будет означать XML-атрибут tutorial_all, который лежит в XML-теге tutorial, который в свою очередь лежит в теге p0.<br />
В файле это выглядит так: <br />
<p0><br />
<tutorial tutorial_all="1"/><br />
</p0><br />
<br />
Эту переменную можно в любой момент изменить с помощью команды set, или же вытащить для использования с помощью команды var. Например, чтобы увеличить ее на некоторое значение.<br />
<br />
[[Файл:Setopt2.JPG]]<br />
<br />
Также в опции пишут свои данные некоторые обьекты, такие как economics, eitems, taskorganizer и другие в виде (название обьекта)(ID в проекте).<br />
Данные, которые они пишут, удобно использовать, например, в счетчиках, или в if-ах для проверки достижения значений.<br />
<br />
[[Файл:Setopt3.JPG]]<br />
<br />
Здесь можно понять, что счетчик берет свое значение из тега eitems22 (это автополе, создаваемое обьектом eitems c objID=22), из атрибута i10773 (автоматически созданный атрибут, который означает предмет экономики с txtID=10773).<br />
Такой счетчик будет обновлять свое значение каждый раз, когда мы будем передавать ему состояние read/read_anim.<br />
<br />
[[Category:Options|*]]<br />
<br />
== Внешние команды ==<br />
Используются для общения с Flash вьювером в web версиях приложений. Могут приходить из flash или отправляться во флеш. <br />
<br />
Реакция на внешнюю команду настраивается через объект options:<br />
<br />
[[Файл:Options cmd 1.jpeg]]<br />
<br />
<br />
Если мы хотим отправить команду, мы указываем её имя и передаём состояние sendExtCommand:<br />
<br />
[[Файл:Options cmd 2.jpg]]<br />
<br />
<br />
Список команд:<br />
<br />
* '''cmdShowMenu''' - отправляем, если хотим поднять табы ( по умолчанию табы выключены).<br />
* '''cmdLevel''' - отправляем, при повышении уровня игрока ( в extCommandParam - указываем текущий уровень).<br />
* '''cmdScore''' - отправляем, при при закрытиях окон "после монстра" и "после локации" ( в extCommandParam - указываем текущее значение общих очков - public.EconomicsTotalScore).<br />
* '''cmdFullscreenDisabled''' - команда приходит, если нужно спрятать кнопки перехода фулскрина ( в связи с багами в версии флеша и браузера), приходить один раз за сессию.<br />
* '''cmdFullscreenFailed''' - команда приходит каждый раз, при показе системного окна о том, что мы не можем перейти в полноэкранный режим ( в связи с багами в версии флеша и браузера).<br />
<br />
Общие для экономических проектов:<br />
<br />
* '''cmdShowGame''' - приходит, если нажали на таб "игра".<br />
* '''cmdShowInvite''' - приходит, если нажали на таб "Друзья". <br />
* '''cmdShowBank''' - приходит, если нажали на таб "Банк".<br />
* '''cmdShowGifts''' - приходит, если нажали на таб "Лидеры".</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Options&diff=9781Options2019-01-10T15:01:19Z<p>Agava: /* Примеры */</p>
<hr />
<div>{{TOC right}}<br />
'''Options''' - [[Object|объект]], который используется для хранения и управления глобальными параметрами приложения. Также '''Options''' позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
== Общие параметры ==<br />
Смотреть описание [[Object|Object]].<br />
<br />
== Основные параметры ==<br />
[[Файл:opt2.jpg|right]]<br />
*'''язык''' ''(lang)'' - Язык, принудительно используемый приложением.<br />
*'''url обновлений''' ''(surl)'' - url, по которому ищем обновления опций.<br />
*'''sound''' ''(sound)'' - Громкость звука:<br />
:'''1''' - максимальный,<br />
:'''0''' - отключен.<br />
*'''music''' ''(music)''- Громкость музыки:<br />
:'''1''' - максимальная,<br />
:'''0''' - отключена.<br />
*'''voice''' ''(voice)'' - Голос рассказчика:<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''ambient''' ''(ambient)'' - Громкость окружающих звуков (шелест листьев, шум дождя, пения птиц и т.д.):<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''курсор''' ''(curs)'' - Графический ресурс курсора по умолчанию для всего проекта.<br />
*'''page''' ''(page)'' - Номер страницы для книги.<br />
*'''fullScreen''' ''(fullScreen)'' - Полноэкранный режим, используется в приложениях для PC: <br />
:'''1''' - на весь экран, <br />
:'''0''' - в окне.<br />
*'''immersive mode''' ''(immersive)'' -<br />
*'''activity''' ''(activity)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bg''' ''(fl_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bar''' ''(fl_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''аниматор загрузки''' - аниматор загрузки динамических ресурсов для flash. Должен иметь состояния ''start'' и ''progress'', а также графический ресурс аниматора ('''он обязательно должен быть статическим!!!'''), который будет рисоваться в месте загружаемого динамического ресурса.<br />
*'''show progress''' ''(progr)'' - 1 - Отображать не только крутилку activity, но и прогрессбар (кастомный или беленький программный).<br />
*'''loading bg''' ''(res_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''loading bar''' ''(res_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''поле ввода''' ''(edit)'' - Объект типа edit, из которого будет браться имя при добавлении/редактировании профилей (состояние add у опций).<br />
*'''таблица''' ''(table)'' - Объект типа table, в который мы будем складывать все профиля (состояние update у опций).<br />
*'''разрешить рекламу''' ''(ad)'' - Разрешить или нет показ рекламы объектом [[Advertisement]]:<br />
:'''1''' - разрешить,<br />
:'''0''' - запретить<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:opt.jpg|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по нажатию правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''ввод пустого имени''' - При попытке добавить пустое имя состоянием add будет изменено состояние заданного объекта.<br />
*'''объект''' - При попытке добавить пустое имя перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''ввод существующего имени''' - Когда будет введено существующее имя, изменить состояние заданного объекта.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Back''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Menu''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Windows - кнопка ESC''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - успех''' - При успешном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - ошибка''' - При ошибочном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из паузы''' - При возврате из паузы перевести объект в новое состояние.<br />
*'''объект''' - При возврате из паузы перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Переход в полноэкранный режим''' - При переходе в полноэкранный режим перевести объект в новое состояние.<br />
*'''объект''' - При переходе в полноэкранный режим перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из полноэкранного режима''' - При выходе из полноэкранного режима перевести объект в новое состояние.<br />
*'''объект''' - При выходе из полноэкранного режима перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<br />
[[Файл:+.png]] '''Смена разрешения''' - При смене разрешения перевести объект в новое состояние.<br />
*'''объект''' - При смене разрешения перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<pre><br />
При смене разрешения объект переведётся в новое состояние уже после записи новых resh, resw, а не как при возврате из <br />
(переходе в) полноэкранный режим.<br />
</pre><br />
<br />
<pre><br />
!!! Если в машине, которая вызывается по нажатию на Android-кнопку, есть обращение к опциям, то это обращение нужно писать в другом<br />
состоянии, через команду '''wait'''<br />
</pre><br />
<br />
<pre><br />
!!! Машину, которая вызывается по нажатию на Android-кнопку, нужно размещать на расшариной сцене, если в ней есть команда '''wait'''<br />
потому, что эта команда работает, если прописана на текущем экране, а не на фоновом (глобальном, не текущем).<br />
</pre><br />
<br />
[[Файл:+.png]] '''одинаковые имена''' - Когда будет введено существующее имя (в поле edit), перевести объект в состояние из следующего поля.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
== Дополнительные стандартные параметры ==<br />
<br />
* '''rlang''' - Текущий язык устройства, если не указан принудительно какой-либо язык (параметр ''lang'').'''При каждом запуске вьювера этот параметр будет перебиваться, в зависимости от системной локализации'''.<br />
* '''r_install''' - Дата и время установки в секундах.<br />
* '''r_hours''' - Время прошедшее с момента установки в часах.<br />
* '''r_playtime''' - Время нахождения в игре в минутах.<br />
* '''r_launches''' - Количество запусков игры.<br />
* '''r_days''' - Сколько дней подряд запускалась игра, если пропускается хотя бы день, то сбрасывается. <br />
* '''r_lastlaunch''' - Дата и время последнего запуска в секундах.<br />
* '''downloadErrCode''' - Код ошибки возвращаемый при неудачной загрузке:<br />
:'''1''' - неизвестная ошибка (возможно нет интернета),<br />
:'''2''' - отключён wi-fi,<br />
:'''3''' - недоступна карта памяти,<br />
:'''4''' - недостаточно места на карте памяти для загрузки,<br />
:'''5''' - ошибка при распаковке архива (чаще всего, не хватает места для распаковки архива).<br />
* '''reloadScrID''' - id экрана, на который мы перейдем после перегрузки лейаута. Перегрузка вызывается в команде init в машине состояний.<br />
* '''curScrID''' - id текущего экрана.<br />
* '''prevScrID''' - id предыдущего экрана.<br />
<br />
== Состояния ==<br />
Объект '''Options''' обладает рядом состояний:<br />
*'''init''' - Инициализация опций.<br />
*'''add''' - Добавить новый профиль из заданного поля ввода и сделать его текущим.<br />
*'''update''' - Заполнить заданную таблицу списком профилей.<br />
*'''change''' - Сменить профиль на выбранный на данный момент в таблице.<br />
*'''delete''' - Удалить выбранный профиль (выбранный в таблице профилей).<br />
*'''generate''' - Генерирует имя профиля по умолчанию при создании нового профиля.<br />
*'''save''' - Сохранение всех параметров в опции. Это состояние вызывается автоматически при переходе между экранами, выгрузки и закрытии приложения. При его вызове приложение физически открывает файл options.xml и записывает туда данные. Частое обращение к этому файлу снизит быстродействие нашего приложения.<br />
*'''edit''' - С текущего поля ввода считывает имя и устанавливает его для текущего профиля.<br />
*'''reset''' - Заменяет файл Options файлом Options_default, то есть сбрасываются все параметры и устанавливаются все параметры по умолчанию<br />
*'''clear_cur_player''' - Удаляет весь текущий прогресс по выбранному профилю, таким образом можно организовать прохождение игры заново для одного и того же профиля.<br />
*'''delete_node''' - Удаляет ''ноду'' в опциях, вычитав ее название из поля ''param''.<br />
*'''readCursor''' - Считать новый ресурс курсора из объекта опций. <br />
*'''updateCursor''' - Обновить курсор над объектом, который под мышкой.<br />
*'''invariantCursor''' - Курсор не изменяется при наведении над объектами с переопределенным курсором.<br />
*'''variableCursor''' - Курсор меняется при наведении над объектами с переопределенным курсором.<br />
*'''disableCursor''' - Курсор отключается полностью. <br />
*'''check_server''' - Запросить обновление опций с сервера. <br />
*'''send_options''' - Отправить опции на сервер. <br />
*'''sendExtCommand''' - Отправить внешнюю команду.<br />
*'''updateVolumes''' - Обновить уровень громкости музыки и звуков.<br />
*'''setGroupMember''' - устанавливаем группе ( id из поля '''groupID'''), единственного члена группы ( id из поля '''groupMemID'''), важно: к группе не должен быть подвязан ни один объект [[Group#Ручное управление группой|Детальнее]].<br />
*'''checkInternet''' - проверяет подключение к интернету, вызывает обработчики '''internetYES''' при наличии интернета и '''internetNO''' при его отсутствии.<br />
*'''calculateDate''' - вычисляет календарную дату времени (текущее игровое время + добавляет время из поля param (в секундах)), выводит информацию в параметры "dateDay", "dateMonth", "dateYear".<br />
<br />
== Испольозвание опций для хранения настроек ==<br />
<br />
Рассмотрим маленькие примеры, которые часто встречаются в окнах с настройками игры.<br />
<br />
[[Файл:Opt 4.jpg|right]]<br />
<br />
1. Отправить письмо <br><br />
<br />
Для объекта типа ''"button"'' следует прописать следующее:<br />
<br />
[[Файл:Opt 5.jpg]]<br />
<br />
2. Сменить язык <br><br />
Организовывается с помощью объектов типа ''"groupbox"'' и ''"checkbox"'':<br><br />
<br />
[[Файл:Opt 6.jpg]]<br />
<br />
Благодаря такой конструкции при выборе одного (в данном случае) языка снимается галочка со второго. В самом чекбоксе следует прописать следующее:<br><br />
<br />
[[Файл:Opt 7.jpg]]<br />
<br />
Изначально следует проверить язык устройства и установить соответствующий чекбокс:<br><br />
<br />
[[Файл:Opt 8.jpg]]<br />
<br />
== Использование Options ==<br />
<br />
Options могут быть использованы, чтобы записывать переменные и опции игрока, которые будут использоваться между сессиями.<br />
Чтобы записать переменную в Options, нужно сделать set с галочками obj, par и val.<br />
В obj мы заносим наш обьект Options, в par - название переменной, а в val - ее значение.<br />
<br />
[[Файл:Setopt.JPG]]<br />
<br />
Переменные хранятся в файле options.xml в папке, которая находится по пути C:\Users\agava\AppData\Roaming\Absolutist\(название игры).<br />
Можно записывать переменные через точки - они определяют вложенность переменной в xml-файле.<br />
Например, запись p0.tutorial.tutorial_all будет означать XML-атрибут tutorial_all, который лежит в XML-теге tutorial, который в свою очередь лежит в теге p0.<br />
В файле это выглядит так: <br />
<p0><br />
<tutorial tutorial_all="1"/><br />
</p0><br />
<br />
Эту переменную можно в любой момент изменить с помощью команды set, или же вытащить для использования с помощью команды var. Например, чтобы увеличить ее на некоторое значение.<br />
<br />
[[Файл:Setopt2.JPG]]<br />
<br />
Также в опции пишут свои данные некоторые обьекты, такие как economics, eitems, taskorganizer и другие в виде (название обьекта)(ID в проекте).<br />
Данные, которые они пишут, удобно использовать, например, в счетчиках, или в if-ах для проверки достижения значений.<br />
<br />
[[Файл:Setopt3.JPG]]<br />
<br />
Здесь можно понять, что счетчик берет свое значение из тега eitems22 (это автополе, создаваемое обьектом eitems c objID=22), из атрибута i10773 (автоматически созданный атрибут, который означает предмет экономики с txtID=10773).<br />
Такой счетчик будет обновлять свое значение каждый раз, когда мы будем передавать ему состояние read/read_anim.<br />
<br />
[[Category:Options|*]]<br />
<br />
== Внешние команды ==<br />
Используются для общения с Flash вьювером в web версиях приложений. Могут приходить из flash или отправляться во флеш. <br />
<br />
Реакция на внешнюю команду настраивается через объект options:<br />
[[Файл:Options cmd 1.jpeg]]<br />
<br />
<br />
Если мы хотим отправить команду, мы указываем её имя и передаём состояние sendExtCommand:<br />
[[Файл:Options cmd 2.jpg]]<br />
<br />
<br />
<br />
Список команд:<br />
<br />
* '''cmdShowMenu''' - отправляем, если хотим поднять табы ( по умолчанию табы выключены).<br />
* '''cmdLevel''' - отправляем, при повышении уровня игрока ( в extCommandParam - указываем текущий уровень).<br />
* '''cmdScore''' - отправляем, при при закрытиях окон "после монстра" и "после локации" ( в extCommandParam - указываем текущее значение общих очков - public.EconomicsTotalScore).<br />
* '''cmdFullscreenDisabled''' - команда приходит, если нужно спрятать кнопки перехода фулскрина ( в связи с багами в версии флеша и браузера), приходить один раз за сессию.<br />
* '''cmdFullscreenFailed''' - команда приходит каждый раз, при показе системного окна о том, что мы не можем перейти в полноэкранный режим ( в связи с багами в версии флеша и браузера).<br />
<br />
Общие для экономических проектов:<br />
* '''cmdShowGame''' - приходит, если нажали на таб "игра".<br />
* '''cmdShowInvite''' - приходит, если нажали на таб "Друзья". <br />
* '''cmdShowBank''' - приходит, если нажали на таб "Банк".<br />
* '''cmdShowGifts''' - приходит, если нажали на таб "Лидеры".</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Options&diff=9780Options2019-01-10T14:56:59Z<p>Agava: /* Использование Options */</p>
<hr />
<div>{{TOC right}}<br />
'''Options''' - [[Object|объект]], который используется для хранения и управления глобальными параметрами приложения. Также '''Options''' позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
== Общие параметры ==<br />
Смотреть описание [[Object|Object]].<br />
<br />
== Основные параметры ==<br />
[[Файл:opt2.jpg|right]]<br />
*'''язык''' ''(lang)'' - Язык, принудительно используемый приложением.<br />
*'''url обновлений''' ''(surl)'' - url, по которому ищем обновления опций.<br />
*'''sound''' ''(sound)'' - Громкость звука:<br />
:'''1''' - максимальный,<br />
:'''0''' - отключен.<br />
*'''music''' ''(music)''- Громкость музыки:<br />
:'''1''' - максимальная,<br />
:'''0''' - отключена.<br />
*'''voice''' ''(voice)'' - Голос рассказчика:<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''ambient''' ''(ambient)'' - Громкость окружающих звуков (шелест листьев, шум дождя, пения птиц и т.д.):<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''курсор''' ''(curs)'' - Графический ресурс курсора по умолчанию для всего проекта.<br />
*'''page''' ''(page)'' - Номер страницы для книги.<br />
*'''fullScreen''' ''(fullScreen)'' - Полноэкранный режим, используется в приложениях для PC: <br />
:'''1''' - на весь экран, <br />
:'''0''' - в окне.<br />
*'''immersive mode''' ''(immersive)'' -<br />
*'''activity''' ''(activity)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bg''' ''(fl_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bar''' ''(fl_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''аниматор загрузки''' - аниматор загрузки динамических ресурсов для flash. Должен иметь состояния ''start'' и ''progress'', а также графический ресурс аниматора ('''он обязательно должен быть статическим!!!'''), который будет рисоваться в месте загружаемого динамического ресурса.<br />
*'''show progress''' ''(progr)'' - 1 - Отображать не только крутилку activity, но и прогрессбар (кастомный или беленький программный).<br />
*'''loading bg''' ''(res_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''loading bar''' ''(res_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''поле ввода''' ''(edit)'' - Объект типа edit, из которого будет браться имя при добавлении/редактировании профилей (состояние add у опций).<br />
*'''таблица''' ''(table)'' - Объект типа table, в который мы будем складывать все профиля (состояние update у опций).<br />
*'''разрешить рекламу''' ''(ad)'' - Разрешить или нет показ рекламы объектом [[Advertisement]]:<br />
:'''1''' - разрешить,<br />
:'''0''' - запретить<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:opt.jpg|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по нажатию правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''ввод пустого имени''' - При попытке добавить пустое имя состоянием add будет изменено состояние заданного объекта.<br />
*'''объект''' - При попытке добавить пустое имя перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''ввод существующего имени''' - Когда будет введено существующее имя, изменить состояние заданного объекта.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Back''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Menu''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Windows - кнопка ESC''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - успех''' - При успешном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - ошибка''' - При ошибочном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из паузы''' - При возврате из паузы перевести объект в новое состояние.<br />
*'''объект''' - При возврате из паузы перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Переход в полноэкранный режим''' - При переходе в полноэкранный режим перевести объект в новое состояние.<br />
*'''объект''' - При переходе в полноэкранный режим перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из полноэкранного режима''' - При выходе из полноэкранного режима перевести объект в новое состояние.<br />
*'''объект''' - При выходе из полноэкранного режима перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<br />
[[Файл:+.png]] '''Смена разрешения''' - При смене разрешения перевести объект в новое состояние.<br />
*'''объект''' - При смене разрешения перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<pre><br />
При смене разрешения объект переведётся в новое состояние уже после записи новых resh, resw, а не как при возврате из <br />
(переходе в) полноэкранный режим.<br />
</pre><br />
<br />
<pre><br />
!!! Если в машине, которая вызывается по нажатию на Android-кнопку, есть обращение к опциям, то это обращение нужно писать в другом<br />
состоянии, через команду '''wait'''<br />
</pre><br />
<br />
<pre><br />
!!! Машину, которая вызывается по нажатию на Android-кнопку, нужно размещать на расшариной сцене, если в ней есть команда '''wait'''<br />
потому, что эта команда работает, если прописана на текущем экране, а не на фоновом (глобальном, не текущем).<br />
</pre><br />
<br />
[[Файл:+.png]] '''одинаковые имена''' - Когда будет введено существующее имя (в поле edit), перевести объект в состояние из следующего поля.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
== Дополнительные стандартные параметры ==<br />
<br />
* '''rlang''' - Текущий язык устройства, если не указан принудительно какой-либо язык (параметр ''lang'').'''При каждом запуске вьювера этот параметр будет перебиваться, в зависимости от системной локализации'''.<br />
* '''r_install''' - Дата и время установки в секундах.<br />
* '''r_hours''' - Время прошедшее с момента установки в часах.<br />
* '''r_playtime''' - Время нахождения в игре в минутах.<br />
* '''r_launches''' - Количество запусков игры.<br />
* '''r_days''' - Сколько дней подряд запускалась игра, если пропускается хотя бы день, то сбрасывается. <br />
* '''r_lastlaunch''' - Дата и время последнего запуска в секундах.<br />
* '''downloadErrCode''' - Код ошибки возвращаемый при неудачной загрузке:<br />
:'''1''' - неизвестная ошибка (возможно нет интернета),<br />
:'''2''' - отключён wi-fi,<br />
:'''3''' - недоступна карта памяти,<br />
:'''4''' - недостаточно места на карте памяти для загрузки,<br />
:'''5''' - ошибка при распаковке архива (чаще всего, не хватает места для распаковки архива).<br />
* '''reloadScrID''' - id экрана, на который мы перейдем после перегрузки лейаута. Перегрузка вызывается в команде init в машине состояний.<br />
* '''curScrID''' - id текущего экрана.<br />
* '''prevScrID''' - id предыдущего экрана.<br />
<br />
== Состояния ==<br />
Объект '''Options''' обладает рядом состояний:<br />
*'''init''' - Инициализация опций.<br />
*'''add''' - Добавить новый профиль из заданного поля ввода и сделать его текущим.<br />
*'''update''' - Заполнить заданную таблицу списком профилей.<br />
*'''change''' - Сменить профиль на выбранный на данный момент в таблице.<br />
*'''delete''' - Удалить выбранный профиль (выбранный в таблице профилей).<br />
*'''generate''' - Генерирует имя профиля по умолчанию при создании нового профиля.<br />
*'''save''' - Сохранение всех параметров в опции. Это состояние вызывается автоматически при переходе между экранами, выгрузки и закрытии приложения. При его вызове приложение физически открывает файл options.xml и записывает туда данные. Частое обращение к этому файлу снизит быстродействие нашего приложения.<br />
*'''edit''' - С текущего поля ввода считывает имя и устанавливает его для текущего профиля.<br />
*'''reset''' - Заменяет файл Options файлом Options_default, то есть сбрасываются все параметры и устанавливаются все параметры по умолчанию<br />
*'''clear_cur_player''' - Удаляет весь текущий прогресс по выбранному профилю, таким образом можно организовать прохождение игры заново для одного и того же профиля.<br />
*'''delete_node''' - Удаляет ''ноду'' в опциях, вычитав ее название из поля ''param''.<br />
*'''readCursor''' - Считать новый ресурс курсора из объекта опций. <br />
*'''updateCursor''' - Обновить курсор над объектом, который под мышкой.<br />
*'''invariantCursor''' - Курсор не изменяется при наведении над объектами с переопределенным курсором.<br />
*'''variableCursor''' - Курсор меняется при наведении над объектами с переопределенным курсором.<br />
*'''disableCursor''' - Курсор отключается полностью. <br />
*'''check_server''' - Запросить обновление опций с сервера. <br />
*'''send_options''' - Отправить опции на сервер. <br />
*'''sendExtCommand''' - Отправить внешнюю команду.<br />
*'''updateVolumes''' - Обновить уровень громкости музыки и звуков.<br />
*'''setGroupMember''' - устанавливаем группе ( id из поля '''groupID'''), единственного члена группы ( id из поля '''groupMemID'''), важно: к группе не должен быть подвязан ни один объект [[Group#Ручное управление группой|Детальнее]].<br />
*'''checkInternet''' - проверяет подключение к интернету, вызывает обработчики '''internetYES''' при наличии интернета и '''internetNO''' при его отсутствии.<br />
*'''calculateDate''' - вычисляет календарную дату времени (текущее игровое время + добавляет время из поля param (в секундах)), выводит информацию в параметры "dateDay", "dateMonth", "dateYear".<br />
<br />
== Примеры ==<br />
<br />
Рассмотрим маленькие примеры, которые часто встречаются в окнах с настройками игры.<br />
<br />
[[Файл:Opt 4.jpg|right]]<br />
<br />
1. Отправить письмо <br><br />
<br />
Для объекта типа ''"button"'' следует прописать следующее:<br />
<br />
[[Файл:Opt 5.jpg]]<br />
<br />
2. Сменить язык <br><br />
Организовывается с помощью объектов типа ''"groupbox"'' и ''"checkbox"'':<br><br />
<br />
[[Файл:Opt 6.jpg]]<br />
<br />
Благодаря такой конструкции при выборе одного (в данном случае) языка снимается галочка со второго. В самом чекбоксе следует прописать следующее:<br><br />
<br />
[[Файл:Opt 7.jpg]]<br />
<br />
Изначально следует проверить язык устройства и установить соответствующий чекбокс:<br><br />
<br />
[[Файл:Opt 8.jpg]]<br />
<br />
== Использование Options ==<br />
<br />
Options могут быть использованы, чтобы записывать переменные и опции игрока, которые будут использоваться между сессиями.<br />
Чтобы записать переменную в Options, нужно сделать set с галочками obj, par и val.<br />
В obj мы заносим наш обьект Options, в par - название переменной, а в val - ее значение.<br />
<br />
[[Файл:Setopt.JPG]]<br />
<br />
Переменные хранятся в файле options.xml в папке, которая находится по пути C:\Users\agava\AppData\Roaming\Absolutist\(название игры).<br />
Можно записывать переменные через точки - они определяют вложенность переменной в xml-файле.<br />
Например, запись p0.tutorial.tutorial_all будет означать XML-атрибут tutorial_all, который лежит в XML-теге tutorial, который в свою очередь лежит в теге p0.<br />
В файле это выглядит так: <br />
<p0><br />
<tutorial tutorial_all="1"/><br />
</p0><br />
<br />
Эту переменную можно в любой момент изменить с помощью команды set, или же вытащить для использования с помощью команды var. Например, чтобы увеличить ее на некоторое значение.<br />
<br />
[[Файл:Setopt2.JPG]]<br />
<br />
Также в опции пишут свои данные некоторые обьекты, такие как economics, eitems, taskorganizer и другие в виде (название обьекта)(ID в проекте).<br />
Данные, которые они пишут, удобно использовать, например, в счетчиках, или в if-ах для проверки достижения значений.<br />
<br />
[[Файл:Setopt3.JPG]]<br />
<br />
Здесь можно понять, что счетчик берет свое значение из тега eitems22 (это автополе, создаваемое обьектом eitems c objID=22), из атрибута i10773 (автоматически созданный атрибут, который означает предмет экономики с txtID=10773).<br />
Такой счетчик будет обновлять свое значение каждый раз, когда мы будем передавать ему состояние read/read_anim.<br />
<br />
[[Category:Options|*]]<br />
<br />
== Внешние команды ==<br />
Используются для общения с Flash вьювером в web версиях приложений. Могут приходить из flash или отправляться во флеш. <br />
<br />
Реакция на внешнюю команду настраивается через объект options:<br />
[[Файл:Options cmd 1.jpeg]]<br />
<br />
<br />
Если мы хотим отправить команду, мы указываем её имя и передаём состояние sendExtCommand:<br />
[[Файл:Options cmd 2.jpg]]<br />
<br />
<br />
<br />
Список команд:<br />
<br />
* '''cmdShowMenu''' - отправляем, если хотим поднять табы ( по умолчанию табы выключены).<br />
* '''cmdLevel''' - отправляем, при повышении уровня игрока ( в extCommandParam - указываем текущий уровень).<br />
* '''cmdScore''' - отправляем, при при закрытиях окон "после монстра" и "после локации" ( в extCommandParam - указываем текущее значение общих очков - public.EconomicsTotalScore).<br />
* '''cmdFullscreenDisabled''' - команда приходит, если нужно спрятать кнопки перехода фулскрина ( в связи с багами в версии флеша и браузера), приходить один раз за сессию.<br />
* '''cmdFullscreenFailed''' - команда приходит каждый раз, при показе системного окна о том, что мы не можем перейти в полноэкранный режим ( в связи с багами в версии флеша и браузера).<br />
<br />
Общие для экономических проектов:<br />
* '''cmdShowGame''' - приходит, если нажали на таб "игра".<br />
* '''cmdShowInvite''' - приходит, если нажали на таб "Друзья". <br />
* '''cmdShowBank''' - приходит, если нажали на таб "Банк".<br />
* '''cmdShowGifts''' - приходит, если нажали на таб "Лидеры".</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Options&diff=9779Options2019-01-10T14:43:10Z<p>Agava: /* Использование Options */</p>
<hr />
<div>{{TOC right}}<br />
'''Options''' - [[Object|объект]], который используется для хранения и управления глобальными параметрами приложения. Также '''Options''' позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
== Общие параметры ==<br />
Смотреть описание [[Object|Object]].<br />
<br />
== Основные параметры ==<br />
[[Файл:opt2.jpg|right]]<br />
*'''язык''' ''(lang)'' - Язык, принудительно используемый приложением.<br />
*'''url обновлений''' ''(surl)'' - url, по которому ищем обновления опций.<br />
*'''sound''' ''(sound)'' - Громкость звука:<br />
:'''1''' - максимальный,<br />
:'''0''' - отключен.<br />
*'''music''' ''(music)''- Громкость музыки:<br />
:'''1''' - максимальная,<br />
:'''0''' - отключена.<br />
*'''voice''' ''(voice)'' - Голос рассказчика:<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''ambient''' ''(ambient)'' - Громкость окружающих звуков (шелест листьев, шум дождя, пения птиц и т.д.):<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''курсор''' ''(curs)'' - Графический ресурс курсора по умолчанию для всего проекта.<br />
*'''page''' ''(page)'' - Номер страницы для книги.<br />
*'''fullScreen''' ''(fullScreen)'' - Полноэкранный режим, используется в приложениях для PC: <br />
:'''1''' - на весь экран, <br />
:'''0''' - в окне.<br />
*'''immersive mode''' ''(immersive)'' -<br />
*'''activity''' ''(activity)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bg''' ''(fl_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bar''' ''(fl_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''аниматор загрузки''' - аниматор загрузки динамических ресурсов для flash. Должен иметь состояния ''start'' и ''progress'', а также графический ресурс аниматора ('''он обязательно должен быть статическим!!!'''), который будет рисоваться в месте загружаемого динамического ресурса.<br />
*'''show progress''' ''(progr)'' - 1 - Отображать не только крутилку activity, но и прогрессбар (кастомный или беленький программный).<br />
*'''loading bg''' ''(res_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''loading bar''' ''(res_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''поле ввода''' ''(edit)'' - Объект типа edit, из которого будет браться имя при добавлении/редактировании профилей (состояние add у опций).<br />
*'''таблица''' ''(table)'' - Объект типа table, в который мы будем складывать все профиля (состояние update у опций).<br />
*'''разрешить рекламу''' ''(ad)'' - Разрешить или нет показ рекламы объектом [[Advertisement]]:<br />
:'''1''' - разрешить,<br />
:'''0''' - запретить<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:opt.jpg|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по нажатию правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''ввод пустого имени''' - При попытке добавить пустое имя состоянием add будет изменено состояние заданного объекта.<br />
*'''объект''' - При попытке добавить пустое имя перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''ввод существующего имени''' - Когда будет введено существующее имя, изменить состояние заданного объекта.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Back''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Menu''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Windows - кнопка ESC''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - успех''' - При успешном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - ошибка''' - При ошибочном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из паузы''' - При возврате из паузы перевести объект в новое состояние.<br />
*'''объект''' - При возврате из паузы перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Переход в полноэкранный режим''' - При переходе в полноэкранный режим перевести объект в новое состояние.<br />
*'''объект''' - При переходе в полноэкранный режим перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из полноэкранного режима''' - При выходе из полноэкранного режима перевести объект в новое состояние.<br />
*'''объект''' - При выходе из полноэкранного режима перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<br />
[[Файл:+.png]] '''Смена разрешения''' - При смене разрешения перевести объект в новое состояние.<br />
*'''объект''' - При смене разрешения перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<pre><br />
При смене разрешения объект переведётся в новое состояние уже после записи новых resh, resw, а не как при возврате из <br />
(переходе в) полноэкранный режим.<br />
</pre><br />
<br />
<pre><br />
!!! Если в машине, которая вызывается по нажатию на Android-кнопку, есть обращение к опциям, то это обращение нужно писать в другом<br />
состоянии, через команду '''wait'''<br />
</pre><br />
<br />
<pre><br />
!!! Машину, которая вызывается по нажатию на Android-кнопку, нужно размещать на расшариной сцене, если в ней есть команда '''wait'''<br />
потому, что эта команда работает, если прописана на текущем экране, а не на фоновом (глобальном, не текущем).<br />
</pre><br />
<br />
[[Файл:+.png]] '''одинаковые имена''' - Когда будет введено существующее имя (в поле edit), перевести объект в состояние из следующего поля.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
== Дополнительные стандартные параметры ==<br />
<br />
* '''rlang''' - Текущий язык устройства, если не указан принудительно какой-либо язык (параметр ''lang'').'''При каждом запуске вьювера этот параметр будет перебиваться, в зависимости от системной локализации'''.<br />
* '''r_install''' - Дата и время установки в секундах.<br />
* '''r_hours''' - Время прошедшее с момента установки в часах.<br />
* '''r_playtime''' - Время нахождения в игре в минутах.<br />
* '''r_launches''' - Количество запусков игры.<br />
* '''r_days''' - Сколько дней подряд запускалась игра, если пропускается хотя бы день, то сбрасывается. <br />
* '''r_lastlaunch''' - Дата и время последнего запуска в секундах.<br />
* '''downloadErrCode''' - Код ошибки возвращаемый при неудачной загрузке:<br />
:'''1''' - неизвестная ошибка (возможно нет интернета),<br />
:'''2''' - отключён wi-fi,<br />
:'''3''' - недоступна карта памяти,<br />
:'''4''' - недостаточно места на карте памяти для загрузки,<br />
:'''5''' - ошибка при распаковке архива (чаще всего, не хватает места для распаковки архива).<br />
* '''reloadScrID''' - id экрана, на который мы перейдем после перегрузки лейаута. Перегрузка вызывается в команде init в машине состояний.<br />
* '''curScrID''' - id текущего экрана.<br />
* '''prevScrID''' - id предыдущего экрана.<br />
<br />
== Состояния ==<br />
Объект '''Options''' обладает рядом состояний:<br />
*'''init''' - Инициализация опций.<br />
*'''add''' - Добавить новый профиль из заданного поля ввода и сделать его текущим.<br />
*'''update''' - Заполнить заданную таблицу списком профилей.<br />
*'''change''' - Сменить профиль на выбранный на данный момент в таблице.<br />
*'''delete''' - Удалить выбранный профиль (выбранный в таблице профилей).<br />
*'''generate''' - Генерирует имя профиля по умолчанию при создании нового профиля.<br />
*'''save''' - Сохранение всех параметров в опции. Это состояние вызывается автоматически при переходе между экранами, выгрузки и закрытии приложения. При его вызове приложение физически открывает файл options.xml и записывает туда данные. Частое обращение к этому файлу снизит быстродействие нашего приложения.<br />
*'''edit''' - С текущего поля ввода считывает имя и устанавливает его для текущего профиля.<br />
*'''reset''' - Заменяет файл Options файлом Options_default, то есть сбрасываются все параметры и устанавливаются все параметры по умолчанию<br />
*'''clear_cur_player''' - Удаляет весь текущий прогресс по выбранному профилю, таким образом можно организовать прохождение игры заново для одного и того же профиля.<br />
*'''delete_node''' - Удаляет ''ноду'' в опциях, вычитав ее название из поля ''param''.<br />
*'''readCursor''' - Считать новый ресурс курсора из объекта опций. <br />
*'''updateCursor''' - Обновить курсор над объектом, который под мышкой.<br />
*'''invariantCursor''' - Курсор не изменяется при наведении над объектами с переопределенным курсором.<br />
*'''variableCursor''' - Курсор меняется при наведении над объектами с переопределенным курсором.<br />
*'''disableCursor''' - Курсор отключается полностью. <br />
*'''check_server''' - Запросить обновление опций с сервера. <br />
*'''send_options''' - Отправить опции на сервер. <br />
*'''sendExtCommand''' - Отправить внешнюю команду.<br />
*'''updateVolumes''' - Обновить уровень громкости музыки и звуков.<br />
*'''setGroupMember''' - устанавливаем группе ( id из поля '''groupID'''), единственного члена группы ( id из поля '''groupMemID'''), важно: к группе не должен быть подвязан ни один объект [[Group#Ручное управление группой|Детальнее]].<br />
*'''checkInternet''' - проверяет подключение к интернету, вызывает обработчики '''internetYES''' при наличии интернета и '''internetNO''' при его отсутствии.<br />
*'''calculateDate''' - вычисляет календарную дату времени (текущее игровое время + добавляет время из поля param (в секундах)), выводит информацию в параметры "dateDay", "dateMonth", "dateYear".<br />
<br />
== Примеры ==<br />
<br />
Рассмотрим маленькие примеры, которые часто встречаются в окнах с настройками игры.<br />
<br />
[[Файл:Opt 4.jpg|right]]<br />
<br />
1. Отправить письмо <br><br />
<br />
Для объекта типа ''"button"'' следует прописать следующее:<br />
<br />
[[Файл:Opt 5.jpg]]<br />
<br />
2. Сменить язык <br><br />
Организовывается с помощью объектов типа ''"groupbox"'' и ''"checkbox"'':<br><br />
<br />
[[Файл:Opt 6.jpg]]<br />
<br />
Благодаря такой конструкции при выборе одного (в данном случае) языка снимается галочка со второго. В самом чекбоксе следует прописать следующее:<br><br />
<br />
[[Файл:Opt 7.jpg]]<br />
<br />
Изначально следует проверить язык устройства и установить соответствующий чекбокс:<br><br />
<br />
[[Файл:Opt 8.jpg]]<br />
<br />
== Использование Options ==<br />
<br />
Options могут быть использованы, чтобы записывать переменные и опции игрока, которые будут использоваться между сессиями.<br />
Чтобы записать переменную в Options, нужно сделать set с галочками obj, par и val.<br />
В obj мы заносим наш обьект Options, в par - название переменной, а в val - ее значение.<br />
<br />
[[Файл:Setopt.JPG]]<br />
<br />
Переменные хранятся в файле options.xml в папке, которая находится по пути C:\Users\agava\AppData\Roaming\Absolutist\(название игры).<br />
Можно записывать переменные через точки - они определяют вложенность переменной в xml-файле.<br />
Например, запись p0.tutorial.tutorial_all будет означать XML-атрибут tutorial_all, который лежит в XML-теге tutorial, который в свою очередь лежит в теге p0.<br />
В файле это выглядит так: <br />
<p0><br />
<tutorial tutorial_all="1"/><br />
</p0><br />
<br />
Эту переменную можно в любой момент изменить с помощью команды set, или же вытащить для использования с помощью команды var. Например, чтобы увеличить ее на некоторое значение.<br />
[[Файл:Setopt2.JPG]]<br />
<br />
Также в опции пишут свои данные некоторые обьекты, такие как economics, eitems, taskorganizer и другие в виде (название обьекта)(ID в проекте).<br />
Данные, которые они пишут, удобно использовать, например, в счетчиках, или в if-ах для проверки достижения значений.<br />
<br />
[[Файл:Setopt3.JPG]]<br />
<br />
Здесь можно понять, что счетчик берет свое значение из тега eitems22 (это автополе, создаваемое обьектом eitems c objID=22), из атрибута i10773 (автоматически созданный атрибут, который означает предмет экономики с txtID=10773).<br />
Такой счетчик будет обновлять свое значение каждый раз, когда мы будем передавать ему состояние read/read_anim.<br />
<br />
[[Category:Options|*]]<br />
<br />
== Внешние команды ==<br />
Используются для общения с Flash вьювером в web версиях приложений. Могут приходить из flash или отправляться во флеш. <br />
<br />
Реакция на внешнюю команду настраивается через объект options:<br />
[[Файл:Options cmd 1.jpeg]]<br />
<br />
<br />
Если мы хотим отправить команду, мы указываем её имя и передаём состояние sendExtCommand:<br />
[[Файл:Options cmd 2.jpg]]<br />
<br />
<br />
<br />
Список команд:<br />
<br />
* '''cmdShowMenu''' - отправляем, если хотим поднять табы ( по умолчанию табы выключены).<br />
* '''cmdLevel''' - отправляем, при повышении уровня игрока ( в extCommandParam - указываем текущий уровень).<br />
* '''cmdScore''' - отправляем, при при закрытиях окон "после монстра" и "после локации" ( в extCommandParam - указываем текущее значение общих очков - public.EconomicsTotalScore).<br />
* '''cmdFullscreenDisabled''' - команда приходит, если нужно спрятать кнопки перехода фулскрина ( в связи с багами в версии флеша и браузера), приходить один раз за сессию.<br />
* '''cmdFullscreenFailed''' - команда приходит каждый раз, при показе системного окна о том, что мы не можем перейти в полноэкранный режим ( в связи с багами в версии флеша и браузера).<br />
<br />
Общие для экономических проектов:<br />
* '''cmdShowGame''' - приходит, если нажали на таб "игра".<br />
* '''cmdShowInvite''' - приходит, если нажали на таб "Друзья". <br />
* '''cmdShowBank''' - приходит, если нажали на таб "Банк".<br />
* '''cmdShowGifts''' - приходит, если нажали на таб "Лидеры".</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Options&diff=9778Options2019-01-10T14:42:55Z<p>Agava: /* Пример */</p>
<hr />
<div>{{TOC right}}<br />
'''Options''' - [[Object|объект]], который используется для хранения и управления глобальными параметрами приложения. Также '''Options''' позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
== Общие параметры ==<br />
Смотреть описание [[Object|Object]].<br />
<br />
== Основные параметры ==<br />
[[Файл:opt2.jpg|right]]<br />
*'''язык''' ''(lang)'' - Язык, принудительно используемый приложением.<br />
*'''url обновлений''' ''(surl)'' - url, по которому ищем обновления опций.<br />
*'''sound''' ''(sound)'' - Громкость звука:<br />
:'''1''' - максимальный,<br />
:'''0''' - отключен.<br />
*'''music''' ''(music)''- Громкость музыки:<br />
:'''1''' - максимальная,<br />
:'''0''' - отключена.<br />
*'''voice''' ''(voice)'' - Голос рассказчика:<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''ambient''' ''(ambient)'' - Громкость окружающих звуков (шелест листьев, шум дождя, пения птиц и т.д.):<br />
:'''0''' - отключен,<br />
:'''не 0''' - включен.<br />
*'''курсор''' ''(curs)'' - Графический ресурс курсора по умолчанию для всего проекта.<br />
*'''page''' ''(page)'' - Номер страницы для книги.<br />
*'''fullScreen''' ''(fullScreen)'' - Полноэкранный режим, используется в приложениях для PC: <br />
:'''1''' - на весь экран, <br />
:'''0''' - в окне.<br />
*'''immersive mode''' ''(immersive)'' -<br />
*'''activity''' ''(activity)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bg''' ''(fl_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''first loading bar''' ''(fl_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''аниматор загрузки''' - аниматор загрузки динамических ресурсов для flash. Должен иметь состояния ''start'' и ''progress'', а также графический ресурс аниматора ('''он обязательно должен быть статическим!!!'''), который будет рисоваться в месте загружаемого динамического ресурса.<br />
*'''show progress''' ''(progr)'' - 1 - Отображать не только крутилку activity, но и прогрессбар (кастомный или беленький программный).<br />
*'''loading bg''' ''(res_bg)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находиться в состоянии редактирования).<br />
*'''loading bar''' ''(res_bar)'' - Графический ресурс для индикатора загрузки. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования).<br />
*'''поле ввода''' ''(edit)'' - Объект типа edit, из которого будет браться имя при добавлении/редактировании профилей (состояние add у опций).<br />
*'''таблица''' ''(table)'' - Объект типа table, в который мы будем складывать все профиля (состояние update у опций).<br />
*'''разрешить рекламу''' ''(ad)'' - Разрешить или нет показ рекламы объектом [[Advertisement]]:<br />
:'''1''' - разрешить,<br />
:'''0''' - запретить<br />
<br />
== Добавляемые параметры ==<br />
[[Файл:opt.jpg|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по нажатию правой кнопки мыши.<br />
<br />
<br />
[[Файл:+.png]] '''ввод пустого имени''' - При попытке добавить пустое имя состоянием add будет изменено состояние заданного объекта.<br />
*'''объект''' - При попытке добавить пустое имя перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''ввод существующего имени''' - Когда будет введено существующее имя, изменить состояние заданного объекта.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Back''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Android - кнопка Menu''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Windows - кнопка ESC''' - При нажатии на кнопку перевести объект в новое состояние.<br />
*'''объект''' - При клике на кнопку перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - успех''' - При успешном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Обновление с сервера - ошибка''' - При ошибочном обновлении опций с сервера перевести объект в новое состояние.<br />
*'''объект''' - Объект, состояние которого меняем.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из паузы''' - При возврате из паузы перевести объект в новое состояние.<br />
*'''объект''' - При возврате из паузы перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Переход в полноэкранный режим''' - При переходе в полноэкранный режим перевести объект в новое состояние.<br />
*'''объект''' - При переходе в полноэкранный режим перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля.<br />
<br />
<br />
[[Файл:+.png]] '''Возврат из полноэкранного режима''' - При выходе из полноэкранного режима перевести объект в новое состояние.<br />
*'''объект''' - При выходе из полноэкранного режима перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<br />
[[Файл:+.png]] '''Смена разрешения''' - При смене разрешения перевести объект в новое состояние.<br />
*'''объект''' - При смене разрешения перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
<pre><br />
При смене разрешения объект переведётся в новое состояние уже после записи новых resh, resw, а не как при возврате из <br />
(переходе в) полноэкранный режим.<br />
</pre><br />
<br />
<pre><br />
!!! Если в машине, которая вызывается по нажатию на Android-кнопку, есть обращение к опциям, то это обращение нужно писать в другом<br />
состоянии, через команду '''wait'''<br />
</pre><br />
<br />
<pre><br />
!!! Машину, которая вызывается по нажатию на Android-кнопку, нужно размещать на расшариной сцене, если в ней есть команда '''wait'''<br />
потому, что эта команда работает, если прописана на текущем экране, а не на фоновом (глобальном, не текущем).<br />
</pre><br />
<br />
[[Файл:+.png]] '''одинаковые имена''' - Когда будет введено существующее имя (в поле edit), перевести объект в состояние из следующего поля.<br />
*'''объект''' - Когда будет введено существующее имя, перевести объект в состояние из следующего поля.<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля<br />
<br />
== Дополнительные стандартные параметры ==<br />
<br />
* '''rlang''' - Текущий язык устройства, если не указан принудительно какой-либо язык (параметр ''lang'').'''При каждом запуске вьювера этот параметр будет перебиваться, в зависимости от системной локализации'''.<br />
* '''r_install''' - Дата и время установки в секундах.<br />
* '''r_hours''' - Время прошедшее с момента установки в часах.<br />
* '''r_playtime''' - Время нахождения в игре в минутах.<br />
* '''r_launches''' - Количество запусков игры.<br />
* '''r_days''' - Сколько дней подряд запускалась игра, если пропускается хотя бы день, то сбрасывается. <br />
* '''r_lastlaunch''' - Дата и время последнего запуска в секундах.<br />
* '''downloadErrCode''' - Код ошибки возвращаемый при неудачной загрузке:<br />
:'''1''' - неизвестная ошибка (возможно нет интернета),<br />
:'''2''' - отключён wi-fi,<br />
:'''3''' - недоступна карта памяти,<br />
:'''4''' - недостаточно места на карте памяти для загрузки,<br />
:'''5''' - ошибка при распаковке архива (чаще всего, не хватает места для распаковки архива).<br />
* '''reloadScrID''' - id экрана, на который мы перейдем после перегрузки лейаута. Перегрузка вызывается в команде init в машине состояний.<br />
* '''curScrID''' - id текущего экрана.<br />
* '''prevScrID''' - id предыдущего экрана.<br />
<br />
== Состояния ==<br />
Объект '''Options''' обладает рядом состояний:<br />
*'''init''' - Инициализация опций.<br />
*'''add''' - Добавить новый профиль из заданного поля ввода и сделать его текущим.<br />
*'''update''' - Заполнить заданную таблицу списком профилей.<br />
*'''change''' - Сменить профиль на выбранный на данный момент в таблице.<br />
*'''delete''' - Удалить выбранный профиль (выбранный в таблице профилей).<br />
*'''generate''' - Генерирует имя профиля по умолчанию при создании нового профиля.<br />
*'''save''' - Сохранение всех параметров в опции. Это состояние вызывается автоматически при переходе между экранами, выгрузки и закрытии приложения. При его вызове приложение физически открывает файл options.xml и записывает туда данные. Частое обращение к этому файлу снизит быстродействие нашего приложения.<br />
*'''edit''' - С текущего поля ввода считывает имя и устанавливает его для текущего профиля.<br />
*'''reset''' - Заменяет файл Options файлом Options_default, то есть сбрасываются все параметры и устанавливаются все параметры по умолчанию<br />
*'''clear_cur_player''' - Удаляет весь текущий прогресс по выбранному профилю, таким образом можно организовать прохождение игры заново для одного и того же профиля.<br />
*'''delete_node''' - Удаляет ''ноду'' в опциях, вычитав ее название из поля ''param''.<br />
*'''readCursor''' - Считать новый ресурс курсора из объекта опций. <br />
*'''updateCursor''' - Обновить курсор над объектом, который под мышкой.<br />
*'''invariantCursor''' - Курсор не изменяется при наведении над объектами с переопределенным курсором.<br />
*'''variableCursor''' - Курсор меняется при наведении над объектами с переопределенным курсором.<br />
*'''disableCursor''' - Курсор отключается полностью. <br />
*'''check_server''' - Запросить обновление опций с сервера. <br />
*'''send_options''' - Отправить опции на сервер. <br />
*'''sendExtCommand''' - Отправить внешнюю команду.<br />
*'''updateVolumes''' - Обновить уровень громкости музыки и звуков.<br />
*'''setGroupMember''' - устанавливаем группе ( id из поля '''groupID'''), единственного члена группы ( id из поля '''groupMemID'''), важно: к группе не должен быть подвязан ни один объект [[Group#Ручное управление группой|Детальнее]].<br />
*'''checkInternet''' - проверяет подключение к интернету, вызывает обработчики '''internetYES''' при наличии интернета и '''internetNO''' при его отсутствии.<br />
*'''calculateDate''' - вычисляет календарную дату времени (текущее игровое время + добавляет время из поля param (в секундах)), выводит информацию в параметры "dateDay", "dateMonth", "dateYear".<br />
<br />
== Примеры ==<br />
<br />
Рассмотрим маленькие примеры, которые часто встречаются в окнах с настройками игры.<br />
<br />
[[Файл:Opt 4.jpg|right]]<br />
<br />
1. Отправить письмо <br><br />
<br />
Для объекта типа ''"button"'' следует прописать следующее:<br />
<br />
[[Файл:Opt 5.jpg]]<br />
<br />
2. Сменить язык <br><br />
Организовывается с помощью объектов типа ''"groupbox"'' и ''"checkbox"'':<br><br />
<br />
[[Файл:Opt 6.jpg]]<br />
<br />
Благодаря такой конструкции при выборе одного (в данном случае) языка снимается галочка со второго. В самом чекбоксе следует прописать следующее:<br><br />
<br />
[[Файл:Opt 7.jpg]]<br />
<br />
Изначально следует проверить язык устройства и установить соответствующий чекбокс:<br><br />
<br />
[[Файл:Opt 8.jpg]]<br />
<br />
== Использование Options ==<br />
<br />
Options могут быть использованы, чтобы записывать переменные и опции игрока, которые будут использоваться между сессиями.<br />
Чтобы записать переменную в Options, нужно сделать set с галочками obj, par и val.<br />
В obj мы заносим наш обьект Options, в par - название переменной, а в val - ее значение.<br />
<br />
[[Файл:Setopt.JPG]]<br />
<br />
Переменные хранятся в файле options.xml в папке, которая находится по пути C:\Users\agava\AppData\Roaming\Absolutist\(название игры).<br />
Можно записывать переменные через точки - они определяют вложенность переменной в xml-файле.<br />
Например, запись p0.tutorial.tutorial_all будет означать XML-атрибут tutorial_all, который лежит в XML-теге tutorial, который в свою очередь лежит в теге p0.<br />
В файле это выглядит так: <br />
<p0><br />
<tutorial tutorial_all="1"/><br />
</p0><br />
<br />
Эту переменную можно в любой момент изменить с помощью команды set, или же вытащить для использования с помощью команды var. Например, чтобы увеличить ее на некоторое значение.<br />
[[Файл:Setopt2.JPG]]<br />
<br />
Также в опции пишут свои данные некоторые обьекты, такие как economics, eitems, taskorganizer и другие в виде (название обьекта)(ID в проекте).<br />
Данные, которые они пишут, удобно использовать, например, в счетчиках, или в if-ах для проверки достижения значений.<br />
<br />
[[Файл:Setopt3.JPG]]<br />
<br />
Здесь можно понять, что счетчик берет свое значение из тега eitems22 (это автополе, создаваемое обьектом eitems c objID=22), из атрибута i10773 (автоматически созданный атрибут, который означает предмет экономики с txtID=10773).<br />
Такой счетчик будет обновлять свое значение каждый раз, когда мы будем передавать ему состояние read/read_anim.<br />
<br />
[[Category:Options|*]]<br />
<br />
== Внешние команды ==<br />
Используются для общения с Flash вьювером в web версиях приложений. Могут приходить из flash или отправляться во флеш. <br />
<br />
Реакция на внешнюю команду настраивается через объект options:<br />
[[Файл:Options cmd 1.jpeg]]<br />
<br />
<br />
Если мы хотим отправить команду, мы указываем её имя и передаём состояние sendExtCommand:<br />
[[Файл:Options cmd 2.jpg]]<br />
<br />
<br />
<br />
Список команд:<br />
<br />
* '''cmdShowMenu''' - отправляем, если хотим поднять табы ( по умолчанию табы выключены).<br />
* '''cmdLevel''' - отправляем, при повышении уровня игрока ( в extCommandParam - указываем текущий уровень).<br />
* '''cmdScore''' - отправляем, при при закрытиях окон "после монстра" и "после локации" ( в extCommandParam - указываем текущее значение общих очков - public.EconomicsTotalScore).<br />
* '''cmdFullscreenDisabled''' - команда приходит, если нужно спрятать кнопки перехода фулскрина ( в связи с багами в версии флеша и браузера), приходить один раз за сессию.<br />
* '''cmdFullscreenFailed''' - команда приходит каждый раз, при показе системного окна о том, что мы не можем перейти в полноэкранный режим ( в связи с багами в версии флеша и браузера).<br />
<br />
Общие для экономических проектов:<br />
* '''cmdShowGame''' - приходит, если нажали на таб "игра".<br />
* '''cmdShowInvite''' - приходит, если нажали на таб "Друзья". <br />
* '''cmdShowBank''' - приходит, если нажали на таб "Банк".<br />
* '''cmdShowGifts''' - приходит, если нажали на таб "Лидеры".</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Setopt3.JPG&diff=9777Файл:Setopt3.JPG2019-01-10T14:40:40Z<p>Agava: </p>
<hr />
<div></div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Setopt2.JPG&diff=9776Файл:Setopt2.JPG2019-01-10T14:37:42Z<p>Agava: </p>
<hr />
<div></div>Agavahttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Setopt.JPG&diff=9775Файл:Setopt.JPG2019-01-10T14:31:20Z<p>Agava: </p>
<hr />
<div></div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Solitaire&diff=9774Solitaire2018-12-22T15:04:19Z<p>Agava: /* Состояния */</p>
<hr />
<div>{{TOC right}}<br />
'''Solitaire''' - [[Object|объект]] для реализации группы карточных игр типа "пасьянс" (одиночных карточных игр).<br />
<br />
'''Общие параметры'''<br />
(см. описание [[Object|Object]])<br />
<br />
==Основные параметры==<br />
<br />
[[Файл:sl_props.png|250px|right]]<br />
<br />
*'''карты''' ''(cards)'' - ссылка на графический ресурс карт. Ресурс состоит из клипов анимации в 54 кадра. Первые 52 - стандартная колода от туза до короля поочередно мастей трефы, бубны, черви, пики. 53-я карта - универсальный джокер, 54-я - карта удаления.<br />
*'''рубашка''' ''(back)'' - графический ресурс рубашки.<br />
*'''место для карт''' ''(place)'' - графический ресурс места для карт.<br />
*'''кнопка deal''' ''(deal)'' - графический ресурс кнопки deal.<br />
*'''номер правил''' ''(gameRule)'' - номер правил пасьянсов. Определяет по каким правилам будет идти игра.<br />
*'''надписи''' <br />
**'''шрифт''' ''(fn)'' - номер шрифта<br />
**'''размер''' ''(fs)'' - размер шрифта<br />
**'''цвет1''' ''(fc1)'' - цвет надписей<br />
***'''Red''' - красный<br />
***'''Green''' - зеленый<br />
***'''Blue''' - голубой<br />
***'''Alpha''' - прозрачность<br />
*'''настроечные файлы''' - файлы с настройками игры (расположением карт, правилами)<br />
**'''основной конфиг''' ''(cfgmain)'' - ссылка на файл основного конфига<br />
**'''считать зашифрованным''' ''(cfgmain_c)'' - считать ли основной конфиг зашифрованным<br />
**'''каталог с настройками''' ''(pathtunes)'' - ссылка на каталог с дополнительными настройками<br />
**'''считать зашифрованным''' ''(pathtunes_c)'' - считать ли файлы настроек зашифрованными<br />
**'''каталог со скриптами''' ''(pathscripts)'' - ссылка на каталог с файлами скриптов<br />
**'''считать зашифрованным''' ''(pathscripts_c)'' - считать ли файлы настроек зашифрованными<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:SlAddProp.PNG|170px|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по правой кнопки мыши. <br />
<br />
[[Файл:+.png]] '''Пасьянс разобран''' - При победе(разборе пасьянса) в игре переводит объект в новое состояние<br />
*'''объект''' - Объект в котором меняем состояние<br />
*'''состояние''' - Новое состояние для объекта выше<br />
<br />
[[Файл:+.png]] '''Пасьянс разобран'''- При проигрыше(не осталось пути для разбора пасьянса) в игре переводит объект в новое состояние<br />
*'''объект''' - Объект в котором меняем состояние<br />
*'''состояние''' - Новое состояние для объекта выше<br />
<br />
[[Файл:+.png]] '''Правильный ход'''- При правильном ходе(переложили карту из одного места на другое) переводит объект в новое состояние<br />
*'''объект''' - Объект в котором меняем состояние<br />
*'''состояние''' - Новое состояние для объекта выше<br />
<br />
[[Файл:+.png]] '''Не правильный ход'''- При попытке хода не по правилам(карта не переместилась) переводит объект в новое состояние<br />
*'''объект''' - Объект в котором меняем состояние<br />
*'''состояние''' - Новое состояние для объекта выше<br />
<br />
== Состояния ==<br />
<br />
Все состояния:<br />
*'''idle''' - состояние простоя<br />
*'''new_game''' - сгенерировать новую игру по правилам в поле gameRule<br />
*'''win''' - состояние, которое вызывается по разбору пасьянса<br />
*'''fail''' - состояние, которое вызывается, если доступных ходов нет<br />
*'''hint''' - позволить компьютеру сделать ход<br />
*'''undo''' - отменить ход<br />
<br />
==Примечания и дополнения==<br />
*Карта переносится как при перетаскивании(Drag&Drop) так и при "клик на карту-клик на место"<br />
'''Важно''':<br />
*Состояние "undo" сработает подряд только для 3-х последних ходов, после этого желательно блокировать кнопку вызова отмены до момента, пока игрок не сделает хотя бы ещё один "правильный ход"(появится возможность вызвать 1 отмену)<br />
<br />
==Правила игры==<br />
'''Klondike'''<br />
*1 - Pas Seul<br />
*2 - Klondike<br />
*3 - Double Klondike<br />
*4 - Double Klondike 2<br />
*5 - Gargantua<br />
*6 - East Haven<br />
*7 - Blind Alleys<br />
*8 - Batsford<br />
*9 - Big Harp<br />
*10 - Achtmal Acht<br />
'''Golf'''<br />
*11 - Relaxed Golf<br />
*12 - Golf<br />
*13 - Dead King Golf<br />
*14 - Elevator<br />
'''Pick 2'''<br />
*15 - Advanced Clamp<br />
*16 - Avalanche<br />
*17 - Battle Lines<br />
*18 - Breech<br />
*19 - Car Wash<br />
*20 - Circus Tent<br />
*21 - DragonFly<br />
*22 - School of Turtles<br />
*23 - Umbrella<br />
*24 - Wrestler<br />
'''3 Towers'''<br />
*25 - 3 Towers<br />
*26 - Battery<br />
*27 - Clamp<br />
*28 - Crossbow<br />
*29 - Divide and Conquer<br />
*30 - Falcon<br />
*31 - Grip Tower<br />
*32 - Lobster<br />
*33 - Super 3 Towers<br />
*34 - The Mirror<br />
'''Best 21'''<br />
*35 - Rabbit in the Hole<br />
*36 - Black Mamba<br />
*37 - Hula Hooper<br />
*38 - Best 21<br />
*39 - Scooter's Game<br />
*40 - Truffle<br />
*41 - Lady Luck<br />
'''Pyramid'''<br />
*42 - Double Deal Pyramid<br />
*43 - Single Deal Pyramid<br />
*44 - Single Deal Pyramid 2<br />
*45 - No Deal Pyramid<br />
'''Forty Theives'''<br />
*46 - Forty Theives<br />
*47 - Diplomat<br />
*48 - Deuces<br />
*49 - Number Ten<br />
'''Spiderette'''<br />
*50 - Spiderette<br />
*51 - Super Spiderette<br />
'''Spider'''<br />
*52 - Spider<br />
'''Bonus'''<br />
*53 - Red and Black<br />
*54 - The Mill<br />
*55 - The Square<br />
*56 - Two Rings<br />
<br />
== Пример ==<br />
''S:\!MOBILE\!!!EditorGames\Wiki_sample\Solitaire.zip''<br />
В примере, на панели, находится counter(правила игры(параметр gameRule)) и кнопки инкремента и декремента правила. Выбираем правило и жмем "новая игра". Можно просмотреть все возможные типы пасьянсов</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Isomover&diff=9773Isomover2018-12-22T14:33:59Z<p>Agava: /* Состояния */</p>
<hr />
<div>'''Isomover''' - [[Object|объект]] используется для осуществления движения и взаимодействия в изометрической карте. <br />
<br />
Isomover обязательно должен быть подобъектом [[isomap]]. <br />
<br />
В проекте с картой ([[isomap]]) и движущимися по ней объектами (isomover) часто используют [[economics]] и [[eitems]] потому, что для завершения процессов часто требуется применить предмет или ресурс.<br />
<br />
Начало движения множества изомуверов сильно нагружает систему, поэтому следует позаботиться, чтобы это происходило не в один момент времени. По возможности добавляйте небольшую и различную паузу каждому изомуверу перед стартом.<br><br><br />
==Основные параметры==<br />
*'''Положение''' (''x'',''y'') - рекомендуется выносить isomover-объекты за пределы карты. Иначе, если объект должен появляться не сразу, то он будет просто стоять без движения<br />
*'''Память''' - всегда должно быть значение 1, обязательное условие корректной работы. Это позволяет объекту двигаться последовательно, не инициализируясь после каждого движения в исходной точке<br />
*'''тип ребра min''' (''edge_t_min'') - перемещаться по ребрам не ниже заданного, -1 не проверять<br />
*'''тип ребра max''' (''edge_t_max'') - перемещаться по ребрам не выше заданного, -1 не проверять. Типы ребер задаются в isomap<br />
*'''Старт''' (''start'') - точка старта, выбирается из списка точек Isomap<br />
*'''Финиш''' (''finish'') - точка финиша, выбирается из списка точек Isomap<br />
*'''Скорость (макс)''' (''vel_max'') - максимальная скорость, с которой передвигается объект Isomover<br />
*'''Скорость''' (''vel'') - не использовать, вычисляется по формуле автоматически, позже будет скрыто. V = Vmax*(k+(1-k)*(P/Pmax))<br />
*'''Жизнь (макс)''' (''pow_max'') - максимальная жизнь<br />
*'''Жизнь''' (''pow'') - текущая жизнь, высчитывается по формуле автоматически<br />
*'''Сохранять жизнь в опции''' (''powsave'') - если да, то объекты сцены сохранят уровень жизни при выходе со сцены и возвращении на нее<br />
*'''Коэффициент скорости''' (''speed_k'') - коэффициент k в формуле расчета скорости. Чтобы скорость не зависела от значения жизни - указываем speed_k = 1<br />
*'''Менять угол''' (''fixangle'') - изменение угла для предания плавности смены графики при дугообразном перемещении объекта. С появлением 3D-объектов больше не используется<br />
*'''Тип''' (''mtype'') - объекты можно разделять на типы (люди, монстры, звери и т.д.). Взаимодействие происходит между объектами разных типов, настраивается в добавляемых параметрах<br />
*'''Радиус''' (''mradius'') - значения радиуса. Попадание изомувера другого типа в этот радиус позволит начать взаимодействие.<br />
*'''Цель при действии''' (''mtarget'') - мувер может быть целью взаимодействия пока сам действует<br />
*'''Запретить действие''' (''disact'') - мувер не сможет перейти из acting_wait в acting<br />
*'''Время появления''' (''appear_time'') - время в миллисекундах появления и исчезания изомувера (длительность перехода по alpha)<br />
*'''Время провала''' (''fail_time'') - длительность анимации смерти объекта, по его окончанию произойдет переход в состояние ''disappear''<br />
*'''Время паузы''' (''pause_time'') - длительность "заморозки" объекта<br />
*'''Предмет паузы''' (''pause_item'') - предмет для включения паузы<br />
*'''Прибавка паузы''' (''pause_add'') - если изомувер уже на паузе, по состоянию pause_add продлевает паузу на заданное значение ms<br />
*'''fail при 0 жизни''' (''zerofail'') - 1- при нулевом уровне жизни изомувер перейдет в fail, 0 - останется жив<br />
*'''Не пересчитывать маршрут''' (''softrecalc'') - 1- при отключении ребер графа не произойдет пересчета маршрута, 0 - маршрут будет пересчитан<br />
*'''Реагировать на''' (''tapreact'') - 1- на тап, 0- на клик<br />
*'''Дорожное движение''' (''trafficcheck'') - 1 - проверять столкновения, 0 - нет<br />
*'''использовать бонусы ко времени''' (''useTimeItems'') - флаг, будет ли изомувер использовать бонусы от амулетов на ускорение времени взаимодействия (настраивается в экономике). 1 - да, 0 - нет. <br />
<br><br />
<br />
==Дополнительные параметры==<br />
[[Файл:Isomover1.png|right|300px]]<br />
*'''Графический ресурс:'''<br />
**вверх (''res0'') - графический ресурс движения вверх<br />
**вверх/вправо (''res1'') - графический ресурс движения вверх/вправо<br />
**вправо (''res2'') - графический ресурс движения вправо <br />
**вниз/вправо (''res3'') - графический ресурс движения вниз/вправо<br />
**вниз (''res4'') - графический ресурс движения вниз <br />
**вниз/влево (''res5'') - графический ресурс движения вниз/влево<br />
**влево (''res6'') - графический ресурс движения влево <br />
**вверх/влево (''res7'') - графический ресурс движения вверх/влево. Достаточно указать первые пять ресурсов, а остальные редактор отобразит автоматически симметрично<br />
**деятельность (''resa'') - графический ресурс для состояния acting и acting_wait<br />
**рисовать действие поверх (''resaover'') - 1 - поверх, 0 - подменять ресурс. Применяем, если, например, анимацию нужно отобразить поверх изомувера.<br />
**иконка персонажа (''char_ico'') - иконка, которая будет находится сверху над персонажем. Изменение масштаба во время игры не влияет на масштаб иконки. Рекомендуется создавать ее с пивотом у нижней границы, тогда при масштабировании не будет образовываться зазор между иконкой и графикой объекта<br />
**смещение иконки персонажа (''char_ico_shift'') - смещение иконки по вертикали<br />
**рисовать при действии (''resad'') - 1- мувер рисуется при состоянии acting, 0- не рисуется<br />
**провал (''resf'') - графический ресурс состояния fail. Может быть картинкой или анимацией<br />
**пауза (''resp'') - графический ресурс состояния pause<br />
**рисовать паузу поверх (''respover'') - 1 - поверх, 0 - подменять ресурс.<br />
**восстановление жизни (''resheal'') - графический ресурс восстановления жизни<br />
**нашлепка при критическом уровне (''reslow'') - Графический ресурс нашлепки при критическом уровне здоровья<br />
*'''3D ресурс'''<br />
**модель (''mdl'') - трехмерный ресурс для отображения объекта<br />
**scale x (''mdlSx'') - масштаб по оси ''x''<br />
**scale y (''mdlSy'') - масштаб по оси ''y''<br />
**scale z (''mdlSz'') - масштаб по оси ''z''<br />
*'''Звуки'''<br />
**всплывание подложки (''snd_panel'') - звук показывающейся подложки<br />
**исчезание подложки (''snd_panel_hide'') - звук прячущейся подложки<br />
**переход в acting (''snd_to_acting'') - звук перехода в состояние acting<br />
**применение предмета (''snd_item_used'') - звук применение предмета при взаимодействии<br />
**предмет при паузе (''snd_item_pause'') - звук применение предмета при паузе<br />
**конец паузы (''snd_pause_end'') - звук при окончании паузы<br />
**фейл взаимодействия (''snd_fail'') - звук при переходе в fail<br />
**успех взаимодействия (''snd_success'') - звук при переходе в win<br />
**клик (''snd_click'') - звук при клике<br />
*'''Коэффициент скорости'''<br />
**вертикальное (''speed_0'') - на этот коэффициент умножается скорость при вертикальном движении<br />
**диагональное (''speed_1'') - на этот коэффициент умножается скорость при диагональном движении<br />
**горизонтальное (''speed_2'') - на этот коэффициент умножается скорость при горизонтальном движении<br />
Обычно горизонтальный коэффициент равен 1.00, чуть меньше диагональный и еще меньше вертикальный. Это необходимо для создания реалистичности движения относительно перспективы. То есть объекты, двигаясь вверх, как бы отдаляются от нас в глубь, поэтому по экрану они движутся медленней<br />
[[Файл:Isomover2.png|right]]<br />
*'''Таймер''':<br />
**подложка (''digBg'') - фон для цифр таймера<br />
**цифры (''digNorm'') - набор из 10-и цифр в виде ресурса анимации (клипа)<br />
**двоеточие (''colNorm'') - графический ресурс двоеточия<br />
**dx (''dx'') - смещение таймера по оси ''x'' относительно пивота изомувера<br />
**dy (''dy'') - смещение таймера по оси ''y'' относительно пивота изомувера<br />
**dx между цифрами (''digShift'') - расстояние между цифрами таймера<br />
**dx от (''colShift'') - отступы числовых разрядов влево и вправо от двоеточия<br />
**жизнь (''objlife'') - здесь выбирается объект типа прогресс_бар для отображения шкалы уровня жизни. Progress_bar создается отдельным объектом<br />
Таймер позволяет отобразить время до окончания взаимодействия объектов. Например "корабль" прибыл в "порт" и начал отгружать груз. С помощью числового таймера или progress_bar можно увидеть через сколько закончится отгрузка. На рисунке справа показано взаимодействие двух объектов с изображение шкалы жизни одного из объектов и времени до конца взаимодействия.<br />
*'''окно предмета''':<br />
**паспорт(''wndPassport'') - текстовый id, в котором в ''word'' лежит текст - название, в icon1 - графика изомувера для окна использования айтем<br />
Паспорт из этой группы используется в случаях открытия окна использования айтема для паузы или восстановления здоровья. <br />
**(текст) название айтема(''wndItemName'') - текстовый объект, в который вкладывается название айтема<br />
**(текст) текст айтема(''wndItemText'') - куда кладем описание айтема<br />
**иконка айтема(''wndItemIcon'') - иконка айтема<br />
**название взаимодействия(''wndActingName'') - куда кладем word и паспорта<br />
**превью взаимодействия(''wndActingPreview'') - паспорт или txtID из взаимодействия<br />
**(каунтер) есть предмета(''wndCntHave'') - сколько есть нужного айтема<br />
**(каунтер) нужно предмета(''wndCntNeed'') - нужно предмета <br />
**(каутер) цена res1(wndCntRes1) - цена предмета res1<br />
**(каутер) цена res2(wndCntRes2) - цена предмета res2<br />
**само окно(''wndWnd'') - должно иметь состояние show<br />
*'''Преследование'''<br />
**тип (''chasetype'') - тип объекта, который можно преследовать<br />
**радиус (''chaseradius'') - если объект указанного типа окажется в этом радиусе, то начнется преследование (например полицейская погоня)<br />
*'''Дорожное движение'''<br />
**радиус (''stopradius'') - объекты, которые двигались по одному ребру, останавливаются на расстоянии этого радиуса (необходимо для препятствия наслоений объектов на дороге, железнодорожных путях)<br />
*'''восстановление жизни''':<br />
**критический уровень (''pow_min'') - Критический уровень жизни<br />
**предмет (''pow_item'') - Предмет восстановления <br />
**время (''pow_time'') - Время восстановления жизни<br />
*'''ускорение взаимодействия''':<br />
**коэффициент (''boost_coef'') - Коэффициент ускорения взаимодействия. <br />
**время (''boost_time'') - Какое время (в миллисекундах) действует ускорение. <br />
<br />
*курсор (''curs'') - Графический ресурс курсора текущего и всех дочерних объектов<br />
*прокликиваемая (''passClk'') - Если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то картинка сама обрабатывает клик, но и пропускает его дальше" regexp="нет=0, да=1, обработать и пропустить=2<br />
*группа (''gr'') - Группа, в которую входит текущий объект<br />
*eitems (''eitems'') - Объект типа eitems<br />
<br><br />
<br />
==Добавляемые параметры==<br />
[[Файл:Isomover9.png|right|300px]]<br />
[[Файл:+.png]] '''Взаимодействие с другими объектами''':<br />
*тип (''mtype'') - тип объекта с которым по настроенному ниже сценарию будет происходить взаимодействие, -1 для любого типа<br />
*min жизнь (''minlife'') - минимальное значение жизни для начала взаимодействия, -1 не проверять. Служит для проверки жизни при взаимодействии и с "тип", и с "тип актив"<br />
*max жизнь (''maxlife'') - максимальное значение жизни для начала взаимодействия, -1 не проверять. Служит для проверки жизни при взаимодействии и с "тип", и с "тип актив"<br />
*тип актив (''mtype_a'') - тип мувера, который активирует взаимодействие, если данный в процессе подготовки<br />
*анимация (''res_a'') - анимация взаимодействия, например боя, разгрузки, разговора. Перетаскивается мышкой из редактора ресурсов<br />
*старт тип (''stype'') - тип старта взаимодействия<br />
**0 - бесконечное ожидание тапа. Переход в состояние acting не начнется, пока не произойдет тап по объекту<br />
**1 - автоматический переход в состояние acting<br />
**2 - время, через которое произойдет переход из acting_wait в acting после начала взаимодействия объектов<br />
**3 - переход по значению жизни<br />
*старт таймер (''stimer'') - время, за которое нужно активировать взаимодействие тапом<br />
*старт изм.жизни (''slife'') - скорость изменения жизни до активации взаимодействия тапом<br />
*старт изм.жизни другого (''slife_o'') - скорость изменения жизни враг до активации взаимодействия тапом<br />
*предмет (''item'') - предмет, необходимый для запуска активности. Актуально, когда имеется объект economics<br />
*иконка (''ico'') - иконка активности<br />
*смещение иконки (''ico_shift'') - смещение иконки активности по вертикали<br />
*актив тип (''atype'') - тип старта взаимодействия<br />
**0 - бесконечное ожидание тапа. Переход в состояние acting не начнется, пока не произойдет тап по объекту<br />
**1 - автоматический переход в состояние acting<br />
**2 - время, через которое произойдет переход из acting_wait в acting после начала взаимодействия объектов<br />
**3 - переход по значению жизни<br />
*актив таймер (''atime'') - время, которое длится взаимодействие<br />
*актив изменение жизни (''alife'') - скорость изменения жизни текущего объекта (ед/сек) в состоянии active<br />
*актив изменение жизни другого (''alife_o'') - скорость изменения жизни другого объекта (ед/сек) в состоянии active<br />
<br />
[[Файл:Isomover3.png|right|300px]]<br />
*объект инит (''obj'') - объект, состояние которого нужно изменить при переходе изомувера в acting_wait<br />
*состояние инит (''st'') - новое состояние другого объекта<br />
*объект старт (''obj_s'') - объект, состояние которого нужно изменить при переходе изомувера в acting<br />
*состояние старт (''st_s'') - новое состояние другого объекта<br />
*объект фейл (''obj_f'') - объект, состояние которого нужно изменить при переходе изомувера в состояние fail (проигрыш)<br />
*состояние фейл (''st_f'') - новое состояние другого объекта<br />
*объект успех (''obj_w'') - объект, состояние которого нужно изменить при переходе изомувера в состояние win (в случае победы)<br />
*состояние успех (''st_w'') - новое состояние другого объекта<br />
*дельта жизнь (''deltalife'') при успехе взаимодействия изменить значение жизни на эту величину<br />
*переводить другой в фейл (''o_fail'') - 1- переводить цель действия в fail, 0- в idle<br />
*переводить другой в мув (''o_move'') - при неудачном действии 1- переводить цель действия в move, 0- в idle<br />
*можно ускорить (''canspeed'') - 1- действие можно ускорить. От этого параметра зависит, какое событие будет вызываться по клику на объект в состоянии acting<br />
*звук ожидания (''snd_wait'') - звук, который будет воспроизводиться в состоянии acting_wait <br />
*звук действия (''snd_act'') - звук, который будет воспроизводиться в состоянии acting<br />
Для каждого типа объектов, с которыми взаимодействие возможно, необходимо добавить отдельный параметр "взаимодействие с другими объектами" и настроить его. Объекты инит, старт, фейл и успех вызываются при переходе текущего объекта в соответствующие состояния. Например, это может быть диалоговое окно, предлагающее продолжить взаимодействие, запуск дополнительных индикаторов, фейерверк в случае победы.<br />
*паспорт(''wndPassport'') - текстовый id, в котором в word лежит текст - название, в icon1 - графика изомувера для окна использования айтем<br />
Паспорт из этой группы используется в случаях открытия окна использования айтема для взаимодействия.<br />
<br />
[[Файл:+.png]] '''Клик при простое''' (''nst_idle''):<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии idel<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_move''), он же '''клик при движении''':<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии move<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Клик при паузе''' (''nst_pause''):<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии pause (заморозка)<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_aw_n'') он же '''клик при acting_wait, если другие действия не возможны'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting_wait<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_a_1'') он же '''клик при acting, ускорение возможно'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting и ускорение возможно<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_a_2'') он же '''клик при acting, ускорение НЕвозможно'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting и ускорение не возможно<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_beact'') он же '''клик при beeng_acting'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии beeng_acting, когда воздействие совершалось над ним другим объектом<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Конец движения''' (''nst_finish''):<br />
*объект - объект, состояние которого меняется, если изомувер закончил движение (достиг точки finish)<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Отправили в текущую ноду''' (''nst_place''):<br />
*объект - объект, состояние которого меняется, если изомувер направлен в ту же ноду, в которой и находится<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Перешел в fail''' (''nst_gopause''):<br />
*объект - объект, состояние которого меняется, если изомувер перешел в fail<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Перешел в pause''' (''nst_heal''):<br />
*объект - объект, состояние которого меняется, если изомувер Перешел в pause<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Восстановил здоровье''' (''nst_low_time''):<br />
*объект - объект, состояние которого меняется, если изомувер Восстановил здоровье<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Здоровье на 0''' (''nst_pow0'') - здоровье снизилось для нуля.<br />
*объект - объект, состояние которого меняется, если изомувер Восстановил здоровье<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Время истекло: изменить состояние объекта''' (''nst_low_time'') он же '''время на исходе: изменить состояние объекта''':<br />
*значение, при котором срабатывает обработчик<br />
*объект - объект, состояние которого меняется по истечению времени<br />
*состояние - новое состояние объекта<br />
<br><br />
<br />
==Состояния==<br />
[[Файл:isomover_box.png|right|350px]]<br />
*'''idle''' - дефолтное состояние, в которое isomover переходит после всех манипуляций. Недвижимым объектам следует передавать ''idle'', чтобы они появились (нарисовались) на карте. Для движущихся объектов его практически не используют, объект сам рисуется с началом движения. Если обьект был в ''being_acted'', то ему следуюет передать ''idle'' перед ''move_to_smooth'', чтобы он сдвинулся с места.<br />
*'''acting_wait''' - состояние, в котором изомувер ожидает взаимодействия с другим обьектом или с пользователем.<br />
*'''acting''' - состояние, в которое изомувер попадает, если встречаются два изомувера, которые могут взаимодействовать друг с другом или принудительная анимация взаимодействия с самим собой.<br />
*'''being_acted''' - в этом состоянии пребывает тот объект, над которым идет действие.<br />
*'''move''' - состояние движения от старта к финишу.<br />
*'''move_to_smooth''' - состояние движения от текущей ноды (или следующей, если объект идет) к финишу. Если обьект уже следует куда-то, и его надо перенаправить, то передаем ему это состояние.<br />
*'''appear''' - показать по альфе за время появления.<br />
*'''disappear''' - скрыть по альфе за время появления.<br />
*'''prepare_acting''' - принудительно перевести изомувер в acting_wait.<br />
*'''start_acting''' - принудительно перевести изомувер в acting.<br />
*'''fail''' - это состояние вызывается, если за время acting пользователь ничего не предпринял. Выполняется обработка взаимодействия в случае провала.<br />
*'''win''' - противоположное предыдущему. Пользователь предпринял действие, выполняется обработка взаимодействия в случае успеха.<br />
*'''healing''' - вылечить изомувер.<br />
*'''tap''' - симуляция тапа по изомуверу.<br />
*'''boost''' - ускорить взаимодействие изомувера.<br />
*'''pause''' - заморозить изомувер.<br />
*'''pause_wait''' - показать окно предмета, вызывающего заморозку.<br />
*'''pause_add''' - продлить заморозку на время, указанное в одноименном параметре (см. выше), если изомувер уже заморожен.<br />
<br />
==Особенности работы==<br />
[[Файл:Isomover6.png|right|300px]][[Файл:Isomover8.png|left|200px]]<br />
Движение объекта типа ''isomover'' задается с помощью отдельной машины состояний через которую происходит управление состояниями move, acting и остальными. Рассмотрим на конкретном примере. У нас есть объект '''woman''' типа ''isomover''. Необходимо, чтобы наш изомувер начал движение с точки b1 и дальше начал двигаться бесконечно по кольцу b2-b3-b4-b5. Движение задается машиной состояний ''woman_machine''.<br><br />
Для управления циклическим ходом назначим дополнительный параметр ''ww''. Название параметра должно быть уникально и не совпадать с параметрами игровых объектов.<br><br />
Для того, чтобы изомувер двигался каждый раз к новой точке, необходимо повторно инициализировать его точку финиша. Однако, если мы продолжим указывать ему состояние move для движения, то каждый раз он будет начинать движение с точки старта. Чтобы это исправить воспользуемся состоянием move_to_smooth, которое заставляет двигаться изомувер от текущей ноде к финишу, будто старт и финиш мы все время смещаем на шаг.<br />
<br>Основная логика будет находиться в состоянии ''circle_moving'' нашей машины. Надо сделать так, чтобы изомувер переходил в это состояние после движения по каждому из ребер. Для этого зайдем в свойства изомувера, нажмем правой кнопкой мыши и добавим параметр '''конец движения'''. У него есть поля ''объект'' и ''свойство''. Объект - машина состояний ''woman_machine'', состояние ''circle_moving'' этой машины. Таким образом, в конце каждого акта движения изомувер будет запускать состояние, в котором мы будем менять его точку финиша и запускать его движение.<br />
<br>Не забываем, что все операции с переменными должны отделяться скобками, как и сама переменная<br><br><br />
<br />
===Пример===<br />
Два изомувера (police_car и werewolf) совершают циклическое движение по определенному маршруту, заданному с помощью машин состояний (car_machine и werewolf_machine соответственно). Когда объекты оказываются в радиусе (достаточном для активации добавляемого параметра '''"Взаимодействие с другими объектами"'''), объект '''police_car''' начинает взаимодействовать с объектом '''werewolf'''. По истечению времени воздействия объект '''police_car''' переходит в состояние '''fail'''. Если кликнуть на процесс взаимодействия объектов, то объект '''police_car''' перейдет в состояние '''win'''.<br />
*'''Пример:<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample\Isomap.rar<br />
<br />
<br />
<br />
[[Category:Main objects]]<br />
[[Category:Game mechanic]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Isomover&diff=9772Isomover2018-12-22T14:32:51Z<p>Agava: /* Состояния */</p>
<hr />
<div>'''Isomover''' - [[Object|объект]] используется для осуществления движения и взаимодействия в изометрической карте. <br />
<br />
Isomover обязательно должен быть подобъектом [[isomap]]. <br />
<br />
В проекте с картой ([[isomap]]) и движущимися по ней объектами (isomover) часто используют [[economics]] и [[eitems]] потому, что для завершения процессов часто требуется применить предмет или ресурс.<br />
<br />
Начало движения множества изомуверов сильно нагружает систему, поэтому следует позаботиться, чтобы это происходило не в один момент времени. По возможности добавляйте небольшую и различную паузу каждому изомуверу перед стартом.<br><br><br />
==Основные параметры==<br />
*'''Положение''' (''x'',''y'') - рекомендуется выносить isomover-объекты за пределы карты. Иначе, если объект должен появляться не сразу, то он будет просто стоять без движения<br />
*'''Память''' - всегда должно быть значение 1, обязательное условие корректной работы. Это позволяет объекту двигаться последовательно, не инициализируясь после каждого движения в исходной точке<br />
*'''тип ребра min''' (''edge_t_min'') - перемещаться по ребрам не ниже заданного, -1 не проверять<br />
*'''тип ребра max''' (''edge_t_max'') - перемещаться по ребрам не выше заданного, -1 не проверять. Типы ребер задаются в isomap<br />
*'''Старт''' (''start'') - точка старта, выбирается из списка точек Isomap<br />
*'''Финиш''' (''finish'') - точка финиша, выбирается из списка точек Isomap<br />
*'''Скорость (макс)''' (''vel_max'') - максимальная скорость, с которой передвигается объект Isomover<br />
*'''Скорость''' (''vel'') - не использовать, вычисляется по формуле автоматически, позже будет скрыто. V = Vmax*(k+(1-k)*(P/Pmax))<br />
*'''Жизнь (макс)''' (''pow_max'') - максимальная жизнь<br />
*'''Жизнь''' (''pow'') - текущая жизнь, высчитывается по формуле автоматически<br />
*'''Сохранять жизнь в опции''' (''powsave'') - если да, то объекты сцены сохранят уровень жизни при выходе со сцены и возвращении на нее<br />
*'''Коэффициент скорости''' (''speed_k'') - коэффициент k в формуле расчета скорости. Чтобы скорость не зависела от значения жизни - указываем speed_k = 1<br />
*'''Менять угол''' (''fixangle'') - изменение угла для предания плавности смены графики при дугообразном перемещении объекта. С появлением 3D-объектов больше не используется<br />
*'''Тип''' (''mtype'') - объекты можно разделять на типы (люди, монстры, звери и т.д.). Взаимодействие происходит между объектами разных типов, настраивается в добавляемых параметрах<br />
*'''Радиус''' (''mradius'') - значения радиуса. Попадание изомувера другого типа в этот радиус позволит начать взаимодействие.<br />
*'''Цель при действии''' (''mtarget'') - мувер может быть целью взаимодействия пока сам действует<br />
*'''Запретить действие''' (''disact'') - мувер не сможет перейти из acting_wait в acting<br />
*'''Время появления''' (''appear_time'') - время в миллисекундах появления и исчезания изомувера (длительность перехода по alpha)<br />
*'''Время провала''' (''fail_time'') - длительность анимации смерти объекта, по его окончанию произойдет переход в состояние ''disappear''<br />
*'''Время паузы''' (''pause_time'') - длительность "заморозки" объекта<br />
*'''Предмет паузы''' (''pause_item'') - предмет для включения паузы<br />
*'''Прибавка паузы''' (''pause_add'') - если изомувер уже на паузе, по состоянию pause_add продлевает паузу на заданное значение ms<br />
*'''fail при 0 жизни''' (''zerofail'') - 1- при нулевом уровне жизни изомувер перейдет в fail, 0 - останется жив<br />
*'''Не пересчитывать маршрут''' (''softrecalc'') - 1- при отключении ребер графа не произойдет пересчета маршрута, 0 - маршрут будет пересчитан<br />
*'''Реагировать на''' (''tapreact'') - 1- на тап, 0- на клик<br />
*'''Дорожное движение''' (''trafficcheck'') - 1 - проверять столкновения, 0 - нет<br />
*'''использовать бонусы ко времени''' (''useTimeItems'') - флаг, будет ли изомувер использовать бонусы от амулетов на ускорение времени взаимодействия (настраивается в экономике). 1 - да, 0 - нет. <br />
<br><br />
<br />
==Дополнительные параметры==<br />
[[Файл:Isomover1.png|right|300px]]<br />
*'''Графический ресурс:'''<br />
**вверх (''res0'') - графический ресурс движения вверх<br />
**вверх/вправо (''res1'') - графический ресурс движения вверх/вправо<br />
**вправо (''res2'') - графический ресурс движения вправо <br />
**вниз/вправо (''res3'') - графический ресурс движения вниз/вправо<br />
**вниз (''res4'') - графический ресурс движения вниз <br />
**вниз/влево (''res5'') - графический ресурс движения вниз/влево<br />
**влево (''res6'') - графический ресурс движения влево <br />
**вверх/влево (''res7'') - графический ресурс движения вверх/влево. Достаточно указать первые пять ресурсов, а остальные редактор отобразит автоматически симметрично<br />
**деятельность (''resa'') - графический ресурс для состояния acting и acting_wait<br />
**рисовать действие поверх (''resaover'') - 1 - поверх, 0 - подменять ресурс. Применяем, если, например, анимацию нужно отобразить поверх изомувера.<br />
**иконка персонажа (''char_ico'') - иконка, которая будет находится сверху над персонажем. Изменение масштаба во время игры не влияет на масштаб иконки. Рекомендуется создавать ее с пивотом у нижней границы, тогда при масштабировании не будет образовываться зазор между иконкой и графикой объекта<br />
**смещение иконки персонажа (''char_ico_shift'') - смещение иконки по вертикали<br />
**рисовать при действии (''resad'') - 1- мувер рисуется при состоянии acting, 0- не рисуется<br />
**провал (''resf'') - графический ресурс состояния fail. Может быть картинкой или анимацией<br />
**пауза (''resp'') - графический ресурс состояния pause<br />
**рисовать паузу поверх (''respover'') - 1 - поверх, 0 - подменять ресурс.<br />
**восстановление жизни (''resheal'') - графический ресурс восстановления жизни<br />
**нашлепка при критическом уровне (''reslow'') - Графический ресурс нашлепки при критическом уровне здоровья<br />
*'''3D ресурс'''<br />
**модель (''mdl'') - трехмерный ресурс для отображения объекта<br />
**scale x (''mdlSx'') - масштаб по оси ''x''<br />
**scale y (''mdlSy'') - масштаб по оси ''y''<br />
**scale z (''mdlSz'') - масштаб по оси ''z''<br />
*'''Звуки'''<br />
**всплывание подложки (''snd_panel'') - звук показывающейся подложки<br />
**исчезание подложки (''snd_panel_hide'') - звук прячущейся подложки<br />
**переход в acting (''snd_to_acting'') - звук перехода в состояние acting<br />
**применение предмета (''snd_item_used'') - звук применение предмета при взаимодействии<br />
**предмет при паузе (''snd_item_pause'') - звук применение предмета при паузе<br />
**конец паузы (''snd_pause_end'') - звук при окончании паузы<br />
**фейл взаимодействия (''snd_fail'') - звук при переходе в fail<br />
**успех взаимодействия (''snd_success'') - звук при переходе в win<br />
**клик (''snd_click'') - звук при клике<br />
*'''Коэффициент скорости'''<br />
**вертикальное (''speed_0'') - на этот коэффициент умножается скорость при вертикальном движении<br />
**диагональное (''speed_1'') - на этот коэффициент умножается скорость при диагональном движении<br />
**горизонтальное (''speed_2'') - на этот коэффициент умножается скорость при горизонтальном движении<br />
Обычно горизонтальный коэффициент равен 1.00, чуть меньше диагональный и еще меньше вертикальный. Это необходимо для создания реалистичности движения относительно перспективы. То есть объекты, двигаясь вверх, как бы отдаляются от нас в глубь, поэтому по экрану они движутся медленней<br />
[[Файл:Isomover2.png|right]]<br />
*'''Таймер''':<br />
**подложка (''digBg'') - фон для цифр таймера<br />
**цифры (''digNorm'') - набор из 10-и цифр в виде ресурса анимации (клипа)<br />
**двоеточие (''colNorm'') - графический ресурс двоеточия<br />
**dx (''dx'') - смещение таймера по оси ''x'' относительно пивота изомувера<br />
**dy (''dy'') - смещение таймера по оси ''y'' относительно пивота изомувера<br />
**dx между цифрами (''digShift'') - расстояние между цифрами таймера<br />
**dx от (''colShift'') - отступы числовых разрядов влево и вправо от двоеточия<br />
**жизнь (''objlife'') - здесь выбирается объект типа прогресс_бар для отображения шкалы уровня жизни. Progress_bar создается отдельным объектом<br />
Таймер позволяет отобразить время до окончания взаимодействия объектов. Например "корабль" прибыл в "порт" и начал отгружать груз. С помощью числового таймера или progress_bar можно увидеть через сколько закончится отгрузка. На рисунке справа показано взаимодействие двух объектов с изображение шкалы жизни одного из объектов и времени до конца взаимодействия.<br />
*'''окно предмета''':<br />
**паспорт(''wndPassport'') - текстовый id, в котором в ''word'' лежит текст - название, в icon1 - графика изомувера для окна использования айтем<br />
Паспорт из этой группы используется в случаях открытия окна использования айтема для паузы или восстановления здоровья. <br />
**(текст) название айтема(''wndItemName'') - текстовый объект, в который вкладывается название айтема<br />
**(текст) текст айтема(''wndItemText'') - куда кладем описание айтема<br />
**иконка айтема(''wndItemIcon'') - иконка айтема<br />
**название взаимодействия(''wndActingName'') - куда кладем word и паспорта<br />
**превью взаимодействия(''wndActingPreview'') - паспорт или txtID из взаимодействия<br />
**(каунтер) есть предмета(''wndCntHave'') - сколько есть нужного айтема<br />
**(каунтер) нужно предмета(''wndCntNeed'') - нужно предмета <br />
**(каутер) цена res1(wndCntRes1) - цена предмета res1<br />
**(каутер) цена res2(wndCntRes2) - цена предмета res2<br />
**само окно(''wndWnd'') - должно иметь состояние show<br />
*'''Преследование'''<br />
**тип (''chasetype'') - тип объекта, который можно преследовать<br />
**радиус (''chaseradius'') - если объект указанного типа окажется в этом радиусе, то начнется преследование (например полицейская погоня)<br />
*'''Дорожное движение'''<br />
**радиус (''stopradius'') - объекты, которые двигались по одному ребру, останавливаются на расстоянии этого радиуса (необходимо для препятствия наслоений объектов на дороге, железнодорожных путях)<br />
*'''восстановление жизни''':<br />
**критический уровень (''pow_min'') - Критический уровень жизни<br />
**предмет (''pow_item'') - Предмет восстановления <br />
**время (''pow_time'') - Время восстановления жизни<br />
*'''ускорение взаимодействия''':<br />
**коэффициент (''boost_coef'') - Коэффициент ускорения взаимодействия. <br />
**время (''boost_time'') - Какое время (в миллисекундах) действует ускорение. <br />
<br />
*курсор (''curs'') - Графический ресурс курсора текущего и всех дочерних объектов<br />
*прокликиваемая (''passClk'') - Если 1, то картинка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то картинка сама обрабатывает клик, но и пропускает его дальше" regexp="нет=0, да=1, обработать и пропустить=2<br />
*группа (''gr'') - Группа, в которую входит текущий объект<br />
*eitems (''eitems'') - Объект типа eitems<br />
<br><br />
<br />
==Добавляемые параметры==<br />
[[Файл:Isomover9.png|right|300px]]<br />
[[Файл:+.png]] '''Взаимодействие с другими объектами''':<br />
*тип (''mtype'') - тип объекта с которым по настроенному ниже сценарию будет происходить взаимодействие, -1 для любого типа<br />
*min жизнь (''minlife'') - минимальное значение жизни для начала взаимодействия, -1 не проверять. Служит для проверки жизни при взаимодействии и с "тип", и с "тип актив"<br />
*max жизнь (''maxlife'') - максимальное значение жизни для начала взаимодействия, -1 не проверять. Служит для проверки жизни при взаимодействии и с "тип", и с "тип актив"<br />
*тип актив (''mtype_a'') - тип мувера, который активирует взаимодействие, если данный в процессе подготовки<br />
*анимация (''res_a'') - анимация взаимодействия, например боя, разгрузки, разговора. Перетаскивается мышкой из редактора ресурсов<br />
*старт тип (''stype'') - тип старта взаимодействия<br />
**0 - бесконечное ожидание тапа. Переход в состояние acting не начнется, пока не произойдет тап по объекту<br />
**1 - автоматический переход в состояние acting<br />
**2 - время, через которое произойдет переход из acting_wait в acting после начала взаимодействия объектов<br />
**3 - переход по значению жизни<br />
*старт таймер (''stimer'') - время, за которое нужно активировать взаимодействие тапом<br />
*старт изм.жизни (''slife'') - скорость изменения жизни до активации взаимодействия тапом<br />
*старт изм.жизни другого (''slife_o'') - скорость изменения жизни враг до активации взаимодействия тапом<br />
*предмет (''item'') - предмет, необходимый для запуска активности. Актуально, когда имеется объект economics<br />
*иконка (''ico'') - иконка активности<br />
*смещение иконки (''ico_shift'') - смещение иконки активности по вертикали<br />
*актив тип (''atype'') - тип старта взаимодействия<br />
**0 - бесконечное ожидание тапа. Переход в состояние acting не начнется, пока не произойдет тап по объекту<br />
**1 - автоматический переход в состояние acting<br />
**2 - время, через которое произойдет переход из acting_wait в acting после начала взаимодействия объектов<br />
**3 - переход по значению жизни<br />
*актив таймер (''atime'') - время, которое длится взаимодействие<br />
*актив изменение жизни (''alife'') - скорость изменения жизни текущего объекта (ед/сек) в состоянии active<br />
*актив изменение жизни другого (''alife_o'') - скорость изменения жизни другого объекта (ед/сек) в состоянии active<br />
<br />
[[Файл:Isomover3.png|right|300px]]<br />
*объект инит (''obj'') - объект, состояние которого нужно изменить при переходе изомувера в acting_wait<br />
*состояние инит (''st'') - новое состояние другого объекта<br />
*объект старт (''obj_s'') - объект, состояние которого нужно изменить при переходе изомувера в acting<br />
*состояние старт (''st_s'') - новое состояние другого объекта<br />
*объект фейл (''obj_f'') - объект, состояние которого нужно изменить при переходе изомувера в состояние fail (проигрыш)<br />
*состояние фейл (''st_f'') - новое состояние другого объекта<br />
*объект успех (''obj_w'') - объект, состояние которого нужно изменить при переходе изомувера в состояние win (в случае победы)<br />
*состояние успех (''st_w'') - новое состояние другого объекта<br />
*дельта жизнь (''deltalife'') при успехе взаимодействия изменить значение жизни на эту величину<br />
*переводить другой в фейл (''o_fail'') - 1- переводить цель действия в fail, 0- в idle<br />
*переводить другой в мув (''o_move'') - при неудачном действии 1- переводить цель действия в move, 0- в idle<br />
*можно ускорить (''canspeed'') - 1- действие можно ускорить. От этого параметра зависит, какое событие будет вызываться по клику на объект в состоянии acting<br />
*звук ожидания (''snd_wait'') - звук, который будет воспроизводиться в состоянии acting_wait <br />
*звук действия (''snd_act'') - звук, который будет воспроизводиться в состоянии acting<br />
Для каждого типа объектов, с которыми взаимодействие возможно, необходимо добавить отдельный параметр "взаимодействие с другими объектами" и настроить его. Объекты инит, старт, фейл и успех вызываются при переходе текущего объекта в соответствующие состояния. Например, это может быть диалоговое окно, предлагающее продолжить взаимодействие, запуск дополнительных индикаторов, фейерверк в случае победы.<br />
*паспорт(''wndPassport'') - текстовый id, в котором в word лежит текст - название, в icon1 - графика изомувера для окна использования айтем<br />
Паспорт из этой группы используется в случаях открытия окна использования айтема для взаимодействия.<br />
<br />
[[Файл:+.png]] '''Клик при простое''' (''nst_idle''):<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии idel<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_move''), он же '''клик при движении''':<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии move<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Клик при паузе''' (''nst_pause''):<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии pause (заморозка)<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_aw_n'') он же '''клик при acting_wait, если другие действия не возможны'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting_wait<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_a_1'') он же '''клик при acting, ускорение возможно'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting и ускорение возможно<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_a_2'') он же '''клик при acting, ускорение НЕвозможно'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии acting и ускорение не возможно<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Изменить состояние объекта''' (''nst_beact'') он же '''клик при beeng_acting'''<br />
*объект - объект, состояние которого меняется, если изомувер был нажат в состоянии beeng_acting, когда воздействие совершалось над ним другим объектом<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Конец движения''' (''nst_finish''):<br />
*объект - объект, состояние которого меняется, если изомувер закончил движение (достиг точки finish)<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Отправили в текущую ноду''' (''nst_place''):<br />
*объект - объект, состояние которого меняется, если изомувер направлен в ту же ноду, в которой и находится<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Перешел в fail''' (''nst_gopause''):<br />
*объект - объект, состояние которого меняется, если изомувер перешел в fail<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Перешел в pause''' (''nst_heal''):<br />
*объект - объект, состояние которого меняется, если изомувер Перешел в pause<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Восстановил здоровье''' (''nst_low_time''):<br />
*объект - объект, состояние которого меняется, если изомувер Восстановил здоровье<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Здоровье на 0''' (''nst_pow0'') - здоровье снизилось для нуля.<br />
*объект - объект, состояние которого меняется, если изомувер Восстановил здоровье<br />
*состояние - новое состояние объекта<br />
[[Файл:+.png]] '''Время истекло: изменить состояние объекта''' (''nst_low_time'') он же '''время на исходе: изменить состояние объекта''':<br />
*значение, при котором срабатывает обработчик<br />
*объект - объект, состояние которого меняется по истечению времени<br />
*состояние - новое состояние объекта<br />
<br><br />
<br />
==Состояния==<br />
[[Файл:isomover_box.png|right|350px]]<br />
*'''idle''' - дефолтное состояние, в которое isomover переходит после всех манипуляций. Недвижимым объектам следует передавать ''idle'', чтобы они появились (нарисовались) на карте. Для движущихся объектов его практически не используют, объект сам рисуется с началом движения. Если обьект был в ''being_acted'', то ему следуюет передать ''idle'' перед ''move_to_smooth'', чтобы он сдвинулся с места.<br />
*'''acting_wait''' - состояние, в котором изомувер ожидает взаимодействия с другим обьектом или с пользователем.<br />
*'''acting''' - состояние, в которое изомувер попадает, если встречаются два изомувера, которые могут взаимодействовать друг с другом или принудительная анимация взаимодействия с самим собой.<br />
*'''being_acted''' - в этом состоянии пребывает тот объект, над которым идет действие.<br />
*'''move''' - состояние движения от старта к финишу.<br />
*'''move_to_smooth''' - состояние движения от текущей ноды (или следующей, если объект идет) к финишу. Если обьект уже следует куда-то, и его надо перенаправить, то передаем ему это состояние.<br />
*'''appear''' - показать по альфе за время появления.<br />
*'''disappear''' - скрыть по альфе за время появления.<br />
*'''prepare_acting''' - принудительно перевести изомувер в acting_wait.<br />
*'''start_acting''' - принудительно перевести изомувер в acting.<br />
*'''fail''' - это состояние вызывается, если за время acting пользователь ничего не предпринял. Изомувер исчезает.<br />
*'''healing''' - вылечить изомувер.<br />
*'''tap''' - симуляция тапа по изомуверу.<br />
*'''boost''' - ускорить взаимодействие изомувера.<br />
*'''pause''' - заморозить изомувер.<br />
*'''pause_wait''' - показать окно предмета, вызывающего заморозку.<br />
*'''pause_add''' - продлить заморозку на время, указанное в одноименном параметре (см. выше), если изомувер уже заморожен.<br />
<br />
==Особенности работы==<br />
[[Файл:Isomover6.png|right|300px]][[Файл:Isomover8.png|left|200px]]<br />
Движение объекта типа ''isomover'' задается с помощью отдельной машины состояний через которую происходит управление состояниями move, acting и остальными. Рассмотрим на конкретном примере. У нас есть объект '''woman''' типа ''isomover''. Необходимо, чтобы наш изомувер начал движение с точки b1 и дальше начал двигаться бесконечно по кольцу b2-b3-b4-b5. Движение задается машиной состояний ''woman_machine''.<br><br />
Для управления циклическим ходом назначим дополнительный параметр ''ww''. Название параметра должно быть уникально и не совпадать с параметрами игровых объектов.<br><br />
Для того, чтобы изомувер двигался каждый раз к новой точке, необходимо повторно инициализировать его точку финиша. Однако, если мы продолжим указывать ему состояние move для движения, то каждый раз он будет начинать движение с точки старта. Чтобы это исправить воспользуемся состоянием move_to_smooth, которое заставляет двигаться изомувер от текущей ноде к финишу, будто старт и финиш мы все время смещаем на шаг.<br />
<br>Основная логика будет находиться в состоянии ''circle_moving'' нашей машины. Надо сделать так, чтобы изомувер переходил в это состояние после движения по каждому из ребер. Для этого зайдем в свойства изомувера, нажмем правой кнопкой мыши и добавим параметр '''конец движения'''. У него есть поля ''объект'' и ''свойство''. Объект - машина состояний ''woman_machine'', состояние ''circle_moving'' этой машины. Таким образом, в конце каждого акта движения изомувер будет запускать состояние, в котором мы будем менять его точку финиша и запускать его движение.<br />
<br>Не забываем, что все операции с переменными должны отделяться скобками, как и сама переменная<br><br><br />
<br />
===Пример===<br />
Два изомувера (police_car и werewolf) совершают циклическое движение по определенному маршруту, заданному с помощью машин состояний (car_machine и werewolf_machine соответственно). Когда объекты оказываются в радиусе (достаточном для активации добавляемого параметра '''"Взаимодействие с другими объектами"'''), объект '''police_car''' начинает взаимодействовать с объектом '''werewolf'''. По истечению времени воздействия объект '''police_car''' переходит в состояние '''fail'''. Если кликнуть на процесс взаимодействия объектов, то объект '''police_car''' перейдет в состояние '''win'''.<br />
*'''Пример:<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample\Isomap.rar<br />
<br />
<br />
<br />
[[Category:Main objects]]<br />
[[Category:Game mechanic]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=HiddenList&diff=9771HiddenList2018-12-22T14:06:53Z<p>Agava: /* Состояния */</p>
<hr />
<div>{{TOC right}}<br />
HiddenList является менеджером поисковых [[Object|объектов]]. На сегодня HiddenList не просто управляет объектами на сцене - он отвечает за все штрафы и поощрения. В связке с такими объектами как [[HiddenHint]] + [[Effect]] HiddenList дает возможность реализовать систему подсказок, а также такие графические эффекты как: "ночь", "трансформация цвета" и т.д. с одним набором графики.<br />
<br />
==Общие параметры==<br />
(см. описание [[Object|Object]])<br />
<br />
[[Файл:HOList_1.jpg|right]]<br />
<br />
*'''имя''' ('' nm '') - Имя объекта HiddenList в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта HiddenList, который можно увидеть в строке "имя" либо при наведении курсора на неё.<br />
*'''синхронизация''' ('' sync '') - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' ('' sv '') - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' ('' z '') - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' ('' memo ''):<br />
:'''1''' - при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
:'''0''' - обновит свои параметры, при повторном открытии экрана.<br />
*'''группа''' ('' gr '') - Группа, в которую входит текущий объект.<br />
<br />
У листа также есть группы стандартных параметров такие как '''положение''', '''размер''', '''модификаторы'''. Но, по сути, они не важны. Главное, чтобы лист не перекрывал на сцене другие объекты. Поэтому ему лучше находиться за пределами сцены. <br />
<br />
==Основные параметры==<br />
<br />
*'''Картинка''' ('' res '') - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Обычно не используется, а применяется для отображения table;<br><br />
*'''Таблица''' ('' table '') - Объект типа [[table]], который является визуальным отображением списка. '''Должна быть обязательно''';<br><br />
*'''Подсказка''' ('' hint '') — объект типа [[HiddenHint]], который является менеджером хинтов;<br><br />
*'''highlighter''' ('' hl '') — объект типа [[HiddenHighLighter|hiddenhighlighter]], который подсвечивает не найденные объекты.;<br><br />
*'''Счетчик''' ('' hdncnt '') — объект типа [[Counter]], который отображает количество найденных объектов.<br><br />
В самом счетчике в параметрах нужно указать val = 0, поскольку изначально нет найденных объектов;<br />
*'''Таймер''' ('' timer '') — объект типа [[Timer]], который отображает время игры.<br />
При инициализации листа он передаст состояние "start" таймеру.<br />
*'''отладка''' ('' trace '') — Отображать в окне состояний текущий объект.<br />
<br />
<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''вычеркнуть''' ('' cross ''):<br />
:'''1''' - найденный объект вычеркивается, оставаясь в списке(таблице);<br />
:'''число''' - найденный объект удаляется из списка;<br />
*'''листать''' ('' scroll '')<br />
:'''1''' - список можно листать (скролировать);<br />
:'''число''' - ищутся только те объекты, которые видны в списке (таблице);<br />
*'''тип списка''' ('' kind '') - Тип поиска объектов:<br />
:'''1''' - слово;<br />
:'''2''' - предложение;<br />
:'''3''' - удаляемая пиктограмма;<br />
:'''4''' - пиктограмма;<br />
:'''5''' - поиск различий.<br />
*'''поиск пар''' ('' pair '') - Если 1, то идет поиска пар объектов с одинаковым типом, иначе обычный режим<br />
:'''пары''' - поиск пар;<br />
:'''одиночные''' - поиск по одному объекту.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''обычный''' ('' sndNrm '') - Звук при нахождении обычного [[HiddenObject]].<br />
*'''коллекционный''' ('' sndCol '') - Звук при нахождении коллекционного [[HiddenObject]](объекту должна быть установлена коллекция).<br />
<br />
<br />
<br />
'''Группа - параметры поиска'''<br />
<br />
*'''объектов''' ('' num '') - Максимальное количество доступных для поиска объектов в одной игровой сессии. (ВАЖНО!!! Таблице нужно установить общее количество ячеек равное(или больше) количеству доступных для поиска объектов).<br />
*'''активных объектов''' ('' numact '') - Максимальное количество активных объектов в одной игровой сессии.<br />
*'''видимых объектов''' ('' numvis'') - Максимальное количество видимых объектов в одной игровой сессии.<br />
*'''одного типа''' ('' max ''):<br />
:'''число''' - Максимальное количество объектов одного типа - поле тип в [[hiddenObject]] или хидден объекты с одинаковыми текстовыми ID могут считаться объектами одного типа;<br />
:'''-1''' - игнорируется.<br />
*'''прятать''' ('' hide '') - Делать невидимыми объекты, не участвующие в поиске.<br />
*'''оставлять''' ('' stay '') - Оставлять найденный объект на месте (вызывая только флаеры) при удачном клике.<br />
*'''актёр-иконка''' ('' actorIco '') - если "да", то во время полёта найденного хидден-объекта вместо него летит иконка которая помечена как "main picture" и указана в текстовом id хидден-объекта.<br><br />
*'''актер''' ('' actor '') - машина состояний, которая управляет процессом полета к таблице найденных [[HiddenObject]] .<br />
*'''z актера''' ('' actorZ '') - z актера. Будет применено только если не равен 0.<br />
*'''актер стартует из таблицы''' ('' actorTable '') - если настройка включена, то актер стартует не из позиции хиддена, а из ячейки таблицы .<br />
*'''целевой объект''' (''trg'') - Если задан, [[HiddenObject]] после нахождения летит не в ячейку таблицы, а к нему.<br />
<br />
<br />
<br />
'''Группа - скорость'''<br />
<br />
Отвечают за скорость перемещения найденного объекта.<br />
*'''полета''' ('' vf '') - Скорость полета в пикселях в секунду.<br />
*'''вращения''' ('' vr '') - Скорость вращения в градусах в секунду.<br />
<br />
<br />
<br />
'''Группа - равномерное распределение'''<br />
<br />
*'''включить''' ('' undist '') - Равномерно распределять объекты по площади сцены.<br />
*'''дополнительные сортировки''' ('' addit_algo '') - Использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами)<br />
<br />
'''Группа - итерационное распределение'''<br />
<br />
*'''включить''' ('' altern_algo '') - Использовать итерационный алгоритм поиска равномерного распределения объектов<br />
*'''учитывать сложности''' ('' process_diff '') - Учитывать сложности предметов при распределении<br />
*'''количество объектов''' ('' hiddens_num_threshold '') - Максимальное количество активных предметов на сцене для которых будут учитываться сложности (max = 24)<br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - Максимальное количество итераций фикса перекрытия объектов.<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - Максимальная допустимая площадь перекрытия в пикселях.<br />
*'''ключ распределения''' ('' distribution_seed '') - Ключ для случайного выбора заменяемого предмета (только для мультиплеера)<br />
*'''удалять перекрытия''' ('' del_after_fix '') - Удалять оставшиеся перекрытия после последней итерации фикса.<br />
<br />
Рекомендации по использованию:<br />
<br />
*Если включать "Удалять перекрытия", то нужно для счетчика кол-ва оставшихся хидденов считывать значение из "num".<br />
*Оптимальное значение максимальной площади - 1024 пикселей, т.е. допускаем перекрытие в 32 на 32 пикселя, что совсем не влияет на визуальное перекрытие объектов.<br />
*Количество итераций можем ставить 20-50. Если перекрытий не останется раньше, то фикс перекрытий остановится, если выполнится все количество - отобразится количество перекрытий в логах. Большое количество итераций фикса негативно сказывается на скорости загрузки сцены.<br />
<br />
Логи:<br />
<br />
<pre><br />
"Deleting a hidden object with textID: %i" - удаление объекта с текстовым ID<br />
"Overlapping detected! Area: %f px" - обнаружения перекрытия в столько-то пикселей<br />
"fixOverlapping() Iterations num: %i / %i; Overlaps num: %i" - итерации, итоговое количество перекрытий<br />
</pre><br />
<br />
==Дополнительные параметры==<br />
<br />
*'''скалирование объектов''' ('' scale_object '') - При нахождении во время полета объект будет скалироватся: <br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''пропадание объектов''' ('' alpha_object '') - При нахождении во время полета объект будет менять альфу:<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''реагировать на отпускание''' ('' touch_up '') - Объекты связанные с этим хидденлистом будут реагировать на отпускание, а не на нажатие:<br />
:'''0''' - отключено;<br />
:'''1''' - включено (То есть реагировать на четкий клик, если кликнули и сместили область клика объект не реагирует!).<br />
*'''реагировать на finger tap''' ('' finger_tap '') - Объекты, связанные с этим хидденлистом, будут реагировать на отпускание после ожидания даблтача.<br />
*'''задержка срабатывания''' ('' touch_delay '') - только для реакции на нажатие. Время между нажатием и реакцией списка объектов.<br />
*'''объединять одинаковые тексты''' ('' same_txt '') - Объекты с одинаковым текстом будут жить в одной ячейке таблицы с добавлением множителя xN.<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''множитель для иконок''' ('' ico_res '') - Графический ресурс(анимация) для отображения множителя у иконок для типа списка 4(поиск по иконкам) и включенного объединения одинаковых текстов. Первый фрейм - х2, второй - х3 и т.д.<br />
*'''исключать одинаковые тексты''' ('' unTxtID '') - исключает или не исключает из поиска объекты с одинаковыми txtID, используется совместно с '''одного типа'''.<br />
*'''показывать один объект игр''' ('' unTxtRep '') - Количество игр, в течении которых будет выбран один объект из данного набора. 0 - не использовать механизм<br />
*'''силуэты после слов''' ('' picsAfterWords '') - Стараться в силуэтах использовать то, что находилось в словах<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один<br />
*'''находить много одним кликом''' ('' canFoundMultiple '') - 1 - если тап попал на несколько объектов, то найдем все. 0 - только один<br />
*'''вероятность пассивного предпочитаемого объекта''' ('' prefProb '') - вероятность выпадения пассивного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''вероятность активного предпочитаемого объекта''' ('' prefProbAct '') - вероятность выпадения активного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''реагировать на невидимые''' ('' canInvis '') - реагировать или нет на объекты, которые в момент игры не видны в таблице. (Кликаются только те [[hiddenObject]] которые отображены в таблице, остальные нет!).<br />
<br />
<br />
'''Группа - равномерное распределение''' - в настоящее время не рекомендуется включать параметры из этой группы. Логика устарела и может конфликтовать со следующей группой итерационного распределения. Эта группа оставлена для возможной доработки в будущем. <br />
*'''включить''' ('' undist '') - равномерно распределять объекты по площади сцены. Да/нет. <br />
*'''дополнительные сортировки''' (''addit_algo'') - использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами). Да/нет. <br />
<br />
<br />
'''Группа - итерационное распределение''' - на данный момент лучший алгоритм равномерного распределения.<br />
*'''включить''' ('' altern_algo '') - использовать итерационный алгоритм поиска равномерного распределения объектов. Да/нет. <br />
*'''учитывать сложности''' ('' process_diff '') - учитывать сложности объектов при распределении. Подробнее о сложностях в описании соответствующего параметра в [[hiddenObject]]. Да/нет. <br />
*'''количество объектов''' ('' hiddens_num_threshold '') - максимальное количество активных предметов на сцене, для которых будут учитываться сложности. <br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - максимальное количество итераций фикса перекрытия объектов. По умолчанию 50, min="0" max="100".<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - максимальная допустимая площадь перекрытия в пикселях. По умолчанию 1024, min="0" max="2048". <br />
*'''ключ распределения''' ('' distribution_seed '') - ключ для случайного выбора заменяемого предмета (только для мультиплеера). min="0" max="32768".<br />
*'''удалять перекрытия''' ('' del_after_fix '') - удалять оставшиеся перекрытия после последней итерации фикса. Количество объектов получать из num, нет=0, да=1. <br />
<br />
<br />
*'''прятать актеров при старте''' ('' hideact '') - Устанавливать актерам видимость false при старте (по умолчанию - да)(То есть всем актерам которые находятся на сцене при запуске принудительно установиться vis = 0).<br />
*'''аномалия''' ('' anom '') - для всех аномалий кроме текстовой [[HiddenObject]] и игровой фон должны быть подобъектами [[Effect]]):<br />
:'''0''' - нет;<br />
:'''1''' - текстовая;<br />
:'''2''' - ночь; В машине которая выставляет эффект ночь, должны передавать сцене с объектом аномалия ( obj="scene"; par="drag"; val="0" ) и ( obj="scene"; st="update");<br />
:'''3''' - трансформация цвета;<br />
:'''4''' - дым.<br />
При применении аномалии "блитц" через объект [[Economics]] набор параметров: anom="0", is_blitz="1".<br />
*'''флурри''' ('' flurry '') - Нужно ли отправлять статистику флурри "regexp=":<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''вероятность инверсии''' ('' invProb '') - Вероятность того, что сцена будет перевернута по x;<br />
*'''набор''' ('' kit '') - Набор, из которого берутся объекты.<br />
*'''поведение дифференсов''' (''difbeh'') - Поведение найденных объектов в режиме поиск отличий.<br />
*'''сортировать по приоритету''' (''priorsort'') - Сортировать итоговый список по полю приоритет объекта. Высокий приоритет - сначала.<br />
*'''не давать ходить игроку''' (''botonly'') - Если включена - то хидден будет работать, но не будет принимать клики от игрока.<br />
*'''предметов по заданию не более''' (''taskless'') - Предметов по заданию не более заданного числа. -1 - без ограничений<br />
*'''неактивные улики как фон''' (''cluesbg'') - Если включена, то в хидденах связанные предметы, для которых есть неактивные таски, будут видны на фоне.<br />
<br />
<br />
'''Группа - появление новых объектов'''<br />
<br />
*'''время''' ('' acttm '') - Время появления объекта (мс);<br />
*'''начальный скейл''' ('' actsc '') - Начальный скейл;<br />
*'''начальная альфа''' ('' actal '') - Начальная альфа.<br />
<br />
<br />
<br />
'''Группа - сессии'''<br />
<br />
*'''сессионность''' ('' ses ''):<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''ограничение сессий''' ('' sesLim '') - Максимальное количество сессий, в которые можно играть.<br />
*'''набор объектов''' ('' sesSet '') - Набор объектов при заходе в хидден после последней сессии:<br />
:'''0''' - случайный;<br />
:'''1''' - последний фон;<br />
:'''2''' - пустой.<br />
<br />
<br />
<br />
'''Группа - цвета'''<br />
<br />
*'''Цвет обязательных''' ('' c_forced '') — цвет текста для обязательных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Цвет найденных''' ('' c_found '') — цвет текста для найденных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Время перехода''' ('' c_time '') - Время изменения цвета.<br />
<br />
<br />
<br />
'''Группа - время'''<br />
<br />
*'''игры''' ('' tmGm '') - Общее время игры. Если оно истекает, идет переход на экран [время вышло] (см.ниже):<br />
:'''-1''' - игнорируется;<br />
:'''число''' - время игры.<br />
*'''прерывать''' ('' tmInt ''):<br />
:'''1''' - по окончанию времени игра будет прервана;<br />
:'''0''' - по окончанию времени игра продолжится, но переход все равно будет на неудачную ветку.<br />
*'''паузы''' ('' tmWt '') - Время перед закрытием окна после разбора (для осмысления результата);<br />
*'''полета актера''' ('' tmActor '') - Время работы актера, после которого обрабатываются ячейки таблицы;<br />
*'''перед исчезновением''' ('' tmWtHide '') - Время, в течение которого объект остается видимым после обработки.<br />
*'''жизни актера''' ('' tmActorLife '') - Время жизни клона актера, после которого он будет удален меньше либо рано 0 - не удалять по времени<br />
<br />
<br />
<br />
'''Группа - ошибки'''<br />
<br />
*'''flyer при ошибке''' ('' fl '') - обычно объект типа flyer (летуны которых надо показать в точке клика, если этот клик ошибочный). Можно в принципе любой объект который обладает состоянием "beg". Ошибочный клик - все клики мимо [[hiddenObject]].<br />
*'''вычет времени при ошибке''' ('' tmPen '') - Сколько отнять миллисекунд за ошибочный клик.<br />
<br />
<br />
<br />
'''Группа - переход'''<br />
<br />
*'''при разборе''' ('' scrOk '') - Экран на который надо перейти, если все объекты найдены.<br />
*'''время вышло''' ('' scrOv '') - Экран на который надо перейти если время вышло, а не все объекты найдены.<br />
<br />
<br />
<br />
'''Группа - система очков'''<br />
<br />
*'''Счетчик''' ('' score_counter '') — счетчик, отображающий набранные очки.<br />
*'''счетчик (test)''' ('' score_counter_test '') — счетчик, отображающий набранные очки.<br />
*'''ID пака''' ('' pack_id '') — строковый идентификатор пака(для записи набранных очков в [[options]] должен быть заполнен); используется для вытаскивания суммарных очков в счетчики и дальнейшего их отображения.<br />
*'''ID игры''' ('' game_id '') — строковый идентификатор игры (сцены).<br />
'''Обязательно должен иметь префикс ID пака. Например, если pack_id = "pack1", то game_id = "pack1.game1"'''.<br />
*'''мультипликатор очков''' ('' scoreM '') — Мультипликатор очков за объект, если все собрано за отведенное время.<br />
*'''Очки''' ('' score '') — количество очков, которые даются за каждый найденный [[hiddenObject]].<br />
*'''Бонус за скорость''' ('' bonusS '') — бонус за быстро найденный [[hiddenObject]].<br />
*'''Бонусный интервал''' ('' bonusT '') — время, за которое нужно найти [[hiddenObject]] для получения бонуса.<br />
*'''бонус за время''' ('' bonusTime '') - бонус за оставшееся время игры = коэффициент который введем * оставшееся время таймера.<br />
*'''Бонусный мультипликатор''' ('' grow ''):<br />
:'''1''' - умножать очки за второй быстро найденный предмет на 2, за третий на 3, и т. д.<br />
:'''0''' - не умножать.<br />
*'''Количество кликов для штрафа''' ('' wrngC '') — количество неверных кликов, после которых запустится блокатор (см. ниже).<br />
*'''Интервал для штрафа''' ('' wrngT '') — время, за которое нужно совершить неверные клики.<br />
*'''Штраф (очки)''' ('' delS '') — Сколько отнимаем очков за ошибочный клик.<br />
*'''Штраф (время)''' ('' delT '') — Сколько отнимаем времени за ошибочный клик.<br />
*'''блокатор''' ('' blockImg '') - Объект, блокирующий сцену при серии ошибочных кликов. (Обычно маска растянутая на весь экран. '''ДОЛЖНА иметь состояние "beg"''').<br />
*'''время блокировки''' ('' blockTime '') - Время блокировки при серии ошибочных кликов по истечении переводит "блокатор" в состояние '''end'''.<br />
*'''порог touch move''' ('' mvSens '') - Порог, начиная с которого движение пальца воспринимается как мув и сбрасываются неправильные клики.<br />
*'''touch move как штраф''' ('' tchMvPen '') - Считать ли touch move за ложное попадание:<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''клик на найденный как штраф''' ('' clkFndPen '') - Считать ли клик на найденный объект за ложное попадание(актуально если объекты остаются на сцене).<br />
*'''аниматор очков''' ('' scoreAnim '') - машина, которая анимирует полученные очки, должна иметь состояние '''anim'''.<br />
*'''коэффициент комбо''' ('' cmbCoef '') - коэффициент для расчёта комбо очков по формуле s(n) = k * n * (n + 1).<br />
*'''счётчик очков за объект''' ('' objScCnt '') - счётчик который показывает очки за последний полученный объект (учитывая бонусы).<br />
*'''счётчик комбо-очков''' ('' cmbScCnt '') - счётчик очков полученных за комбо-серию.<br />
*'''счётчик комбо-серий''' ('' cmbRwCnt '') - счётчик который показывает комбо-серию (комбо из 2-х, 3-х и т.д. найденных объектов).<br />
*'''комбо2 прогресс''' ('' cmb2Pr '') - комбо2 прогресс;<br />
*'''комбо2 время''' ('' cmb2Tm '') - комбо2 время;<br />
*'''комбо2 кол-во''' ('' cmb2Num '') - комбо2 кол-во.<br />
*'''очки 3.0''' (''score30'') - Использовать систему очков, придуманную Степановым в августе 2015.<br />
*'''очки 3.0 коэф. комбо''' (''score30lc'') - в конце комбо даем за него очков n * s * l * (n-1) - где n число предметов в комбо, s - очки за один предмет, l - этот коэффициент<br />
*'''очки 3.0 коэф. аккуратности''' (''score30la'') - в конце игры начисляем очки за точность по формуле s * la / (1 + Nmiss / N)<br />
*'''очки 3.0 коэф. времени 1 (l)''' (''score30lt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки 3.0 коэф. времени 2 (t)''' (''score30tt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки детектив макс. комбо''' (''scoreDetMaxCombo'') - максимальное значение комбо для очков по системе детектива, используется при состоянии хидден-листа max_combo. Если в настройках хидден-листа очковая система "очки 3.0", то scoreDetMaxCombo должно быть равно <property name="комбо2 кол-во" id="cmb2Num" hint="комбо2 кол-во" type="int" label="комбо2 кол-во" value="1"/> +1. То есть, на 1 больше, чем значение комбо2 кол-во ('' cmb2Num '').<br />
*'''держать max_combo до тапа''' (''keepMaxCombo'') - Будет ли максимальное значение комбо после вызова max_combo храниться до тапа (да) или уменьшаться сразу (нет). Флаг используется только для состояния max_combo, обычный хидден останется прежним. Флаг обеспечит max_combo до первого тапа. То есть, чтобы комбо убывало по времени, но после первого тапа.<br />
<br />
<br />
'''Группа - звезды'''<br />
<br />
*'''combo num''' ('' comboNum '') - Количество быстро найденных объектов, нужное для получения звезды Combo.<br />
*'''combo time''' ('' comboInt '') - Интервал между кликами, считающимися быстрыми для Combo.<br />
*'''accuracy''' ('' accuracy '') - Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные).<br />
*'''лимит ложных кликов''' ('' starWrAcc '') - Лимит ложных кликов.<br />
Формула расчета проста, количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
==Параметры бота и мультиплеера==<br />
<br />
'''Группа - Хидден бот'''<br />
<br />
*'''тип бота''' - тип бота:<br />
:'''нет''' - обычная одиночная игра, бот выключен;<br />
:'''на одном поле''' - игра с ботом на одном поле, у обоих одинаковый список предметов;<br />
:'''с маленьким полем''' - бот будет играть на отдельном поле (??????);<br />
:'''горячий стул''' - hotsit, игра двух живых игроков на одном девайсе, передача хода по очереди;<br />
:'''мультиплеер''' - игра через сервер с живым оппонентом;<br />
*'''файл уровня''' - xml файл с настройками сложности бота ([[HiddenList#Настройка сложности бота|пример]]);<br />
*'''номер уровня''' - номер уровня в файле (начиная с 0);<br />
*'''номер уровня max''' - если задан больше предыдущего номера - выбирается рандомное значение;<br />
*'''multiplayer''' - объект мультиплеера;<br />
*'''кнопка хинта''' - кнопка хинта для 2го игрока \ бота;<br />
*'''проверять интернет''' - проверять интернет при игре с ботом (так же, как при игре с живым игроком);<br />
*'''первый ход (вероятность)''' - вероятность первого хода игрока при игре с ботом (в процентах);<br />
*'''t min abs ms''' - самая минимальная задержка между ходами бота;<br />
*'''t1 min ms''' - минимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 max ms''' - максимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 prob %''' - вероятность быстрого нахождения предмета ботом;<br />
*'''t2 min ms''' - минимальное время для нахождения предмета ботом;<br />
*'''t2 max ms''' - максимальное время для нахождения предмета ботом;<br />
*'''t coef delta''' - коэффициент сложности (кажется от -1 до 1, могу ошибаться);<br />
*'''t wrong min ms''' - минимальное время между ложными кликами (мимо объекта) бота;<br />
*'''t wrong max ms''' - максимальное время между ложными кликами бота;<br />
*'''bot hint chance (percent)''' - шанс бота использовать хинт (в процентах);<br />
*'''bot hint num''' - максимальное кол-во использования хинтов ботом на игру;<br />
*'''доп. поле x''' - координаты доп. поля по Х;<br />
*'''доп. поле y''' - координаты доп. поля по Y;<br />
*'''доп. поле sx''' - масштаб доп. поля;<br />
*'''доп. поле sy''' - масштаб доп. поля;<br />
*'''указатель хода''' - указатель хода бота\оппонента. Должен иметь состояние ''beg'' и находитсья в сцене с хидденами;<br />
*'''родитель''' - родитель, в который поместим клонированную сцену (доп. поле);<br />
*'''счетчик очков бота''' - счетчик, выводящий очки;<br />
*'''счетчик без бонусов бота''' - счетчик, выводящий очки без бонусов за время и точность;<br />
*'''комбо2 прогресс бота''' - комбо2 прогресс;<br />
*'''аниматор очков бота''' - машина, которая при нахождении хиддена анимирует полученные очки;<br />
*'''счетчик очков за объект бот''' - счетчик, выводящий очки за объект;<br />
*'''счетчик комбо-серий (макс) бот''' - счетчик, выводящий макс. количество комбо-серий;<br />
*'''счетчик комбо-серий (тек) бот''' - счетчик, выводящий текущее количество комбо-серий;<br />
*'''flyer при ошибке''' - объект типа ''flyer'' который надо показать в точке клика, если этот клик ошибочный;<br />
*'''таймер хода бота''' - таймер хода бота;<br />
*'''таймер хода игрока''' - таймер хода игрока;<br />
*'''длительность хода ms''' - длительность хода игрока \ бота. Если задан 0 - игроки ходят одновременно;<br />
*'''длительность паузы между ходами ms''' - длительность паузы при смене хода игрока\бота.<br />
<br />
=== Настройка сложности бота ===<br />
<br />
Файл уровней для хидден-бота должен иметь такую структуру:<br />
<bots><br />
<obj id="0"><br />
<bot weight="3" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="21000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
<obj id="1"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="10000" t2max="25000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="7000" twrongmax="10000" /><br />
</obj><br />
<obj id="2"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="7000" t2max="21000" twrongmax="10000" /><br />
<bot weight="2" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
</bots><br />
<br />
*bots - основной таг<br />
*obj > id - номер уровня<br />
*bot - содержит те же параметры, что и настройки бота в хидден листе<br />
<br />
==Режим "блиц" с бесконечными объектами==<br />
<br />
'''Правила аномалии "блиц"''':<br />
<br />
*Блиц заканчивается победой, если игрок нашел хотя бы один предмет за отведенное время игры блиц.<br />
*Если время вышло, но не было найдено ни одного предмета, то засчитывается поражение.<br />
*В аномалии блиц количество возможных предметов ограничивается максимальным количеством уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num). А количество видимых предметов ограничивается количеством предметов, заданных на уровне мастерства локации. При постепенном разборе предметов добавляются новые пока не будет разобрано максимальное количество предметов на хидден сцене, либо, пока не закончится время, но одновременно видно предметов не больше, чем заданных на конкретном уровне мастерства локации.<br />
<br />
Для включения такого режима блиц используем поле в настройках хидден-листа:<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один. (да - использовать режим, нет - не использовать).<br />
<br />
Если в этом поле настройка "нет", то режим блиц работает по-старому: объектов столько, сколько указано в уровне мастерства.<br />
<br />
Прочитать, находится ли хидден в режиме блиц можно из поля "is_blitz" хидден листа (возможные значения - 0 или 1). Заполняется экономикой в момент старта локации.<br />
<br />
Для отображения в счетчике максимального количества уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num) вычитывать измененный num можно ТОЛЬКО ПОСЛЕ прихода start hiddenlist, т.е. не в ините.<br />
<br />
В экономике указываем блиц, как отдельную аномалию.<br />
<br />
==Состояния==<br />
<br />
Состояния которые есть у листа. Мы можем передавать их с помощью различных объектов:<br />
<br />
*'''init''' - инициализация хидден-листа;<br />
*'''invert''' - горизонтально отображает изображение;<br />
*'''run''' - переводит хидден в состояние активности, если до этого был на паузе;<br />
*'''pause''' - переводит хидден в состояние паузы, объекты не кликаются, таймер не идет;<br />
*'''pause_timer''' - объекты кликаются, но таймер не идет;<br />
*'''resume_timer''' - продолжить работу таймера, который был остановлен в состоянии ''pause_timer'';<br />
*'''add_time''' - добавить игрового времени (перед этим надо передать в param количество времени в ms)<br />
*'''swap_hiddens''' - меняет отображаемые в таблице поисковые объекты на случайные другие.<br />
*'''get_visible_ho''' - вернуть id активного HO объекта (объект пишет в себя два параметра - '''randomHO_id''' и '''randomHO_vis''' (id объекта и виден ли он сейчас юзеру)); Приоритет выбора HO объекта: с начала видимые юзеру, если таких нет - выводим невидимый на текущий момент HO (до предмета нужно фокусировать сцену);<br />
*'''max_combo''' - хидден начинается с максимальным значением комбо;<br />
*'''putback''' - вернуть случайный уже найденный обьект на экран и в список;<br />
*'''restart_no_anomaly''' - перезапустить хидден без аномалии;<br />
*'''finish''' - принудительно завершить игру.<br />
<br />
==Примечания==<br />
<br />
*HiddenList должен располагаться в дереве проекта ниже всех своих поисковых объектов.<br />
<br />
*Единственный '''обязательный объект''' о котором должен знать лист это [[Table]] для отображения списка поиска, даже если таблица не будет использоваться быть все равно должна!<br />
<br />
*После завершения хидден-игры (по разбору или по времени)при переходе на другой экран HiddenList записывает данные в опции в два места: первое - это то, которое указано у настройках (ID пака, ID уровня, тип списка), для каждой локации свое; а второе - это last_game. <br><br />
Например, <br><br />
'''last_game.time_spent''' (либо же '''pck_N.lvl_N.kind_N.time_spent''') - время последней игры, <br> <br />
'''last_game.clicks''' (либо же '''pck_N.lvl_N.kind_N.clicks''') - количество найденных объектов и т.д. <br><br />
Все их можно увидеть в опциях. last_game был придуман для того, чтобы было удобно задавать счетчики в окне результатов. Также эти данные могут быть сохранены в опциях, если задать листу состояние '''wait'''.<br />
<br />
*Для проверки кликабельности хидденобъектов можно воспользоваться следующими настройками в app.icf:<br />
<br />
<pre><br />
[GHiddenList]<br />
HitTest=0<br />
HitTestDx=1 - шаг по х<br />
HitTestDy=1 - шаг по y<br />
</pre><br />
<br />
в результате после перехода на сцену с хидденом появится файл, в котором будет казан объекты и координаты в которых они не тапаются.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''появляется новый объект: изменить состояние объекта''' ('' actst ''):<br />
:'''объект''' ('' obj '') - Объект, состояние которого нужно изменить;<br />
:'''состояние''' ('' st '') - Новое состояние объекта.<br />
<br />
[[Файл:HOList_3.jpg|right]]<br />
<br />
[[Файл:+.png]] '''разбор: если был экран''' ('' wscrOk '') - При нахождении всех объектов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''разбор: изменить состояние объекта''' ('' nstOk '') - При нахождении всех объектов, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''разбор: изменить параметр объекта''' ('' chgOk '') - При нахождении всех объектов, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '') - Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''нет предметов (при создании из динамического конфига)''' ('' nstNoObjects '') - при загрузке локации без хидден-объектов (например не подтянулся пак либо нет локализации) перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: если был экран''' ('' wscrOv '') - Если вышло время, а объекты не найдены, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''не успел: изменить состояние объекта''' ('' nstOv '') - Если вышло время, а объекты не найдены, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: изменить параметр объекта''' ('' chgOv '') - Если вышло время, а объекты не найдены, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '')- Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''счетчик очков''' ('' scoreCnt ''):<br />
:'''счетчик''' ('' cnt '') - Каунтер, которому приходят очки.<br />
<br />
[[Файл:+.png]] '''группа extra bonus''' ('' extraBonus ''). Используется для economics, при нахождении объекта с некой вероятностью может выпасть бонус. Объект который анимирует появление бонуса должен иметь состояние show, время на анимацию бонуса - 10 секунд:<br />
:'''монетки объект''' ('' coinsObj '') - объект который анимирует получение монет;<br />
:'''монетки вероятность''' ('' coinsProb '') - вероятность по нахождению объекта получить дополнительно монетки;<br />
:'''опыт объект''' ('' expObj '') - объект который анимирует получение опыта;<br />
:'''опыт вероятность''' ('' expProb '') - вероятность по нахождению объекта получить дополнительно опыт;<br />
:'''энергия объект''' ('' energyObj '') - объект который анимирует получение энергии;<br />
:'''энергия вероятность''' ('' energyProb '') - вероятность по нахождению объекта получить дополнительно энергию.<br />
<br />
[[Файл:+.png]] '''Объект, который срабатывает, если долго не находить хидден''' ('' notfnd ''):<br />
:'''объект''' ('' obj '') - Объект, который переводится в указанное состояние, если долго не находить хидден;<br />
:'''состояние''' ('' st '') - Состояние, в которое переводится объект;<br />
:'''время''' ('' tm '') - Время от последнего нахождения хиддена, после которого срабатывает объект.<br />
<br />
[[Файл:+.png]] '''параметры аномалии с исчезновением букв''' ('' hlPars ''):<br />
:'''оставшиеся буквы''' ('' min '') - Минимальное количество оставшихся букв в предложении;<br />
:'''задержка''' ('' wait '') - Момент времени, начиная с которого аномалия будет проявляться;<br />
:'''задержка 2''' ('' wait2 '') - Задержка для появившихся слов, изначально недоступных;<br />
:'''время''' ('' time '') - Время, за которое должны исчезнуть все буквы (если -1, то до конца времени в хиддене);<br />
:'''промежутки''' ('' dt '') - промежутки времени между каждой итерацией;<br />
:'''флайер''' ('' fl '') - Флайер, анимирующий исчезающую букву (должен иметь '''текстовый''' тип).<br />
<br />
[[Файл:+.png]] '''параметры аномалии ночь''' ('' nightPars ''): <br />
:'''effect''' ('' ef '') - эффект, управляющий трансформацией цвета;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего ночь.<br />
<br />
[[Файл:+.png]] '''параметры аномалии трансформации цвета''' ('' colInvPars ''):<br />
:'''effect''' ('' ef '') - Эффект, управляющий трансформацией цвета;<br />
:'''tags''' ('' eftags '') - Теги эффектов, реализующих трансформацию цвета, из которых будет выбран один.<br />
<br />
[[Файл:+.png]] '''параметры аномалии дым''' ('' smokePars ''): <br />
:'''effect''' ('' ef '') - Машина, управляющая эффектом дыма;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего дым.<br />
<br />
Все аномалии кроме текстовой должны быть настроены с помощью объекта [[Effect]]<br />
<br />
== Get Started==<br />
Минимальный набор ресурсов:<br />
* Фоновая картинка для поисковой сцены<br />
* Комплект картинок, с которых будут сделаны поисковые [[HiddenObject|объекты]]<br />
* Текстовые объекты для идентификации спрятанных объектов<br />
<br />
Минимальный набор объектов редактора:<br />
* [[Image]] который будет изменен в хидден-лист<br />
* [[Table|Таблица]] в которой будут отображаться тексты/картинки (зависит от режима) спрятанных объектов.<br />
* По одному [[Image]] для каждого спрятанного объекта (будут созданы автоматически при добавлении картинок из базы ресурсов на сцену)<br />
<br />
Наши действия:<br />
# откроем [[Интерфейс_ScenceEditor|редактор сцен]] и создадим новый проект,<br />
# добавим новый экран с именем ''scrHList''<br />
# создадим в этом экране сцену ''stgHList''<br />
# перейдём в [[Интерфейс_ResourceEditor|редактор ресурсов]]<br />
## создаём папку ''HList''<br />
## добавим в ней картинку для фона и картинки для спрятанных объектов.<br />
## выделим все картинки в дереве ресурсов и перенесем их на нашу сцену ''stgHList'', при этом для каждой картинки автоматически создастся объект [[Image]].<br />
## закроем редактор ресурсов<br />
# перейдём в [[Интерфейс_TextEditor|редактор текстов]]<br />
## создаём папку ''HListText''<br />
## добавим в нее текстовые объекты, по одному на каждый поисковый объект.<br />
## сохраним внесенные изменения.<br />
# перейдём в редактор сцен.<br />
# создадим в сцене stgHList объект [[Table]] и назовем его HOT<br />
## настроим размер и положение таблицы, согласно нашего дизайна<br />
## установим параметры колонок = "50", колонок видно = "5", строчек = "5", строчек видно = "1" (таким образом в таблице будут отображаться 5 поисковых предметов, а максимальное количество объектов для поиска будет равно 250)<br />
## установим параметры скорость листания = "650", добавлять по строкам = "0", центрировать = "растянуть", сдвигать ячейки при удалении ="да"<br />
# создадим в сцене stgHList объект '''HiddenList''', напоминаем что его размер и положение на сцене не имеют значения, по этому расположим его где-нибудь за границей экрана. <br>'''Важно''' В дереве проекта хидден-лист должен быть ниже всех своих поисковых объектов.<br />
## в поле таблица указываем нашу HOT<br />
## установим параметр объектов = "10"<br />
## установим параметр пропадание объектов = "да"<br />
## установим параметр реагировать на отпускание = "да"<br />
## установим параметр реагировать на невидимые = "нет"<br />
## установим параметр набор = "1"<br />
# Настроим объекты, которые будут прятаться. Для этого выделим картинки поисковых объектов, добавленные нами ранее, и изменим им тип на "hiddenObject". Оставляя группу этих объектов выделенной, настроим им параметры:<br />
## в поле list укажем наш HiddenList<br />
## параметр набор = "1"<br />
## Теперь снимаем выделение и каждому объекту в поле текстID перетаскиваем мышкой соответствующий текстовый объект из текстовой базы (поле текстID должно быть активно для редактирования - по нему нужно кликнуть мышкой)<br />
# сохраним проект<br />
# запустим [[Интерфейс_Viewer|вьювер]]<br />
<br />
== Динамический HG==<br />
Функционал позволяет генерировать HL самостоятельно HO объекты из файла конфига. <br />
<br />
П.С. - вся графика д.б. динамической. Данные файлы может создавать HO_Manager [http://wiki/index.php/HO_Manager Wiki HO_manager] <br />
[https://docs.google.com/document/d/13UUOKf_iJNzFx0PjU4JQIfYDX7NhK7dyfJAR3I-SWlQ/edit#heading=h.4pd8h5jdvqj4 Документ по динамических пакам]<br />
<br />
[[Файл:D485ecbbbb.jpg|right]]<br />
*'''файл уровня''' ('' configFile'') — указываем путь к файлу конфигу, где перечисляем файлы с HG. <br />
*'''список графических ресурсов''' — служебное, пока не используется;<br />
*'''список текстовых ресурсов''' — служебное, пока не используется;<br />
*'''номер уровня''' ('' hiddenLevelNum '') — номер уровня из файла;<br />
*'''образец хиддена''' ('' hiddenTemplate '') — obj_id HO объект, должен иметь нужные параметры (остальные возьмутся из конфига) ;<br />
*'''образец нашлёпки''' ('' hiddenPatchTempl '') — obj_id нашлёпки на HO объект, должна иметь нужные параметры (остальные возьмутся из конфига);<br />
*'''корневой объект''' ('' hiddenRoot '') — obj_id корневого объект в который сложим всех клонов;<br />
*'''точечный спецэффект''' ('' hiddenEffect '') — ;<br />
*'''фоновый объект ''' ('' hiddenBG '') — obj_id объекта которому поменяем ресурс;<br />
<br />
Требования, вся графика HO,BG отрисовывается без учёта пивоты;<br />
<br />
Файлы конфиги имеют вид:<br />
Файл уровня имеет вид:<br />
{<br />
"levels": [<br />
{<br />
"file": "ViewerFiles/DynHid/hidden0.cfg",<br />
"pack":3<br />
}<br />
]<br />
}<br />
<br />
:Где "levels" - линки на файлы уровней. <br />
:::"file" - путь к файлу;<br />
:::"pack" - пак в который попадут ресурсы;<br />
<br />
<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
"bg": {<br />
"src": "bg.png",<br />
"w": 2048,<br />
"h": 1151,<br />
"id": 16,<br />
"color": "#ffffff",<br />
"tile": ""<br />
},<br />
"hiddens": [<br />
{<br />
"id": 1022,<br />
"nm": "bucket_01",<br />
"res": 129,<br />
"bg": 666,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
},<br />
"objs": [{<br />
"res": 1488,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
}<br />
}],<br />
}, <br />
{<br />
"x": 1537,<br />
"y": 409,<br />
"id": 1023,<br />
"res": 329,<br />
"nm": "bucket_02",<br />
"rect": {<br />
"x": 1493,<br />
"y": 366,<br />
"w": 81,<br />
"h": 87<br />
}<br />
}<br />
],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
}<br />
}<br />
<br />
:Где "bg" - настройки фона. <br />
:::"src" - сорс графического файла в ресурсной базе;<br />
:::"color" - цвет которым будет залито под фоном, нужное если фон имеет дырки;<br />
:::"tile" - тайлинг фона;<br />
:::"id" - id ресурса из ресурсной базы;<br />
::"hiddens" - перечень HO с их настройками<br />
::::"id" - TxtId;<br />
::::"nm" - имя HO;<br />
::::"res" - графический ресурс HO;<br />
::::"bg" - графический ресурс тени;<br />
::::"rect" - настройки "res";<br />
:::::"x" - координата x, в координатах корневого объекта;<br />
:::::"y" - координата y, в координатах корневого объекта;<br />
:::::"w" - ширина;<br />
:::::"h" - высота;<br />
::::"objs" - перечень нашлёпок;<br />
:::::"res" - графический ресурс нашлёпки;<br />
:::::"rect" - настройки графического ресурса нашлёпки;<br />
::::::"x" - координата x, в координатах HO;<br />
::::::"y" - координата y, в координатах HO;<br />
::::::"w" - ширина;<br />
::::::"h" - высота;<br />
::"res" - ресурсы которые входят в пак уровня ( будут вырезаны при экспорте в пак уровня)<br />
::::"images" - перечень графических ресурсов<br />
::::"texts" - перечень текстовых ресурсов<br />
::::"sounds" - перечень звуковых ресурсов<br />
<br />
== Кроссворд ==<br />
Данный функционал базируется на динамических HG и настраивается в файле динамического уровня.<br />
<br />
=== Мода 2 - слова с мусором ===<br />
[[Файл:Crossword mode2.jpg|right|500x500px]]<br />
Данная мода представляет собой HO объекты и текстовую таблицу, при нахождении предмета, в текстовой таблице подсвечиваются буквы слова.<br />
<br />
Настройка в HiddenList указывается в теге '''кроссворд - мода 2 - слова с мусором''' ('''_G_17'''):<br />
* '''режим кроссворда''' ('''cwon''') - использовать/не использовать режим;<br />
* '''подуровень''' ('''sub_level''') - подуровень;<br />
* '''root''' ('''cw2root''') - родитель текстового поля, координаты будут установлены согласно параметрам "x","y";<br />
* '''text''' ('''cw2text''') - линк на текстовый объект, в котором будем отображать текстовое поле; <br />
* '''цвет найденных''' ('''colorFound''') - цвет букв найденных слов в нашем текстовом поле;<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
...<br />
"hiddens": [ ... ],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
},<br />
"mode2" : {<br />
"en" : [<br />
{<br />
"ids" : [ 3032, 4480, 4491, 4493, 4494, 4499 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 414,<br />
"x" : -682,<br />
"y" : -300<br />
},<br />
"string_check" : "XObatHWZIF|RJLhacksaw|QVPNsaddle|AECGDaxeYU|doveSlante|rnBMTKGEAQ",<br />
"string_display" : "XOBATHWZIF|RJLHACKSAW|QVPNSADDLE|AECGDAXEYU|DOVESLANTE|RNBMTKGEAQ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 4485, 4487, 4490, 4495, 4502, 17112 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "FskatesNTH|ALMboomera|ngWERODrad|ioSKBZoarP|tableGball|oonJXCUIYV",<br />
"string_display" : "FSKATESNTH|ALMBOOMERA|NGWERODRAD|IOSKBZOARP|TABLEGBALL|OONJXCUIYV",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
],<br />
"ru" : [<br />
{<br />
"ids" : [ 4481, 4485, 4490, 4495, 4500, 4508 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ЕконькиМЭк|олокольчик|ХАрадиоШве|слоВбабочк|аЖИЛкастрю|ляУЯРТНСКЮ",<br />
"string_display" : "ЕКОНЬКИМЭК|ОЛОКОЛЬЧИК|ХАРАДИОШВЕ|СЛОВБАБОЧК|АЖИЛКАСТРЮ|ЛЯУЯРТНСКЮ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 3053, 4480, 4487, 4494, 4502, 4507 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ШЩЧУГЮДзве|здаНОМТЕХб|умерангИЪс|толЗЖЪбита|УфонарьЮпо|дарокХПЭБТ",<br />
"string_display" : "ШЩЧУГЮДЗВЕ|ЗДАНОМТЕХБ|УМЕРАНГИЪС|ТОЛЗЖЪБИТА|УФОНАРЬЮПО|ДАРОКХПЭБТ",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
]<br />
}<br />
<br />
:где "mode2" - настройки моды 2;<br />
:::"en", "ru" - языковые локали;<br />
::::"ids" - массив textID активных HO;<br />
::::"nm" - имя уровня - для нашего удобства;<br />
::::"num" - количество активных объектов == размеру массива '''ids''';<br />
::::"numvis" - количество всего объектов,используем для задания фоновых объектов (количество которых == numvis - num);<br />
::::"rect_field" - ректангл активной зоны (пока не используется);<br />
::::"rect_text" - ректангл текстового поля(пока не используется);<br />
::::"string_check" - текстовое поле регистро-зависимое - для HL; <br />
::::"string_display" - текстовое поле для отображения;<br />
::::"x" - координата x родительского объекта для текста;<br />
::::"y" - координата y родительского объекта для текста;<br />
<br />
П.С. данную моду генерирует программа HGcrossword (https://docs.google.com/document/d/1RXSNUxNePF4qEibAPoCgfdiQycxoggc6Hu7a9VUjxSI/edit#)<br />
<br />
== Авто тест HL ==<br />
Для запуска автотеста, нам нужно указать в app.icf параметры:<br />
<br />
[GHiddenList]<br />
:'''HitTest''' - мода автотеста; (0- выкл.; 1 - разовая логика, пишется в файл раз в сессию для одного хидден листа ; 2 - при каждом init любого хидн листа дописывается статистика в файл);<br />
:'''HitTestDx''' = 5 - шаг с которым проходит автокликер по X;<br />
:'''HitTestDy''' = 5 - шаг с которым проходит автокликер по Y;<br />
<br />
Для HitTest==2, очень помогает параметр "allow_background". Остаётся только написать скриптулину, которая ходит сама между экранами.<br />
<br />
== Пример ==<br />
<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample<br />
<br />
HiddenList.rar<br />
<br />
[[Category:Game mechanic]]<br />
<br />
[[Category:Get Started]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=HiddenList&diff=9770HiddenList2018-12-22T14:06:44Z<p>Agava: /* Состояния */</p>
<hr />
<div>{{TOC right}}<br />
HiddenList является менеджером поисковых [[Object|объектов]]. На сегодня HiddenList не просто управляет объектами на сцене - он отвечает за все штрафы и поощрения. В связке с такими объектами как [[HiddenHint]] + [[Effect]] HiddenList дает возможность реализовать систему подсказок, а также такие графические эффекты как: "ночь", "трансформация цвета" и т.д. с одним набором графики.<br />
<br />
==Общие параметры==<br />
(см. описание [[Object|Object]])<br />
<br />
[[Файл:HOList_1.jpg|right]]<br />
<br />
*'''имя''' ('' nm '') - Имя объекта HiddenList в дереве проекта. Может быт произвольным.<br />
*'''id-объекта''' - Уникальный номер объекта HiddenList, который можно увидеть в строке "имя" либо при наведении курсора на неё.<br />
*'''синхронизация''' ('' sync '') - Применяется для синхронизации между лейаутами. Если указан параметр "нет", то объект будет активен только на текущем лейауте. По умолчанию указан параметр "да". <br />
*'''сохранение параметров''' ('' sv '') - Настройка этого параметра актуальна, если приложение в дальнейшем будет сворачиваться в системную панель («трей»). Выбирается значение этого параметра из выпадающего списка. Возможны следующие варианты: "нет", "только объект", "объект с подобъектами", "только подобъекты". При выходе из трэя будут восстановлены ранее измененные/установленные (при переходе с одного экрана на другой)параметры объектов или подобъектов в зависимости от выбранного варианта для этого параметра. По умолчанию указан параметр "нет". Следует помнить, что если выбирается для объекта некоторой сцены значения этого параметра отличное от "нет", то должно и предусматриваться соответствующее значение этого параметра и для этой сцены, и для экрана, содержащего эту сцену.<br />
*'''z''' ('' z '') - Параметр порядка рисования объекта. Сначала рисуются объекты с большим z, затем, поверх них - с меньшим.<br />
*'''память''' ('' memo ''):<br />
:'''1''' - при повторном открытии экрана объект не обновляет свои параметры (помнит текущие параметры, оставшиеся от предыдущего посещения экрана);<br />
:'''0''' - обновит свои параметры, при повторном открытии экрана.<br />
*'''группа''' ('' gr '') - Группа, в которую входит текущий объект.<br />
<br />
У листа также есть группы стандартных параметров такие как '''положение''', '''размер''', '''модификаторы'''. Но, по сути, они не важны. Главное, чтобы лист не перекрывал на сцене другие объекты. Поэтому ему лучше находиться за пределами сцены. <br />
<br />
==Основные параметры==<br />
<br />
*'''Картинка''' ('' res '') - Графический ресурс для отображения объекта. Перетаскивается мышкой из редактора ресурсов (поле должно находится в состоянии редактирования). Обычно не используется, а применяется для отображения table;<br><br />
*'''Таблица''' ('' table '') - Объект типа [[table]], который является визуальным отображением списка. '''Должна быть обязательно''';<br><br />
*'''Подсказка''' ('' hint '') — объект типа [[HiddenHint]], который является менеджером хинтов;<br><br />
*'''highlighter''' ('' hl '') — объект типа [[HiddenHighLighter|hiddenhighlighter]], который подсвечивает не найденные объекты.;<br><br />
*'''Счетчик''' ('' hdncnt '') — объект типа [[Counter]], который отображает количество найденных объектов.<br><br />
В самом счетчике в параметрах нужно указать val = 0, поскольку изначально нет найденных объектов;<br />
*'''Таймер''' ('' timer '') — объект типа [[Timer]], который отображает время игры.<br />
При инициализации листа он передаст состояние "start" таймеру.<br />
*'''отладка''' ('' trace '') — Отображать в окне состояний текущий объект.<br />
<br />
<br />
<br />
'''Группа - внешний вид'''<br />
<br />
*'''вычеркнуть''' ('' cross ''):<br />
:'''1''' - найденный объект вычеркивается, оставаясь в списке(таблице);<br />
:'''число''' - найденный объект удаляется из списка;<br />
*'''листать''' ('' scroll '')<br />
:'''1''' - список можно листать (скролировать);<br />
:'''число''' - ищутся только те объекты, которые видны в списке (таблице);<br />
*'''тип списка''' ('' kind '') - Тип поиска объектов:<br />
:'''1''' - слово;<br />
:'''2''' - предложение;<br />
:'''3''' - удаляемая пиктограмма;<br />
:'''4''' - пиктограмма;<br />
:'''5''' - поиск различий.<br />
*'''поиск пар''' ('' pair '') - Если 1, то идет поиска пар объектов с одинаковым типом, иначе обычный режим<br />
:'''пары''' - поиск пар;<br />
:'''одиночные''' - поиск по одному объекту.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''обычный''' ('' sndNrm '') - Звук при нахождении обычного [[HiddenObject]].<br />
*'''коллекционный''' ('' sndCol '') - Звук при нахождении коллекционного [[HiddenObject]](объекту должна быть установлена коллекция).<br />
<br />
<br />
<br />
'''Группа - параметры поиска'''<br />
<br />
*'''объектов''' ('' num '') - Максимальное количество доступных для поиска объектов в одной игровой сессии. (ВАЖНО!!! Таблице нужно установить общее количество ячеек равное(или больше) количеству доступных для поиска объектов).<br />
*'''активных объектов''' ('' numact '') - Максимальное количество активных объектов в одной игровой сессии.<br />
*'''видимых объектов''' ('' numvis'') - Максимальное количество видимых объектов в одной игровой сессии.<br />
*'''одного типа''' ('' max ''):<br />
:'''число''' - Максимальное количество объектов одного типа - поле тип в [[hiddenObject]] или хидден объекты с одинаковыми текстовыми ID могут считаться объектами одного типа;<br />
:'''-1''' - игнорируется.<br />
*'''прятать''' ('' hide '') - Делать невидимыми объекты, не участвующие в поиске.<br />
*'''оставлять''' ('' stay '') - Оставлять найденный объект на месте (вызывая только флаеры) при удачном клике.<br />
*'''актёр-иконка''' ('' actorIco '') - если "да", то во время полёта найденного хидден-объекта вместо него летит иконка которая помечена как "main picture" и указана в текстовом id хидден-объекта.<br><br />
*'''актер''' ('' actor '') - машина состояний, которая управляет процессом полета к таблице найденных [[HiddenObject]] .<br />
*'''z актера''' ('' actorZ '') - z актера. Будет применено только если не равен 0.<br />
*'''актер стартует из таблицы''' ('' actorTable '') - если настройка включена, то актер стартует не из позиции хиддена, а из ячейки таблицы .<br />
*'''целевой объект''' (''trg'') - Если задан, [[HiddenObject]] после нахождения летит не в ячейку таблицы, а к нему.<br />
<br />
<br />
<br />
'''Группа - скорость'''<br />
<br />
Отвечают за скорость перемещения найденного объекта.<br />
*'''полета''' ('' vf '') - Скорость полета в пикселях в секунду.<br />
*'''вращения''' ('' vr '') - Скорость вращения в градусах в секунду.<br />
<br />
<br />
<br />
'''Группа - равномерное распределение'''<br />
<br />
*'''включить''' ('' undist '') - Равномерно распределять объекты по площади сцены.<br />
*'''дополнительные сортировки''' ('' addit_algo '') - Использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами)<br />
<br />
'''Группа - итерационное распределение'''<br />
<br />
*'''включить''' ('' altern_algo '') - Использовать итерационный алгоритм поиска равномерного распределения объектов<br />
*'''учитывать сложности''' ('' process_diff '') - Учитывать сложности предметов при распределении<br />
*'''количество объектов''' ('' hiddens_num_threshold '') - Максимальное количество активных предметов на сцене для которых будут учитываться сложности (max = 24)<br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - Максимальное количество итераций фикса перекрытия объектов.<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - Максимальная допустимая площадь перекрытия в пикселях.<br />
*'''ключ распределения''' ('' distribution_seed '') - Ключ для случайного выбора заменяемого предмета (только для мультиплеера)<br />
*'''удалять перекрытия''' ('' del_after_fix '') - Удалять оставшиеся перекрытия после последней итерации фикса.<br />
<br />
Рекомендации по использованию:<br />
<br />
*Если включать "Удалять перекрытия", то нужно для счетчика кол-ва оставшихся хидденов считывать значение из "num".<br />
*Оптимальное значение максимальной площади - 1024 пикселей, т.е. допускаем перекрытие в 32 на 32 пикселя, что совсем не влияет на визуальное перекрытие объектов.<br />
*Количество итераций можем ставить 20-50. Если перекрытий не останется раньше, то фикс перекрытий остановится, если выполнится все количество - отобразится количество перекрытий в логах. Большое количество итераций фикса негативно сказывается на скорости загрузки сцены.<br />
<br />
Логи:<br />
<br />
<pre><br />
"Deleting a hidden object with textID: %i" - удаление объекта с текстовым ID<br />
"Overlapping detected! Area: %f px" - обнаружения перекрытия в столько-то пикселей<br />
"fixOverlapping() Iterations num: %i / %i; Overlaps num: %i" - итерации, итоговое количество перекрытий<br />
</pre><br />
<br />
==Дополнительные параметры==<br />
<br />
*'''скалирование объектов''' ('' scale_object '') - При нахождении во время полета объект будет скалироватся: <br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''пропадание объектов''' ('' alpha_object '') - При нахождении во время полета объект будет менять альфу:<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''реагировать на отпускание''' ('' touch_up '') - Объекты связанные с этим хидденлистом будут реагировать на отпускание, а не на нажатие:<br />
:'''0''' - отключено;<br />
:'''1''' - включено (То есть реагировать на четкий клик, если кликнули и сместили область клика объект не реагирует!).<br />
*'''реагировать на finger tap''' ('' finger_tap '') - Объекты, связанные с этим хидденлистом, будут реагировать на отпускание после ожидания даблтача.<br />
*'''задержка срабатывания''' ('' touch_delay '') - только для реакции на нажатие. Время между нажатием и реакцией списка объектов.<br />
*'''объединять одинаковые тексты''' ('' same_txt '') - Объекты с одинаковым текстом будут жить в одной ячейке таблицы с добавлением множителя xN.<br />
:'''0''' - отключено;<br />
:'''1''' - включено.<br />
*'''множитель для иконок''' ('' ico_res '') - Графический ресурс(анимация) для отображения множителя у иконок для типа списка 4(поиск по иконкам) и включенного объединения одинаковых текстов. Первый фрейм - х2, второй - х3 и т.д.<br />
*'''исключать одинаковые тексты''' ('' unTxtID '') - исключает или не исключает из поиска объекты с одинаковыми txtID, используется совместно с '''одного типа'''.<br />
*'''показывать один объект игр''' ('' unTxtRep '') - Количество игр, в течении которых будет выбран один объект из данного набора. 0 - не использовать механизм<br />
*'''силуэты после слов''' ('' picsAfterWords '') - Стараться в силуэтах использовать то, что находилось в словах<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один<br />
*'''находить много одним кликом''' ('' canFoundMultiple '') - 1 - если тап попал на несколько объектов, то найдем все. 0 - только один<br />
*'''вероятность пассивного предпочитаемого объекта''' ('' prefProb '') - вероятность выпадения пассивного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''вероятность активного предпочитаемого объекта''' ('' prefProbAct '') - вероятность выпадения активного объекта, если у объекта стоит параметр "предпочитаемый" используется при исключении объектов с одинаковыми текстовыми ID.<br />
*'''реагировать на невидимые''' ('' canInvis '') - реагировать или нет на объекты, которые в момент игры не видны в таблице. (Кликаются только те [[hiddenObject]] которые отображены в таблице, остальные нет!).<br />
<br />
<br />
'''Группа - равномерное распределение''' - в настоящее время не рекомендуется включать параметры из этой группы. Логика устарела и может конфликтовать со следующей группой итерационного распределения. Эта группа оставлена для возможной доработки в будущем. <br />
*'''включить''' ('' undist '') - равномерно распределять объекты по площади сцены. Да/нет. <br />
*'''дополнительные сортировки''' (''addit_algo'') - использовать дополнительные алгоритмы поиска равномерного распределения (не работает с динамическими хидденами). Да/нет. <br />
<br />
<br />
'''Группа - итерационное распределение''' - на данный момент лучший алгоритм равномерного распределения.<br />
*'''включить''' ('' altern_algo '') - использовать итерационный алгоритм поиска равномерного распределения объектов. Да/нет. <br />
*'''учитывать сложности''' ('' process_diff '') - учитывать сложности объектов при распределении. Подробнее о сложностях в описании соответствующего параметра в [[hiddenObject]]. Да/нет. <br />
*'''количество объектов''' ('' hiddens_num_threshold '') - максимальное количество активных предметов на сцене, для которых будут учитываться сложности. <br />
*'''количество итераций''' ('' fix_overlapping_iter_num '') - максимальное количество итераций фикса перекрытия объектов. По умолчанию 50, min="0" max="100".<br />
*'''максимальное перекрытие''' ('' max_overlapping '') - максимальная допустимая площадь перекрытия в пикселях. По умолчанию 1024, min="0" max="2048". <br />
*'''ключ распределения''' ('' distribution_seed '') - ключ для случайного выбора заменяемого предмета (только для мультиплеера). min="0" max="32768".<br />
*'''удалять перекрытия''' ('' del_after_fix '') - удалять оставшиеся перекрытия после последней итерации фикса. Количество объектов получать из num, нет=0, да=1. <br />
<br />
<br />
*'''прятать актеров при старте''' ('' hideact '') - Устанавливать актерам видимость false при старте (по умолчанию - да)(То есть всем актерам которые находятся на сцене при запуске принудительно установиться vis = 0).<br />
*'''аномалия''' ('' anom '') - для всех аномалий кроме текстовой [[HiddenObject]] и игровой фон должны быть подобъектами [[Effect]]):<br />
:'''0''' - нет;<br />
:'''1''' - текстовая;<br />
:'''2''' - ночь; В машине которая выставляет эффект ночь, должны передавать сцене с объектом аномалия ( obj="scene"; par="drag"; val="0" ) и ( obj="scene"; st="update");<br />
:'''3''' - трансформация цвета;<br />
:'''4''' - дым.<br />
При применении аномалии "блитц" через объект [[Economics]] набор параметров: anom="0", is_blitz="1".<br />
*'''флурри''' ('' flurry '') - Нужно ли отправлять статистику флурри "regexp=":<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''вероятность инверсии''' ('' invProb '') - Вероятность того, что сцена будет перевернута по x;<br />
*'''набор''' ('' kit '') - Набор, из которого берутся объекты.<br />
*'''поведение дифференсов''' (''difbeh'') - Поведение найденных объектов в режиме поиск отличий.<br />
*'''сортировать по приоритету''' (''priorsort'') - Сортировать итоговый список по полю приоритет объекта. Высокий приоритет - сначала.<br />
*'''не давать ходить игроку''' (''botonly'') - Если включена - то хидден будет работать, но не будет принимать клики от игрока.<br />
*'''предметов по заданию не более''' (''taskless'') - Предметов по заданию не более заданного числа. -1 - без ограничений<br />
*'''неактивные улики как фон''' (''cluesbg'') - Если включена, то в хидденах связанные предметы, для которых есть неактивные таски, будут видны на фоне.<br />
<br />
<br />
'''Группа - появление новых объектов'''<br />
<br />
*'''время''' ('' acttm '') - Время появления объекта (мс);<br />
*'''начальный скейл''' ('' actsc '') - Начальный скейл;<br />
*'''начальная альфа''' ('' actal '') - Начальная альфа.<br />
<br />
<br />
<br />
'''Группа - сессии'''<br />
<br />
*'''сессионность''' ('' ses ''):<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''ограничение сессий''' ('' sesLim '') - Максимальное количество сессий, в которые можно играть.<br />
*'''набор объектов''' ('' sesSet '') - Набор объектов при заходе в хидден после последней сессии:<br />
:'''0''' - случайный;<br />
:'''1''' - последний фон;<br />
:'''2''' - пустой.<br />
<br />
<br />
<br />
'''Группа - цвета'''<br />
<br />
*'''Цвет обязательных''' ('' c_forced '') — цвет текста для обязательных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Цвет найденных''' ('' c_found '') — цвет текста для найденных объектов, указывается код цвета, если строку не заполнять цвет не используется.<br />
*'''Время перехода''' ('' c_time '') - Время изменения цвета.<br />
<br />
<br />
<br />
'''Группа - время'''<br />
<br />
*'''игры''' ('' tmGm '') - Общее время игры. Если оно истекает, идет переход на экран [время вышло] (см.ниже):<br />
:'''-1''' - игнорируется;<br />
:'''число''' - время игры.<br />
*'''прерывать''' ('' tmInt ''):<br />
:'''1''' - по окончанию времени игра будет прервана;<br />
:'''0''' - по окончанию времени игра продолжится, но переход все равно будет на неудачную ветку.<br />
*'''паузы''' ('' tmWt '') - Время перед закрытием окна после разбора (для осмысления результата);<br />
*'''полета актера''' ('' tmActor '') - Время работы актера, после которого обрабатываются ячейки таблицы;<br />
*'''перед исчезновением''' ('' tmWtHide '') - Время, в течение которого объект остается видимым после обработки.<br />
*'''жизни актера''' ('' tmActorLife '') - Время жизни клона актера, после которого он будет удален меньше либо рано 0 - не удалять по времени<br />
<br />
<br />
<br />
'''Группа - ошибки'''<br />
<br />
*'''flyer при ошибке''' ('' fl '') - обычно объект типа flyer (летуны которых надо показать в точке клика, если этот клик ошибочный). Можно в принципе любой объект который обладает состоянием "beg". Ошибочный клик - все клики мимо [[hiddenObject]].<br />
*'''вычет времени при ошибке''' ('' tmPen '') - Сколько отнять миллисекунд за ошибочный клик.<br />
<br />
<br />
<br />
'''Группа - переход'''<br />
<br />
*'''при разборе''' ('' scrOk '') - Экран на который надо перейти, если все объекты найдены.<br />
*'''время вышло''' ('' scrOv '') - Экран на который надо перейти если время вышло, а не все объекты найдены.<br />
<br />
<br />
<br />
'''Группа - система очков'''<br />
<br />
*'''Счетчик''' ('' score_counter '') — счетчик, отображающий набранные очки.<br />
*'''счетчик (test)''' ('' score_counter_test '') — счетчик, отображающий набранные очки.<br />
*'''ID пака''' ('' pack_id '') — строковый идентификатор пака(для записи набранных очков в [[options]] должен быть заполнен); используется для вытаскивания суммарных очков в счетчики и дальнейшего их отображения.<br />
*'''ID игры''' ('' game_id '') — строковый идентификатор игры (сцены).<br />
'''Обязательно должен иметь префикс ID пака. Например, если pack_id = "pack1", то game_id = "pack1.game1"'''.<br />
*'''мультипликатор очков''' ('' scoreM '') — Мультипликатор очков за объект, если все собрано за отведенное время.<br />
*'''Очки''' ('' score '') — количество очков, которые даются за каждый найденный [[hiddenObject]].<br />
*'''Бонус за скорость''' ('' bonusS '') — бонус за быстро найденный [[hiddenObject]].<br />
*'''Бонусный интервал''' ('' bonusT '') — время, за которое нужно найти [[hiddenObject]] для получения бонуса.<br />
*'''бонус за время''' ('' bonusTime '') - бонус за оставшееся время игры = коэффициент который введем * оставшееся время таймера.<br />
*'''Бонусный мультипликатор''' ('' grow ''):<br />
:'''1''' - умножать очки за второй быстро найденный предмет на 2, за третий на 3, и т. д.<br />
:'''0''' - не умножать.<br />
*'''Количество кликов для штрафа''' ('' wrngC '') — количество неверных кликов, после которых запустится блокатор (см. ниже).<br />
*'''Интервал для штрафа''' ('' wrngT '') — время, за которое нужно совершить неверные клики.<br />
*'''Штраф (очки)''' ('' delS '') — Сколько отнимаем очков за ошибочный клик.<br />
*'''Штраф (время)''' ('' delT '') — Сколько отнимаем времени за ошибочный клик.<br />
*'''блокатор''' ('' blockImg '') - Объект, блокирующий сцену при серии ошибочных кликов. (Обычно маска растянутая на весь экран. '''ДОЛЖНА иметь состояние "beg"''').<br />
*'''время блокировки''' ('' blockTime '') - Время блокировки при серии ошибочных кликов по истечении переводит "блокатор" в состояние '''end'''.<br />
*'''порог touch move''' ('' mvSens '') - Порог, начиная с которого движение пальца воспринимается как мув и сбрасываются неправильные клики.<br />
*'''touch move как штраф''' ('' tchMvPen '') - Считать ли touch move за ложное попадание:<br />
:'''0''' - нет;<br />
:'''1''' - да.<br />
*'''клик на найденный как штраф''' ('' clkFndPen '') - Считать ли клик на найденный объект за ложное попадание(актуально если объекты остаются на сцене).<br />
*'''аниматор очков''' ('' scoreAnim '') - машина, которая анимирует полученные очки, должна иметь состояние '''anim'''.<br />
*'''коэффициент комбо''' ('' cmbCoef '') - коэффициент для расчёта комбо очков по формуле s(n) = k * n * (n + 1).<br />
*'''счётчик очков за объект''' ('' objScCnt '') - счётчик который показывает очки за последний полученный объект (учитывая бонусы).<br />
*'''счётчик комбо-очков''' ('' cmbScCnt '') - счётчик очков полученных за комбо-серию.<br />
*'''счётчик комбо-серий''' ('' cmbRwCnt '') - счётчик который показывает комбо-серию (комбо из 2-х, 3-х и т.д. найденных объектов).<br />
*'''комбо2 прогресс''' ('' cmb2Pr '') - комбо2 прогресс;<br />
*'''комбо2 время''' ('' cmb2Tm '') - комбо2 время;<br />
*'''комбо2 кол-во''' ('' cmb2Num '') - комбо2 кол-во.<br />
*'''очки 3.0''' (''score30'') - Использовать систему очков, придуманную Степановым в августе 2015.<br />
*'''очки 3.0 коэф. комбо''' (''score30lc'') - в конце комбо даем за него очков n * s * l * (n-1) - где n число предметов в комбо, s - очки за один предмет, l - этот коэффициент<br />
*'''очки 3.0 коэф. аккуратности''' (''score30la'') - в конце игры начисляем очки за точность по формуле s * la / (1 + Nmiss / N)<br />
*'''очки 3.0 коэф. времени 1 (l)''' (''score30lt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки 3.0 коэф. времени 2 (t)''' (''score30tt'') - в конце игры начисляем очки за время по формуле s * lt / (1 + T / (tt * N))<br />
*'''очки детектив макс. комбо''' (''scoreDetMaxCombo'') - максимальное значение комбо для очков по системе детектива, используется при состоянии хидден-листа max_combo. Если в настройках хидден-листа очковая система "очки 3.0", то scoreDetMaxCombo должно быть равно <property name="комбо2 кол-во" id="cmb2Num" hint="комбо2 кол-во" type="int" label="комбо2 кол-во" value="1"/> +1. То есть, на 1 больше, чем значение комбо2 кол-во ('' cmb2Num '').<br />
*'''держать max_combo до тапа''' (''keepMaxCombo'') - Будет ли максимальное значение комбо после вызова max_combo храниться до тапа (да) или уменьшаться сразу (нет). Флаг используется только для состояния max_combo, обычный хидден останется прежним. Флаг обеспечит max_combo до первого тапа. То есть, чтобы комбо убывало по времени, но после первого тапа.<br />
<br />
<br />
'''Группа - звезды'''<br />
<br />
*'''combo num''' ('' comboNum '') - Количество быстро найденных объектов, нужное для получения звезды Combo.<br />
*'''combo time''' ('' comboInt '') - Интервал между кликами, считающимися быстрыми для Combo.<br />
*'''accuracy''' ('' accuracy '') - Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные).<br />
*'''лимит ложных кликов''' ('' starWrAcc '') - Лимит ложных кликов.<br />
Формула расчета проста, количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
==Параметры бота и мультиплеера==<br />
<br />
'''Группа - Хидден бот'''<br />
<br />
*'''тип бота''' - тип бота:<br />
:'''нет''' - обычная одиночная игра, бот выключен;<br />
:'''на одном поле''' - игра с ботом на одном поле, у обоих одинаковый список предметов;<br />
:'''с маленьким полем''' - бот будет играть на отдельном поле (??????);<br />
:'''горячий стул''' - hotsit, игра двух живых игроков на одном девайсе, передача хода по очереди;<br />
:'''мультиплеер''' - игра через сервер с живым оппонентом;<br />
*'''файл уровня''' - xml файл с настройками сложности бота ([[HiddenList#Настройка сложности бота|пример]]);<br />
*'''номер уровня''' - номер уровня в файле (начиная с 0);<br />
*'''номер уровня max''' - если задан больше предыдущего номера - выбирается рандомное значение;<br />
*'''multiplayer''' - объект мультиплеера;<br />
*'''кнопка хинта''' - кнопка хинта для 2го игрока \ бота;<br />
*'''проверять интернет''' - проверять интернет при игре с ботом (так же, как при игре с живым игроком);<br />
*'''первый ход (вероятность)''' - вероятность первого хода игрока при игре с ботом (в процентах);<br />
*'''t min abs ms''' - самая минимальная задержка между ходами бота;<br />
*'''t1 min ms''' - минимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 max ms''' - максимальное время для быстрого нахождения предмета ботом;<br />
*'''t1 prob %''' - вероятность быстрого нахождения предмета ботом;<br />
*'''t2 min ms''' - минимальное время для нахождения предмета ботом;<br />
*'''t2 max ms''' - максимальное время для нахождения предмета ботом;<br />
*'''t coef delta''' - коэффициент сложности (кажется от -1 до 1, могу ошибаться);<br />
*'''t wrong min ms''' - минимальное время между ложными кликами (мимо объекта) бота;<br />
*'''t wrong max ms''' - максимальное время между ложными кликами бота;<br />
*'''bot hint chance (percent)''' - шанс бота использовать хинт (в процентах);<br />
*'''bot hint num''' - максимальное кол-во использования хинтов ботом на игру;<br />
*'''доп. поле x''' - координаты доп. поля по Х;<br />
*'''доп. поле y''' - координаты доп. поля по Y;<br />
*'''доп. поле sx''' - масштаб доп. поля;<br />
*'''доп. поле sy''' - масштаб доп. поля;<br />
*'''указатель хода''' - указатель хода бота\оппонента. Должен иметь состояние ''beg'' и находитсья в сцене с хидденами;<br />
*'''родитель''' - родитель, в который поместим клонированную сцену (доп. поле);<br />
*'''счетчик очков бота''' - счетчик, выводящий очки;<br />
*'''счетчик без бонусов бота''' - счетчик, выводящий очки без бонусов за время и точность;<br />
*'''комбо2 прогресс бота''' - комбо2 прогресс;<br />
*'''аниматор очков бота''' - машина, которая при нахождении хиддена анимирует полученные очки;<br />
*'''счетчик очков за объект бот''' - счетчик, выводящий очки за объект;<br />
*'''счетчик комбо-серий (макс) бот''' - счетчик, выводящий макс. количество комбо-серий;<br />
*'''счетчик комбо-серий (тек) бот''' - счетчик, выводящий текущее количество комбо-серий;<br />
*'''flyer при ошибке''' - объект типа ''flyer'' который надо показать в точке клика, если этот клик ошибочный;<br />
*'''таймер хода бота''' - таймер хода бота;<br />
*'''таймер хода игрока''' - таймер хода игрока;<br />
*'''длительность хода ms''' - длительность хода игрока \ бота. Если задан 0 - игроки ходят одновременно;<br />
*'''длительность паузы между ходами ms''' - длительность паузы при смене хода игрока\бота.<br />
<br />
=== Настройка сложности бота ===<br />
<br />
Файл уровней для хидден-бота должен иметь такую структуру:<br />
<bots><br />
<obj id="0"><br />
<bot weight="3" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="21000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
<obj id="1"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="10000" t2max="25000" twrongmax="10000" /><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="7000" twrongmax="10000" /><br />
</obj><br />
<obj id="2"><br />
<bot weight="1" t1min="1000" t1max="2000" t1percent="10" t2min="7000" t2max="21000" twrongmax="10000" /><br />
<bot weight="2" t1min="1000" t1max="2000" t1percent="15" t2min="3000" t2max="5000" twrongmax="10000" /><br />
</obj><br />
</bots><br />
<br />
*bots - основной таг<br />
*obj > id - номер уровня<br />
*bot - содержит те же параметры, что и настройки бота в хидден листе<br />
<br />
==Режим "блиц" с бесконечными объектами==<br />
<br />
'''Правила аномалии "блиц"''':<br />
<br />
*Блиц заканчивается победой, если игрок нашел хотя бы один предмет за отведенное время игры блиц.<br />
*Если время вышло, но не было найдено ни одного предмета, то засчитывается поражение.<br />
*В аномалии блиц количество возможных предметов ограничивается максимальным количеством уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num). А количество видимых предметов ограничивается количеством предметов, заданных на уровне мастерства локации. При постепенном разборе предметов добавляются новые пока не будет разобрано максимальное количество предметов на хидден сцене, либо, пока не закончится время, но одновременно видно предметов не больше, чем заданных на конкретном уровне мастерства локации.<br />
<br />
Для включения такого режима блиц используем поле в настройках хидден-листа:<br />
*'''блиц с бесконечными объектами''' ('' endlessBlitz '') - При блице ставим максимальное количество объектов и засчитываем победу, если найден хоть один. (да - использовать режим, нет - не использовать).<br />
<br />
Если в этом поле настройка "нет", то режим блиц работает по-старому: объектов столько, сколько указано в уровне мастерства.<br />
<br />
Прочитать, находится ли хидден в режиме блиц можно из поля "is_blitz" хидден листа (возможные значения - 0 или 1). Заполняется экономикой в момент старта локации.<br />
<br />
Для отображения в счетчике максимального количества уникальных хидден-предметов на сцене (считываем из хидден-листа, параметр num) вычитывать измененный num можно ТОЛЬКО ПОСЛЕ прихода start hiddenlist, т.е. не в ините.<br />
<br />
В экономике указываем блиц, как отдельную аномалию.<br />
<br />
==Состояния==<br />
<br />
Состояния которые есть у листа. Мы можем передавать их с помощью различных объектов:<br />
<br />
*'''init''' - инициализация хидден-листа;<br />
*'''invert''' - горизонтально отображает изображение;<br />
*'''run''' - переводит хидден в состояние активности, если до этого был на паузе;<br />
*'''pause''' - переводит хидден в состояние паузы, объекты не кликаются, таймер не идет;<br />
*'''pause_timer''' - объекты кликаются, но таймер не идет;<br />
*'''resume_timer''' - продолжить работу таймера, который был остановлен в состоянии ''pause_timer'';<br />
*'''add_time''' - добавить игрового времени (перед этим надо передать в param количество времени в ms)<br />
*'''swap_hiddens''' - меняет отображаемые в таблице поисковые объекты на случайные другие.<br />
*'''get_visible_ho''' - вернуть id активного HO объекта (объект пишет в себя два параметра - '''randomHO_id''' и '''randomHO_vis''' (id объекта и виден ли он сейчас юзеру)); Приоритет выбора HO объекта: с начала видимые юзеру, если таких нет - выводим невидимый на текущий момент HO (до предмета нужно фокусировать сцену);<br />
*'''max_combo''' - хидден начинается с максимальным значением комбо;<br />
*'''putback''' - вернуть случайный уже найденный обьект на экран и в список;<br />
*'''restart_no_anomaly''' - перезапустить хидден без аномалии;<br />
*'''finish''' - принудительно завершить игру;<br />
<br />
==Примечания==<br />
<br />
*HiddenList должен располагаться в дереве проекта ниже всех своих поисковых объектов.<br />
<br />
*Единственный '''обязательный объект''' о котором должен знать лист это [[Table]] для отображения списка поиска, даже если таблица не будет использоваться быть все равно должна!<br />
<br />
*После завершения хидден-игры (по разбору или по времени)при переходе на другой экран HiddenList записывает данные в опции в два места: первое - это то, которое указано у настройках (ID пака, ID уровня, тип списка), для каждой локации свое; а второе - это last_game. <br><br />
Например, <br><br />
'''last_game.time_spent''' (либо же '''pck_N.lvl_N.kind_N.time_spent''') - время последней игры, <br> <br />
'''last_game.clicks''' (либо же '''pck_N.lvl_N.kind_N.clicks''') - количество найденных объектов и т.д. <br><br />
Все их можно увидеть в опциях. last_game был придуман для того, чтобы было удобно задавать счетчики в окне результатов. Также эти данные могут быть сохранены в опциях, если задать листу состояние '''wait'''.<br />
<br />
*Для проверки кликабельности хидденобъектов можно воспользоваться следующими настройками в app.icf:<br />
<br />
<pre><br />
[GHiddenList]<br />
HitTest=0<br />
HitTestDx=1 - шаг по х<br />
HitTestDy=1 - шаг по y<br />
</pre><br />
<br />
в результате после перехода на сцену с хидденом появится файл, в котором будет казан объекты и координаты в которых они не тапаются.<br />
<br />
== Добавляемые параметры ==<br />
<br />
[[Файл:+.png]] '''появляется новый объект: изменить состояние объекта''' ('' actst ''):<br />
:'''объект''' ('' obj '') - Объект, состояние которого нужно изменить;<br />
:'''состояние''' ('' st '') - Новое состояние объекта.<br />
<br />
[[Файл:HOList_3.jpg|right]]<br />
<br />
[[Файл:+.png]] '''разбор: если был экран''' ('' wscrOk '') - При нахождении всех объектов, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''разбор: изменить состояние объекта''' ('' nstOk '') - При нахождении всех объектов, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''разбор: изменить параметр объекта''' ('' chgOk '') - При нахождении всех объектов, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '') - Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''нет предметов (при создании из динамического конфига)''' ('' nstNoObjects '') - при загрузке локации без хидден-объектов (например не подтянулся пак либо нет локализации) перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - Перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: если был экран''' ('' wscrOv '') - Если вышло время, а объекты не найдены, переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен:<br />
:'''был экран''' ('' was '') - Экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз;<br />
:'''перейти на''' ('' scr '') - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''не успел: изменить состояние объекта''' ('' nstOv '') - Если вышло время, а объекты не найдены, перевести объект в новое состояние:<br />
:'''объект''' ('' obj '') - перевести объект в состояние из следующего поля;<br />
:'''состояние''' ('' st '') - Новое состояние для объекта из предыдущего поля.<br />
<br />
[[Файл:+.png]] '''не успел: изменить параметр объекта''' ('' chgOv '') - Если вышло время, а объекты не найдены, изменить параметр объекта:<br />
:'''объект''' ('' obj '') - этот объект меняет свой параметр;<br />
:'''свойство''' ('' par '')- Параметр, который мы изменяем;<br />
:'''значение''' ('' val '') - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''счетчик очков''' ('' scoreCnt ''):<br />
:'''счетчик''' ('' cnt '') - Каунтер, которому приходят очки.<br />
<br />
[[Файл:+.png]] '''группа extra bonus''' ('' extraBonus ''). Используется для economics, при нахождении объекта с некой вероятностью может выпасть бонус. Объект который анимирует появление бонуса должен иметь состояние show, время на анимацию бонуса - 10 секунд:<br />
:'''монетки объект''' ('' coinsObj '') - объект который анимирует получение монет;<br />
:'''монетки вероятность''' ('' coinsProb '') - вероятность по нахождению объекта получить дополнительно монетки;<br />
:'''опыт объект''' ('' expObj '') - объект который анимирует получение опыта;<br />
:'''опыт вероятность''' ('' expProb '') - вероятность по нахождению объекта получить дополнительно опыт;<br />
:'''энергия объект''' ('' energyObj '') - объект который анимирует получение энергии;<br />
:'''энергия вероятность''' ('' energyProb '') - вероятность по нахождению объекта получить дополнительно энергию.<br />
<br />
[[Файл:+.png]] '''Объект, который срабатывает, если долго не находить хидден''' ('' notfnd ''):<br />
:'''объект''' ('' obj '') - Объект, который переводится в указанное состояние, если долго не находить хидден;<br />
:'''состояние''' ('' st '') - Состояние, в которое переводится объект;<br />
:'''время''' ('' tm '') - Время от последнего нахождения хиддена, после которого срабатывает объект.<br />
<br />
[[Файл:+.png]] '''параметры аномалии с исчезновением букв''' ('' hlPars ''):<br />
:'''оставшиеся буквы''' ('' min '') - Минимальное количество оставшихся букв в предложении;<br />
:'''задержка''' ('' wait '') - Момент времени, начиная с которого аномалия будет проявляться;<br />
:'''задержка 2''' ('' wait2 '') - Задержка для появившихся слов, изначально недоступных;<br />
:'''время''' ('' time '') - Время, за которое должны исчезнуть все буквы (если -1, то до конца времени в хиддене);<br />
:'''промежутки''' ('' dt '') - промежутки времени между каждой итерацией;<br />
:'''флайер''' ('' fl '') - Флайер, анимирующий исчезающую букву (должен иметь '''текстовый''' тип).<br />
<br />
[[Файл:+.png]] '''параметры аномалии ночь''' ('' nightPars ''): <br />
:'''effect''' ('' ef '') - эффект, управляющий трансформацией цвета;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего ночь.<br />
<br />
[[Файл:+.png]] '''параметры аномалии трансформации цвета''' ('' colInvPars ''):<br />
:'''effect''' ('' ef '') - Эффект, управляющий трансформацией цвета;<br />
:'''tags''' ('' eftags '') - Теги эффектов, реализующих трансформацию цвета, из которых будет выбран один.<br />
<br />
[[Файл:+.png]] '''параметры аномалии дым''' ('' smokePars ''): <br />
:'''effect''' ('' ef '') - Машина, управляющая эффектом дыма;<br />
:'''tag''' ('' eftag '') - Тег эффекта, реализующего дым.<br />
<br />
Все аномалии кроме текстовой должны быть настроены с помощью объекта [[Effect]]<br />
<br />
== Get Started==<br />
Минимальный набор ресурсов:<br />
* Фоновая картинка для поисковой сцены<br />
* Комплект картинок, с которых будут сделаны поисковые [[HiddenObject|объекты]]<br />
* Текстовые объекты для идентификации спрятанных объектов<br />
<br />
Минимальный набор объектов редактора:<br />
* [[Image]] который будет изменен в хидден-лист<br />
* [[Table|Таблица]] в которой будут отображаться тексты/картинки (зависит от режима) спрятанных объектов.<br />
* По одному [[Image]] для каждого спрятанного объекта (будут созданы автоматически при добавлении картинок из базы ресурсов на сцену)<br />
<br />
Наши действия:<br />
# откроем [[Интерфейс_ScenceEditor|редактор сцен]] и создадим новый проект,<br />
# добавим новый экран с именем ''scrHList''<br />
# создадим в этом экране сцену ''stgHList''<br />
# перейдём в [[Интерфейс_ResourceEditor|редактор ресурсов]]<br />
## создаём папку ''HList''<br />
## добавим в ней картинку для фона и картинки для спрятанных объектов.<br />
## выделим все картинки в дереве ресурсов и перенесем их на нашу сцену ''stgHList'', при этом для каждой картинки автоматически создастся объект [[Image]].<br />
## закроем редактор ресурсов<br />
# перейдём в [[Интерфейс_TextEditor|редактор текстов]]<br />
## создаём папку ''HListText''<br />
## добавим в нее текстовые объекты, по одному на каждый поисковый объект.<br />
## сохраним внесенные изменения.<br />
# перейдём в редактор сцен.<br />
# создадим в сцене stgHList объект [[Table]] и назовем его HOT<br />
## настроим размер и положение таблицы, согласно нашего дизайна<br />
## установим параметры колонок = "50", колонок видно = "5", строчек = "5", строчек видно = "1" (таким образом в таблице будут отображаться 5 поисковых предметов, а максимальное количество объектов для поиска будет равно 250)<br />
## установим параметры скорость листания = "650", добавлять по строкам = "0", центрировать = "растянуть", сдвигать ячейки при удалении ="да"<br />
# создадим в сцене stgHList объект '''HiddenList''', напоминаем что его размер и положение на сцене не имеют значения, по этому расположим его где-нибудь за границей экрана. <br>'''Важно''' В дереве проекта хидден-лист должен быть ниже всех своих поисковых объектов.<br />
## в поле таблица указываем нашу HOT<br />
## установим параметр объектов = "10"<br />
## установим параметр пропадание объектов = "да"<br />
## установим параметр реагировать на отпускание = "да"<br />
## установим параметр реагировать на невидимые = "нет"<br />
## установим параметр набор = "1"<br />
# Настроим объекты, которые будут прятаться. Для этого выделим картинки поисковых объектов, добавленные нами ранее, и изменим им тип на "hiddenObject". Оставляя группу этих объектов выделенной, настроим им параметры:<br />
## в поле list укажем наш HiddenList<br />
## параметр набор = "1"<br />
## Теперь снимаем выделение и каждому объекту в поле текстID перетаскиваем мышкой соответствующий текстовый объект из текстовой базы (поле текстID должно быть активно для редактирования - по нему нужно кликнуть мышкой)<br />
# сохраним проект<br />
# запустим [[Интерфейс_Viewer|вьювер]]<br />
<br />
== Динамический HG==<br />
Функционал позволяет генерировать HL самостоятельно HO объекты из файла конфига. <br />
<br />
П.С. - вся графика д.б. динамической. Данные файлы может создавать HO_Manager [http://wiki/index.php/HO_Manager Wiki HO_manager] <br />
[https://docs.google.com/document/d/13UUOKf_iJNzFx0PjU4JQIfYDX7NhK7dyfJAR3I-SWlQ/edit#heading=h.4pd8h5jdvqj4 Документ по динамических пакам]<br />
<br />
[[Файл:D485ecbbbb.jpg|right]]<br />
*'''файл уровня''' ('' configFile'') — указываем путь к файлу конфигу, где перечисляем файлы с HG. <br />
*'''список графических ресурсов''' — служебное, пока не используется;<br />
*'''список текстовых ресурсов''' — служебное, пока не используется;<br />
*'''номер уровня''' ('' hiddenLevelNum '') — номер уровня из файла;<br />
*'''образец хиддена''' ('' hiddenTemplate '') — obj_id HO объект, должен иметь нужные параметры (остальные возьмутся из конфига) ;<br />
*'''образец нашлёпки''' ('' hiddenPatchTempl '') — obj_id нашлёпки на HO объект, должна иметь нужные параметры (остальные возьмутся из конфига);<br />
*'''корневой объект''' ('' hiddenRoot '') — obj_id корневого объект в который сложим всех клонов;<br />
*'''точечный спецэффект''' ('' hiddenEffect '') — ;<br />
*'''фоновый объект ''' ('' hiddenBG '') — obj_id объекта которому поменяем ресурс;<br />
<br />
Требования, вся графика HO,BG отрисовывается без учёта пивоты;<br />
<br />
Файлы конфиги имеют вид:<br />
Файл уровня имеет вид:<br />
{<br />
"levels": [<br />
{<br />
"file": "ViewerFiles/DynHid/hidden0.cfg",<br />
"pack":3<br />
}<br />
]<br />
}<br />
<br />
:Где "levels" - линки на файлы уровней. <br />
:::"file" - путь к файлу;<br />
:::"pack" - пак в который попадут ресурсы;<br />
<br />
<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
"bg": {<br />
"src": "bg.png",<br />
"w": 2048,<br />
"h": 1151,<br />
"id": 16,<br />
"color": "#ffffff",<br />
"tile": ""<br />
},<br />
"hiddens": [<br />
{<br />
"id": 1022,<br />
"nm": "bucket_01",<br />
"res": 129,<br />
"bg": 666,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
},<br />
"objs": [{<br />
"res": 1488,<br />
"rect": {<br />
"x": 1393,<br />
"y": 653,<br />
"w": 115,<br />
"h": 137<br />
}<br />
}],<br />
}, <br />
{<br />
"x": 1537,<br />
"y": 409,<br />
"id": 1023,<br />
"res": 329,<br />
"nm": "bucket_02",<br />
"rect": {<br />
"x": 1493,<br />
"y": 366,<br />
"w": 81,<br />
"h": 87<br />
}<br />
}<br />
],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
}<br />
}<br />
<br />
:Где "bg" - настройки фона. <br />
:::"src" - сорс графического файла в ресурсной базе;<br />
:::"color" - цвет которым будет залито под фоном, нужное если фон имеет дырки;<br />
:::"tile" - тайлинг фона;<br />
:::"id" - id ресурса из ресурсной базы;<br />
::"hiddens" - перечень HO с их настройками<br />
::::"id" - TxtId;<br />
::::"nm" - имя HO;<br />
::::"res" - графический ресурс HO;<br />
::::"bg" - графический ресурс тени;<br />
::::"rect" - настройки "res";<br />
:::::"x" - координата x, в координатах корневого объекта;<br />
:::::"y" - координата y, в координатах корневого объекта;<br />
:::::"w" - ширина;<br />
:::::"h" - высота;<br />
::::"objs" - перечень нашлёпок;<br />
:::::"res" - графический ресурс нашлёпки;<br />
:::::"rect" - настройки графического ресурса нашлёпки;<br />
::::::"x" - координата x, в координатах HO;<br />
::::::"y" - координата y, в координатах HO;<br />
::::::"w" - ширина;<br />
::::::"h" - высота;<br />
::"res" - ресурсы которые входят в пак уровня ( будут вырезаны при экспорте в пак уровня)<br />
::::"images" - перечень графических ресурсов<br />
::::"texts" - перечень текстовых ресурсов<br />
::::"sounds" - перечень звуковых ресурсов<br />
<br />
== Кроссворд ==<br />
Данный функционал базируется на динамических HG и настраивается в файле динамического уровня.<br />
<br />
=== Мода 2 - слова с мусором ===<br />
[[Файл:Crossword mode2.jpg|right|500x500px]]<br />
Данная мода представляет собой HO объекты и текстовую таблицу, при нахождении предмета, в текстовой таблице подсвечиваются буквы слова.<br />
<br />
Настройка в HiddenList указывается в теге '''кроссворд - мода 2 - слова с мусором''' ('''_G_17'''):<br />
* '''режим кроссворда''' ('''cwon''') - использовать/не использовать режим;<br />
* '''подуровень''' ('''sub_level''') - подуровень;<br />
* '''root''' ('''cw2root''') - родитель текстового поля, координаты будут установлены согласно параметрам "x","y";<br />
* '''text''' ('''cw2text''') - линк на текстовый объект, в котором будем отображать текстовое поле; <br />
* '''цвет найденных''' ('''colorFound''') - цвет букв найденных слов в нашем текстовом поле;<br />
<br />
Файл конкретного уровня имеет вид:<br />
{<br />
...<br />
"hiddens": [ ... ],<br />
"res": {<br />
"images": [16, 129, 1488, 329],<br />
"texts": [1022, 1023],<br />
"sounds": [],<br />
},<br />
"mode2" : {<br />
"en" : [<br />
{<br />
"ids" : [ 3032, 4480, 4491, 4493, 4494, 4499 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 414,<br />
"x" : -682,<br />
"y" : -300<br />
},<br />
"string_check" : "XObatHWZIF|RJLhacksaw|QVPNsaddle|AECGDaxeYU|doveSlante|rnBMTKGEAQ",<br />
"string_display" : "XOBATHWZIF|RJLHACKSAW|QVPNSADDLE|AECGDAXEYU|DOVESLANTE|RNBMTKGEAQ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 4485, 4487, 4490, 4495, 4502, 17112 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "FskatesNTH|ALMboomera|ngWERODrad|ioSKBZoarP|tableGball|oonJXCUIYV",<br />
"string_display" : "FSKATESNTH|ALMBOOMERA|NGWERODRAD|IOSKBZOARP|TABLEGBALL|OONJXCUIYV",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
],<br />
"ru" : [<br />
{<br />
"ids" : [ 4481, 4485, 4490, 4495, 4500, 4508 ],<br />
"nm" : "0001_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ЕконькиМЭк|олокольчик|ХАрадиоШве|слоВбабочк|аЖИЛкастрю|ляУЯРТНСКЮ",<br />
"string_display" : "ЕКОНЬКИМЭК|ОЛОКОЛЬЧИК|ХАРАДИОШВЕ|СЛОВБАБОЧК|АЖИЛКАСТРЮ|ЛЯУЯРТНСКЮ",<br />
"x" : -475,<br />
"y" : -69<br />
},<br />
{<br />
"ids" : [ 3053, 4480, 4487, 4494, 4502, 4507 ],<br />
"nm" : "0002_06",<br />
"num" : 6,<br />
"numvis" : 9,<br />
"rect_field" : {<br />
"h" : 1151,<br />
"w" : 1534,<br />
"x" : -768,<br />
"y" : -575<br />
},<br />
"rect_text" : {<br />
"h" : 462,<br />
"w" : 412,<br />
"x" : -681,<br />
"y" : -300<br />
},<br />
"string_check" : "ШЩЧУГЮДзве|здаНОМТЕХб|умерангИЪс|толЗЖЪбита|УфонарьЮпо|дарокХПЭБТ",<br />
"string_display" : "ШЩЧУГЮДЗВЕ|ЗДАНОМТЕХБ|УМЕРАНГИЪС|ТОЛЗЖЪБИТА|УФОНАРЬЮПО|ДАРОКХПЭБТ",<br />
"x" : -475,<br />
"y" : -69<br />
}<br />
]<br />
}<br />
<br />
:где "mode2" - настройки моды 2;<br />
:::"en", "ru" - языковые локали;<br />
::::"ids" - массив textID активных HO;<br />
::::"nm" - имя уровня - для нашего удобства;<br />
::::"num" - количество активных объектов == размеру массива '''ids''';<br />
::::"numvis" - количество всего объектов,используем для задания фоновых объектов (количество которых == numvis - num);<br />
::::"rect_field" - ректангл активной зоны (пока не используется);<br />
::::"rect_text" - ректангл текстового поля(пока не используется);<br />
::::"string_check" - текстовое поле регистро-зависимое - для HL; <br />
::::"string_display" - текстовое поле для отображения;<br />
::::"x" - координата x родительского объекта для текста;<br />
::::"y" - координата y родительского объекта для текста;<br />
<br />
П.С. данную моду генерирует программа HGcrossword (https://docs.google.com/document/d/1RXSNUxNePF4qEibAPoCgfdiQycxoggc6Hu7a9VUjxSI/edit#)<br />
<br />
== Авто тест HL ==<br />
Для запуска автотеста, нам нужно указать в app.icf параметры:<br />
<br />
[GHiddenList]<br />
:'''HitTest''' - мода автотеста; (0- выкл.; 1 - разовая логика, пишется в файл раз в сессию для одного хидден листа ; 2 - при каждом init любого хидн листа дописывается статистика в файл);<br />
:'''HitTestDx''' = 5 - шаг с которым проходит автокликер по X;<br />
:'''HitTestDy''' = 5 - шаг с которым проходит автокликер по Y;<br />
<br />
Для HitTest==2, очень помогает параметр "allow_background". Остаётся только написать скриптулину, которая ходит сама между экранами.<br />
<br />
== Пример ==<br />
<br />
S:\!MOBILE\!!!EditorGames\Wiki_sample<br />
<br />
HiddenList.rar<br />
<br />
[[Category:Game mechanic]]<br />
<br />
[[Category:Get Started]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Button&diff=9769Button2018-12-22T13:25:22Z<p>Agava: /* Состояния */</p>
<hr />
<div>{{TOC right}}<br />
'''Общие параметры'''<br />
(см. описание [[Object|Object]])<br />
<br />
*'''[[прокликиваемая]]''' - Если 1, то кнопка прозрачна для клика мышкой (пропускает объектам под ней). Если 2, то кнопка сама обрабатывает клик, но и пропускает его дальше<br />
*'''память''' - Если 1, то при повторном открытии экрана объект не обновляет свое состояние (помнит текущие параметры, оставшиеся от предыдущего посещения экрана)<br />
<br />
== Основные параметры ==<br />
'''Группа - внешний вид'''<br />
[[Файл:But.png|250px|right]]<br />
<br />
''(Курсивом в скобках указан id параметра, или состояния)''<br />
<br />
*'''up''' ''(res)'' - Графический ресурс для отображения отжатой кнопки. <br />
*'''down''' ''(rdn)'' - Графический ресурс для отображения нажатой кнопки. Может отсутствовать.<br />
*'''over''' ''(rov)'' - Графический ресурс для отображения кнопки с мышкой над ней. Может отсутствовать.<br />
*'''disable''' ''(dis)'' - Графический ресурс для отображения неактивной кнопки. Может отсутствовать. <br />
*'''disable alpha''' ''(dis_al)'' - Можно указать с какой прозрачностью будет кнопка в состоянии disable, например, если кнопку в неактивном состоянии нужно прятать, то ставим 0, и кнопка в состоянии disable будет невидимой.<br />
*'''накладывать''' - Если "1", то графика из параметра '''down''' будет накладываться на графику из параметра '''up''' при нажатии на кнопу, если "0", то не накладывается.<br />
*'''down scale''' ''(sd)'' - Изменяет размеры графического ресурса для отображения нажатой кнопки. Может отсутствовать.<br />
*'''over scale''' ''(so)'' - Изменяет размеры графического ресурса для отображения кнопки с мышкой над ней. Может отсутствовать.<br />
<br />
'''Группа - звуки'''<br />
<br />
*'''up''' ''(sup)'' - Звуковой ресурс для проигрывания отжатой кнопки. Может отсутствовать.<br />
*'''down''' ''(sdn)'' - Звуковой ресурс для проигрывания нажатой кнопки. Может отсутствовать.<br />
*'''over''' ''(sov)'' - Звуковой ресурс для проигрывания кнопки с мышкой над ней. Может отсутствовать.<br />
<br />
'''Группа - время'''<br />
<br />
*'''невидимости''' ''(tmBeg)'' - Время невидимости перед открытием.<br />
*'''открытия''' ''(tmOpn)'' - Время проявления кнопки от полной прозрачности к прозрачности, заданной в модификаторах.<br />
*'''закрытия''' ''(tmCls)'' - Время исчезания кнопки до полной прозрачности.<br />
*'''Пауза''' ''(tmPause)'' - Время, в течении которого кнопка после нажатия не будет воспринимать клик, но будет выглядеть как активная. Применяется для предотвращения случайного двойного нажатия, например, для кнопки покупки или закрытия окна, когда закрытие длится некоторое время. Этот параметр НЕ применяется для кнопки хинта с перезарядкой.<br />
<br />
'''надпись ID''' ''(txtID)'' - Надпись на кнопке, перетаскивается из редактора строк.<br />
<br />
'''надпись''' ''(txt)'' - Надпись на кнопке. Используется только, если нет графики. <br />
<br />
'''Группа - [[шрифт]]'''<br />
<br />
*'''имя''' ''(fn)'' - Номер шрифта - целое число, начиная с 0 (порядковый номер шрифта).<br />
*'''размер''' ''(fs)'' - Размер шрифта в пикселях.<br />
<br />
== Дополнительные параметры ==<br />
<br />
*'''вернуться назад''' ''(back)'' - 1 - кнопка служит для возврата на предыдущий экран, id экрана для перехода игнорируется.<br />
*'''перейти на''' ''(scr)'' - Экран для перехода после клика на кнопку, если условные переходы (ниже) не сработали<br />
*'''задержка перехода''' ''(delay)'' - Задержка перед переходом на следующий экран в ms.<br />
*'''рейтинг''' ''(raiting)'' - Открывает системное окно с предложением проголосовать, данные берёт из rating.xml<br />
Если на девайсе была нажата кнопка "отрейтинговать", то в опции запишется параметр rating значение 1, если нажата кнопка "позже" - rating 2, "никогда" - rating 3.<br />
*'''перезагрузить лэйаут''' ''(reload)'' - 1 - по нажатию на кнопку перезагружает лэйаут<br />
*'''отменить текущие закачки''' ''(cancel)'' - 1 - по нажатию на кнопку отменяет все текущие закачки<br />
*'''перезапустить текущие закачки''' ''(redownload)'' - 1 - по нажатию на кнопку перезапускает все текущие закачки<br />
*'''не предзагружать''' ''(pr)'' - Не загружает в фоновой загрузке графику экрана на которую ведёт кнопка.<br />
*'''закрыть приложение''' ''(exit)'' - По нажатию закрывает приложение.<br />
*'''восстановить покупки''' ''(restore)'' - 1 - по нажатию на кнопку попытаться восстановить покупки.<br />
<br />
'''Группа - [[позиционирование]]'''<br />
*'''горизонтальное''' ''(alHor)'' - 0 - нет выравнивания; 1 - прижать к левому краю; 2 - центр; 3 - к правому<br />
*'''вертикальное''' ''(alVer)'' - 0 - нет выравнивания; 1 - прижать к верхнему краю; 2 - центр; 3 - к нижнему<br />
<br />
== Добавляемые параметры ==<br />
<br />
<br />
[[Файл:Button1.PNG|300px|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по правой кнопки мыши. <br />
<br />
[[Файл:+.png]] '''если был экран''' - Переходим на определенный экран, если некоторый экран был уже хотя бы раз посещен.<br />
*'''был экран'''- Проверяемый экран, который мы проверяем на то, был ли он уже открыт хотя бы один раз.<br />
*'''перейти на''' - Переходим на этот экран, если экран из предыдущего поля уже открывался.<br />
<br />
[[Файл:+.png]] '''изменить состояние объекта''' - При клике на кнопку перевести объект в новое состояние.<br />
*'''объект''' - Изменить состояние у выбранного объекта<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля. <br />
<br />
[[Файл:+.png]] '''изменить параметр объекта''' - Изменить параметр (свойство) объекта при клике на кнопку.<br />
*'''объект''' - Изменить параметр у выбранного объекта<br />
*'''параметр''' - Параметр, который мы изменяем. <br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''изменить состояние объекта - наведение''' - При наведении на кнопку перевести объект в новое состояние.<br />
*'''объект''' - Изменить состояние у выбранного объекта<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля. <br />
<br />
[[Файл:+.png]] '''изменить параметр объекта - наведение''' - Изменить параметр (свойство) объекта при наведении на кнопку.<br />
*'''объект''' - Изменить параметр у выбранного объекта<br />
*'''параметр''' - Параметр, который мы изменяем. <br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''изменить состояние объекта - отпускание''' - При отпускании кнопки перевести объект в новое состояние.<br />
*'''объект''' - Изменить состояние у выбранного объекта<br />
*'''состояние''' - Новое состояние для объекта из предыдущего поля. <br />
<br />
[[Файл:+.png]] '''изменить параметр объекта - отпускание''' - Изменить параметр (свойство) объекта при отпускании кнопки.<br />
*'''объект''' - Изменить параметр у выбранного объекта<br />
*'''параметр''' - Параметр, который мы изменяем. <br />
*'''значение''' - Новое значение параметра.<br />
<br />
[[Файл:+.png]] '''изменить графику объекта''' - При клике на кнопку изменить графический ресурс объекта.<br />
*'''объект''' - Изменить параметр у выбранного объекта<br />
*'''параметр''' - Параметр, который мы изменяем.<br />
*'''значение''' - Новое значение графического ресурса (перетаскивается из редактора ресурсов). <br />
<br />
[[Файл:+.png]] '''изменить id текста''' - При клике на кнопку меняет id текста на выбранный у другого объекта.<br />
*'''объект''' - Объект у которого меняется id текста. <br />
*'''свойство''' - Свойство, в которое записывается новый id текста.<br />
*'''значение''' - Новое значение текстового ресурса (перетаскивается из редактора текстов). <br />
<br />
[[Файл:+.png]] '''изменить id объекта''' - При клике на кнопку меняет id объекта на выбранный у другого объекта(на пример у инвентаря таким образом указывается id объекта помещаемого в инвентарь).<br />
*'''объект''' - Объект у которого меняется id объекта. <br />
*'''свойство''' - Свойство, в которое записывается новый id объекта.<br />
*'''значение''' - Объект, id которого будет записан. <br />
<br />
[[Файл:+.png]] '''изменить id экрана объекта''' - При клике на кнопку меняет id экрана на выбранный у другого объекта(на пример можно использовать для изменения id экрана для перехода у кнопки).<br />
*'''объект''' - Объект у которого меняется id экрана. <br />
*'''свойство''' - Свойство, в которое записывается новый id экрана.<br />
*'''значение''' - Экран, id которого будет записан. <br />
<br />
[[Файл:+.png]] '''совершить in-app покупку''' - При клике на кнопку открывается системное окно с предложением совершить in-app покупку.<br />
*'''id покупки''' - Внутренний id покупки для приложения, указывается в объекте store<br />
*'''объект(успех)''' - Объект, которому сообщается об удачной покупке<br />
*'''состояние(успех)''' - Состояние в которое переводится выбранный объект в случае успешной покупки<br />
*'''объект(провал)''' - Объект, которому сообщается о неудачной покупке<br />
*'''состояние(провал)''' - Состояние в которое переводится объект в случае неудачной покупки<br />
<br />
[[Файл:+.png]] '''скачать загружаемый контент''' - При клике на кнопку будет совершена попытка скачать контент. <br />
*'''url''' - Ссылка на zip архив с контентом в интернете.<br />
*'''объект (успех)''' - Этому объекту будет сообщено об успехе закачки.<br />
*'''состояние (успех)''' - Это состояние будет установлено объекту при успешной закачке.<br />
*'''объект (провал)''' - Этому объекту будет сообщено о неудаче закачки.<br />
*'''состояние (провал)''' - Это состояние будет установлено объекту при ошибке/отмене закачки.<br />
*'''счетчик прогресса''' - Объект типа счетчик, который будет отображать прогресс загрузки. Крайне желательно, чтобы он имел диапазон 0..100.<br />
<br />
[[Файл:+.png]] '''открыть внешнюю ссылку''' - При клике на кнопку открыть ссылку в браузере.<br />
*'''id cсылки''' - Если в опциях не будет найдено ссылки, то сам айдишник будет интерпретироваться как ссылка.<br />
*'''id cсылки (iOS)''' - Если задано, то на iOS устройствах будет использоваться ВМЕСТО основного линка. Ссылка которая открывается на iOS устройствах(может быть в виде itms://.. itms-apps://.. http://...).<br />
*'''id cсылки (Android)''' - Если задано, то на Android устройствах будет использоваться ВМЕСТО основного линка.<br />
*'''id cсылки (текстовая база)''' - Если задано, то будет использоваться ссылка из записи текстовой базы(перетаскивается запись из текстовой базы) ВМЕСТО основного линка. Какая ссылка будет использоваться задаётся при сборке.<br />
<br />
[[Файл:+.png]] '''отправить письмо''' - При клике на кнопку вызывается почтовый клиент.<br />
*'''адрес''' - адрес получателя.<br />
*'''тема''' - тема письма.<br />
*'''письмо''' - текст письма.<br />
<br />
==Примечания и дополнения==<br />
<br />
'''Важно помнить:''' <br />
<br />
*Кнопка реагирует только на отпускание. (В отличии от машины, которая может реагировать как на нажатие, команда click, так и на отпускание, команда touch_up.)<br/><br />
Часто для простых похожих действий используют как кнопки, так и машины. Важно учитывать, на каком этапе тапа они срабатывают (нажатие, удерживание, отпускание) потому, что игрок может очень длительное время удерживать палец на экране. <br/><br />
Можно сделать так, что один тап будет приводить в действие два объекта. Например, тапнуть на машину, которая реагирует на нажатие, а затем перетащить палец на кнопку (или поместить кнопку поверх машины) и отпустить. В таком случае на один тап откликнется и машина, и кнопка.<br />
<br />
*Следует аккуратно использовать кнопки, если у них или их родителей прокликиваемость = 2. В таком случае, если кнопку двигать (например, анимация колыхания), то она потеряет фокус и не будет реагировать на тап.<br />
<br />
== Состояния ==<br />
<br />
Все состояния:<br />
<br />
*'''beg''' - кнопка невидима, при вызове этого состояния она перейдет в ''open'' по прохождению времени, указанного в поле времена->невидимости.<br />
*'''open''' - кнопка проявляется по альфе за время, указанном в поле времена->открытия, после чего переходит в ''up''.<br />
*'''up''' - кнопка доступна для нажатия. При нажатии переходит в ''down''. В этом состоянии она отображает ресурс, указанный в поле внешний вид->up.<br />
*'''down''' - вызывается, когда кнопка нажата. Это состояние можно взывать вручную из машины, если надо симулировать нажатие кнопки. В этом состоянии она отображает ресурс, указанный в поле внешний вид->down.<br />
*'''ov''' - вызывается, когда кусор мыши находится над кнопкой. В играх на мобильных телефонах не используется ввиду отсутствия курсора. Кнопка в этом состоянии также доступна для нажатия. В этом состоянии она отображает ресурс, указанный в поле внешний вид->over.<br />
*'''close''' - состояние закрытия, при запуске растворяется по альфе за время, указанном в поле времена->закрытия, после чего переходит в ''end''.<br />
*'''end''' - Кнопка невидима и неактивна.<br />
*'''disable''' - Кнопка видима, но нажать на нее нельзя. В этом состоянии она отображает ресурс, указанный в поле внешний вид->disable.<br />
*'''pause''' - Кнопка временно неактивна. Состояние используется в основном, если надо избежать повторного нажатия на некоторое время, указанное в поле времена->паузы. В этом состоянии она отображает ресурс, указанный в поле внешний вид->disable.<br />
*'''highlight_on''' - В этом состоянии кнопка подствечивается по бленд-альфе на время, указанное в поле времена->подсветки. После чего уходит в состояние ''highlight_off'' (его можно вызвать и самому, если сильно приспичит).<br />
*'''highlight_off''' - Окончание подсветки кнопки, после которого она возращается в состояние до подсветки.<br />
<br />
== Пример реализации ==<br />
<br />
[http://fs5.absolutist.com/files/wikisample/button.zip Download]<br />
<br />
<br />
[[Category:Main objects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Text&diff=9768Text2018-12-22T13:22:12Z<p>Agava: /* Состояния */</p>
<hr />
<div>'''Text''' - [[Object|объект]] для отображения текстовой информации с поддержкой многоязычности. Для управления текстовыми ресурсами используется [[TextEditor]]. <br><br />
== Введение ==<br />
[[Файл:2223.png]]<br><br />
<br />
<br />
Если необходимо разместить текст на сцене необходимо создать объект с типом text и перетащить на поле текстID текстовую строку из TextEditor. Также можно просто перенести их TextEditor выбранную текстовую запись, при этом автоматически создастся объект с типом Text.<br><br />
<br />
'''Обязательно в тексте ТекстовойБазы, после символа '|' должен стоять другой символ. Если делаем два переноса, это будет выглядеть: "текст| |тест".'''<br />
<br />
== Параметры объекта ==<br />
<br />
=== Общие параметры ===<br />
(см. описание [[Object|Object]])<br />
<br />
=== Основные параметры ===<br />
<br />
*'''res''' - Графический ресурс подложки на которой выводится текст. Перетаскивается мышкой из редактора текста (поле должно находится в состоянии редактирования). Может отсутствовать.<br />
*'''текстID''' - Выводимый текст перетаскивается из ресурса текстов, для перетягивания поле в объекте Text должно быть в режиме редактирования. Решетка (#) разделяет на страницы, черта (|) - принудительный переход на новую строку.<br />
*'''текст''' - Выводимый текст без использования базы текстовых ресурсов. Решетка (#) разделяет на страницы, черта (|) - принудительный переход на новую строку.<br />
*'''textCanBeOptionsKey''' - позволяет выключить проверку на ключ в опциях (Если в поле '''text''' указать "x" - то с включённым функционалом, текстовый объект покажет значение из опций параметра "x"; Если выключено - отобразит "x");<br />
*'''состояние''' - в поле указывается состояние текстового объекта, в которое он перейдет при загрузке экрана (это поле часто оставляют пустым, а состояния задают машиной).<br />
<br />
'''!!! - Необходимо обязательно сохранять любые изменения с текстом в редакторе TextEditor.'''<br />
<br />
[[Файл:Text1.PNG|800px|thumb|center]]<br />
<br />
=== Дополнительные параметры ===<br />
<br />
[[Файл:Text2.PNG|800px|thumb|right]] <br />
<br />
'''Группа - форматирования'''<br />
<br />
*'''dx''' - Бордюр (отступ текста слева и справа от границы прямоугольника объекта);<br />
*'''dy''' - Бордюр (отступ текста сверху и снизу от границы прямоугольника объекта);<br />
*'''отступ''' - Вертикальное расстояние между строчками в пикселях;<br />
*'''h align''' - Горизонтальное форматирование. Если (c) - центрирование по горизонтали, если (r) - прижатие вправо;<br />
*'''v align''' - Вертикальное форматирование. Если (c) - центрирование по вертикали.<br />
[[Файл:2224.png|250px|center]]<br />
[[Файл:Text11.png|250px|left]]<br />
[[Файл:Text22.png|250px|center]]<br />
<br />
<br><br />
*'''автоматическое уменьшение''' - Функция позволяет уменьшить размер шрифта, чтобы уместить текст внутри прямоугольника ( размеры текстового объекта).<br />
*'''минимальный размер шрифта''' - Минимальный размер до которого уменьшит функция автоскейла.<br />
*'''уменьшать до строк''' - Нужно для функционала автоматического уменьшения. Попытается строку преобразовать в n строк ( исп. для цен).<br />
[[Файл:890a37f3ed.jpg|center]]<br />
<br><br />
<br />
'''Группа - Параметры отображения текста'''<br />
<br />
*'''время до открытия''' - Время перед началом проявления текста (от невидимого до заданной прозрачности);<br />
*'''время открытия''' - Время проявления текста и подложки до alpha в начале;<br />
*'''время закрытия''' - Время исчезновения текста и подложки от alpha до 0 в конце. Если отрицательно - текст не закрывается;<br />
*'''буквы''' - Задержка в ms для перехода к новой букве при подсветке;<br />
*'''слова''' - Задержка в ms перед подсветкой следующего слова;<br />
*'''страницы''' - Задержка в ms перед переходом к следующей странице или увяданию по alpha-каналу.<br />
<br />
'''Группа - Параметры используемого [[шрифт]]а'''<br />
<br />
*'''имя''' - Номер [[шрифт]]а - целое число, начиная с 0 (порядковый номер шрифта).<br />
*'''размер''' - Размер [[шрифт]]а в поинтах.<br />
*'''цвет 1''' - Цвет текста начального вида (бледный).<br />
*'''цвет 2''' - Цвет прочитанного текста (контрастный). Чтение делается по буквам.<br />
<br />
'''Группа - Время'''<br />
*'''до появления символов''' ( '''tmBefore''' ) - Время до появления символов по alpha-каналу. Только для режима спрятанных символов; Пауза перед стартом анимации (по сути отсрочка сост. "start");<br />
<br />
'''Группа - Параметры поведения текста'''<br />
<br />
*'''автопромотка''' - Автоматический переход на следующую страницу после завершения отображения текста;<br />
* '''зациклить''' - Зациклить страницы (после последней, перейти опять на первую);<br />
*'''подсветка''' - Тип подсветки: 0-не подсвечивать, 1-по слову; 2-по букве слова (караоке); 3-по букве с начала страницы;<br />
*'''звук''' - 1 - есть озвучка, 0 - нет;<br />
*'''случайный выбор''' - 1 - при переключении страницы будет выбираться случайная, 0 - все страницы последовательно. Если выбрана 1 - в редакторе Texts Editor между страницами надо поставить знак #. <br />
*'''прятать % символов''' ( ''' hidesymbols ''' ) - указанный процент символов которые будут спрятаны;<br />
Тонкости исп. ''' hidesymbols ''':<br />
при сост. "init" - буквы будут выставленны моментально<br />
при изменение параметра и передаче сост. "start" - буквы будут проявляться за время "проявления одного символа" ("tmAppear"); <br />
Добавленные буквы после сост. "start" записываются в текстовом объекте в поле "appearingChars" с разделителем "|" ;<br />
П.С. текстовый объект сохраняет маску спрятанных букв в опции ( до тех пор, пока не меняется количество символов - т.е. поменяв txtID или локализацию - маска перегенерируется); <br />
<br />
<br />
<br />
<br>Например:<br />
<br />
[[Файл:Text3.PNG|800px|thumb|center]]<br />
<br />
*'''голос''' - голос для озвучки. Звуковой файл для одной реплики.<br />
*'''позиционирование текста'''<br />
** горизонтальное - 0 - нет выравнивания; 1 - прижать к левому краю; 2 - центр; 3 - к правому;<br />
** вертикальное - 0 - нет выравнивания; 1 - прижать к верхнему краю; 2 - центр; 3 - к нижнему.<br />
<br />
=== Добавляемые параметры ===<br />
<br />
<br />
[[Файл:Menadd.png|300px|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по правой кнопки мыши. <br />
<br />
[[Файл:+.png]] '''голос для озвучки''' - голос для озвучки 1 реплики. Следить за тем, чтобы количество звуков совпадало с количеством реплик.<br />
=== Состояния ===<br />
<br />
Все состояния: <br />
<br />
*'''beg''' - по прохождению времени из поля время->до открытия переходит в состояние ''open'';<br />
*'''start''' - форматирует текст, после чего переходит в состояние ''beg'';<br />
*'''open''' - проявляет текст по альфе за время, указанное в поле время->открытия и переходит в состояние ''first'';<br />
*'''run''' - выводит текст из поля txt/txtID по правилам из группы "Подсветка";<br />
*'''pause''' - остановка вывода текста в обьект на подсвеченом слове;<br />
*'''wait''' - показ последней напечатанной страницы, ожидание следующей команды;<br />
*'''first''' - запустить показ первой страницы текста (страницы отделяются в текстовом ID символами #) в соответствии с правилами подсветки;<br />
*'''first''' - запустить показ последней страницы текста (страницы отделяются в текстовом ID символами #) в соответствии с правилами подсветки;<br />
*'''next''' - запустить показ следующей страницы текста в соответствии с правилами подсветки (если текущая страница - последняя, то в этом состоянии ничего не произойдет);<br />
*'''prev''' - запустить показ предыдущей страницы текста в соответствии с правилами подсветки (если текущая страница - первая, то в этом состоянии ничего не произойдет);<br />
*'''close''' - плавно растворяет текст по альфе в течении времени, указанном в поле время->закрытия, после чего переходит в состояние ''end'';<br />
*'''cross''' - зачеркнуть текст;<br />
*'''end''' - убрать текст из текстового обьекта.<br />
<br />
=== Параметры ===<br />
<br />
*'''txtID''' - меняет объекту текстовый id. Перетягиваем из текстового редактора в поле ''val_txt'' необходимый текстовый id.<br />
*'''fc1''' - предоставляет возможность изменить цвет шрифта текстового объекта. В поле ''val'' вписывается цвет в виде 16-го кода.<br />
*'''sense''' - позволяет отображать разные поля текстового id. Если установить значение 0 - у текстового объекта будет отображаться поле ''word'', если 1 - ''sentence1'', если 2 - ''sentence2''.<br />
*'''textWidth''' - ширина текущего текста в текстовом объекте в px (с учетом параметров форматирования текстового объекта).<br />
*'''textHeight''' - высота текущего текста в текстовом объекте в px.<br />
<br />
== Пример применения ==<br />
<br />
[[Файл:Text3.PNG|800px|thumb|center]]<br />
<br />
[[Файл:Ex3.PNG|800px|thumb|center]]<br />
<br />
== Примечания и дополнения ==<br />
<br />
* Если у одного текстового ID слишком много страниц или же они должны меняться в запутанном порядке, то лучше создать несколько тестовых ID и по очереди присваивать их одному текстовому объекту с помощью машины состояний: команда ''set'', параметры ''obj''(текстовый объект), ''par''(txtID), ''val_txt''(текстовый ID, перетаскивается кнопкой мыши из редактора текстов).<br />
* Отображать и делать невидимым текст можно несколькими способами, например, менять общие параметры vis или al, но целесообразней использовать состояния текстового объекта ''start'' и ''close''.<br />
* Разделение строк в текстовой базе символом ''#'' можно использовать, если страниц 2(3). В этом случае для смены страниц используют состояние ''next''. Если страниц больше 2(3), лучше создать несколько текстовых ID и присваивать их текстовому объекту с помощью машины состояний.<br />
* Значения временных параметров по умолчанию: <br />
:время до открытия - 0, <br />
:время открытия - 500,<br />
:время закрытия - 500, <br />
:буквы - 30, <br />
:слова - 30, <br />
:страницы - 500. <br />
:Другими словами такие значения параметров равносильны нулю.<br />
'''Для постепенного открытия (закрытия) текста следует указывать временные параметры отличные от значений по умолчанию.'''<br />
<br />
<br />
=== Картинка в тексте ===<br />
<br />
----<br />
<br />
:Иконка будет вставлена в текст, если будет символы - $id167$al0.5$dx5. <br />
<br />
:Расшифровка: <br />
::$ - карявка для определения, что впереди что-то есть<br />
::id167 - указываем отрисовать картинку с id==167 ( картинка должна присутствовать на этом экране, иначе не покажется; Если картинки нету в ресурсной базе - будет выполнено два пробела);<br />
::$al0.5 - указываем альфу картинки;<br />
::$dx5 - указываем что картинку смещаем на 5-ть пикселей вправо от точки вставки;<br />
<br />
:Примечание: <br />
::1) Если не указываем $al0.5 или $dx5, то берём стандартное значение ( к примеру $id167 - означает картинка 167 с альфой==1 и без смещения (dx==0));<br />
::2) al и dx могут могут быть в любом порядке. <br />
::3) Записывать в текст спец. символы можно и через переменную;<br />
::4) Текст по высоте будет смещён на половину высоты самой большой картинки в строке ( если половина высоты больше размера шрифта);<br />
::5) иконка вставляемая в текст должна быть без лишней альфы ( при отступах учитывается ширина и высота картинки).<br />
<br />
:Пример:<br />
<br />
[[Файл:Viewer 2.jpg]]<br />
<br />
<br />
[[Файл:Viewer 3.jpg]]<br />
<br />
[[Файл:Viewer.jpg]]<br />
<br />
<br />
<br />
=== Цветной текст ===<br />
<br />
----<br />
<br />
:Текстовый объект, если встретит в тексте символы $c0xFF46FF26 ( обязательно пробел до символов и после), то последующий текст будет перекрашен в указанный цвет. <br />
'''!!! Нельзя указывать вначале текстовой ячейки или сразу после #.'''<br />
'''После перекрашивания не ставим пробел, должен быть символ ( нельзя так : "текст $c0xFF46FF26 текст2")'''<br />
<br />
:Расшифровка: <br />
::$c0xFF46FF26<br />
::$ - карявка для определения, что впереди что-то есть<br />
::с - типа color <br />
::0xFF46FF26 - код цвета 0xFF46FF26 ( 0x - обязательно ( указываем 16-тиричную систему исчисления), FF - альфа, 46 - число по Red каналу, FF - Green канал, 26 - Blue канал).<br />
[[Файл:Select Color.jpg]]<br />
<br />
:Пример:<br />
::Текст_1 $c0xFF46FF26 Текст_2<br />
::Текст_1 - будет цветом указанным в текстовом объекте, а Текст_2 - будет зелёным.<br />
[[Файл:Viewer 4.jpg]]<br />
<br />
<br />
[[Category:Main objects]]</div>Agavahttps://wiki.appsalutecreator.com/index.php?title=Text&diff=9767Text2018-12-22T13:21:24Z<p>Agava: /* Состояния */</p>
<hr />
<div>'''Text''' - [[Object|объект]] для отображения текстовой информации с поддержкой многоязычности. Для управления текстовыми ресурсами используется [[TextEditor]]. <br><br />
== Введение ==<br />
[[Файл:2223.png]]<br><br />
<br />
<br />
Если необходимо разместить текст на сцене необходимо создать объект с типом text и перетащить на поле текстID текстовую строку из TextEditor. Также можно просто перенести их TextEditor выбранную текстовую запись, при этом автоматически создастся объект с типом Text.<br><br />
<br />
'''Обязательно в тексте ТекстовойБазы, после символа '|' должен стоять другой символ. Если делаем два переноса, это будет выглядеть: "текст| |тест".'''<br />
<br />
== Параметры объекта ==<br />
<br />
=== Общие параметры ===<br />
(см. описание [[Object|Object]])<br />
<br />
=== Основные параметры ===<br />
<br />
*'''res''' - Графический ресурс подложки на которой выводится текст. Перетаскивается мышкой из редактора текста (поле должно находится в состоянии редактирования). Может отсутствовать.<br />
*'''текстID''' - Выводимый текст перетаскивается из ресурса текстов, для перетягивания поле в объекте Text должно быть в режиме редактирования. Решетка (#) разделяет на страницы, черта (|) - принудительный переход на новую строку.<br />
*'''текст''' - Выводимый текст без использования базы текстовых ресурсов. Решетка (#) разделяет на страницы, черта (|) - принудительный переход на новую строку.<br />
*'''textCanBeOptionsKey''' - позволяет выключить проверку на ключ в опциях (Если в поле '''text''' указать "x" - то с включённым функционалом, текстовый объект покажет значение из опций параметра "x"; Если выключено - отобразит "x");<br />
*'''состояние''' - в поле указывается состояние текстового объекта, в которое он перейдет при загрузке экрана (это поле часто оставляют пустым, а состояния задают машиной).<br />
<br />
'''!!! - Необходимо обязательно сохранять любые изменения с текстом в редакторе TextEditor.'''<br />
<br />
[[Файл:Text1.PNG|800px|thumb|center]]<br />
<br />
=== Дополнительные параметры ===<br />
<br />
[[Файл:Text2.PNG|800px|thumb|right]] <br />
<br />
'''Группа - форматирования'''<br />
<br />
*'''dx''' - Бордюр (отступ текста слева и справа от границы прямоугольника объекта);<br />
*'''dy''' - Бордюр (отступ текста сверху и снизу от границы прямоугольника объекта);<br />
*'''отступ''' - Вертикальное расстояние между строчками в пикселях;<br />
*'''h align''' - Горизонтальное форматирование. Если (c) - центрирование по горизонтали, если (r) - прижатие вправо;<br />
*'''v align''' - Вертикальное форматирование. Если (c) - центрирование по вертикали.<br />
[[Файл:2224.png|250px|center]]<br />
[[Файл:Text11.png|250px|left]]<br />
[[Файл:Text22.png|250px|center]]<br />
<br />
<br><br />
*'''автоматическое уменьшение''' - Функция позволяет уменьшить размер шрифта, чтобы уместить текст внутри прямоугольника ( размеры текстового объекта).<br />
*'''минимальный размер шрифта''' - Минимальный размер до которого уменьшит функция автоскейла.<br />
*'''уменьшать до строк''' - Нужно для функционала автоматического уменьшения. Попытается строку преобразовать в n строк ( исп. для цен).<br />
[[Файл:890a37f3ed.jpg|center]]<br />
<br><br />
<br />
'''Группа - Параметры отображения текста'''<br />
<br />
*'''время до открытия''' - Время перед началом проявления текста (от невидимого до заданной прозрачности);<br />
*'''время открытия''' - Время проявления текста и подложки до alpha в начале;<br />
*'''время закрытия''' - Время исчезновения текста и подложки от alpha до 0 в конце. Если отрицательно - текст не закрывается;<br />
*'''буквы''' - Задержка в ms для перехода к новой букве при подсветке;<br />
*'''слова''' - Задержка в ms перед подсветкой следующего слова;<br />
*'''страницы''' - Задержка в ms перед переходом к следующей странице или увяданию по alpha-каналу.<br />
<br />
'''Группа - Параметры используемого [[шрифт]]а'''<br />
<br />
*'''имя''' - Номер [[шрифт]]а - целое число, начиная с 0 (порядковый номер шрифта).<br />
*'''размер''' - Размер [[шрифт]]а в поинтах.<br />
*'''цвет 1''' - Цвет текста начального вида (бледный).<br />
*'''цвет 2''' - Цвет прочитанного текста (контрастный). Чтение делается по буквам.<br />
<br />
'''Группа - Время'''<br />
*'''до появления символов''' ( '''tmBefore''' ) - Время до появления символов по alpha-каналу. Только для режима спрятанных символов; Пауза перед стартом анимации (по сути отсрочка сост. "start");<br />
<br />
'''Группа - Параметры поведения текста'''<br />
<br />
*'''автопромотка''' - Автоматический переход на следующую страницу после завершения отображения текста;<br />
* '''зациклить''' - Зациклить страницы (после последней, перейти опять на первую);<br />
*'''подсветка''' - Тип подсветки: 0-не подсвечивать, 1-по слову; 2-по букве слова (караоке); 3-по букве с начала страницы;<br />
*'''звук''' - 1 - есть озвучка, 0 - нет;<br />
*'''случайный выбор''' - 1 - при переключении страницы будет выбираться случайная, 0 - все страницы последовательно. Если выбрана 1 - в редакторе Texts Editor между страницами надо поставить знак #. <br />
*'''прятать % символов''' ( ''' hidesymbols ''' ) - указанный процент символов которые будут спрятаны;<br />
Тонкости исп. ''' hidesymbols ''':<br />
при сост. "init" - буквы будут выставленны моментально<br />
при изменение параметра и передаче сост. "start" - буквы будут проявляться за время "проявления одного символа" ("tmAppear"); <br />
Добавленные буквы после сост. "start" записываются в текстовом объекте в поле "appearingChars" с разделителем "|" ;<br />
П.С. текстовый объект сохраняет маску спрятанных букв в опции ( до тех пор, пока не меняется количество символов - т.е. поменяв txtID или локализацию - маска перегенерируется); <br />
<br />
<br />
<br />
<br>Например:<br />
<br />
[[Файл:Text3.PNG|800px|thumb|center]]<br />
<br />
*'''голос''' - голос для озвучки. Звуковой файл для одной реплики.<br />
*'''позиционирование текста'''<br />
** горизонтальное - 0 - нет выравнивания; 1 - прижать к левому краю; 2 - центр; 3 - к правому;<br />
** вертикальное - 0 - нет выравнивания; 1 - прижать к верхнему краю; 2 - центр; 3 - к нижнему.<br />
<br />
=== Добавляемые параметры ===<br />
<br />
<br />
[[Файл:Menadd.png|300px|right]]<br />
Меню выбора ''Добавляемые параметры'' к объектам активируется по правой кнопки мыши. <br />
<br />
[[Файл:+.png]] '''голос для озвучки''' - голос для озвучки 1 реплики. Следить за тем, чтобы количество звуков совпадало с количеством реплик.<br />
=== Состояния ===<br />
<br />
Все состояния: <br />
<br />
*'''beg''' - по прохождению времени из поля время->до открытия переходит в состояние open;<br />
*'''start''' - форматирует текст, после чего переходит в beg;<br />
*'''open''' - проявляет текст по альфе за время, указанное в поле время->открытия и переходит в first;<br />
*'''run''' - выводит текст из поля txt/txtID по правилам из группы "Подсветка";<br />
*'''pause''' - остановка вывода текста в обьект на подсвеченом слове;<br />
*'''wait''' - показ последней напечатанной страницы, ожидание следующей команды;<br />
*'''first''' - запустить показ первой страницы текста (страницы отделяются в текстовом ID символами #) в соответствии с правилами подсветки;<br />
*'''first''' - запустить показ последней страницы текста (страницы отделяются в текстовом ID символами #) в соответствии с правилами подсветки;<br />
*'''next''' - запустить показ следующей страницы текста в соответствии с правилами подсветки (если текущая страница - последняя, то в этом состоянии ничего не произойдет);<br />
*'''prev''' - запустить показ предыдущей страницы текста в соответствии с правилами подсветки (если текущая страница - первая, то в этом состоянии ничего не произойдет);<br />
*'''close''' - плавно растворяет текст по альфе в течении времени, указанном в поле время->закрытия, после чего переходит в состояние end;<br />
*'''cross''' - зачеркнуть текст;<br />
*'''end''' - убрать текст из текстового обьекта.<br />
<br />
=== Параметры ===<br />
<br />
*'''txtID''' - меняет объекту текстовый id. Перетягиваем из текстового редактора в поле ''val_txt'' необходимый текстовый id.<br />
*'''fc1''' - предоставляет возможность изменить цвет шрифта текстового объекта. В поле ''val'' вписывается цвет в виде 16-го кода.<br />
*'''sense''' - позволяет отображать разные поля текстового id. Если установить значение 0 - у текстового объекта будет отображаться поле ''word'', если 1 - ''sentence1'', если 2 - ''sentence2''.<br />
*'''textWidth''' - ширина текущего текста в текстовом объекте в px (с учетом параметров форматирования текстового объекта).<br />
*'''textHeight''' - высота текущего текста в текстовом объекте в px.<br />
<br />
== Пример применения ==<br />
<br />
[[Файл:Text3.PNG|800px|thumb|center]]<br />
<br />
[[Файл:Ex3.PNG|800px|thumb|center]]<br />
<br />
== Примечания и дополнения ==<br />
<br />
* Если у одного текстового ID слишком много страниц или же они должны меняться в запутанном порядке, то лучше создать несколько тестовых ID и по очереди присваивать их одному текстовому объекту с помощью машины состояний: команда ''set'', параметры ''obj''(текстовый объект), ''par''(txtID), ''val_txt''(текстовый ID, перетаскивается кнопкой мыши из редактора текстов).<br />
* Отображать и делать невидимым текст можно несколькими способами, например, менять общие параметры vis или al, но целесообразней использовать состояния текстового объекта ''start'' и ''close''.<br />
* Разделение строк в текстовой базе символом ''#'' можно использовать, если страниц 2(3). В этом случае для смены страниц используют состояние ''next''. Если страниц больше 2(3), лучше создать несколько текстовых ID и присваивать их текстовому объекту с помощью машины состояний.<br />
* Значения временных параметров по умолчанию: <br />
:время до открытия - 0, <br />
:время открытия - 500,<br />
:время закрытия - 500, <br />
:буквы - 30, <br />
:слова - 30, <br />
:страницы - 500. <br />
:Другими словами такие значения параметров равносильны нулю.<br />
'''Для постепенного открытия (закрытия) текста следует указывать временные параметры отличные от значений по умолчанию.'''<br />
<br />
<br />
=== Картинка в тексте ===<br />
<br />
----<br />
<br />
:Иконка будет вставлена в текст, если будет символы - $id167$al0.5$dx5. <br />
<br />
:Расшифровка: <br />
::$ - карявка для определения, что впереди что-то есть<br />
::id167 - указываем отрисовать картинку с id==167 ( картинка должна присутствовать на этом экране, иначе не покажется; Если картинки нету в ресурсной базе - будет выполнено два пробела);<br />
::$al0.5 - указываем альфу картинки;<br />
::$dx5 - указываем что картинку смещаем на 5-ть пикселей вправо от точки вставки;<br />
<br />
:Примечание: <br />
::1) Если не указываем $al0.5 или $dx5, то берём стандартное значение ( к примеру $id167 - означает картинка 167 с альфой==1 и без смещения (dx==0));<br />
::2) al и dx могут могут быть в любом порядке. <br />
::3) Записывать в текст спец. символы можно и через переменную;<br />
::4) Текст по высоте будет смещён на половину высоты самой большой картинки в строке ( если половина высоты больше размера шрифта);<br />
::5) иконка вставляемая в текст должна быть без лишней альфы ( при отступах учитывается ширина и высота картинки).<br />
<br />
:Пример:<br />
<br />
[[Файл:Viewer 2.jpg]]<br />
<br />
<br />
[[Файл:Viewer 3.jpg]]<br />
<br />
[[Файл:Viewer.jpg]]<br />
<br />
<br />
<br />
=== Цветной текст ===<br />
<br />
----<br />
<br />
:Текстовый объект, если встретит в тексте символы $c0xFF46FF26 ( обязательно пробел до символов и после), то последующий текст будет перекрашен в указанный цвет. <br />
'''!!! Нельзя указывать вначале текстовой ячейки или сразу после #.'''<br />
'''После перекрашивания не ставим пробел, должен быть символ ( нельзя так : "текст $c0xFF46FF26 текст2")'''<br />
<br />
:Расшифровка: <br />
::$c0xFF46FF26<br />
::$ - карявка для определения, что впереди что-то есть<br />
::с - типа color <br />
::0xFF46FF26 - код цвета 0xFF46FF26 ( 0x - обязательно ( указываем 16-тиричную систему исчисления), FF - альфа, 46 - число по Red каналу, FF - Green канал, 26 - Blue канал).<br />
[[Файл:Select Color.jpg]]<br />
<br />
:Пример:<br />
::Текст_1 $c0xFF46FF26 Текст_2<br />
::Текст_1 - будет цветом указанным в текстовом объекте, а Текст_2 - будет зелёным.<br />
[[Файл:Viewer 4.jpg]]<br />
<br />
<br />
[[Category:Main objects]]</div>Agava