<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.appsalutecreator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Blymar</id>
	<title>wiki.appsalutecreator.com - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.appsalutecreator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Blymar"/>
	<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Blymar"/>
	<updated>2026-10-17T05:17:43Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.15</generator>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10117</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10117"/>
		<updated>2021-08-30T13:36:32Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка системы подсчета очков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
&lt;br /&gt;
Настройки хидденлиста: &lt;br /&gt;
&lt;br /&gt;
[[Файл:hiddenlist1.png]]&lt;br /&gt;
[[Файл:hiddenlist2.png]]&lt;br /&gt;
[[Файл:hiddenlist3.png]]&lt;br /&gt;
[[Файл:hiddenlist4.png]]&lt;br /&gt;
[[Файл:hiddenlist5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Настройки таймера:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_timer_params.png]]&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_accuracy.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_time.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:final_result.png]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist5.png&amp;diff=10116</id>
		<title>Файл:Hiddenlist5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist5.png&amp;diff=10116"/>
		<updated>2021-08-30T13:35:58Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist4.png&amp;diff=10115</id>
		<title>Файл:Hiddenlist4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist4.png&amp;diff=10115"/>
		<updated>2021-08-30T13:35:33Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist3.png&amp;diff=10114</id>
		<title>Файл:Hiddenlist3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist3.png&amp;diff=10114"/>
		<updated>2021-08-30T13:35:10Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist2.png&amp;diff=10113</id>
		<title>Файл:Hiddenlist2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist2.png&amp;diff=10113"/>
		<updated>2021-08-30T13:34:44Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist1.png&amp;diff=10112</id>
		<title>Файл:Hiddenlist1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hiddenlist1.png&amp;diff=10112"/>
		<updated>2021-08-30T13:34:23Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10111</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10111"/>
		<updated>2021-08-30T13:16:46Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка отображения окна при победе/поражении */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_accuracy.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_time.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:final_result.png]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Final_result.png&amp;diff=10110</id>
		<title>Файл:Final result.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Final_result.png&amp;diff=10110"/>
		<updated>2021-08-30T13:16:04Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10109</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10109"/>
		<updated>2021-08-30T13:13:21Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка звёзд */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_accuracy.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_time.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_test_results_1.png|400px]] [[Файл:Lesson7_test_results_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_time.png&amp;diff=10108</id>
		<title>Файл:Star time.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_time.png&amp;diff=10108"/>
		<updated>2021-08-30T13:13:00Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10107</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10107"/>
		<updated>2021-08-30T13:10:45Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка звёзд */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_accuracy.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star3.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_test_results_1.png|400px]] [[Файл:Lesson7_test_results_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_accuracy.png&amp;diff=10106</id>
		<title>Файл:Star accuracy.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_accuracy.png&amp;diff=10106"/>
		<updated>2021-08-30T13:10:03Z</updated>

		<summary type="html">&lt;p&gt;Blymar: Blymar загрузил новую версию Файл:Star accuracy.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10105</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10105"/>
		<updated>2021-08-30T13:09:42Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка звёзд */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:star2.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star3.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_test_results_1.png|400px]] [[Файл:Lesson7_test_results_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_accuracy.png&amp;diff=10104</id>
		<title>Файл:Star accuracy.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_accuracy.png&amp;diff=10104"/>
		<updated>2021-08-30T13:09:24Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star2_1.png&amp;diff=10103</id>
		<title>Файл:Star2 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star2_1.png&amp;diff=10103"/>
		<updated>2021-08-30T13:07:52Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lesson7_star2.png&amp;diff=10102</id>
		<title>Файл:Lesson7 star2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lesson7_star2.png&amp;diff=10102"/>
		<updated>2021-08-30T13:06:19Z</updated>

		<summary type="html">&lt;p&gt;Blymar: Blymar загрузил новую версию Файл:Lesson7 star2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10101</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10101"/>
		<updated>2021-08-30T13:01:57Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка системы комбо */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress_params.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star2.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_test_results_1.png|400px]] [[Файл:Lesson7_test_results_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Progress_params1.png&amp;diff=10100</id>
		<title>Файл:Progress params1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Progress_params1.png&amp;diff=10100"/>
		<updated>2021-08-30T12:58:42Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10099</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10099"/>
		<updated>2021-08-30T12:57:18Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка системы комбо */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' &lt;br /&gt;
* Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Создать уровень игры содержащей 15 поисковых объектов. &lt;br /&gt;
* Обеспечить размещение 5 объектов для поиска.&lt;br /&gt;
*  Создать окно, информирующее о победе или поражении, с указанием очков полученных и звёзд.&lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Как и в предыдущих уроках первым делом создадим новый [[Screen|экран]] Lesson_7 для создаваемой игры и игровую [[Scene|сцену]] stg_main.&lt;br /&gt;
На созданной сцене добавим из редактора ресурсов фон (файл bg), 10 изображений из папки hiddenobj на выбор, которые спрячем в «подходящих» местах и изменим тип с [[Image]] на '''Game mechanic''' – [[HiddenObject]].&lt;br /&gt;
Для того, чтобы при перемещении фона позиции «спрятанных» объектов не менялись их можно добавить внутрь объекта.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_bg_with_hiddens.png|400px]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hidden_objects.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Если вы добавляете в ресурсы изображение с прозрачностью вокруг объекта, то в редакторе оно будет обрезано, но, при размещении объекта на сцене, прозрачность будет учитываться. Благодаря этому есть возможность размещения объектов на сцене обычным перетаскиванием, если художник позаботился о нас (''подготовил изображения для того, чтобы они располагались в местах для «прятанья»'').&lt;br /&gt;
[[Файл:Lesson7_resize_template.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После добавления хидденов необходимо подготовить для них текстовое описание. Это делается в текстовом редакторе ([[Интерфейс_TextEditor|TextEditor]]).&lt;br /&gt;
Создадим в нём папку Lesson_7 и по одной записи для каждого объекта. Также добавим для каждого объекта графическое отображение. Для этого нажмём кнопку Start [[Интерфейс_ResourceEditor|Res Editor]], перетащим соответствующее изображение в поле Image viewer и установим тип иконки Icon 1 (''правой кнопкой мыши на изображение'').&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_text_editor.png|350px|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация механики HOG ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для базовой реализации механики HOG необходимо использовать комбинацию из компонентов [[HiddenObject]], [[HiddenList]] и [[Table]].&lt;br /&gt;
[[HiddenObject]] у нас уже есть – это наши «спрятанные» хиддены, а вот [[HiddenList]] и Table создадим с помощью контекстного меню (Создать объект после текущего...).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenList ===&lt;br /&gt;
[[HiddenList]] – это список поисковых объектов (Hidden), которые надо найти в хидден-сцене.&lt;br /&gt;
Каждый поисковый объект на сцене связывают со списком. Объектов в списке может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В таком случае они будут выбраны случайным образом. Запоминаются те из них, по которым произошёл клик (''увеличивается счетчик их кликов''). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
[[HiddenList]] определяет основные параметры для настройки [[HiddenObject]] (''например, скорость полета''). В дальнейшем, при необходимости, эти же параметры можно добавить в [[HiddenObject]], чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
Зададим основные параметры, такие как: &lt;br /&gt;
* num (поле «объектов») – максимальное количество объектов, участвующие в поиске.&lt;br /&gt;
* table (поле «таблица») – идентификатор объекта [[Table]]. Необходим для вывода списка объектов для поиска.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenlist_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка Table ===&lt;br /&gt;
Объект [[Table]] предназначен для вывода данных в табличном виде. [[HiddenList]] использует его для вывода списка хидденов, которые необходимо найти. Настроим таблицу для вывода элементов в формате 3 на 3, указав в графе «таблица» параметры подходящие параметры, а также зададим ширину, высоту (''объект с нулевыми размерами не отображается'') и позицию таблицы. Учитывайте, что таблица может перекрывать искомые объекты, тем самым создавая трудности для игрока.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_table_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
=== Настройка HiddenObject ===&lt;br /&gt;
Как было сказано ранее, [[HiddenObject]] это наш «спрятанный» объект, который, возможно, предстоит найти. Для его настройки укажем следующие параметры:&lt;br /&gt;
* txtID (поле «текстID») – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора; &lt;br /&gt;
* list (поле «list») – ссылка на [[HiddenList]], к которому будет подключен объект, для обеспечения связи между ними; &lt;br /&gt;
Параметр list можно задать выделив несколько [[HiddenObject]].&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    [[Файл:Lesson7_hiddenobj_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Внимание!''' [[HiddenList]] не будет работать без объекта Options, который вы должны были создать в предыдущем уроке, а так же без параметра id игры (Очковая система – id игры). &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавить 5 новых «спрятанных» объекта.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Установить для поиска 7 объектов вместо 5.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3. Сделайте так чтобы объекты быстро улетали(исчезали) со сцены.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4. Создайте аналогичный экран Lesson_7_1, на котором установите время игры в 20 секунд, паузу 2 секунды и переход на экран Lesson_7.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы подсчета очков ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для начала настройки системы подсчёта очков создадим новую сцену stg_interface, на которой будет отображаться интерфейс пользователя.&lt;br /&gt;
Первым делом перетащим подложку для таблицы из редактора ресурсов (файл down) и внутрь него поместим объект [[Table]], после чего добавим два объекта типа [[Counter]] (счётчик) и один [[Timer]] (таймер).&lt;br /&gt;
Счётчик score отвечает за вывод информации о очках игрока, count – о количестве найденных объектов, а таймер – за оставшееся время игры.&lt;br /&gt;
Обратим внимание что ни таймер ни счётчики ничего не показывают. Это связано с тем, что для них не настроен ни графический ресурс, ни шрифты (''настраивается в поле «шрифт» и работает если не указан графический ресурс'').&lt;br /&gt;
Создайте в редакторе ресурсов анимацию и укажите её в поле res («графика – цифры нормальные» для таймера) каждого из созданных объектов. Для анимации скачайте изображения ниже, либо найдите в интернете. Кроме этого для значений счётчика можно установить минимальное (поле «min») и максимальное (поле «max») значения.&lt;br /&gt;
[[Файл:Lesson7_timer_counter.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
После указания ресурса и размещения объектов на сцене свяжем их с [[HiddenList]]. Не забудем указать количество очков за найденный объект в поле «очковая система – очки», а также, обязательно, id игры (''например, hidden'').&lt;br /&gt;
Кроме этого установим у таймера в поле «значение» тоже число что и у [[HiddenList]] в поле «время – игры» так как данные объекты считают время независимо, что может привести к случаям когда игра закончилась раньше или позже чем показал таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_1.png|260px|right]]&lt;br /&gt;
[[Файл:Lesson7_hiddenlist_sch_2.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_timer_params.png|260px|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка системы комбо ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для работы системы комбо нам понадобится объект [[Progress]]. Создадим его и настроим следующим образом (''не забываем указать размер объекта''):&lt;br /&gt;
&lt;br /&gt;
[[Файл:progress.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для графики (заполнитель) можно использовать следующее изображение:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Созданный [[Progress]] необходимо связать с объектом [[HiddenList]]. Так как система комбо связана с системой очков, то и искать соответствующие поля мы будем в «очковой системе» и, неожиданно, в «звёздах». &lt;br /&gt;
В поле очки 3.0 выбираем аналогичное значение. Данное поле необходимо для работы системы комбо.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_progress_score_1.png|right]]&lt;br /&gt;
[[Файл:Lesson7_progress_score_2.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Кроме поощрения игрока дополнительными очками существует также и способ «наказать» его за ошибочные клики (звёзды – лимит ложных кликов), после которых игровая сцена должна блокироваться. Для этого существует так называемая машина-блокатор.&lt;br /&gt;
Создадим её и настроим следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_err_click_blocker.png]]&lt;br /&gt;
&lt;br /&gt;
а для того, чтобы машина именно блокировала сцену создадим внутри неё объект типа [[Rectangle]] закрывающий всю игровую сцену как маска (''высота и ширина объекта должна быть равна размерам сцены'').&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Машина-блокатор указывается в «очковой системе» объекта [[HiddenList]].&lt;br /&gt;
[[Файл:Lesson7_sel_blocker.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Создание окна с результатами игры ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для создания окна вывода результатов создадим новую сцену stg_win_lose, на которой создадим [[Machine|машину состояний]] win.&lt;br /&gt;
Данная машина состояний будет управлять инициализацией данных окна, а также его отображение и закрытием.&lt;br /&gt;
Внутри машины создадим объекты с примерно следующей структурой:&lt;br /&gt;
* lock – [[rectangle]]-маска для блокировки сцены игры. Должен иметь размер больший или равный сцене.&lt;br /&gt;
* window – [[rectangle]] для фона окна.&lt;br /&gt;
* *_points – [[Counter|счётчики]] для очков.&lt;br /&gt;
* *_pts_lbl – [[Text|текстовое описание]] для счётчиков.&lt;br /&gt;
* Star1 – [[Machine|машина состояний]] для звезды.&lt;br /&gt;
* close_btn – [[Button|кнопка]] закрытия окна.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_result_wnd_struct.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для всех счётчиков установим в качестве графического ресурса анимацию чисел созданную ранее, а для окна window и кнопки закрытия добавим новые. Можно использовать ресурсы представленные ниже:&lt;br /&gt;
[[Файл:Lesson7_result_rect_params.png|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]]&lt;br /&gt;
 [[Файл:Lesson7_close_btn.png]][[Файл:00010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда у нас есть видимое окно для вывода сообщения, расположим текст и счётчики таким образом, чтобы они соответствовали друг другу, а также установим одну звезду. Внешний вид текстовых полей и счётчиков красиво настроим самостоятельно:) (''попробуйте изменить значения в полях и посмотрите на что они влияют'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_result_wnd_template.png|450px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка счётчиков ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Теперь, когда всё на своих местах, настроим счётчики и текстовые поля. Объект [[HiddenList]] сохраняет в объект [[Options]] некоторые данные о игре. Для того чтобы счётчик мог воспользоваться ими (''и не только счётчик'') необходимо в поле “Уровень” каждого счётчика указать строку вида [game.]level.param&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для нас важны следующие строки:&lt;br /&gt;
* last_game.score30_total – Игровые очки. (счётчик game_points)&lt;br /&gt;
* last_game.score30_time -  Бонус за время. (time_points)&lt;br /&gt;
* last_game.score30_accuracy -  Бонус за аккуратность (accuracy_points)&lt;br /&gt;
* last_game.ecmbRowMax -  Бонус за комбо (combo_points)&lt;br /&gt;
* last_game.score30_level -  Очки за уровень (game_points)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Укажите данные строки в соответствующих полях, а также описание (''игровые очки и т.д.'') в текстовых полях.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка звёзд ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Создадим в имеющейся звезде два состояния init и check, а затем скопируем её чтобы получилось ещё две звезды, каждую из которых настроим отдельно.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Star1 (''Показать в любом случае'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star1.png]]&lt;br /&gt;
&lt;br /&gt;
Star2 (''Если очки за аккуратность не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star2.png]]&lt;br /&gt;
&lt;br /&gt;
Star3 (''Если очки за время не равны 0'')&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_star3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка машины win ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Как было сказано ранее машина win отвечает за открытие/закрытие окна, а также за инициализацию всех данных. Благодаря тому что все компоненты окна расположены внутри машины для отображения/скрытия его достаточно изменить прозрачность(al) машины.&lt;br /&gt;
Настроим машину следующим образом:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_mch_states.png|700px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Для того, чтобы машина закрывалась добавим у кнопки close_btn свойство «изменить состояние объекта» с значениями: объект – win, состояние – close.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Настройка отображения окна при победе/поражении ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
Для настройки отображения окна первым делом стоит подумать какие условия победы/поражения, а затем установить что: победа – игрок нашёл все объекты, поражение – истёк таймер.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
[[Файл:Lesson7_win_state.png|right]]&lt;br /&gt;
[[Файл:Lesson7_lose_state.png|right]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Настройка вывода окна при победе настраивается в [[HiddenList]] путём добавления «разбор: изменить состояние объекта», а  окна поражения в [[Timer]] – «время истекло: изменить состояние объекта».&lt;br /&gt;
Проверяем на работоспособность игру.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_test_results_1.png|400px]] [[Файл:Lesson7_test_results_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&amp;lt;p&amp;gt;1. Добавьте на сцену победы/поражения текстовое поле, которое будет сообщать «Вы победили!» или «Вы проиграли!» для каждого из игровых исходов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2. Сделайте так, чтобы при закрытии окна победы/поражения игра начиналась заново.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Progress_params.png&amp;diff=10098</id>
		<title>Файл:Progress params.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Progress_params.png&amp;diff=10098"/>
		<updated>2021-08-30T12:56:49Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10060</id>
		<title>Редактор текстовых ресурсов</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10060"/>
		<updated>2021-08-09T09:55:04Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Создаем текстовую базу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
----&lt;br /&gt;
'''Цель:''' научится пользоваться редактором текстовых ресурсов на примере использования объекта типа &amp;quot;text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Cоздать новый экран и сцену для этого урока.&lt;br /&gt;
* Вывести на экран последовательно два текста с помощью двух текстовых объектов.&lt;br /&gt;
* Вывести на экран эти же тексты, но с помощью только одного текстового объекта.&lt;br /&gt;
&lt;br /&gt;
== Объект Text ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Начнём урок, как обычно,  с открытия проекта lessons. В нём добавим новый экран lesson_6&lt;br /&gt;
со сценой stg_main, так как это было описано в предыдущем [[Создание экранов, сцен. Работа с кнопками|уроке]]. Поместим из редактора ресурсов на сцену любой фон из папки этого или предыдущего  урока. Для примера далее используется &amp;quot;лунный пейзаж&amp;quot; (картинка '''bg''').&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_1.jpg|right]]&lt;br /&gt;
Поверх фона поместите на сцену картинку ввиде стрелки вправо. Назовите ее '''button_next'''. Выберите для нее тип '''machine'''. Кликая на сцене правой кнопкой мыши, выберете пункт из выпадающего меню &amp;quot;Создать объект в текущем элементе&amp;quot;. Новый объект переименуйте в Text и выберите для него тип '''[[Text|Text]]''' (также нужно выставить размеры данному объекту, чтобы текст был виден).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Меняем текст машиной ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы было что менять, скопируем объект Text и вставим его в этой же сцене. Переименуем его в text2. Так как эти два объекта без графического ресурса, то на сцене мы можем их видеть как пустые рамки (зеленая рамка, если объет выделен, и красная - если не выделен).&lt;br /&gt;
[[Файл:Lesson6_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Text_prop.png‎|right]]&lt;br /&gt;
Посмотрим на свойства объекта Text. В поле &amp;quot;текст&amp;quot; впишем &amp;quot;Первая часть текста&amp;quot;. В поле &amp;quot;шрифт&amp;quot; в строке &amp;quot;цвет 1&amp;quot; выберем белый цвет. В свойствах объекта text2 в поле текст впишем &amp;quot;Вторая часть текста&amp;quot;. Цвет шрифта поставим такой же. Таким образом, мы получили две текстовых надписей на сцене, которые располагаются одна поверх другой. Если мы сейчас сохраним проект и запустим, то обе надписи будут видны одновременно, что затруднит их читаемость. Для того, чтобы мы могли без проблем их прочитать, сделаем переключение текстов по нажатию на кнопку. На самом деле, '''button_next''' только выглядит как кнопка - это машина состояний. Пропишем для нее логику таким образом, чтобы при нажатии на машину, она по-очереди делала видимым то один текст, то другой. Создайте для этой машины следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_4.jpg]]&lt;br /&gt;
&lt;br /&gt;
За видимость объектов отвечает параметр '''vis'''. Если vis=0, то объект не видно, если 1 - видно. По клику осуществляется переход между состояниями. Сохраните проект и запустите этот экран. Вы видите, что по клику на кнопку текст изменяется.&lt;br /&gt;
[[Файл:Lesson6_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Переключать текстовые объекты можно еще несколькими способами:&lt;br /&gt;
&lt;br /&gt;
- менять параметр '''al''' (alpha); это позволит делать текст полупрозрачным (в отличии от '''vis''', параметр '''al''' может принимать промежуточные значения между 0 и 1);&lt;br /&gt;
&lt;br /&gt;
- менять текстовому объекту состояние; как известно, у объекта [[Text#Состояния | text]] есть 3 состояния '''first''', '''next''', '''end''', чтобы текст стал видимым, достаточно передать ему состояние '''first''', чтобы текст исчез, достаточно передать ему состояние '''end'''.&lt;br /&gt;
&lt;br /&gt;
== Создаем текстовую базу ==&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере мы научились вставлять текстовые объекты на сцену и менять их видимость. Все это мы сделали не имея текстовой базы. Текстовая база предназначена для хранения всей текстовой информации вашего проекта, с возможностью мультиязычной поддержки. Она значительно облегчает управление текстом в проекте.&lt;br /&gt;
&lt;br /&gt;
Для вызова текстового редактора можно воспользоваться меню '''Tools -&amp;gt; [[Интерфейс TextEditor|Text Editor]]''', либо кнопкой быстрого запуска [[Файл:Text_base.png‎]]. После нажатия появляется предупреждение:&lt;br /&gt;
&lt;br /&gt;
[[Файл:warning.png]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на кнопку &amp;quot;Yes&amp;quot;, выбираем папку, которая является базой ресурсов проекта и выбираем файл с расширением '''.sirx''' (также можно создать новую текстовую базу. Для этого заходите в пункт меню '''Project -&amp;gt; New''', либо кнопкой быстрого запуска [[Файл:new.png]]. Появляется пустая база ресурсов, по умолчанию названная '''Untitled'''. Ее можно переименовать как вам удобней.)&lt;br /&gt;
&lt;br /&gt;
Появляется пустая база ресурсов, по умолчанию названная '''text.xml''. Ее можно переименовать как вам удобней. Аналогично как в редакторе ресурсов слева вы видите дерево текстовых объектов. Нажимаем правой кнопкой по названию базы text.xml и выбираем ''add folder'''. Таким образом мы создали новую папку. Назовем ее lesson_6. Нажимая по папке правой кнопкой выбираем '''Add record'''. Каждый раз при добавлении новой текстовой записи редактор просит нас написать ее имя. Это имя можно будет изменить в любой момент. Запишем имя first_part. Создавать папки и записи можно также с помощью кнопок быстрого доступа на панели. Выделим папку lesson_6 и нажмем на значок &amp;quot;Add record&amp;quot;. Запишем имя новой текстовой записи second_part.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Именитый.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Пока эти текстовые записи пустые. Для того чтобы заполнить их, выделим первую запись. Справа мы видим столбцы '''word''', '''sentence1''', '''sentence2''' и '''voice'''. В данном уроке нам понадобится только первый столбец '''word'''. Об остальных подробнее узнаете в следующем уроке. В строках записывается текст на разных языках. Запишем текст на русском и его перевод на английский в соответствующие поля. Для first_part - Первая часть текста (The first part of the text), для second_part - Вторая часть текста (The second part of the text). Запись на разных языках позволяет, в зависимости от локализации мобильного устройства, выбирать язык текстовых объектов.&lt;br /&gt;
&lt;br /&gt;
Для того что бы добавить какой-либо язык в базу данных необходимо выполнить следующие действия:&lt;br /&gt;
1) Проходим путь Project/Properties/Select languages…&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление языка (1).png|600px]]&lt;br /&gt;
&lt;br /&gt;
2) После этого необходимо выбрать языки которые вы хотите добавить&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление_языка_(2).png|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Можете похвалить себя&lt;br /&gt;
&lt;br /&gt;
Если вы добавили языки, но они не видны, проверьте, не создали ли вы случайно свою папку в папке Untranslatable.&lt;br /&gt;
&lt;br /&gt;
Чтобы корректно пользоваться текстовой базой после каждого ее изменения, ее необходимо сохранять. Можно воспользоваться кнопками быстрого доступа и нажать на значок дискеты. [[Файл:disketa.png]]&lt;br /&gt;
&lt;br /&gt;
Каждый объект текстовой базы имеет свой уникальный '''id'''. Мы можем вызывать текст из текстовой базы меняя текстовому объекту на сцене этот id с помощью кнопки или машины состояний.&lt;br /&gt;
&lt;br /&gt;
Давайте сделаем это на примере нашего проекта.&lt;br /&gt;
Так как теперь мы будем пользоваться только одним текстовым объектом на сцене, то второй text2 можно удалить. В объекте text удалим из пункта текст запись &amp;quot;Первая часть текста&amp;quot;. Перепишем также немного состояния нашей машины. В поле '''val_txt''' мы записываем id текста путем перетаскивания его из текстовой базы (перед перетаскиванием id текста нужно сохранять и переоткрывать текстовую базу).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_7.jpg]]&lt;br /&gt;
&lt;br /&gt;
Теперь в состояниях машины мы присваиваем нашему объекту text только текстовые id из текстовой базы. Сохраняем проект и запускаем. Результат тот же, что и в первом случае. Заметим, что на сцене стало на один объект меньше, а состояния машины сократились на одну строчку. Может это не существенно в таком маленьком проекте, но в больших проектах количество объектов и величина исполняемого файла может стать решающей причиной к упрощению кода.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Добавьте в текстовую базу еще несколько записей.&lt;br /&gt;
* Расширьте состояния машины, чтобы последовательно вывести на экран все текстовые записи.&lt;br /&gt;
* Поменяйте язык приложения, используя объект '''[[Options|Options]]'''.&lt;br /&gt;
До сих пор мы изучали объекты и их свойства для каждого определенного экрана. Рассмотрим возможность изменять параметры всего приложения.&lt;br /&gt;
Будем изменять язык приложения. Для этого необходимо ознакомится с объектом Options.&lt;br /&gt;
&lt;br /&gt;
'''Options''' — объект, который используется для хранения и управления глобальными параметрами приложения. Также Options позволяет хранить и использовать параметры записанные в него другими объектами.&lt;br /&gt;
&lt;br /&gt;
В проекте lessons создаем новый экран, для которого в свойствах устанавливаем глобальный&lt;br /&gt;
&lt;br /&gt;
[[Файл:Глобальный.PNG]]&lt;br /&gt;
&lt;br /&gt;
В экране '''opt''' создадим сцену '''opt'''. Создадим на сцене opt новый объект, переименуем его в '''Options'''. Поменяем ему тип на option (Option → option).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Опции.PNG]]&lt;br /&gt;
&lt;br /&gt;
Создадим в проекте новый экран '''lessons_6_1''' со сценой '''6_1'''. В сцену из проекта '''lessons_6''' копируем объекты '''bg_1''', '''button_next''', Text не изменяя их параметры. Перенесем на сцену из редактора ресурсов, из папки lessons_2, объекты: '''arrow_lf_norm''' и '''arrow_rt_norm'''. Переименуем,  arrow_lf_norm в '''en''',  arrow_rt_norm в '''ru''', и сделаем их машинами. Добавляем ниже на сцену новый объект, изменяем ему тип на '''[[Groupset|Groupset]]''' и имя на '''groupset'''. Щелкаем в свойствах по имени правой кнопкой мыши, добавляем в свойства объект, из списка объектов выбираем Text.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Группа.PNG]]&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Groupset'''&lt;br /&gt;
&lt;br /&gt;
'''Groupset (группа)'''  позволяет передавать состояния и параметры множеству объектов, которые являются участниками группы. Участником группы является любой объект, указанный в в объекте Groupset.&lt;br /&gt;
&lt;br /&gt;
Groupset удобно использовать, когда необходимо обращаться к множеству объектов.&lt;br /&gt;
Если объекту Groupset передается состояние (например st_1), то все объекты принадлежащие объекту Groupset должны иметь состояние st_1, иначе возникнет ошибка.&lt;br /&gt;
&lt;br /&gt;
Объекты принадлежащие одной группе могут быть разного типа и разноименными.&lt;br /&gt;
&lt;br /&gt;
Команды применимые к группе:&lt;br /&gt;
&lt;br /&gt;
• ''set'' — группе можно установить состояние st и параметр (значение) par(val);&lt;br /&gt;
&lt;br /&gt;
• ''drop'' —  на группу (объекты принадлежащие группе) можно отпустить объект.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для каждой из добавленных машин запишем состояния.&lt;br /&gt;
&lt;br /&gt;
Машина en:&lt;br /&gt;
&lt;br /&gt;
[[Файл:En.PNG]]&lt;br /&gt;
&lt;br /&gt;
Машина ru&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ru.PNG]]&lt;br /&gt;
&lt;br /&gt;
Как видно, в состоянии on, каждой машины, задается lang (язык) в глобальном объекте Options. В состояние r  Groupset передается состояние init (инициализация объекта).&lt;br /&gt;
&lt;br /&gt;
Сохраняем и запускаем вьювер.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Вьювер.PNG]]&lt;br /&gt;
&lt;br /&gt;
На экране  расположено три кнопки и текст. При нажатие кнопки вперед язык текста меняется — на русский, при нажатие назад — на английский, желтая кнопка вперед меняет сам текст.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Disketa.png&amp;diff=10059</id>
		<title>Файл:Disketa.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Disketa.png&amp;diff=10059"/>
		<updated>2021-08-09T09:50:30Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:New.png&amp;diff=10058</id>
		<title>Файл:New.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:New.png&amp;diff=10058"/>
		<updated>2021-08-09T09:34:31Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Warning.png&amp;diff=10057</id>
		<title>Файл:Warning.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Warning.png&amp;diff=10057"/>
		<updated>2021-08-09T09:15:50Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10056</id>
		<title>Работа с эффектами</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10056"/>
		<updated>2021-08-06T06:28:10Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Использование Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить возможности редактора на примере применения различных эффектов.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:'''&lt;br /&gt;
* Создать экран, на котором можно освоить работу с патиклами (объект flyer) и масками ;&lt;br /&gt;
* Создать экран и настроить просмотр Видео&lt;br /&gt;
* Настроить появление сцены с проявлением по альфе, переходить на следующий экран с проявлением по альфе&lt;br /&gt;
* Настроить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
== Партиклы (Particles) ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → lessons.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.3, создать экран Lesson_09.&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_09 создать новую сцену 09, в которую (через Resources Editor) добавить графические ресурсы из папки Sources\Lesson_09 (см. подготовка к работе «Создание проекта»).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_1.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
'''Настройка объектов, работа с маской'''&lt;br /&gt;
&lt;br /&gt;
В этом уроке поработаем над использованием объекта flyer (Particles). Параллельно с этим научимся пользоваться хитрым приемом &amp;quot;маска&amp;quot;. В редактор ресурсов вы подгрузили уже знакомую вам графику &amp;quot;лунного пейзажа&amp;quot; и две части слоненка. &lt;br /&gt;
&lt;br /&gt;
1. Разместим их на сцене как показано на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_2.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Сделаем из головы слоненка машину состояний. Голова должна вертеться из стороны в сторону с интервалом в 1 секунду. Запишем в состояниях машины следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_3.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
3. Посмотрите результат с помощью программы viewer. Слоненок будет мотать головой.&lt;br /&gt;
&lt;br /&gt;
4. Теперь мы хотим, чтобы клик на слоненка вызывал какое-то действие, например, чтобы шел снег. Можно сделать из туловища машину состояний, но туловище маленькое, а нам нужен именно весь слоненок. Для этого нам понадобится маска. Из редактора ресурсов перетащим на сцену графический ресурс mask и переместим ее на слоненка. Маска очень маленькая, чтобы закрывать всего слоненка, поэтому воспользуемся модификаторами. Увеличим маску и сделаем ей прозрачность (alpha) 0,01.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_4.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
На сцене вы можете увидеть вокруг слоненка рамку от маски. Саму маску не видно из-за прозрачности. Стоит обратить внимание на то, что прозрачность мы сделали 0,01. Если бы она была равна 0, то маска не воспринимала бы клик, а была бы полностью прозрачной.&lt;br /&gt;
&lt;br /&gt;
5. Как вы уже догадались, маска у нас будет машиной состояний, включающей другой объект. Этим другим объектом будет flyer. Флаеры (патиклы) используются для создания эффектов, когда один маленький объект размножается и совершает какие-либо действия, при этом все его частички ведут себя подобно.&lt;br /&gt;
&lt;br /&gt;
Перетащим из редактора ресурсов на сцену графический ресурс snow и разместим его на сцене посередине по оси x (x=0) и вверху, немного за сценой (y=-320). Сделайте объекту тип flyer.&lt;br /&gt;
&lt;br /&gt;
6. Параметры флаера настроим немного позже, а сейчас вернемся к нашей маске. Сделайте маске тип machine. И введите следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_5.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
В первом состоянии (начальном) машина передает объекту snow состояние end, а во втором - beg. У флаера есть два состояния end и beg, в которых он выключен и включен соответственно. Чтобы без нашего желания флаер не запускался, в свойствах snow в поле &amp;quot;состояние&amp;quot; запишем его начальное состояние end.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
Подробно о свойствах флаера можно почитать [[Flyer|тут]]. Для того чтобы из него получился снег запишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:snow_fl.png]]&lt;br /&gt;
&lt;br /&gt;
7. Сохраните проект и проверьте его выполнение в программе viewer. При клике на слоненка начинает идти снег, а при повторном клике снег исчезает.&lt;br /&gt;
&lt;br /&gt;
8. Следующей нашей задачей будет создание разлетающегося кольца из звездочек вокруг желтой звезды на сцене, при клике на эту звезду. Представьте, что эта сцена у вас сейчас на экране мобильного телефона, а вам нужно дотронуться до звезды. Звезда очень маленькая, как следствие - по ней трудно попасть. Здесь нам на помощь опять явится маска. Снова перетащите ресурс mask на сцену из редактора ресурсов, переименуйте его в star_mask и поместите точно над звездой.&lt;br /&gt;
&lt;br /&gt;
9. Растягивать маску не нужно, она таких размеров, как нам нужно. В свойствах star_mask в модификаторах задайте alpha=0,01.&lt;br /&gt;
&lt;br /&gt;
10. Добавьте на сцену ресурс star из редактора ресурсов и поместите его точно на звезду.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_8.jpg]]&lt;br /&gt;
&lt;br /&gt;
11. Объекту star_mask нужно изменить тип на machine, а объекту star на flyer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
12. Задайте машине star_mask следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
13. Флаеру star пропишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_fl.png]]&lt;br /&gt;
&lt;br /&gt;
14. Сохраните проект и проверьте его выполнение в программе viewer. При клике на звезду флаер будет вести себя как взрыв сверхновой (или салют).&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_09, создать новый экран Lesson_09.1&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием .&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 09 (экрана Lesson_09).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену (экрана Lesson_09.1).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) снег шел при клике на любую область экрана;&lt;br /&gt;
b) изменить параметры флаера snow таким образом, чтобы он выглядел как дождь;&lt;br /&gt;
с) поиграйтесь с параметрами флаера, чтобы прочувствовать зависимость поведения флаера от его параметров;&lt;br /&gt;
&lt;br /&gt;
== Использование Видео ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Создайте еще один экран Lesson_9.2 после экрана Lesson_9.1.&lt;br /&gt;
&lt;br /&gt;
2. Добавьте сцену 09.&lt;br /&gt;
&lt;br /&gt;
3. Загрузите на сцену ресурсы к этому уроку из редактора ресурсов (bg, play).&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
'''''Если, в базе ресурсов урока, видео отсутствует, скачайте или добавьте любое, которое вам понравится(только без произвола).'''''&lt;br /&gt;
&lt;br /&gt;
1. Создайте на сцене новый объект и сделайте ему тип video. Переименуйте его в video.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Из ресурса play сделайте машину состояний. Пропишите машине следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_13.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Объекту video выставляем следующие параметры. &lt;br /&gt;
&lt;br /&gt;
[[Файл:vid.png]]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что id видео перетаскивается мышкой из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
4. Сохраните проект и посмотрите результат в программе viewer.&lt;br /&gt;
&lt;br /&gt;
Стоит учесть, что объект Video принимает видео(извините за тавтологию) определенного формата - '''*.ogv'''&lt;br /&gt;
Также есть поддержка формата '''*.webm'''&lt;br /&gt;
&lt;br /&gt;
Если видео без альфа-канала (прямоугольное и не содержит в себе прозрачности), то используется 1 файл, id которого нужно перетащить из базы ресурсов в поле '''id видео RGB'''.&lt;br /&gt;
&lt;br /&gt;
Если видео с альфа-каналом, то дополнительно используется '''id видео Alpha'''.&lt;br /&gt;
&lt;br /&gt;
== Звуки ==&lt;br /&gt;
 &lt;br /&gt;
Для того, чтобы игра была веселее и живее в редакторе предусмотрена возможность использовать звуки. В этом уроке мы научимся ставить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
1. Вернитесь к экрану Lesson_09.&lt;br /&gt;
&lt;br /&gt;
2. Создайте на сцене 09 новый объект и назовите его music.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Сделайте из объекта music машину состояний и пропишите следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_15.jpg]]&lt;br /&gt;
&lt;br /&gt;
Согласно этих состояний, сразу после запуска экрана начинает играть музыка music_gaming_04. Через 60 секунд после начала машина идет в состояние stop, где дается команда mus_stop и проигрывание музыки останавливается. Музыку можно не останавливать, тогда она будет играть по кругу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) после остановки проигрывания музыки можно кликом на слоненка снова ее запустить;&lt;br /&gt;
&lt;br /&gt;
b) чтобы музыка останавливалась кликом на слоненка.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10055</id>
		<title>Работа с эффектами</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10055"/>
		<updated>2021-08-05T15:30:59Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Использование Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить возможности редактора на примере применения различных эффектов.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:'''&lt;br /&gt;
* Создать экран, на котором можно освоить работу с патиклами (объект flyer) и масками ;&lt;br /&gt;
* Создать экран и настроить просмотр Видео&lt;br /&gt;
* Настроить появление сцены с проявлением по альфе, переходить на следующий экран с проявлением по альфе&lt;br /&gt;
* Настроить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
== Партиклы (Particles) ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → lessons.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.3, создать экран Lesson_09.&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_09 создать новую сцену 09, в которую (через Resources Editor) добавить графические ресурсы из папки Sources\Lesson_09 (см. подготовка к работе «Создание проекта»).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_1.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
'''Настройка объектов, работа с маской'''&lt;br /&gt;
&lt;br /&gt;
В этом уроке поработаем над использованием объекта flyer (Particles). Параллельно с этим научимся пользоваться хитрым приемом &amp;quot;маска&amp;quot;. В редактор ресурсов вы подгрузили уже знакомую вам графику &amp;quot;лунного пейзажа&amp;quot; и две части слоненка. &lt;br /&gt;
&lt;br /&gt;
1. Разместим их на сцене как показано на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_2.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Сделаем из головы слоненка машину состояний. Голова должна вертеться из стороны в сторону с интервалом в 1 секунду. Запишем в состояниях машины следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_3.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
3. Посмотрите результат с помощью программы viewer. Слоненок будет мотать головой.&lt;br /&gt;
&lt;br /&gt;
4. Теперь мы хотим, чтобы клик на слоненка вызывал какое-то действие, например, чтобы шел снег. Можно сделать из туловища машину состояний, но туловище маленькое, а нам нужен именно весь слоненок. Для этого нам понадобится маска. Из редактора ресурсов перетащим на сцену графический ресурс mask и переместим ее на слоненка. Маска очень маленькая, чтобы закрывать всего слоненка, поэтому воспользуемся модификаторами. Увеличим маску и сделаем ей прозрачность (alpha) 0,01.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_4.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
На сцене вы можете увидеть вокруг слоненка рамку от маски. Саму маску не видно из-за прозрачности. Стоит обратить внимание на то, что прозрачность мы сделали 0,01. Если бы она была равна 0, то маска не воспринимала бы клик, а была бы полностью прозрачной.&lt;br /&gt;
&lt;br /&gt;
5. Как вы уже догадались, маска у нас будет машиной состояний, включающей другой объект. Этим другим объектом будет flyer. Флаеры (патиклы) используются для создания эффектов, когда один маленький объект размножается и совершает какие-либо действия, при этом все его частички ведут себя подобно.&lt;br /&gt;
&lt;br /&gt;
Перетащим из редактора ресурсов на сцену графический ресурс snow и разместим его на сцене посередине по оси x (x=0) и вверху, немного за сценой (y=-320). Сделайте объекту тип flyer.&lt;br /&gt;
&lt;br /&gt;
6. Параметры флаера настроим немного позже, а сейчас вернемся к нашей маске. Сделайте маске тип machine. И введите следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_5.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
В первом состоянии (начальном) машина передает объекту snow состояние end, а во втором - beg. У флаера есть два состояния end и beg, в которых он выключен и включен соответственно. Чтобы без нашего желания флаер не запускался, в свойствах snow в поле &amp;quot;состояние&amp;quot; запишем его начальное состояние end.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
Подробно о свойствах флаера можно почитать [[Flyer|тут]]. Для того чтобы из него получился снег запишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:snow_fl.png]]&lt;br /&gt;
&lt;br /&gt;
7. Сохраните проект и проверьте его выполнение в программе viewer. При клике на слоненка начинает идти снег, а при повторном клике снег исчезает.&lt;br /&gt;
&lt;br /&gt;
8. Следующей нашей задачей будет создание разлетающегося кольца из звездочек вокруг желтой звезды на сцене, при клике на эту звезду. Представьте, что эта сцена у вас сейчас на экране мобильного телефона, а вам нужно дотронуться до звезды. Звезда очень маленькая, как следствие - по ней трудно попасть. Здесь нам на помощь опять явится маска. Снова перетащите ресурс mask на сцену из редактора ресурсов, переименуйте его в star_mask и поместите точно над звездой.&lt;br /&gt;
&lt;br /&gt;
9. Растягивать маску не нужно, она таких размеров, как нам нужно. В свойствах star_mask в модификаторах задайте alpha=0,01.&lt;br /&gt;
&lt;br /&gt;
10. Добавьте на сцену ресурс star из редактора ресурсов и поместите его точно на звезду.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_8.jpg]]&lt;br /&gt;
&lt;br /&gt;
11. Объекту star_mask нужно изменить тип на machine, а объекту star на flyer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
12. Задайте машине star_mask следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
13. Флаеру star пропишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_fl.png]]&lt;br /&gt;
&lt;br /&gt;
14. Сохраните проект и проверьте его выполнение в программе viewer. При клике на звезду флаер будет вести себя как взрыв сверхновой (или салют).&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_09, создать новый экран Lesson_09.1&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием .&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 09 (экрана Lesson_09).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену (экрана Lesson_09.1).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) снег шел при клике на любую область экрана;&lt;br /&gt;
b) изменить параметры флаера snow таким образом, чтобы он выглядел как дождь;&lt;br /&gt;
с) поиграйтесь с параметрами флаера, чтобы прочувствовать зависимость поведения флаера от его параметров;&lt;br /&gt;
&lt;br /&gt;
== Использование Видео ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Создайте еще один экран Lesson_9.2 после экрана Lesson_9.1.&lt;br /&gt;
&lt;br /&gt;
2. Добавьте сцену 09.&lt;br /&gt;
&lt;br /&gt;
3. Загрузите на сцену ресурсы к этому уроку из редактора ресурсов (bg, play).&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
'''''Если, в базе ресурсов урока, видео отсутствует, скачайте или добавьте любое, которое вам понравится(только без произвола).'''''&lt;br /&gt;
&lt;br /&gt;
1. Создайте на сцене новый объект и сделайте ему тип video. Переименуйте его в video.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Из ресурса play сделайте машину состояний. Пропишите машине следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_13.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Объекту video выставляем следующие параметры. &lt;br /&gt;
&lt;br /&gt;
[[Файл:vid.png]]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что id видео перетаскивается мышкой из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
4. Сохраните проект и посмотрите результат в программе viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!'''&lt;br /&gt;
В более новой версии движка, окно свойств объекта выглядит так :&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_9_0_new_ui_screen.png]]&lt;br /&gt;
&lt;br /&gt;
Стоит учесть, что объект Video принимает видео(извините за тавтологию) определенного формата - '''*.ogv'''&lt;br /&gt;
Также есть поддержка формата '''*.webm'''&lt;br /&gt;
&lt;br /&gt;
Если видео без альфа-канала (прямоугольное и не содержит в себе прозрачности), то используется 1 файл, id которого нужно перетащить из базы ресурсов в поле '''id видео RGB'''.&lt;br /&gt;
&lt;br /&gt;
Если видео с альфа-каналом, то дополнительно используется '''id видео Alpha'''.&lt;br /&gt;
&lt;br /&gt;
== Звуки ==&lt;br /&gt;
 &lt;br /&gt;
Для того, чтобы игра была веселее и живее в редакторе предусмотрена возможность использовать звуки. В этом уроке мы научимся ставить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
1. Вернитесь к экрану Lesson_09.&lt;br /&gt;
&lt;br /&gt;
2. Создайте на сцене 09 новый объект и назовите его music.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Сделайте из объекта music машину состояний и пропишите следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_15.jpg]]&lt;br /&gt;
&lt;br /&gt;
Согласно этих состояний, сразу после запуска экрана начинает играть музыка music_gaming_04. Через 60 секунд после начала машина идет в состояние stop, где дается команда mus_stop и проигрывание музыки останавливается. Музыку можно не останавливать, тогда она будет играть по кругу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) после остановки проигрывания музыки можно кликом на слоненка снова ее запустить;&lt;br /&gt;
&lt;br /&gt;
b) чтобы музыка останавливалась кликом на слоненка.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Vid.png&amp;diff=10054</id>
		<title>Файл:Vid.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Vid.png&amp;diff=10054"/>
		<updated>2021-08-05T15:29:15Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10053</id>
		<title>Настройка миниигр</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10053"/>
		<updated>2021-08-05T14:59:05Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка объектов, создание машин состояний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить настройки объектов, реализующих различные минигры.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Puzzle&lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Patchwork &lt;br /&gt;
&lt;br /&gt;
== Puzzle ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
Запускаем SceneEditor. Открываем наш учебный проект lessons.seproj.&lt;br /&gt;
&lt;br /&gt;
Создаём экран lesson_8, а в нём сцены 08 и Buttons (стараемся делать это по памяти или подсматриваем в прошлых уроках), куда добавляем необходимые графические ресурсы из папки этого урока в Resources Editor: в экран 08 отправляем картинку level_01 (наш будущий пазл), а в Buttons (думаю, уже догадались) - будущие кнопки - hint_normal и ico_r_normal2. &lt;br /&gt;
&lt;br /&gt;
На экране кнопочкам подбираем симпатичное и удобное расположение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:801.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов, создание машин состояний ===&lt;br /&gt;
	&lt;br /&gt;
Меняем тип картинки '''level_01''' с '''image''' на [[Puzzle|puzzle]] (в папке Game mechanic) и устанавливаем следующие настройки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:802.png]]&lt;br /&gt;
&lt;br /&gt;
В сцене '''08''' создаём ещё один объект. Даём ему имя '''applause''', тип '''machine''' (прописываем 3 состояния '''init''', '''on''' и '''off'''). &lt;br /&gt;
&lt;br /&gt;
В состоянии '''on''' добавляем команду '''play''' (проиграть звук) и в списке выбираем '''snd''' (короткий звук), который подгружаем с помощью базы ресурсов (если подходящего звукового файла в уроке не обнаружилось, его необходимо добавить самостоятельно; при добавлении звука в базу ресурсов, ее нужно сохранить и переоткрыть).Также добавляем команду '''wait''' &lt;br /&gt;
&lt;br /&gt;
Возвращаемся к общим настройкам.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:applause (2).png]]&lt;br /&gt;
&lt;br /&gt;
Переходим к сцене '''Buttons''' и меняем тип обоих графических файлов на '''button'''. Общий вид лейаута на этом этапе получится примерно следующий:&lt;br /&gt;
&lt;br /&gt;
[[Файл:804.png]]  &lt;br /&gt;
&lt;br /&gt;
В настройках кнопок перетянем из базы ресурсов картинки с внешним видом нажатых и отжатых кнопок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:805.png]] &lt;br /&gt;
&lt;br /&gt;
Кнопка '''ico_R_normal2''' (переиграть) — кнопка, запускающая игру Puzzle сначала. &lt;br /&gt;
&lt;br /&gt;
Нам необходимо, чтобы кнопка '''ico_R_normal2''' перемешивала части нашего пазла. Для этого в настройках кликаем правой кнопкой мыши и выбираем '''клик:изменить состояние объекта'''. В появившейся в настройках вкладке выбираем в качестве объекта наш пазл ('''level_01''') и состояние '''mix''', которое перемешает части исходной картинки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:806.png]] &lt;br /&gt;
	&lt;br /&gt;
Пусть кнопка '''hint_normal''' (подсказка) по клику показывает нам картинку в собранном виде. Для этого повторяем процедуру с добавлением настройки '''клик:изменить состояние объекта''', только теперь для кнопки '''hint_normal'''. Выбираем объектом наш '''level_01''' и состояние для него '''hint'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Если возникает необходимость добавить 2 и более настройки при помощи правой кнопки мыши, &lt;br /&gt;
то лучше из кнопки сделать машину состояний и все состояния создать уже там.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любуемся результатом своих стараний, сохранив проект и запустив его с помощью Viewer`а.&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
Копируем экран '''lesson_8''' и переименовываем его в '''lesson_8_1''', а сцену '''08''' в '''08_01'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:807.png]]&lt;br /&gt;
&lt;br /&gt;
В новом экране вносим все изменения самостоятельно. Необходимо:&lt;br /&gt;
&lt;br /&gt;
a) добавить другой аудиофайл, имеющимся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;&lt;br /&gt;
&lt;br /&gt;
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Store ===&lt;br /&gt;
&lt;br /&gt;
В реальной игре нам может понадобиться счётчик подсказок, который даёт возможность совершать покупки подсказок за реальные деньги. Для его реализации необходим объект '''[[Store|Store]]'''.&lt;br /&gt;
&lt;br /&gt;
Создадим новый экран '''lesson_8_1_1'''. Добавим в него сцены '''08_1''' и '''Button_8_1'''. В сцену '''08_1''' поместим из экрана '''lesson_8_1''' объекты  '''level_01''' и '''applause''', оставим их без изменения. &lt;br /&gt;
&lt;br /&gt;
В сцену '''Button_8_1''' скопируем из '''lesson_08_1''' кнопки '''hint_normal''' и '''ico_R_normal2''' и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и назовём его '''hint'''. Добавим ресурс из базы ресурсов – анимацию c цифрами из прошлого урока. Счётчик '''hint''' будет считывать купленные подсказки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:808.png]]&lt;br /&gt;
&lt;br /&gt;
В  '''hint_normal''' добавим подобъект, сделаем его машиной и назовем '''hint_m'''.&lt;br /&gt;
&lt;br /&gt;
Щёлкнув правой кнопкой мыши на сцену  '''Button_8_1''' создадим новые сцены '''store''' и '''error''', которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.&lt;br /&gt;
&lt;br /&gt;
В сцену  store добавим две машины:  '''buy''' и '''store'''; в  error - машину  '''error'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:809.PNG]]&lt;br /&gt;
&lt;br /&gt;
В машине '''store''' зададим считывания со счётчика и прозрачность экрана:&lt;br /&gt;
&lt;br /&gt;
[[Файл:810.png]]&lt;br /&gt;
&lt;br /&gt;
Машина '''error''' будет отвечать за вывод ошибки при неудачной покупке, то есть задаёт прозрачность экрана с ошибкой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:811.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для машины '''buy''' зададим состояния, при которых она начисляет купленную подсказку либо вызывает окно ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:812.PNG]]&lt;br /&gt;
&lt;br /&gt;
Вернёмся к машине '''hint_m''' сцены '''Button_8_1''' и пропишем для неё состояния. Машина отвечает за начисление подсказки при удачной покупке&lt;br /&gt;
&lt;br /&gt;
[[Файл:813.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы вызывать машину '''hint_m''' в нашей игре, откроем кнопку '''hint_normal''' и в добавляемом свойстве '''изменить состояние объекта''' в качестве объекта выберем машину '''hint_m''', и пропишем ей состояние '''check'''.&lt;br /&gt;
&lt;br /&gt;
'''Совершение покупки (настройка Store)'''&lt;br /&gt;
&lt;br /&gt;
Для того чтобы покупку можно было совершить, необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store (в папке Options).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Store в проекте может быть только один.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:814.PNG]]&lt;br /&gt;
&lt;br /&gt;
Дважды клацнув на объект (так же, как на машину состояний), мы попадаем в окно настроек '''store'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:815.PNG]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на плюсик и создаём покупку. Вводим для неё id и изменяем указанные настройки, как на картинке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo12.png]]&lt;br /&gt;
&lt;br /&gt;
И тут должен возникнуть вопрос. Почему среди перечня доступных объектов нет необходимого нам '''buy'''? Прежде чем читать дальше, предлагаю попробовать найти ответ на этот вопрос самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для удобства использования, а также во избежание различных ошибок, в объектах экрана можно обращаться только к объектам этого же экрана. Исключением будут объекты глобальных экранов (вспоминаем прошлые уроки и смотрим на наш глобальный экран '''opt'''). &lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы получить доступ к объекту '''buy''', мы временно делаем экран '''lesson_8_1_1''' глобальным и завершаем настройку объекта '''store'''. Позже, на этапе проверки при помощи Viewer`а можем поэкспериментировать и проверить, будет ли работать проект корректно, когда мы в настройках глобальности экрана '''lesson_8_1_1''' снова поставим '''нет'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Когда мы обращаемся к объекту, то в layout.xml &lt;br /&gt;
прописывается ссылка на этот объект в виде его id.&lt;br /&gt;
Когда убираем глобальность экрана и делаем его снова обычным, &lt;br /&gt;
выбранный объект мы в редакторе больше не видим, &lt;br /&gt;
но его id в лэйауте всё равно остаётся.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Store'''&lt;br /&gt;
&lt;br /&gt;
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.&lt;br /&gt;
&lt;br /&gt;
Основные параметры объекта Store&lt;br /&gt;
&lt;br /&gt;
''id покупки'' – внутренний id покупки.&lt;br /&gt;
&lt;br /&gt;
''расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда; если параметр не указан, по-умолчанию покупка – одноразовая.&lt;br /&gt;
&lt;br /&gt;
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.&lt;br /&gt;
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.&lt;br /&gt;
&lt;br /&gt;
'''Для того, чтобы объект Store работал во Viewer, необходимо подкорректировать файл app.icf'''&lt;br /&gt;
&lt;br /&gt;
1. Найти файл app.icf в папке с вашим проектом.&lt;br /&gt;
&lt;br /&gt;
2. Открыть его и найти тег [Game].&lt;br /&gt;
&lt;br /&gt;
3. В теге Game добавить строку purchaseEverything=1.&lt;br /&gt;
&lt;br /&gt;
4. Сохранить файл&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Game]&lt;br /&gt;
purchaseEverything=1&lt;br /&gt;
DispFixRot=&amp;quot;Landscape&amp;quot;&lt;br /&gt;
# comments and whitespace stripped by deployment tool&lt;br /&gt;
debug=&amp;quot;Absolutist-2253&amp;quot;&lt;br /&gt;
show_build_date=1&lt;br /&gt;
AppTitle=&amp;quot;Viewer&amp;quot;&lt;br /&gt;
DebuggerIP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
DebuggerPort=5322&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оформление'''&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём к оформлению. Для того чтобы на экране появлялось окно с предложением о покупке подсказки, необходимо его создать. В начальный момент окно должно быть невидимым и прокликиваем, это состояние задано в машине '''store'''. Создадим в ней 5 подобъектов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.&lt;br /&gt;
&lt;br /&gt;
Откроем объект  '''black''', пропишем ему свойства, оставив пустой рамку, цвет фона – чёрный.&lt;br /&gt;
&lt;br /&gt;
Для объекта '''rec''' зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке. Чтобы прямоугольник отображался правильно, задайте ему ненулевые размеры. Настройки '''rec''' (имена файлов могут отличаться):&lt;br /&gt;
&lt;br /&gt;
[[Файл:817.PNG]]&lt;br /&gt;
&lt;br /&gt;
Третьему элементу поменяем тип на '''text''' с текстом &amp;quot;Купить подсказку?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Четвёртый объект сделаем машиной и назовём её '''ok'''. Она будет в глазах пользователя совершать покупку. Для внешнего вида машины в '''res''' перетянем изображение зелёного света светофора из 4 урока. В модификаторах можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
Опишем следующие состояния машины:&lt;br /&gt;
&lt;br /&gt;
[[Файл:818.PNG]]&lt;br /&gt;
&lt;br /&gt;
Все действия, связанные с совершением и провалом покупки, управляемые этой машиной, мы уже указали в '''store'''.&lt;br /&gt;
&lt;br /&gt;
Пятый объект будет кнопкой '''no'''. Она по клику изменяет состояние ('''close''') объекта ('''store'''). Для внешнего вида кнопки в '''res''' перетянем изображение красного света светофора из 4 урока. В модификаторах тоже можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
&lt;br /&gt;
Так же поступим со сценой '''error'''. В ней создадим четыре объекта: два '''rectangle''': '''rec_error''' – пустой, '''black_error''' — их можно скопировать из предыдущей сцены; кнопку '''buy''', которая будет переводить '''error''' в состояние '''i'''; текстовый объект '''text_error''' с текстом «error!». Общий вид этого задания в лейауте примерно следующий:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:819.PNG]]&lt;br /&gt;
&lt;br /&gt;
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим Viewer. Сейчас при покупке подсказки количество покупок не имеет лимита (благодаря нашим изменениям в '''app.icf'''), поэтому вывод ошибки мы не получим.&lt;br /&gt;
&lt;br /&gt;
== Patchwork ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → Learning.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_1.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.&lt;br /&gt;
&lt;br /&gt;
Если в папке урока отсутствует изображение panel_down, то скачать любое изображение боковой панели самостоятельно и использовать ее в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов ===&lt;br /&gt;
&lt;br /&gt;
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем &amp;quot;Создать объект в текущем элементе&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Переименуем один из созданных объектов в Patchwork, а другой в table.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_4.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.&lt;br /&gt;
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 0х0 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле &amp;quot;перейти на экран&amp;quot; укажите текущий экран Lesson_8.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:правка_намба_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для таблицы измените следующие параметры&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson8_table_setup.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля &amp;quot;карт.спереди&amp;quot; и &amp;quot;шаблон&amp;quot; заполняются перетаскиванием графического ресурса из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8.3.Fin.png]]&lt;br /&gt;
&lt;br /&gt;
===  Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием game.&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Applause_(2).png&amp;diff=10052</id>
		<title>Файл:Applause (2).png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Applause_(2).png&amp;diff=10052"/>
		<updated>2021-08-05T14:57:32Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Applause.png&amp;diff=10051</id>
		<title>Файл:Applause.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Applause.png&amp;diff=10051"/>
		<updated>2021-08-05T14:55:44Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Photo11.png&amp;diff=10050</id>
		<title>Файл:Photo11.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Photo11.png&amp;diff=10050"/>
		<updated>2021-08-05T14:53:27Z</updated>

		<summary type="html">&lt;p&gt;Blymar: Blymar загрузил новую версию Файл:Photo11.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10049</id>
		<title>Настройка миниигр</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10049"/>
		<updated>2021-08-05T14:47:21Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка объектов, создание машин состояний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить настройки объектов, реализующих различные минигры.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Puzzle&lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Patchwork &lt;br /&gt;
&lt;br /&gt;
== Puzzle ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
Запускаем SceneEditor. Открываем наш учебный проект lessons.seproj.&lt;br /&gt;
&lt;br /&gt;
Создаём экран lesson_8, а в нём сцены 08 и Buttons (стараемся делать это по памяти или подсматриваем в прошлых уроках), куда добавляем необходимые графические ресурсы из папки этого урока в Resources Editor: в экран 08 отправляем картинку level_01 (наш будущий пазл), а в Buttons (думаю, уже догадались) - будущие кнопки - hint_normal и ico_r_normal2. &lt;br /&gt;
&lt;br /&gt;
На экране кнопочкам подбираем симпатичное и удобное расположение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:801.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов, создание машин состояний ===&lt;br /&gt;
	&lt;br /&gt;
Меняем тип картинки '''level_01''' с '''image''' на [[Puzzle|puzzle]] (в папке Game mechanic) и устанавливаем следующие настройки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:802.png]]&lt;br /&gt;
&lt;br /&gt;
В сцене '''08''' создаём ещё один объект. Даём ему имя '''applause''', тип '''machine''' (прописываем 3 состояния '''init''', '''on''' и '''off'''). &lt;br /&gt;
&lt;br /&gt;
В состоянии '''on''' добавляем команду '''play''' (проиграть звук) и в списке выбираем '''snd''' (короткий звук), который подгружаем с помощью базы ресурсов (если подходящего звукового файла в уроке не обнаружилось, его необходимо добавить самостоятельно; при добавлении звука в базу ресурсов, ее нужно сохранить и переоткрыть).Также добавляем команду '''wait''' &lt;br /&gt;
&lt;br /&gt;
Возвращаемся к общим настройкам.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo11.png]]&lt;br /&gt;
&lt;br /&gt;
Переходим к сцене '''Buttons''' и меняем тип обоих графических файлов на '''button'''. Общий вид лейаута на этом этапе получится примерно следующий:&lt;br /&gt;
&lt;br /&gt;
[[Файл:804.png]]  &lt;br /&gt;
&lt;br /&gt;
В настройках кнопок перетянем из базы ресурсов картинки с внешним видом нажатых и отжатых кнопок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:805.png]] &lt;br /&gt;
&lt;br /&gt;
Кнопка '''ico_R_normal2''' (переиграть) — кнопка, запускающая игру Puzzle сначала. &lt;br /&gt;
&lt;br /&gt;
Нам необходимо, чтобы кнопка '''ico_R_normal2''' перемешивала части нашего пазла. Для этого в настройках кликаем правой кнопкой мыши и выбираем '''клик:изменить состояние объекта'''. В появившейся в настройках вкладке выбираем в качестве объекта наш пазл ('''level_01''') и состояние '''mix''', которое перемешает части исходной картинки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:806.png]] &lt;br /&gt;
	&lt;br /&gt;
Пусть кнопка '''hint_normal''' (подсказка) по клику показывает нам картинку в собранном виде. Для этого повторяем процедуру с добавлением настройки '''клик:изменить состояние объекта''', только теперь для кнопки '''hint_normal'''. Выбираем объектом наш '''level_01''' и состояние для него '''hint'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Если возникает необходимость добавить 2 и более настройки при помощи правой кнопки мыши, &lt;br /&gt;
то лучше из кнопки сделать машину состояний и все состояния создать уже там.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любуемся результатом своих стараний, сохранив проект и запустив его с помощью Viewer`а.&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
Копируем экран '''lesson_8''' и переименовываем его в '''lesson_8_1''', а сцену '''08''' в '''08_01'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:807.png]]&lt;br /&gt;
&lt;br /&gt;
В новом экране вносим все изменения самостоятельно. Необходимо:&lt;br /&gt;
&lt;br /&gt;
a) добавить другой аудиофайл, имеющимся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;&lt;br /&gt;
&lt;br /&gt;
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Store ===&lt;br /&gt;
&lt;br /&gt;
В реальной игре нам может понадобиться счётчик подсказок, который даёт возможность совершать покупки подсказок за реальные деньги. Для его реализации необходим объект '''[[Store|Store]]'''.&lt;br /&gt;
&lt;br /&gt;
Создадим новый экран '''lesson_8_1_1'''. Добавим в него сцены '''08_1''' и '''Button_8_1'''. В сцену '''08_1''' поместим из экрана '''lesson_8_1''' объекты  '''level_01''' и '''applause''', оставим их без изменения. &lt;br /&gt;
&lt;br /&gt;
В сцену '''Button_8_1''' скопируем из '''lesson_08_1''' кнопки '''hint_normal''' и '''ico_R_normal2''' и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и назовём его '''hint'''. Добавим ресурс из базы ресурсов – анимацию c цифрами из прошлого урока. Счётчик '''hint''' будет считывать купленные подсказки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:808.png]]&lt;br /&gt;
&lt;br /&gt;
В  '''hint_normal''' добавим подобъект, сделаем его машиной и назовем '''hint_m'''.&lt;br /&gt;
&lt;br /&gt;
Щёлкнув правой кнопкой мыши на сцену  '''Button_8_1''' создадим новые сцены '''store''' и '''error''', которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.&lt;br /&gt;
&lt;br /&gt;
В сцену  store добавим две машины:  '''buy''' и '''store'''; в  error - машину  '''error'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:809.PNG]]&lt;br /&gt;
&lt;br /&gt;
В машине '''store''' зададим считывания со счётчика и прозрачность экрана:&lt;br /&gt;
&lt;br /&gt;
[[Файл:810.png]]&lt;br /&gt;
&lt;br /&gt;
Машина '''error''' будет отвечать за вывод ошибки при неудачной покупке, то есть задаёт прозрачность экрана с ошибкой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:811.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для машины '''buy''' зададим состояния, при которых она начисляет купленную подсказку либо вызывает окно ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:812.PNG]]&lt;br /&gt;
&lt;br /&gt;
Вернёмся к машине '''hint_m''' сцены '''Button_8_1''' и пропишем для неё состояния. Машина отвечает за начисление подсказки при удачной покупке&lt;br /&gt;
&lt;br /&gt;
[[Файл:813.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы вызывать машину '''hint_m''' в нашей игре, откроем кнопку '''hint_normal''' и в добавляемом свойстве '''изменить состояние объекта''' в качестве объекта выберем машину '''hint_m''', и пропишем ей состояние '''check'''.&lt;br /&gt;
&lt;br /&gt;
'''Совершение покупки (настройка Store)'''&lt;br /&gt;
&lt;br /&gt;
Для того чтобы покупку можно было совершить, необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store (в папке Options).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Store в проекте может быть только один.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:814.PNG]]&lt;br /&gt;
&lt;br /&gt;
Дважды клацнув на объект (так же, как на машину состояний), мы попадаем в окно настроек '''store'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:815.PNG]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на плюсик и создаём покупку. Вводим для неё id и изменяем указанные настройки, как на картинке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo12.png]]&lt;br /&gt;
&lt;br /&gt;
И тут должен возникнуть вопрос. Почему среди перечня доступных объектов нет необходимого нам '''buy'''? Прежде чем читать дальше, предлагаю попробовать найти ответ на этот вопрос самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для удобства использования, а также во избежание различных ошибок, в объектах экрана можно обращаться только к объектам этого же экрана. Исключением будут объекты глобальных экранов (вспоминаем прошлые уроки и смотрим на наш глобальный экран '''opt'''). &lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы получить доступ к объекту '''buy''', мы временно делаем экран '''lesson_8_1_1''' глобальным и завершаем настройку объекта '''store'''. Позже, на этапе проверки при помощи Viewer`а можем поэкспериментировать и проверить, будет ли работать проект корректно, когда мы в настройках глобальности экрана '''lesson_8_1_1''' снова поставим '''нет'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Когда мы обращаемся к объекту, то в layout.xml &lt;br /&gt;
прописывается ссылка на этот объект в виде его id.&lt;br /&gt;
Когда убираем глобальность экрана и делаем его снова обычным, &lt;br /&gt;
выбранный объект мы в редакторе больше не видим, &lt;br /&gt;
но его id в лэйауте всё равно остаётся.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Store'''&lt;br /&gt;
&lt;br /&gt;
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.&lt;br /&gt;
&lt;br /&gt;
Основные параметры объекта Store&lt;br /&gt;
&lt;br /&gt;
''id покупки'' – внутренний id покупки.&lt;br /&gt;
&lt;br /&gt;
''расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда; если параметр не указан, по-умолчанию покупка – одноразовая.&lt;br /&gt;
&lt;br /&gt;
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.&lt;br /&gt;
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.&lt;br /&gt;
&lt;br /&gt;
'''Для того, чтобы объект Store работал во Viewer, необходимо подкорректировать файл app.icf'''&lt;br /&gt;
&lt;br /&gt;
1. Найти файл app.icf в папке с вашим проектом.&lt;br /&gt;
&lt;br /&gt;
2. Открыть его и найти тег [Game].&lt;br /&gt;
&lt;br /&gt;
3. В теге Game добавить строку purchaseEverything=1.&lt;br /&gt;
&lt;br /&gt;
4. Сохранить файл&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Game]&lt;br /&gt;
purchaseEverything=1&lt;br /&gt;
DispFixRot=&amp;quot;Landscape&amp;quot;&lt;br /&gt;
# comments and whitespace stripped by deployment tool&lt;br /&gt;
debug=&amp;quot;Absolutist-2253&amp;quot;&lt;br /&gt;
show_build_date=1&lt;br /&gt;
AppTitle=&amp;quot;Viewer&amp;quot;&lt;br /&gt;
DebuggerIP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
DebuggerPort=5322&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оформление'''&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём к оформлению. Для того чтобы на экране появлялось окно с предложением о покупке подсказки, необходимо его создать. В начальный момент окно должно быть невидимым и прокликиваем, это состояние задано в машине '''store'''. Создадим в ней 5 подобъектов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.&lt;br /&gt;
&lt;br /&gt;
Откроем объект  '''black''', пропишем ему свойства, оставив пустой рамку, цвет фона – чёрный.&lt;br /&gt;
&lt;br /&gt;
Для объекта '''rec''' зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке. Чтобы прямоугольник отображался правильно, задайте ему ненулевые размеры. Настройки '''rec''' (имена файлов могут отличаться):&lt;br /&gt;
&lt;br /&gt;
[[Файл:817.PNG]]&lt;br /&gt;
&lt;br /&gt;
Третьему элементу поменяем тип на '''text''' с текстом &amp;quot;Купить подсказку?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Четвёртый объект сделаем машиной и назовём её '''ok'''. Она будет в глазах пользователя совершать покупку. Для внешнего вида машины в '''res''' перетянем изображение зелёного света светофора из 4 урока. В модификаторах можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
Опишем следующие состояния машины:&lt;br /&gt;
&lt;br /&gt;
[[Файл:818.PNG]]&lt;br /&gt;
&lt;br /&gt;
Все действия, связанные с совершением и провалом покупки, управляемые этой машиной, мы уже указали в '''store'''.&lt;br /&gt;
&lt;br /&gt;
Пятый объект будет кнопкой '''no'''. Она по клику изменяет состояние ('''close''') объекта ('''store'''). Для внешнего вида кнопки в '''res''' перетянем изображение красного света светофора из 4 урока. В модификаторах тоже можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
&lt;br /&gt;
Так же поступим со сценой '''error'''. В ней создадим четыре объекта: два '''rectangle''': '''rec_error''' – пустой, '''black_error''' — их можно скопировать из предыдущей сцены; кнопку '''buy''', которая будет переводить '''error''' в состояние '''i'''; текстовый объект '''text_error''' с текстом «error!». Общий вид этого задания в лейауте примерно следующий:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:819.PNG]]&lt;br /&gt;
&lt;br /&gt;
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим Viewer. Сейчас при покупке подсказки количество покупок не имеет лимита (благодаря нашим изменениям в '''app.icf'''), поэтому вывод ошибки мы не получим.&lt;br /&gt;
&lt;br /&gt;
== Patchwork ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → Learning.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_1.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.&lt;br /&gt;
&lt;br /&gt;
Если в папке урока отсутствует изображение panel_down, то скачать любое изображение боковой панели самостоятельно и использовать ее в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов ===&lt;br /&gt;
&lt;br /&gt;
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем &amp;quot;Создать объект в текущем элементе&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Переименуем один из созданных объектов в Patchwork, а другой в table.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_4.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.&lt;br /&gt;
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 0х0 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле &amp;quot;перейти на экран&amp;quot; укажите текущий экран Lesson_8.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:правка_намба_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для таблицы измените следующие параметры&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson8_table_setup.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля &amp;quot;карт.спереди&amp;quot; и &amp;quot;шаблон&amp;quot; заполняются перетаскиванием графического ресурса из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8.3.Fin.png]]&lt;br /&gt;
&lt;br /&gt;
===  Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием game.&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10048</id>
		<title>Движение машин: жучки, ключи и многое другое</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10048"/>
		<updated>2021-08-05T12:47:48Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Вращение вокруг пивота */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить процессы движения и способы взаимодействия машин.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* реализовать разными методами &amp;quot;ход конем&amp;quot;;&lt;br /&gt;
* организовать циклическое движение по квадрату;&lt;br /&gt;
* разобраться с понятием точки пивота;&lt;br /&gt;
* научиться согласовывать поступательное и вращательное движение;&lt;br /&gt;
* рассмотреть способ применения одного предмета на другой.&lt;br /&gt;
&lt;br /&gt;
== Процессы и движение ==&lt;br /&gt;
&lt;br /&gt;
До сих пор мы ограничивались только одной командой процессов - '''wait''' (ожидание).&lt;br /&gt;
В этом уроке мы рассмотрим другие процессы. Существуют следующие команды движения (изменения объекта):&lt;br /&gt;
* '''move''' - движение по прямой&lt;br /&gt;
* '''rot'''  - вращение &lt;br /&gt;
* '''scale''' - изменение размера&lt;br /&gt;
* '''alpha''' - изменение прозрачности&lt;br /&gt;
* '''phys''' - движение в силовом поле.&lt;br /&gt;
 &lt;br /&gt;
В каждой команде достаточно много параметров. Например, можно сдвинуться (move)&lt;br /&gt;
по горизонтали на '''dx''' пикселей за время '''t'''. Вместо времени можно указать скорость  '''v''' в пикселях в секунду.&lt;br /&gt;
Можно двигаться в определенную целевую точку с координатами ('''tx''', '''ty''') и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Ход конем ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lady_bug_64.png|right]]&lt;br /&gt;
Рассмотрим простой пример в котором объект движется сначала вверх на 100 пикселей, а затем вправо на 200.&lt;br /&gt;
В качестве такого объекта будем использовать ladybug (божья коровка или для краткости жучок), &lt;br /&gt;
картинку которой можно найти в редакторе ресурсов в папке этого урока.&lt;br /&gt;
Как обычно, перетаскиваем её на сцену, переименовываем и превращаем в машину состояний.&lt;br /&gt;
Организуем сначала движние нашего жучка при помощи трёх состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug1.png]] &lt;br /&gt;
&lt;br /&gt;
Первое, стартовое состояние является запускающим. Если кликнуть на жучка, то он начнет своё движение.&lt;br /&gt;
Когда перемещение по вертикали заканчивается (состояние up), жучок переходит в третье состояние (right), в котором движется вправо.&lt;br /&gt;
Закончив движение, он возвращается в стартовое состояние и ждет очередного клика.&lt;br /&gt;
&lt;br /&gt;
Координатная ось Y (вертикальная) на сцене направлена вниз, а ось X (горизонтальная) -- вправо.&lt;br /&gt;
Поэтому, чтобы жучок начал двигаться вверх, его смещение должно быть отрицательным.&lt;br /&gt;
В нашем случае это dy=-100. Эти 100 пикселей объект должен пройти за одну секунду (t=1000).&lt;br /&gt;
В конце выполнения команды move происходит переход в следующее состояние, имя которого задается в поле &amp;quot;'''go'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
При движении вправо, происходит смещение на 200 пикселей.&lt;br /&gt;
Чтобы скорость движения вверх и вправо была постоянной, необходимо соответственно увеличить&lt;br /&gt;
время движения (t=2000).&lt;br /&gt;
&lt;br /&gt;
Точно такое же движение можно организовать в рамках одного, а не двух состояний.&lt;br /&gt;
Поместите на сцену еще одного жучка, дайте ему другое имя и задайте следующую машину состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug2.png]]&lt;br /&gt;
&lt;br /&gt;
Команды move в состоянии way выполняются последовательно.&lt;br /&gt;
Сначала отрабатывает нулевой move, а затем первый.&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат. Оба жучка должны двигаться одинаковым образом.&lt;br /&gt;
Не забывайте при тестировании включать отладочную информацию о текущих состояниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательно и параллельно ===&lt;br /&gt;
&lt;br /&gt;
И так, в рамках данного состояния все команды процессов с одинаковым названием выполняются '''последовательно'''.&lt;br /&gt;
При этом команды с разными именами выполняются '''параллельно'''.&lt;br /&gt;
&lt;br /&gt;
[[файл:Def_procesess1.png|right]]&lt;br /&gt;
Пусть в состянии есть несколько команд move и несколько команд rot (вращения):&lt;br /&gt;
* move0 move1 rot0 move2 rot1 rot2&lt;br /&gt;
Независимо от их чередования, они выстраиваются в параллельные списки процессов:&lt;br /&gt;
* move0   rot0&lt;br /&gt;
* move1   rot1&lt;br /&gt;
* move2   rot2&lt;br /&gt;
Эти списки начинают одновременно выполняться сверху вниз: &lt;br /&gt;
отрабатывают команды move и одновременно с ними комананды rot.&lt;br /&gt;
&lt;br /&gt;
Заставим нашего жучка при совершении хода конем поворачиваться на 360 градусов.&lt;br /&gt;
Для этого поместим третью машину со следующими состояниями:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug3.png]]&lt;br /&gt;
&lt;br /&gt;
Запустите проект во вьювере. &lt;br /&gt;
Одновременно с выполнением двух команд move будет выполняться одна команда rot.&lt;br /&gt;
Время выполнения rot равно суммарному времени двух команд move (t=3000=1000+2000).&lt;br /&gt;
В результате, к концу движения, жучок поворачивается на da=360 градусов ('''da''' - изменение угла).&lt;br /&gt;
&lt;br /&gt;
Переход в следующее состояние '''go''' в данном случае можно было бы поставить не в команду '''rot''',&lt;br /&gt;
а в последнюю команду '''move'''. Однако приведенное решение лучше, так как&lt;br /&gt;
гарантирует, что переход произойдет только, когда жучок полностью развернется.&lt;br /&gt;
Хотя суммарное время move совпадает с временем rot, реальное компьютерное время&lt;br /&gt;
выполнения этих команд может немного отличаться. В результате, если выйти из&lt;br /&gt;
состояния по окончанию движения, можно получить не до конца развернувшегося жучка.&lt;br /&gt;
&lt;br /&gt;
=== Циклическое движение ===&lt;br /&gt;
&lt;br /&gt;
С командами движения, также как и с командой ожидания, можно использовать циклы.&lt;br /&gt;
Например, заставим (уже четвертого) жучка при клике два раз оббегать стороны квадрата.&lt;br /&gt;
Это можно сделать при помощи следующей машины:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug4.png]]&lt;br /&gt;
&lt;br /&gt;
Четыре команды move выполняются одна за одной.&lt;br /&gt;
Затем вьювер натыкается на параметр loop=1 и еще раз выполняет&lt;br /&gt;
это движение с самого начала. Последняя команда move служит для перехода в стартовое состояние&lt;br /&gt;
ожидания клика. &lt;br /&gt;
&lt;br /&gt;
Заметим, что нельзя было для перехода использовать '''wait'''.&lt;br /&gt;
Она, как и остальные команды процессов, запустилась бы параллельно с командами&lt;br /&gt;
и сработала бы сразу. В результате ни какого движения не получилось бы!&lt;br /&gt;
&lt;br /&gt;
Если параметр loop=-1, то движение будет бесконечным. &lt;br /&gt;
Этого же можно было добиться, поставив вместо loop=-1 параметр go с переходом в это же состояние (перезапустить состояние). &lt;br /&gt;
&lt;br /&gt;
=== Управление командами ===&lt;br /&gt;
&lt;br /&gt;
Кроме команды зацикливания данного процесса, можно из одних команд запускать другие (начинать процессы другого типа). Например, пусть жучок движется вправо в течении 1 секунды и вращается 2 секунды.&lt;br /&gt;
Команда move закончится раньше команды rot.&lt;br /&gt;
Пусть затем, закончив полный оборот (на уже остановившемся объекте), он начинает снова двигаться вправо. Реализуется это так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_move_rot.png]]&lt;br /&gt;
&lt;br /&gt;
Команда '''rot''' зациклена (loop=-1). Кроме этого, она имеет параметр move=0&lt;br /&gt;
в котором задается номер команды move которую надо запустить на выполнение после окончания вращения.&lt;br /&gt;
&lt;br /&gt;
Вызов одних команд процессов из других очень мощный, но одновременно и опасный инструмент. &lt;br /&gt;
Множественные вызовы различных команд превращают состояние в спагетти переходов,&lt;br /&gt;
логику которого часто сложно понять. Более того, иногда можно получить зависание вьювера&lt;br /&gt;
при неудачной перекрестной ссылке двух команд друг на друга.&lt;br /&gt;
По этой причине запрещено вызывать из данной команды другие команды этого же типа&lt;br /&gt;
(из rot вызывать rot и т.д.). Однако это, к сожалению, не снимает полностью проблему зависания.&lt;br /&gt;
Так, что готовьтесь...&lt;br /&gt;
&lt;br /&gt;
=== Вращение вокруг пивота ===&lt;br /&gt;
&lt;br /&gt;
При вращении (команда '''rot''') машина вращается вокруг, так называемой,&lt;br /&gt;
'''точки пивота''' (''pivot'' - штырь, болт; опорная точка).&lt;br /&gt;
В примерах выше эта точка находилась в центре картинки.&lt;br /&gt;
Изменим теперь её положение и посмотрим к какому эффекту это приведет.&lt;br /&gt;
&lt;br /&gt;
Откроем редактор ресурсов и в папке этого урока найдем солнышко. &lt;br /&gt;
Сделаем четыре действий:&lt;br /&gt;
# Кликнем на имя солнышка (sun_1) в дереве на левой панели&lt;br /&gt;
# Под этой панелью поставим галочку в чекбоксе ''Edit''.&lt;br /&gt;
# Схватимся мышкой за красный крестик в центре солнышка на правой панели и перетащим этот крестик влево (либо выставить координаты под графой &amp;quot;source:&amp;quot;).&lt;br /&gt;
# Уберем галочку в чекбоксе ''Save''&lt;br /&gt;
800&lt;br /&gt;
[[Файл:Vot-tak-vot.png|800px]]&lt;br /&gt;
Теперь перетащим солнышко на сцену этого урока (лучше для него создать отдельный экран и также закроем базу ресурсов).&lt;br /&gt;
Уменьшим его размеры модификаторами scale x и scale y, поставив там значение 0.5.&lt;br /&gt;
Превратим солнышко в такую машину:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_pivot2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохранив проект и запустив вьювер, мы увидим, что солнышко начало вращаться &lt;br /&gt;
по окружности. Машина по прежнему вращается вокруг точки пивота.&lt;br /&gt;
Однако теперь эта точка смещена в центр окружности.&lt;br /&gt;
&lt;br /&gt;
В качестве упражнения попробуйте организовать вращение, подобное вращению Земли и Луны&lt;br /&gt;
(Земля вращается по окружности, а Луна вращается по окружности меньшего радиуса вокруг Земли).&lt;br /&gt;
Для этого Вам потребуется &amp;quot;Луну&amp;quot; сделать подобъектом &amp;quot;Земли&amp;quot; и правильно выставить&lt;br /&gt;
положение &amp;quot;Луны&amp;quot; относительно &amp;quot;Земли&amp;quot;. &lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:Ok.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Если объект помещен в группу, то координаты его пивота изменяются относительно точки пивота того объекта, чьим подобъектом он является. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Поэкспериментируйте. Можно использовать следующие картинки:&lt;br /&gt;
&lt;br /&gt;
[[файл:eath.png]]  [[файл:moon.png]]&lt;br /&gt;
&lt;br /&gt;
== Как ездят кареты ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Если Вы уже организовали движение Земли и Луны, то сложное движение,&lt;br /&gt;
возникающие при наличие подобъектов, не должно вызывать затруднений.&lt;br /&gt;
В этом примере мы покажем как согласовывать поступательное и &lt;br /&gt;
вращательное движение на примере кареты с двумя колёсами.&lt;br /&gt;
Разместим все три объекта (карету и её два колеса) на сцене&lt;br /&gt;
и сделаем колеса подобъектами кареты.&lt;br /&gt;
Превратим их все в машины состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть при клике на карету она проезжает некоторое расстояние по горизонтали и останавливается.&lt;br /&gt;
Сделайте самостоятельно такую машину и протестируйте её.&lt;br /&gt;
Карета должна перемещаться, а  колеса, являясь её подобъектами, двигаться вместе с ней.&lt;br /&gt;
Однако, они пока не вращаются. Если в ресурсах не окажется колеса и кареты,&lt;br /&gt;
можно загрузить их непосредственно из этого урока:&lt;br /&gt;
&lt;br /&gt;
[[файл:kareta.png]] [[файл:koleso.png]]&lt;br /&gt;
&lt;br /&gt;
=== Немного математики ===&lt;br /&gt;
&lt;br /&gt;
Разберемся как согласовать ''поступательную'' скорость кареты и ''угловую'' скорость вращения колес. Последняя должна быть подобрана таким образом, чтобы движение &lt;br /&gt;
выглядело естественным (колеса не проскальзывали вперед или назад).&lt;br /&gt;
&lt;br /&gt;
Посмотрите на формулы возле рисунка кареты. В первой из них приводится связь длины окружности L колеса и его радиуса r. Ниже - коэффициент 57.3 перевода числа пи из углов в радианы (пи - это 3.1415.. в радианах или 180 градусов). Во второй колонке даны определения поступательной и угловой скорости (изменение расстояния или угла за некоторое время t).  &lt;br /&gt;
Наконец, в третей колонке дана ключевая для нашей задачи формула, связывающая радиус '''r''', линейную '''v''' и угловую скорости '''w'''. Попробуйте её самостоятельно вывести, из предположения, что за одно и тоже время длина смещения кареты должна совпадать с длиной окружности обода колеса.&lt;br /&gt;
При этом поступательная скорость '''v''' измеряется в пикселях за секунду, а угловая скорость '''w''' в градусах за секунду.&lt;br /&gt;
&lt;br /&gt;
=== Машины ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем теперь карету и колеса так, что бы после клика начинала двигаться карета&lt;br /&gt;
и вращаться колеса. Когда карета останавливается, то и колеса должны переставать крутится.&lt;br /&gt;
Колеса сделаем одинаковыми простыми машинами с двумя состояниями, которые назовем '''off''' (неподвижны) и '''on''' (крутятся):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что в состояниях колес нет команды draw, так как колесо всегда рисуется при помощи одной картинки, она берется по умолчанию, из той, которая была перетащена на сцену (свойство '''res''').&lt;br /&gt;
Угловая скорость '''v''' (в формулах она была обозначена как w) в команде rot измеряется в градусах в секунду. Поэтому v=180 означает, что колесо будет делать полный оборот (360 градусов) за 2 секунды.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что раньше вращение мы задавали двумя параметрами: изменением угла '''da''' за время '''t'''. Так как сейчас время вращения колеса не фиксируется (этим занимается карета),&lt;br /&gt;
то указан только один параметр: угловая скорость v.&lt;br /&gt;
&lt;br /&gt;
Так как колеса одинаковые, то имеет смысл создать сначала одно колесо, запрограммировать его, а затем скопировать, получив готовое второе колесо. Его надо будет только затем мышкой перетащить на нужное место.&lt;br /&gt;
Не забываем также переименовать машины (в нашем случае это '''koleso1''' и '''koleso2'''). &lt;br /&gt;
&lt;br /&gt;
Карета должна при клике запускать на вращение колеса (переводя в состояние on),&lt;br /&gt;
а при остановке их останавливать:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Проверьте что параметр v=66 в команде move состояния run кареты, угловая скорость колес v=180 в команде rot состояния on согласуются с радиусом колеса r=21. Радиус колеса равен половине ширины его картинки (свойство &amp;quot;размер&amp;quot;). Если Ваше колесо имеет другой размер, пересчитайте поступательную скорость по приведенной выше формуле.&lt;br /&gt;
&lt;br /&gt;
== Как открыть замок ключом ==&lt;br /&gt;
&lt;br /&gt;
В адвентюрных играх часто используется прием применения предметов.&lt;br /&gt;
При этом один предмет мышкой перетаскивается на другой, в результате&lt;br /&gt;
чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.)&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим простой пример подобного взаимодействия объектов.&lt;br /&gt;
Создайте новый экран и сцену на нём, так как предыдущий экран должен быть уже&lt;br /&gt;
забит различными насекомыми.&lt;br /&gt;
Перетащите на сцену из редактора ресурсов очередного жука, саквояж и ключ.&lt;br /&gt;
Лучше их перетаскивать именно в таком порядке.&lt;br /&gt;
Если порядок получился другой, мышкой в дереве проекта упорядочите&lt;br /&gt;
эти объекты, так  чтобы последовательность рисования была: жук, затем саквояж, затем ключ.&lt;br /&gt;
Расположите эти объекты примерно в центре сцены и сделайте их машинами состояний.&lt;br /&gt;
Поменяйте их имена на '''ladybug''' (божья коровка), '''bag''' (саквояж) и '''key''' (ключ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наша задача состоит в организации взаимодействия ключа, саквояжа и жука при котором,&lt;br /&gt;
работают такие правила:&lt;br /&gt;
* если схватить ключ мышкой, он будет таскаться по сцене в определенных границах;&lt;br /&gt;
* если отпустить ключ над саквояжем, саквояж должен &amp;quot;растаять&amp;quot;, уменьшив свою прозрачность, а ключ уменьшиться в размерах, сжавшись в точку;&lt;br /&gt;
* одновременно с этим, из-под саквояжа начинает вверх бежать жук;&lt;br /&gt;
* когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж.&lt;br /&gt;
&lt;br /&gt;
=== Ключ ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем сначала машину для ключа:&lt;br /&gt;
 &lt;br /&gt;
[[файл:lesson_5_key3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Три состояния соответствуют трём режимам функционирования ключа:&lt;br /&gt;
* '''drag''' - в этом, стартовом состоянии мы таскаем ключ по экрану &lt;br /&gt;
* '''open''' - открываем саквояж и уменьшаемся до 0&lt;br /&gt;
* '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране&lt;br /&gt;
&lt;br /&gt;
Второе состояние состояние '''open''' не должно вызвать особых затруднений.&lt;br /&gt;
В команде '''set''' меняется состояние объекта '''bag''' (саквояж) на open.&lt;br /&gt;
В этот момент саквояж должен изобразить своё открытие.&lt;br /&gt;
В команде процессов '''scale''' происходит за время t=500 миллисекунд уменьшение масштаба рисования&lt;br /&gt;
ключа (его размера) до ''целевых значений'' tx, ty которые выбраны близкими к нулю. &lt;br /&gt;
После этого ключ переходит в третье состояние back.&lt;br /&gt;
&lt;br /&gt;
В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1&lt;br /&gt;
по ширине и высоте. &lt;br /&gt;
Кроме этого появилась новая команда '''init'''. Это команда инициализации&lt;br /&gt;
или переустановки свойств данной машины. В нашем случае, мы меняем её координаты&lt;br /&gt;
на значения x=0 и y=250 пикселей. Как и команда '''set''', команда '''init''' выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции.&lt;br /&gt;
Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250,&lt;br /&gt;
чтобы туда в дальнейшем он и возвращался.&lt;br /&gt;
&lt;br /&gt;
Разберемся теперь с системой координат на сцене. &lt;br /&gt;
&lt;br /&gt;
=== Координаты на сцене ===&lt;br /&gt;
&lt;br /&gt;
Если сцена создавалась по умолчанию, то она имеет ширину 960 пикселей,&lt;br /&gt;
а высоту - 640. Начало отсчёта координат на сцене расположено в её центре.&lt;br /&gt;
Ось x, по которой откладывается горизонтальная координата объекта направлена вправо,&lt;br /&gt;
а ось Y для вертикальной координаты - вниз: &lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key2.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Стоит раскрыть координаты любого объекта (свойство положение) на панели Properties.&lt;br /&gt;
Затем потаскать объект по сцене, наблюдая как эти координаты меняются.&lt;br /&gt;
Если '''x''' стало отрицательным, значит объект находится левее центра сцены.&lt;br /&gt;
Если же отрицательный '''y''', то объект расположен выше центра.&lt;br /&gt;
&lt;br /&gt;
Заметим, что координата объекта определяется его точкой пивота.&lt;br /&gt;
Для трех объектов, находящихся сейчас на сцене точка пивота должна&lt;br /&gt;
совпадать с центрами картинок.&lt;br /&gt;
&lt;br /&gt;
Таким образом, когда мы задали в команде init положение для ключа x=0, y=250,&lt;br /&gt;
мы поместили его по середине, в нижней части сцены.&lt;br /&gt;
&lt;br /&gt;
=== Драг энд дроп ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key3_drag.png|right]]&lt;br /&gt;
Осталось разобраться с ещё двумя новыми командами,&lt;br /&gt;
которые появились в состоянии drag.&lt;br /&gt;
Первая команда '''drag''' (таскать) означает, что данную машину в этом состоянии&lt;br /&gt;
разрешено мышкой таскать по экрану.&lt;br /&gt;
При этом могут быть заданы координаты области за которую объект вытащить нельзя.&lt;br /&gt;
Эта область определяется двумя точками - верхним левым углом с координатами (x1,y1)&lt;br /&gt;
и правым нижним углом с координатами (x2,y2).&lt;br /&gt;
&lt;br /&gt;
В нашем случае эти точки почти совпадают с углами сцены.&lt;br /&gt;
На самом деле область разрешенного таскания чуть меньше размера сцены.&lt;br /&gt;
Сделано это для того, чтобы ключ нельзя было даже краешком вытащить за сцену.&lt;br /&gt;
Правый нижний угол сцены имеет координаты (x2, y2)=(480, 320)=(960/2, 640/2).&lt;br /&gt;
Ширина ключа 128 пикселей (см. свойство размер).&lt;br /&gt;
Поэтому, чтобы правая сторона ключа не выехала за сцену, для координаты y1&lt;br /&gt;
мы берем значение 416 = 480-128/2 (сужаем границу таскания на половину ширины ключа). Аналогично считаются остальные координаты области разрешенного таскания.&lt;br /&gt;
&lt;br /&gt;
Наконец, команда '''drop''' (бросить), регулирует, что должно произойти при бросании ключа&lt;br /&gt;
(отпускания мышки) если оно произошло на объекте '''obj'''.&lt;br /&gt;
В данном случае происходит переход в новое состояние (поле '''go''').&lt;br /&gt;
&lt;br /&gt;
=== Саквояж и жук ===&lt;br /&gt;
&lt;br /&gt;
Создадим теперь машину для саквояжа.&lt;br /&gt;
Она будет иметь два состояния open и close:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В состоянии close в команде '''init''' саквояж переустанавливает свою прозрачность в единичное значение (непрозрачен) al=1.00. Это необходимо, что бы появиться на экране после исчезновения.&lt;br /&gt;
Сам процесс исчезновения задается командой процесса '''alpha''' в состоянии open.&lt;br /&gt;
Эта команда меняет текущую прозрачность объекта до целевого значения ta=0 (полностью прозрачен) за время t=500 миллисекунд (пол секунды).&lt;br /&gt;
Кроме этого в этом состоянии меняется состояние жука (команда '''set'''), который должен из под саквояжа начать бежать.&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!''' Если в параметре '''ta''' команды '''alpha''' установлено значение 0, то, помимо того что объект станет полностью прозрачен, стоить иметь ввиду, что он также станет невосприимчив к кликам. Для того, чтобы прозрачный объект считывал клики, стоит задать для '''ta''' следующее значение '''ta=0.02'''&lt;br /&gt;
&lt;br /&gt;
Осталось создать два состояния для жука, который будет выбегать из под саквояжа.&lt;br /&gt;
Ничего сложного в его поведении нет:&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[файл:lesson_5_key5.png]]&lt;br /&gt;
&lt;br /&gt;
Теперь самое время протестировать результат наших действий.&lt;br /&gt;
Потаскайте сначала ключ по сцене, убедившись, что он за неё не входит.&lt;br /&gt;
Затем наведите ключом на саквояж и отпустите мышку. &lt;br /&gt;
Всё должно прийти в движение.&lt;br /&gt;
Включите отладку (кнопка S и потом кнопка C) и понаблюдайте как изменяются состояния объектов.&lt;br /&gt;
В момент выполнения процессов можно несколько раз понажимать на пробел,&lt;br /&gt;
чтобы приостановить их выполнение и запустить снова.&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Мы разобрали много команд и их параметров.&lt;br /&gt;
Однако это далеко не все возможности машин состояний.&lt;br /&gt;
Стоит прочитать документ [[Machine]] в котором описан весь язык машин.&lt;br /&gt;
Чем больше Вы создадите машин с различным поведением, тем увереннее будете с ними работать.&lt;br /&gt;
&lt;br /&gt;
В заключение приведем несколько общих советов:&lt;br /&gt;
* Проектируйте сначала логику поведения машин на бумаге.&lt;br /&gt;
* Давайте осмысленные названия для машин и их состояний.&lt;br /&gt;
* Обязательно документируйте машины, описывая их поведение на естественном языке.&lt;br /&gt;
* Копируйте однотипные машины для сокращения времени по их программированию.&lt;br /&gt;
* При сложном взаимодействии нескольких машин, вводите управляющую машину (возможно невидимую), в которой концентрируйте основную логику поведения.    &lt;br /&gt;
* Не увлекайтесь длинными состояниями с множеством команд процессов. Иногда поведение становится понятнее, если состояние разбить на несколько последовательных состояний. &lt;br /&gt;
* Смело спрашивайте совета у более опытных дизайнеров. Они в своё время поступали именно так.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* создайте движение Земли по окружности, а Луны также по окружности, но вокруг Земли;&lt;br /&gt;
* сделайте движение кареты бесконечным так, что после того как она уезжает за правый край экрана, она появлялась из-за левого края; &lt;br /&gt;
* заставьте жука начинать бежать, только когда саквояж полностью уменьшится (set на выходе из состояния).&lt;br /&gt;
* организуйте так, чтобы при перетаскивании ключа в область саквояжа, жук развернулся на 180 градусов и двигался вниз, обратно под саквояж.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10047</id>
		<title>Работа с эффектами</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=10047"/>
		<updated>2021-08-05T12:33:55Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Партиклы (Particles) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить возможности редактора на примере применения различных эффектов.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:'''&lt;br /&gt;
* Создать экран, на котором можно освоить работу с патиклами (объект flyer) и масками ;&lt;br /&gt;
* Создать экран и настроить просмотр Видео&lt;br /&gt;
* Настроить появление сцены с проявлением по альфе, переходить на следующий экран с проявлением по альфе&lt;br /&gt;
* Настроить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
== Партиклы (Particles) ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → lessons.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.3, создать экран Lesson_09.&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_09 создать новую сцену 09, в которую (через Resources Editor) добавить графические ресурсы из папки Sources\Lesson_09 (см. подготовка к работе «Создание проекта»).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_1.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
'''Настройка объектов, работа с маской'''&lt;br /&gt;
&lt;br /&gt;
В этом уроке поработаем над использованием объекта flyer (Particles). Параллельно с этим научимся пользоваться хитрым приемом &amp;quot;маска&amp;quot;. В редактор ресурсов вы подгрузили уже знакомую вам графику &amp;quot;лунного пейзажа&amp;quot; и две части слоненка. &lt;br /&gt;
&lt;br /&gt;
1. Разместим их на сцене как показано на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_2.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Сделаем из головы слоненка машину состояний. Голова должна вертеться из стороны в сторону с интервалом в 1 секунду. Запишем в состояниях машины следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_3.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
3. Посмотрите результат с помощью программы viewer. Слоненок будет мотать головой.&lt;br /&gt;
&lt;br /&gt;
4. Теперь мы хотим, чтобы клик на слоненка вызывал какое-то действие, например, чтобы шел снег. Можно сделать из туловища машину состояний, но туловище маленькое, а нам нужен именно весь слоненок. Для этого нам понадобится маска. Из редактора ресурсов перетащим на сцену графический ресурс mask и переместим ее на слоненка. Маска очень маленькая, чтобы закрывать всего слоненка, поэтому воспользуемся модификаторами. Увеличим маску и сделаем ей прозрачность (alpha) 0,01.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_4.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
На сцене вы можете увидеть вокруг слоненка рамку от маски. Саму маску не видно из-за прозрачности. Стоит обратить внимание на то, что прозрачность мы сделали 0,01. Если бы она была равна 0, то маска не воспринимала бы клик, а была бы полностью прозрачной.&lt;br /&gt;
&lt;br /&gt;
5. Как вы уже догадались, маска у нас будет машиной состояний, включающей другой объект. Этим другим объектом будет flyer. Флаеры (патиклы) используются для создания эффектов, когда один маленький объект размножается и совершает какие-либо действия, при этом все его частички ведут себя подобно.&lt;br /&gt;
&lt;br /&gt;
Перетащим из редактора ресурсов на сцену графический ресурс snow и разместим его на сцене посередине по оси x (x=0) и вверху, немного за сценой (y=-320). Сделайте объекту тип flyer.&lt;br /&gt;
&lt;br /&gt;
6. Параметры флаера настроим немного позже, а сейчас вернемся к нашей маске. Сделайте маске тип machine. И введите следующие параметры.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_5.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
В первом состоянии (начальном) машина передает объекту snow состояние end, а во втором - beg. У флаера есть два состояния end и beg, в которых он выключен и включен соответственно. Чтобы без нашего желания флаер не запускался, в свойствах snow в поле &amp;quot;состояние&amp;quot; запишем его начальное состояние end.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
Подробно о свойствах флаера можно почитать [[Flyer|тут]]. Для того чтобы из него получился снег запишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:snow_fl.png]]&lt;br /&gt;
&lt;br /&gt;
7. Сохраните проект и проверьте его выполнение в программе viewer. При клике на слоненка начинает идти снег, а при повторном клике снег исчезает.&lt;br /&gt;
&lt;br /&gt;
8. Следующей нашей задачей будет создание разлетающегося кольца из звездочек вокруг желтой звезды на сцене, при клике на эту звезду. Представьте, что эта сцена у вас сейчас на экране мобильного телефона, а вам нужно дотронуться до звезды. Звезда очень маленькая, как следствие - по ней трудно попасть. Здесь нам на помощь опять явится маска. Снова перетащите ресурс mask на сцену из редактора ресурсов, переименуйте его в star_mask и поместите точно над звездой.&lt;br /&gt;
&lt;br /&gt;
9. Растягивать маску не нужно, она таких размеров, как нам нужно. В свойствах star_mask в модификаторах задайте alpha=0,01.&lt;br /&gt;
&lt;br /&gt;
10. Добавьте на сцену ресурс star из редактора ресурсов и поместите его точно на звезду.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_8.jpg]]&lt;br /&gt;
&lt;br /&gt;
11. Объекту star_mask нужно изменить тип на machine, а объекту star на flyer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
12. Задайте машине star_mask следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
13. Флаеру star пропишите следующие свойства.&lt;br /&gt;
&lt;br /&gt;
[[Файл:star_fl.png]]&lt;br /&gt;
&lt;br /&gt;
14. Сохраните проект и проверьте его выполнение в программе viewer. При клике на звезду флаер будет вести себя как взрыв сверхновой (или салют).&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_09, создать новый экран Lesson_09.1&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием .&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 09 (экрана Lesson_09).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену (экрана Lesson_09.1).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) снег шел при клике на любую область экрана;&lt;br /&gt;
b) изменить параметры флаера snow таким образом, чтобы он выглядел как дождь;&lt;br /&gt;
с) поиграйтесь с параметрами флаера, чтобы прочувствовать зависимость поведения флаера от его параметров;&lt;br /&gt;
&lt;br /&gt;
== Использование Видео ==&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
1. Создайте еще один экран Lesson_9.2 после экрана Lesson_9.1.&lt;br /&gt;
&lt;br /&gt;
2. Добавьте сцену 09.&lt;br /&gt;
&lt;br /&gt;
3. Загрузите на сцену ресурсы к этому уроку из редактора ресурсов (bg, play).&lt;br /&gt;
&lt;br /&gt;
'''Создание экрана и сцены в игровом проекте'''&lt;br /&gt;
&lt;br /&gt;
'''''Если, в базе ресурсов урока, видео отсутствует, скачайте или добавьте любое, которое вам понравится(только без произвола).'''''&lt;br /&gt;
&lt;br /&gt;
1. Создайте на сцене новый объект и сделайте ему тип video. Переименуйте его в video.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
2. Из ресурса play сделайте машину состояний. Пропишите машине следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_13.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Объекту video выставляем следующие параметры. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_14.jpg]]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что id видео перетаскивается мышкой из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
4. Сохраните проект и посмотрите результат в программе viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!'''&lt;br /&gt;
В более новой версии движка, окно свойств объекта выглядит так :&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_9_0_new_ui_screen.png]]&lt;br /&gt;
&lt;br /&gt;
Стоит учесть, что объект Video принимает видео(извините за тавтологию) определенного формата - '''*.ogv'''&lt;br /&gt;
Также есть поддержка формата '''*.webm'''&lt;br /&gt;
&lt;br /&gt;
Если видео без альфа-канала (прямоугольное и не содержит в себе прозрачности), то используется 1 файл, id которого нужно перетащить из базы ресурсов в поле '''id видео RGB'''.&lt;br /&gt;
&lt;br /&gt;
Если видео с альфа-каналом, то дополнительно используется '''id видео Alpha'''.&lt;br /&gt;
&lt;br /&gt;
== Звуки ==&lt;br /&gt;
 &lt;br /&gt;
Для того, чтобы игра была веселее и живее в редакторе предусмотрена возможность использовать звуки. В этом уроке мы научимся ставить фоновую музыку.&lt;br /&gt;
&lt;br /&gt;
1. Вернитесь к экрану Lesson_09.&lt;br /&gt;
&lt;br /&gt;
2. Создайте на сцене 09 новый объект и назовите его music.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_12.jpg]]&lt;br /&gt;
&lt;br /&gt;
3. Сделайте из объекта music машину состояний и пропишите следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson9_15.jpg]]&lt;br /&gt;
&lt;br /&gt;
Согласно этих состояний, сразу после запуска экрана начинает играть музыка music_gaming_04. Через 60 секунд после начала машина идет в состояние stop, где дается команда mus_stop и проигрывание музыки останавливается. Музыку можно не останавливать, тогда она будет играть по кругу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) после остановки проигрывания музыки можно кликом на слоненка снова ее запустить;&lt;br /&gt;
&lt;br /&gt;
b) чтобы музыка останавливалась кликом на слоненка.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Настройка миниигр|Урок 8]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Экспорт, импорт и релиз проекта|Урок 10]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_fl.png&amp;diff=10046</id>
		<title>Файл:Star fl.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Star_fl.png&amp;diff=10046"/>
		<updated>2021-08-05T12:32:47Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Snow_fl.png&amp;diff=10045</id>
		<title>Файл:Snow fl.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Snow_fl.png&amp;diff=10045"/>
		<updated>2021-08-05T12:28:21Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10044</id>
		<title>Настройка миниигр</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10044"/>
		<updated>2021-08-05T12:15:48Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка объектов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить настройки объектов, реализующих различные минигры.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Puzzle&lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Patchwork &lt;br /&gt;
&lt;br /&gt;
== Puzzle ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
Запускаем SceneEditor. Открываем наш учебный проект lessons.seproj.&lt;br /&gt;
&lt;br /&gt;
Создаём экран lesson_8, а в нём сцены 08 и Buttons (стараемся делать это по памяти или подсматриваем в прошлых уроках), куда добавляем необходимые графические ресурсы из папки этого урока в Resources Editor: в экран 08 отправляем картинку level_01 (наш будущий пазл), а в Buttons (думаю, уже догадались) - будущие кнопки - hint_normal и ico_r_normal2. &lt;br /&gt;
&lt;br /&gt;
На экране кнопочкам подбираем симпатичное и удобное расположение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:801.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов, создание машин состояний ===&lt;br /&gt;
	&lt;br /&gt;
Меняем тип картинки '''level_01''' с '''image''' на [[Puzzle|puzzle]] (в папке Game mechanic) и устанавливаем следующие настройки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:802.png]]&lt;br /&gt;
&lt;br /&gt;
В сцене '''08''' создаём ещё один объект. Даём ему имя '''applause''', тип '''machine''' (прописываем 3 состояния '''init''', '''on''' и '''off'''). &lt;br /&gt;
&lt;br /&gt;
В состоянии '''on''' добавляем команду '''play''' (проиграть звук) и в списке выбираем '''snd''' (короткий звук), который подгружаем с помощью базы ресурсов (если подходящего звукового файла в уроке не обнаружилось, его необходимо добавить самостоятельно; при добавлении звука в базу ресурсов, ее нужно сохранить и переоткрыть).Также добавляем команду '''wait''' &lt;br /&gt;
&lt;br /&gt;
Возвращаемся к общим настройкам  и устанавливаем стартовое состояние '''init'''.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo11.png]]&lt;br /&gt;
&lt;br /&gt;
Переходим к сцене '''Buttons''' и меняем тип обоих графических файлов на '''button'''. Общий вид лейаута на этом этапе получится примерно следующий:&lt;br /&gt;
&lt;br /&gt;
[[Файл:804.png]]  &lt;br /&gt;
&lt;br /&gt;
В настройках кнопок перетянем из базы ресурсов картинки с внешним видом нажатых и отжатых кнопок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:805.png]] &lt;br /&gt;
&lt;br /&gt;
Кнопка '''ico_R_normal2''' (переиграть) — кнопка, запускающая игру Puzzle сначала. &lt;br /&gt;
&lt;br /&gt;
Нам необходимо, чтобы кнопка '''ico_R_normal2''' перемешивала части нашего пазла. Для этого в настройках кликаем правой кнопкой мыши и выбираем '''клик:изменить состояние объекта'''. В появившейся в настройках вкладке выбираем в качестве объекта наш пазл ('''level_01''') и состояние '''mix''', которое перемешает части исходной картинки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:806.png]] &lt;br /&gt;
	&lt;br /&gt;
Пусть кнопка '''hint_normal''' (подсказка) по клику показывает нам картинку в собранном виде. Для этого повторяем процедуру с добавлением настройки '''клик:изменить состояние объекта''', только теперь для кнопки '''hint_normal'''. Выбираем объектом наш '''level_01''' и состояние для него '''hint'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Если возникает необходимость добавить 2 и более настройки при помощи правой кнопки мыши, &lt;br /&gt;
то лучше из кнопки сделать машину состояний и все состояния создать уже там.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любуемся результатом своих стараний, сохранив проект и запустив его с помощью Viewer`а.&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
Копируем экран '''lesson_8''' и переименовываем его в '''lesson_8_1''', а сцену '''08''' в '''08_01'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:807.png]]&lt;br /&gt;
&lt;br /&gt;
В новом экране вносим все изменения самостоятельно. Необходимо:&lt;br /&gt;
&lt;br /&gt;
a) добавить другой аудиофайл, имеющимся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;&lt;br /&gt;
&lt;br /&gt;
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Store ===&lt;br /&gt;
&lt;br /&gt;
В реальной игре нам может понадобиться счётчик подсказок, который даёт возможность совершать покупки подсказок за реальные деньги. Для его реализации необходим объект '''[[Store|Store]]'''.&lt;br /&gt;
&lt;br /&gt;
Создадим новый экран '''lesson_8_1_1'''. Добавим в него сцены '''08_1''' и '''Button_8_1'''. В сцену '''08_1''' поместим из экрана '''lesson_8_1''' объекты  '''level_01''' и '''applause''', оставим их без изменения. &lt;br /&gt;
&lt;br /&gt;
В сцену '''Button_8_1''' скопируем из '''lesson_08_1''' кнопки '''hint_normal''' и '''ico_R_normal2''' и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и назовём его '''hint'''. Добавим ресурс из базы ресурсов – анимацию c цифрами из прошлого урока. Счётчик '''hint''' будет считывать купленные подсказки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:808.png]]&lt;br /&gt;
&lt;br /&gt;
В  '''hint_normal''' добавим подобъект, сделаем его машиной и назовем '''hint_m'''.&lt;br /&gt;
&lt;br /&gt;
Щёлкнув правой кнопкой мыши на сцену  '''Button_8_1''' создадим новые сцены '''store''' и '''error''', которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.&lt;br /&gt;
&lt;br /&gt;
В сцену  store добавим две машины:  '''buy''' и '''store'''; в  error - машину  '''error'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:809.PNG]]&lt;br /&gt;
&lt;br /&gt;
В машине '''store''' зададим считывания со счётчика и прозрачность экрана:&lt;br /&gt;
&lt;br /&gt;
[[Файл:810.png]]&lt;br /&gt;
&lt;br /&gt;
Машина '''error''' будет отвечать за вывод ошибки при неудачной покупке, то есть задаёт прозрачность экрана с ошибкой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:811.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для машины '''buy''' зададим состояния, при которых она начисляет купленную подсказку либо вызывает окно ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:812.PNG]]&lt;br /&gt;
&lt;br /&gt;
Вернёмся к машине '''hint_m''' сцены '''Button_8_1''' и пропишем для неё состояния. Машина отвечает за начисление подсказки при удачной покупке&lt;br /&gt;
&lt;br /&gt;
[[Файл:813.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы вызывать машину '''hint_m''' в нашей игре, откроем кнопку '''hint_normal''' и в добавляемом свойстве '''изменить состояние объекта''' в качестве объекта выберем машину '''hint_m''', и пропишем ей состояние '''check'''.&lt;br /&gt;
&lt;br /&gt;
'''Совершение покупки (настройка Store)'''&lt;br /&gt;
&lt;br /&gt;
Для того чтобы покупку можно было совершить, необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store (в папке Options).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Store в проекте может быть только один.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:814.PNG]]&lt;br /&gt;
&lt;br /&gt;
Дважды клацнув на объект (так же, как на машину состояний), мы попадаем в окно настроек '''store'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:815.PNG]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на плюсик и создаём покупку. Вводим для неё id и изменяем указанные настройки, как на картинке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo12.png]]&lt;br /&gt;
&lt;br /&gt;
И тут должен возникнуть вопрос. Почему среди перечня доступных объектов нет необходимого нам '''buy'''? Прежде чем читать дальше, предлагаю попробовать найти ответ на этот вопрос самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для удобства использования, а также во избежание различных ошибок, в объектах экрана можно обращаться только к объектам этого же экрана. Исключением будут объекты глобальных экранов (вспоминаем прошлые уроки и смотрим на наш глобальный экран '''opt'''). &lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы получить доступ к объекту '''buy''', мы временно делаем экран '''lesson_8_1_1''' глобальным и завершаем настройку объекта '''store'''. Позже, на этапе проверки при помощи Viewer`а можем поэкспериментировать и проверить, будет ли работать проект корректно, когда мы в настройках глобальности экрана '''lesson_8_1_1''' снова поставим '''нет'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Когда мы обращаемся к объекту, то в layout.xml &lt;br /&gt;
прописывается ссылка на этот объект в виде его id.&lt;br /&gt;
Когда убираем глобальность экрана и делаем его снова обычным, &lt;br /&gt;
выбранный объект мы в редакторе больше не видим, &lt;br /&gt;
но его id в лэйауте всё равно остаётся.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Store'''&lt;br /&gt;
&lt;br /&gt;
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.&lt;br /&gt;
&lt;br /&gt;
Основные параметры объекта Store&lt;br /&gt;
&lt;br /&gt;
''id покупки'' – внутренний id покупки.&lt;br /&gt;
&lt;br /&gt;
''расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда; если параметр не указан, по-умолчанию покупка – одноразовая.&lt;br /&gt;
&lt;br /&gt;
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.&lt;br /&gt;
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.&lt;br /&gt;
&lt;br /&gt;
'''Для того, чтобы объект Store работал во Viewer, необходимо подкорректировать файл app.icf'''&lt;br /&gt;
&lt;br /&gt;
1. Найти файл app.icf в папке с вашим проектом.&lt;br /&gt;
&lt;br /&gt;
2. Открыть его и найти тег [Game].&lt;br /&gt;
&lt;br /&gt;
3. В теге Game добавить строку purchaseEverything=1.&lt;br /&gt;
&lt;br /&gt;
4. Сохранить файл&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Game]&lt;br /&gt;
purchaseEverything=1&lt;br /&gt;
DispFixRot=&amp;quot;Landscape&amp;quot;&lt;br /&gt;
# comments and whitespace stripped by deployment tool&lt;br /&gt;
debug=&amp;quot;Absolutist-2253&amp;quot;&lt;br /&gt;
show_build_date=1&lt;br /&gt;
AppTitle=&amp;quot;Viewer&amp;quot;&lt;br /&gt;
DebuggerIP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
DebuggerPort=5322&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оформление'''&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём к оформлению. Для того чтобы на экране появлялось окно с предложением о покупке подсказки, необходимо его создать. В начальный момент окно должно быть невидимым и прокликиваем, это состояние задано в машине '''store'''. Создадим в ней 5 подобъектов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.&lt;br /&gt;
&lt;br /&gt;
Откроем объект  '''black''', пропишем ему свойства, оставив пустой рамку, цвет фона – чёрный.&lt;br /&gt;
&lt;br /&gt;
Для объекта '''rec''' зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке. Чтобы прямоугольник отображался правильно, задайте ему ненулевые размеры. Настройки '''rec''' (имена файлов могут отличаться):&lt;br /&gt;
&lt;br /&gt;
[[Файл:817.PNG]]&lt;br /&gt;
&lt;br /&gt;
Третьему элементу поменяем тип на '''text''' с текстом &amp;quot;Купить подсказку?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Четвёртый объект сделаем машиной и назовём её '''ok'''. Она будет в глазах пользователя совершать покупку. Для внешнего вида машины в '''res''' перетянем изображение зелёного света светофора из 4 урока. В модификаторах можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
Опишем следующие состояния машины:&lt;br /&gt;
&lt;br /&gt;
[[Файл:818.PNG]]&lt;br /&gt;
&lt;br /&gt;
Все действия, связанные с совершением и провалом покупки, управляемые этой машиной, мы уже указали в '''store'''.&lt;br /&gt;
&lt;br /&gt;
Пятый объект будет кнопкой '''no'''. Она по клику изменяет состояние ('''close''') объекта ('''store'''). Для внешнего вида кнопки в '''res''' перетянем изображение красного света светофора из 4 урока. В модификаторах тоже можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
&lt;br /&gt;
Так же поступим со сценой '''error'''. В ней создадим четыре объекта: два '''rectangle''': '''rec_error''' – пустой, '''black_error''' — их можно скопировать из предыдущей сцены; кнопку '''buy''', которая будет переводить '''error''' в состояние '''i'''; текстовый объект '''text_error''' с текстом «error!». Общий вид этого задания в лейауте примерно следующий:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:819.PNG]]&lt;br /&gt;
&lt;br /&gt;
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим Viewer. Сейчас при покупке подсказки количество покупок не имеет лимита (благодаря нашим изменениям в '''app.icf'''), поэтому вывод ошибки мы не получим.&lt;br /&gt;
&lt;br /&gt;
== Patchwork ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → Learning.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_1.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.&lt;br /&gt;
&lt;br /&gt;
Если в папке урока отсутствует изображение panel_down, то скачать любое изображение боковой панели самостоятельно и использовать ее в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов ===&lt;br /&gt;
&lt;br /&gt;
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем &amp;quot;Создать объект в текущем элементе&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Переименуем один из созданных объектов в Patchwork, а другой в table.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_4.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.&lt;br /&gt;
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 0х0 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле &amp;quot;перейти на экран&amp;quot; укажите текущий экран Lesson_8.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:правка_намба_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для таблицы измените следующие параметры&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson8_table_setup.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля &amp;quot;карт.спереди&amp;quot; и &amp;quot;шаблон&amp;quot; заполняются перетаскиванием графического ресурса из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8.3.Fin.png]]&lt;br /&gt;
&lt;br /&gt;
===  Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием game.&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10043</id>
		<title>Настройка миниигр</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10043"/>
		<updated>2021-08-05T12:11:48Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Упражнения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить настройки объектов, реализующих различные минигры.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Puzzle&lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Patchwork &lt;br /&gt;
&lt;br /&gt;
== Puzzle ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
Запускаем SceneEditor. Открываем наш учебный проект lessons.seproj.&lt;br /&gt;
&lt;br /&gt;
Создаём экран lesson_8, а в нём сцены 08 и Buttons (стараемся делать это по памяти или подсматриваем в прошлых уроках), куда добавляем необходимые графические ресурсы из папки этого урока в Resources Editor: в экран 08 отправляем картинку level_01 (наш будущий пазл), а в Buttons (думаю, уже догадались) - будущие кнопки - hint_normal и ico_r_normal2. &lt;br /&gt;
&lt;br /&gt;
На экране кнопочкам подбираем симпатичное и удобное расположение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:801.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов, создание машин состояний ===&lt;br /&gt;
	&lt;br /&gt;
Меняем тип картинки '''level_01''' с '''image''' на [[Puzzle|puzzle]] (в папке Game mechanic) и устанавливаем следующие настройки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:802.png]]&lt;br /&gt;
&lt;br /&gt;
В сцене '''08''' создаём ещё один объект. Даём ему имя '''applause''', тип '''machine''' (прописываем 3 состояния '''init''', '''on''' и '''off'''). &lt;br /&gt;
&lt;br /&gt;
В состоянии '''on''' добавляем команду '''play''' (проиграть звук) и в списке выбираем '''snd''' (короткий звук), который подгружаем с помощью базы ресурсов (если подходящего звукового файла в уроке не обнаружилось, его необходимо добавить самостоятельно; при добавлении звука в базу ресурсов, ее нужно сохранить и переоткрыть).Также добавляем команду '''wait''' &lt;br /&gt;
&lt;br /&gt;
Возвращаемся к общим настройкам  и устанавливаем стартовое состояние '''init'''.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo11.png]]&lt;br /&gt;
&lt;br /&gt;
Переходим к сцене '''Buttons''' и меняем тип обоих графических файлов на '''button'''. Общий вид лейаута на этом этапе получится примерно следующий:&lt;br /&gt;
&lt;br /&gt;
[[Файл:804.png]]  &lt;br /&gt;
&lt;br /&gt;
В настройках кнопок перетянем из базы ресурсов картинки с внешним видом нажатых и отжатых кнопок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:805.png]] &lt;br /&gt;
&lt;br /&gt;
Кнопка '''ico_R_normal2''' (переиграть) — кнопка, запускающая игру Puzzle сначала. &lt;br /&gt;
&lt;br /&gt;
Нам необходимо, чтобы кнопка '''ico_R_normal2''' перемешивала части нашего пазла. Для этого в настройках кликаем правой кнопкой мыши и выбираем '''клик:изменить состояние объекта'''. В появившейся в настройках вкладке выбираем в качестве объекта наш пазл ('''level_01''') и состояние '''mix''', которое перемешает части исходной картинки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:806.png]] &lt;br /&gt;
	&lt;br /&gt;
Пусть кнопка '''hint_normal''' (подсказка) по клику показывает нам картинку в собранном виде. Для этого повторяем процедуру с добавлением настройки '''клик:изменить состояние объекта''', только теперь для кнопки '''hint_normal'''. Выбираем объектом наш '''level_01''' и состояние для него '''hint'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Если возникает необходимость добавить 2 и более настройки при помощи правой кнопки мыши, &lt;br /&gt;
то лучше из кнопки сделать машину состояний и все состояния создать уже там.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любуемся результатом своих стараний, сохранив проект и запустив его с помощью Viewer`а.&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
Копируем экран '''lesson_8''' и переименовываем его в '''lesson_8_1''', а сцену '''08''' в '''08_01'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:807.png]]&lt;br /&gt;
&lt;br /&gt;
В новом экране вносим все изменения самостоятельно. Необходимо:&lt;br /&gt;
&lt;br /&gt;
a) добавить другой аудиофайл, имеющимся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;&lt;br /&gt;
&lt;br /&gt;
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Store ===&lt;br /&gt;
&lt;br /&gt;
В реальной игре нам может понадобиться счётчик подсказок, который даёт возможность совершать покупки подсказок за реальные деньги. Для его реализации необходим объект '''[[Store|Store]]'''.&lt;br /&gt;
&lt;br /&gt;
Создадим новый экран '''lesson_8_1_1'''. Добавим в него сцены '''08_1''' и '''Button_8_1'''. В сцену '''08_1''' поместим из экрана '''lesson_8_1''' объекты  '''level_01''' и '''applause''', оставим их без изменения. &lt;br /&gt;
&lt;br /&gt;
В сцену '''Button_8_1''' скопируем из '''lesson_08_1''' кнопки '''hint_normal''' и '''ico_R_normal2''' и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и назовём его '''hint'''. Добавим ресурс из базы ресурсов – анимацию c цифрами из прошлого урока. Счётчик '''hint''' будет считывать купленные подсказки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:808.png]]&lt;br /&gt;
&lt;br /&gt;
В  '''hint_normal''' добавим подобъект, сделаем его машиной и назовем '''hint_m'''.&lt;br /&gt;
&lt;br /&gt;
Щёлкнув правой кнопкой мыши на сцену  '''Button_8_1''' создадим новые сцены '''store''' и '''error''', которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.&lt;br /&gt;
&lt;br /&gt;
В сцену  store добавим две машины:  '''buy''' и '''store'''; в  error - машину  '''error'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:809.PNG]]&lt;br /&gt;
&lt;br /&gt;
В машине '''store''' зададим считывания со счётчика и прозрачность экрана:&lt;br /&gt;
&lt;br /&gt;
[[Файл:810.png]]&lt;br /&gt;
&lt;br /&gt;
Машина '''error''' будет отвечать за вывод ошибки при неудачной покупке, то есть задаёт прозрачность экрана с ошибкой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:811.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для машины '''buy''' зададим состояния, при которых она начисляет купленную подсказку либо вызывает окно ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:812.PNG]]&lt;br /&gt;
&lt;br /&gt;
Вернёмся к машине '''hint_m''' сцены '''Button_8_1''' и пропишем для неё состояния. Машина отвечает за начисление подсказки при удачной покупке&lt;br /&gt;
&lt;br /&gt;
[[Файл:813.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы вызывать машину '''hint_m''' в нашей игре, откроем кнопку '''hint_normal''' и в добавляемом свойстве '''изменить состояние объекта''' в качестве объекта выберем машину '''hint_m''', и пропишем ей состояние '''check'''.&lt;br /&gt;
&lt;br /&gt;
'''Совершение покупки (настройка Store)'''&lt;br /&gt;
&lt;br /&gt;
Для того чтобы покупку можно было совершить, необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store (в папке Options).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Store в проекте может быть только один.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:814.PNG]]&lt;br /&gt;
&lt;br /&gt;
Дважды клацнув на объект (так же, как на машину состояний), мы попадаем в окно настроек '''store'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:815.PNG]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на плюсик и создаём покупку. Вводим для неё id и изменяем указанные настройки, как на картинке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo12.png]]&lt;br /&gt;
&lt;br /&gt;
И тут должен возникнуть вопрос. Почему среди перечня доступных объектов нет необходимого нам '''buy'''? Прежде чем читать дальше, предлагаю попробовать найти ответ на этот вопрос самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для удобства использования, а также во избежание различных ошибок, в объектах экрана можно обращаться только к объектам этого же экрана. Исключением будут объекты глобальных экранов (вспоминаем прошлые уроки и смотрим на наш глобальный экран '''opt'''). &lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы получить доступ к объекту '''buy''', мы временно делаем экран '''lesson_8_1_1''' глобальным и завершаем настройку объекта '''store'''. Позже, на этапе проверки при помощи Viewer`а можем поэкспериментировать и проверить, будет ли работать проект корректно, когда мы в настройках глобальности экрана '''lesson_8_1_1''' снова поставим '''нет'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Когда мы обращаемся к объекту, то в layout.xml &lt;br /&gt;
прописывается ссылка на этот объект в виде его id.&lt;br /&gt;
Когда убираем глобальность экрана и делаем его снова обычным, &lt;br /&gt;
выбранный объект мы в редакторе больше не видим, &lt;br /&gt;
но его id в лэйауте всё равно остаётся.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Store'''&lt;br /&gt;
&lt;br /&gt;
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.&lt;br /&gt;
&lt;br /&gt;
Основные параметры объекта Store&lt;br /&gt;
&lt;br /&gt;
''id покупки'' – внутренний id покупки.&lt;br /&gt;
&lt;br /&gt;
''расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда; если параметр не указан, по-умолчанию покупка – одноразовая.&lt;br /&gt;
&lt;br /&gt;
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.&lt;br /&gt;
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.&lt;br /&gt;
&lt;br /&gt;
'''Для того, чтобы объект Store работал во Viewer, необходимо подкорректировать файл app.icf'''&lt;br /&gt;
&lt;br /&gt;
1. Найти файл app.icf в папке с вашим проектом.&lt;br /&gt;
&lt;br /&gt;
2. Открыть его и найти тег [Game].&lt;br /&gt;
&lt;br /&gt;
3. В теге Game добавить строку purchaseEverything=1.&lt;br /&gt;
&lt;br /&gt;
4. Сохранить файл&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Game]&lt;br /&gt;
purchaseEverything=1&lt;br /&gt;
DispFixRot=&amp;quot;Landscape&amp;quot;&lt;br /&gt;
# comments and whitespace stripped by deployment tool&lt;br /&gt;
debug=&amp;quot;Absolutist-2253&amp;quot;&lt;br /&gt;
show_build_date=1&lt;br /&gt;
AppTitle=&amp;quot;Viewer&amp;quot;&lt;br /&gt;
DebuggerIP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
DebuggerPort=5322&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оформление'''&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём к оформлению. Для того чтобы на экране появлялось окно с предложением о покупке подсказки, необходимо его создать. В начальный момент окно должно быть невидимым и прокликиваем, это состояние задано в машине '''store'''. Создадим в ней 5 подобъектов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.&lt;br /&gt;
&lt;br /&gt;
Откроем объект  '''black''', пропишем ему свойства, оставив пустой рамку, цвет фона – чёрный.&lt;br /&gt;
&lt;br /&gt;
Для объекта '''rec''' зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке. Чтобы прямоугольник отображался правильно, задайте ему ненулевые размеры. Настройки '''rec''' (имена файлов могут отличаться):&lt;br /&gt;
&lt;br /&gt;
[[Файл:817.PNG]]&lt;br /&gt;
&lt;br /&gt;
Третьему элементу поменяем тип на '''text''' с текстом &amp;quot;Купить подсказку?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Четвёртый объект сделаем машиной и назовём её '''ok'''. Она будет в глазах пользователя совершать покупку. Для внешнего вида машины в '''res''' перетянем изображение зелёного света светофора из 4 урока. В модификаторах можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
Опишем следующие состояния машины:&lt;br /&gt;
&lt;br /&gt;
[[Файл:818.PNG]]&lt;br /&gt;
&lt;br /&gt;
Все действия, связанные с совершением и провалом покупки, управляемые этой машиной, мы уже указали в '''store'''.&lt;br /&gt;
&lt;br /&gt;
Пятый объект будет кнопкой '''no'''. Она по клику изменяет состояние ('''close''') объекта ('''store'''). Для внешнего вида кнопки в '''res''' перетянем изображение красного света светофора из 4 урока. В модификаторах тоже можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
&lt;br /&gt;
Так же поступим со сценой '''error'''. В ней создадим четыре объекта: два '''rectangle''': '''rec_error''' – пустой, '''black_error''' — их можно скопировать из предыдущей сцены; кнопку '''buy''', которая будет переводить '''error''' в состояние '''i'''; текстовый объект '''text_error''' с текстом «error!». Общий вид этого задания в лейауте примерно следующий:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:819.PNG]]&lt;br /&gt;
&lt;br /&gt;
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим Viewer. Сейчас при покупке подсказки количество покупок не имеет лимита (благодаря нашим изменениям в '''app.icf'''), поэтому вывод ошибки мы не получим.&lt;br /&gt;
&lt;br /&gt;
== Patchwork ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → Learning.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_1.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.&lt;br /&gt;
&lt;br /&gt;
Если в папке урока отсутствует изображение panel_down, то скачать любое изображение боковой панели самостоятельно и использовать ее в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов ===&lt;br /&gt;
&lt;br /&gt;
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем &amp;quot;Создать объект в текущем элементе&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Переименуем один из созданных объектов в Patchwork, а другой в table.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_4.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.&lt;br /&gt;
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 100х100 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле &amp;quot;перейти на&amp;quot; укажите текущий экран Lesson_8.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:правка_намба_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для таблицы измените следующие параметры&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson8_table_setup.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля &amp;quot;карт.спереди&amp;quot; и &amp;quot;шаблон&amp;quot; заполняются перетаскиванием графического ресурса из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8.3.Fin.png]]&lt;br /&gt;
&lt;br /&gt;
===  Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием game.&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10042</id>
		<title>Настройка миниигр</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%B8%D0%B3%D1%80&amp;diff=10042"/>
		<updated>2021-08-05T12:08:36Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка объектов, создание машин состояний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить настройки объектов, реализующих различные минигры.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Puzzle&lt;br /&gt;
* создать уровень игры с объектом, содержащим тип механики Patchwork &lt;br /&gt;
&lt;br /&gt;
== Puzzle ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
Запускаем SceneEditor. Открываем наш учебный проект lessons.seproj.&lt;br /&gt;
&lt;br /&gt;
Создаём экран lesson_8, а в нём сцены 08 и Buttons (стараемся делать это по памяти или подсматриваем в прошлых уроках), куда добавляем необходимые графические ресурсы из папки этого урока в Resources Editor: в экран 08 отправляем картинку level_01 (наш будущий пазл), а в Buttons (думаю, уже догадались) - будущие кнопки - hint_normal и ico_r_normal2. &lt;br /&gt;
&lt;br /&gt;
На экране кнопочкам подбираем симпатичное и удобное расположение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:801.png]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов, создание машин состояний ===&lt;br /&gt;
	&lt;br /&gt;
Меняем тип картинки '''level_01''' с '''image''' на [[Puzzle|puzzle]] (в папке Game mechanic) и устанавливаем следующие настройки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:802.png]]&lt;br /&gt;
&lt;br /&gt;
В сцене '''08''' создаём ещё один объект. Даём ему имя '''applause''', тип '''machine''' (прописываем 3 состояния '''init''', '''on''' и '''off'''). &lt;br /&gt;
&lt;br /&gt;
В состоянии '''on''' добавляем команду '''play''' (проиграть звук) и в списке выбираем '''snd''' (короткий звук), который подгружаем с помощью базы ресурсов (если подходящего звукового файла в уроке не обнаружилось, его необходимо добавить самостоятельно; при добавлении звука в базу ресурсов, ее нужно сохранить и переоткрыть).Также добавляем команду '''wait''' &lt;br /&gt;
&lt;br /&gt;
Возвращаемся к общим настройкам  и устанавливаем стартовое состояние '''init'''.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo11.png]]&lt;br /&gt;
&lt;br /&gt;
Переходим к сцене '''Buttons''' и меняем тип обоих графических файлов на '''button'''. Общий вид лейаута на этом этапе получится примерно следующий:&lt;br /&gt;
&lt;br /&gt;
[[Файл:804.png]]  &lt;br /&gt;
&lt;br /&gt;
В настройках кнопок перетянем из базы ресурсов картинки с внешним видом нажатых и отжатых кнопок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:805.png]] &lt;br /&gt;
&lt;br /&gt;
Кнопка '''ico_R_normal2''' (переиграть) — кнопка, запускающая игру Puzzle сначала. &lt;br /&gt;
&lt;br /&gt;
Нам необходимо, чтобы кнопка '''ico_R_normal2''' перемешивала части нашего пазла. Для этого в настройках кликаем правой кнопкой мыши и выбираем '''клик:изменить состояние объекта'''. В появившейся в настройках вкладке выбираем в качестве объекта наш пазл ('''level_01''') и состояние '''mix''', которое перемешает части исходной картинки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:806.png]] &lt;br /&gt;
	&lt;br /&gt;
Пусть кнопка '''hint_normal''' (подсказка) по клику показывает нам картинку в собранном виде. Для этого повторяем процедуру с добавлением настройки '''клик:изменить состояние объекта''', только теперь для кнопки '''hint_normal'''. Выбираем объектом наш '''level_01''' и состояние для него '''hint'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Если возникает необходимость добавить 2 и более настройки при помощи правой кнопки мыши, &lt;br /&gt;
то лучше из кнопки сделать машину состояний и все состояния создать уже там.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любуемся результатом своих стараний, сохранив проект и запустив его с помощью Viewer`а.&lt;br /&gt;
&lt;br /&gt;
=== Упражнения ===&lt;br /&gt;
&lt;br /&gt;
Копируем экран '''lesson_8''' и переименовываем его в '''lesson_8_1''', а сцену '''08''' в '''08_01'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:807.png]]&lt;br /&gt;
&lt;br /&gt;
В новом экране вносим все изменения самостоятельно. Необходимо:&lt;br /&gt;
&lt;br /&gt;
a) заменить звук аплодисментов другим аудиофайлом, имеющимся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;&lt;br /&gt;
&lt;br /&gt;
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Store ===&lt;br /&gt;
&lt;br /&gt;
В реальной игре нам может понадобиться счётчик подсказок, который даёт возможность совершать покупки подсказок за реальные деньги. Для его реализации необходим объект '''[[Store|Store]]'''.&lt;br /&gt;
&lt;br /&gt;
Создадим новый экран '''lesson_8_1_1'''. Добавим в него сцены '''08_1''' и '''Button_8_1'''. В сцену '''08_1''' поместим из экрана '''lesson_8_1''' объекты  '''level_01''' и '''applause''', оставим их без изменения. &lt;br /&gt;
&lt;br /&gt;
В сцену '''Button_8_1''' скопируем из '''lesson_08_1''' кнопки '''hint_normal''' и '''ico_R_normal2''' и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и назовём его '''hint'''. Добавим ресурс из базы ресурсов – анимацию c цифрами из прошлого урока. Счётчик '''hint''' будет считывать купленные подсказки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:808.png]]&lt;br /&gt;
&lt;br /&gt;
В  '''hint_normal''' добавим подобъект, сделаем его машиной и назовем '''hint_m'''.&lt;br /&gt;
&lt;br /&gt;
Щёлкнув правой кнопкой мыши на сцену  '''Button_8_1''' создадим новые сцены '''store''' и '''error''', которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.&lt;br /&gt;
&lt;br /&gt;
В сцену  store добавим две машины:  '''buy''' и '''store'''; в  error - машину  '''error'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:809.PNG]]&lt;br /&gt;
&lt;br /&gt;
В машине '''store''' зададим считывания со счётчика и прозрачность экрана:&lt;br /&gt;
&lt;br /&gt;
[[Файл:810.png]]&lt;br /&gt;
&lt;br /&gt;
Машина '''error''' будет отвечать за вывод ошибки при неудачной покупке, то есть задаёт прозрачность экрана с ошибкой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:811.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для машины '''buy''' зададим состояния, при которых она начисляет купленную подсказку либо вызывает окно ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:812.PNG]]&lt;br /&gt;
&lt;br /&gt;
Вернёмся к машине '''hint_m''' сцены '''Button_8_1''' и пропишем для неё состояния. Машина отвечает за начисление подсказки при удачной покупке&lt;br /&gt;
&lt;br /&gt;
[[Файл:813.PNG]]&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы вызывать машину '''hint_m''' в нашей игре, откроем кнопку '''hint_normal''' и в добавляемом свойстве '''изменить состояние объекта''' в качестве объекта выберем машину '''hint_m''', и пропишем ей состояние '''check'''.&lt;br /&gt;
&lt;br /&gt;
'''Совершение покупки (настройка Store)'''&lt;br /&gt;
&lt;br /&gt;
Для того чтобы покупку можно было совершить, необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store (в папке Options).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Store в проекте может быть только один.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:814.PNG]]&lt;br /&gt;
&lt;br /&gt;
Дважды клацнув на объект (так же, как на машину состояний), мы попадаем в окно настроек '''store'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:815.PNG]]&lt;br /&gt;
&lt;br /&gt;
Нажимаем на плюсик и создаём покупку. Вводим для неё id и изменяем указанные настройки, как на картинке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo12.png]]&lt;br /&gt;
&lt;br /&gt;
И тут должен возникнуть вопрос. Почему среди перечня доступных объектов нет необходимого нам '''buy'''? Прежде чем читать дальше, предлагаю попробовать найти ответ на этот вопрос самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для удобства использования, а также во избежание различных ошибок, в объектах экрана можно обращаться только к объектам этого же экрана. Исключением будут объекты глобальных экранов (вспоминаем прошлые уроки и смотрим на наш глобальный экран '''opt'''). &lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы получить доступ к объекту '''buy''', мы временно делаем экран '''lesson_8_1_1''' глобальным и завершаем настройку объекта '''store'''. Позже, на этапе проверки при помощи Viewer`а можем поэкспериментировать и проверить, будет ли работать проект корректно, когда мы в настройках глобальности экрана '''lesson_8_1_1''' снова поставим '''нет'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
На заметку. Когда мы обращаемся к объекту, то в layout.xml &lt;br /&gt;
прописывается ссылка на этот объект в виде его id.&lt;br /&gt;
Когда убираем глобальность экрана и делаем его снова обычным, &lt;br /&gt;
выбранный объект мы в редакторе больше не видим, &lt;br /&gt;
но его id в лэйауте всё равно остаётся.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Store'''&lt;br /&gt;
&lt;br /&gt;
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.&lt;br /&gt;
&lt;br /&gt;
Основные параметры объекта Store&lt;br /&gt;
&lt;br /&gt;
''id покупки'' – внутренний id покупки.&lt;br /&gt;
&lt;br /&gt;
''расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда; если параметр не указан, по-умолчанию покупка – одноразовая.&lt;br /&gt;
&lt;br /&gt;
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.&lt;br /&gt;
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.&lt;br /&gt;
&lt;br /&gt;
'''Для того, чтобы объект Store работал во Viewer, необходимо подкорректировать файл app.icf'''&lt;br /&gt;
&lt;br /&gt;
1. Найти файл app.icf в папке с вашим проектом.&lt;br /&gt;
&lt;br /&gt;
2. Открыть его и найти тег [Game].&lt;br /&gt;
&lt;br /&gt;
3. В теге Game добавить строку purchaseEverything=1.&lt;br /&gt;
&lt;br /&gt;
4. Сохранить файл&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Game]&lt;br /&gt;
purchaseEverything=1&lt;br /&gt;
DispFixRot=&amp;quot;Landscape&amp;quot;&lt;br /&gt;
# comments and whitespace stripped by deployment tool&lt;br /&gt;
debug=&amp;quot;Absolutist-2253&amp;quot;&lt;br /&gt;
show_build_date=1&lt;br /&gt;
AppTitle=&amp;quot;Viewer&amp;quot;&lt;br /&gt;
DebuggerIP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
DebuggerPort=5322&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Оформление'''&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём к оформлению. Для того чтобы на экране появлялось окно с предложением о покупке подсказки, необходимо его создать. В начальный момент окно должно быть невидимым и прокликиваем, это состояние задано в машине '''store'''. Создадим в ней 5 подобъектов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.&lt;br /&gt;
&lt;br /&gt;
Откроем объект  '''black''', пропишем ему свойства, оставив пустой рамку, цвет фона – чёрный.&lt;br /&gt;
&lt;br /&gt;
Для объекта '''rec''' зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке. Чтобы прямоугольник отображался правильно, задайте ему ненулевые размеры. Настройки '''rec''' (имена файлов могут отличаться):&lt;br /&gt;
&lt;br /&gt;
[[Файл:817.PNG]]&lt;br /&gt;
&lt;br /&gt;
Третьему элементу поменяем тип на '''text''' с текстом &amp;quot;Купить подсказку?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Четвёртый объект сделаем машиной и назовём её '''ok'''. Она будет в глазах пользователя совершать покупку. Для внешнего вида машины в '''res''' перетянем изображение зелёного света светофора из 4 урока. В модификаторах можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
Опишем следующие состояния машины:&lt;br /&gt;
&lt;br /&gt;
[[Файл:818.PNG]]&lt;br /&gt;
&lt;br /&gt;
Все действия, связанные с совершением и провалом покупки, управляемые этой машиной, мы уже указали в '''store'''.&lt;br /&gt;
&lt;br /&gt;
Пятый объект будет кнопкой '''no'''. Она по клику изменяет состояние ('''close''') объекта ('''store'''). Для внешнего вида кнопки в '''res''' перетянем изображение красного света светофора из 4 урока. В модификаторах тоже можно задать '''scale''' по х и по у 0.5.&lt;br /&gt;
&lt;br /&gt;
Так же поступим со сценой '''error'''. В ней создадим четыре объекта: два '''rectangle''': '''rec_error''' – пустой, '''black_error''' — их можно скопировать из предыдущей сцены; кнопку '''buy''', которая будет переводить '''error''' в состояние '''i'''; текстовый объект '''text_error''' с текстом «error!». Общий вид этого задания в лейауте примерно следующий:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:819.PNG]]&lt;br /&gt;
&lt;br /&gt;
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим Viewer. Сейчас при покупке подсказки количество покупок не имеет лимита (благодаря нашим изменениям в '''app.icf'''), поэтому вывод ошибки мы не получим.&lt;br /&gt;
&lt;br /&gt;
== Patchwork ==&lt;br /&gt;
&lt;br /&gt;
=== Создание экрана и сцены в игровом проекте ===&lt;br /&gt;
&lt;br /&gt;
1. Запустить SceneEditor.&lt;br /&gt;
&lt;br /&gt;
2. В меню Проект → Загрузить → Learning.seproj. &lt;br /&gt;
&lt;br /&gt;
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_1.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.&lt;br /&gt;
&lt;br /&gt;
Если в папке урока отсутствует изображение panel_down, то скачать любое изображение боковой панели самостоятельно и использовать ее в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Настройка объектов ===&lt;br /&gt;
&lt;br /&gt;
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем &amp;quot;Создать объект в текущем элементе&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
2. Переименуем один из созданных объектов в Patchwork, а другой в table.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_4.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.&lt;br /&gt;
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 100х100 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле &amp;quot;перейти на&amp;quot; укажите текущий экран Lesson_8.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:правка_намба_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для таблицы измените следующие параметры&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson8_table_setup.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля &amp;quot;карт.спереди&amp;quot; и &amp;quot;шаблон&amp;quot; заполняются перетаскиванием графического ресурса из редактора ресурсов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson8.3.Fin.png]]&lt;br /&gt;
&lt;br /&gt;
===  Упражнения ===&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену с названием game.&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).&lt;br /&gt;
&lt;br /&gt;
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:&lt;br /&gt;
&lt;br /&gt;
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;&lt;br /&gt;
&lt;br /&gt;
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание игры «Hidden Object Game»|Урок 7]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Работа с эффектами|Урок 9]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10041</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10041"/>
		<updated>2021-08-05T11:54:22Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Прогресс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. &lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&lt;br /&gt;
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]&lt;br /&gt;
В экране Lesson_7 добавляем новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])&lt;br /&gt;
&lt;br /&gt;
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья». Перетягиваем сначала '''bg''', потом остальные объекты с папки ''hiddenObj''.&lt;br /&gt;
&lt;br /&gt;
Создадим папку Lesson_7  в базе текстовых описаний с помощью TextEditor.  Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи 2 значения, один из которых называет сам предмет, а второе - является его синонимом или ассоцией, которая укажет на него ([[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]]), добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип &amp;quot;icon1&amp;quot; (текстовая база должна быть подвязана к базе ресурсов). Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].&lt;br /&gt;
&lt;br /&gt;
== Общая настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
1. Для всех поисковых графических объектов изменяем тип с image на [[HiddenObject]]: выделяем первый и последний элементы, удерживая кнопку Shift, в окне Property выбраем соответствующий параметр.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_hidden_obj.png]]&lt;br /&gt;
&lt;br /&gt;
2. Создаем новую сцену, которую называем 7_1 и добавляем на нее специальные объекты [[Table]] и [[HiddenList]]. Для этого переносим графическое изображение table и изменяем его тип с image на Table. Название объекта изменить на table**&lt;br /&gt;
&lt;br /&gt;
[[Файл:07 5.png]]&lt;br /&gt;
&lt;br /&gt;
3. Для объекта HiddenList создаем  новый объект и меняем его тип с image на HiddenList. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HiddenList**&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_HiddenList.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''**''' Имена для специальных объектов могут использоваться любые.&lt;br /&gt;
&lt;br /&gt;
== Детальная настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
'''1. Описание HiddenObject.'''&lt;br /&gt;
&lt;br /&gt;
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:Photo01.png|right]]&lt;br /&gt;
&lt;br /&gt;
Необходимо выбрать используемый объект с именем HiddenList (тип HiddenObjectList) в поле list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;&lt;br /&gt;
&lt;br /&gt;
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);&lt;br /&gt;
&lt;br /&gt;
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;&lt;br /&gt;
&lt;br /&gt;
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);&lt;br /&gt;
&lt;br /&gt;
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.&lt;br /&gt;
&lt;br /&gt;
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2. Описание HiddenObjectList.'''&lt;br /&gt;
&lt;br /&gt;
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:Photo02.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подготовка спрятанных объектов: &lt;br /&gt;
&lt;br /&gt;
''num'' (поле &amp;quot;объектов&amp;quot;) – максимальное количество объектов, участвующие в поиске. (int)&lt;br /&gt;
&lt;br /&gt;
''hide'' (поле &amp;quot;прятать&amp;quot;) – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) &lt;br /&gt;
&lt;br /&gt;
Визуальные параметры списка: &lt;br /&gt;
&lt;br /&gt;
''table'' (поле &amp;quot;таблица&amp;quot;) – идентификатор объекта Table. (objid)&lt;br /&gt;
&lt;br /&gt;
''kind'' (внешний вид - поле &amp;quot;тип списка&amp;quot;) – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)&lt;br /&gt;
&lt;br /&gt;
''cross'' (внешний вид - поле &amp;quot;вычеркнуть&amp;quot;) – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе &amp;quot;зачеркивается&amp;quot;.(int).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''3. Настройка Table'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo03.png]] &lt;br /&gt;
&lt;br /&gt;
 Хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица”, чтобы настроить внешний вид , вспомогательную область для поиска предметов.&lt;br /&gt;
&lt;br /&gt;
'''4. Параметры, общие для всех спрятанных объектов:'''&lt;br /&gt;
&lt;br /&gt;
''die'' –  тип исчезания при удачном клике на объект (если нет актера) (int): &lt;br /&gt;
&lt;br /&gt;
0: просто исчезает;&lt;br /&gt;
&lt;br /&gt;
1: летит к пункту с описанием в списке HiddenList;&lt;br /&gt;
&lt;br /&gt;
2: улетает в случайном направлении;&lt;br /&gt;
&lt;br /&gt;
3: улетает к заданным координатам (fx, fy).&lt;br /&gt;
&lt;br /&gt;
vm - скорость движения при полете к списку предметов после клика в px/sec (float) &lt;br /&gt;
&lt;br /&gt;
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) &lt;br /&gt;
&lt;br /&gt;
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) &lt;br /&gt;
&lt;br /&gt;
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. &lt;br /&gt;
&lt;br /&gt;
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) &lt;br /&gt;
&lt;br /&gt;
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
        '''Внимание!'''  HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -&amp;gt; id игры; для теста заполним его любой строкой).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену (с названием stg_7_1).&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7). (Одновременно можно выделять или копировать только объекты одного типа)&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированные объекты в новую сцену stg_7_1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Screenshot 1.png]] &lt;br /&gt;
&lt;br /&gt;
5. В новой сцене:&lt;br /&gt;
&lt;br /&gt;
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;&lt;br /&gt;
&lt;br /&gt;
b) разместить на местах предназначенных для их «Прятанья»;&lt;br /&gt;
&lt;br /&gt;
c) добавить текстовое описание в TextEditor;&lt;br /&gt;
&lt;br /&gt;
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
== Настройка полноценной системы подсчета очков ==&lt;br /&gt;
&lt;br /&gt;
Экран lesson_7  необходимо модифицировать в полноценный уровень с выводом количества очков, игрой на время и графикой.&lt;br /&gt;
&lt;br /&gt;
Для этого создаем еще одну сцену 7_3 в первом экране с объектами, которые сделают игру полноценной: первый экран дополняем  2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), прогрессом ([[progress]]), таблица (table, перенесите данный объект со сцены 7_1 в 7_3) и подложкой (image). Второй экран с выводом очков составим позже.&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo04.png]] &lt;br /&gt;
&lt;br /&gt;
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «prog» ([[progress]]) активируется во время комбо.&lt;br /&gt;
&lt;br /&gt;
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор и прогресс в свойствах HiddenList ([[hiddenList]]).&lt;br /&gt;
&lt;br /&gt;
=== Счетчик ===&lt;br /&gt;
&lt;br /&gt;
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!'''  Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её -  это просто). Анимация создается с названием папки, в которой хранились картинки, избегайте кириллицы в названии  папок.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель уже указан в настройках. Настройки для счетчика:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:243.png]]&lt;br /&gt;
&lt;br /&gt;
=== Таймер ===&lt;br /&gt;
&lt;br /&gt;
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (20000 = 20 сек.). &lt;br /&gt;
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие или делаем его обычным шрифтом, редактируя в свойствах параметр '''шрифт'''. Настройки для таймера:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo05.png]]&lt;br /&gt;
&lt;br /&gt;
Также стоит обновить настройки в HiddenObjectList , т.к. если мы их не укажем, то отсчет времени просто не начнется. Время таймера и время указанное в HiddenObjectList должны совпадать, иначе отсчет времени будет идти от меньшего времени вне зависимости указано оно в HiddenList или в таймере.&lt;br /&gt;
  [[Файл:Photo06.png]]&lt;br /&gt;
&lt;br /&gt;
=== Прогресс ===&lt;br /&gt;
&lt;br /&gt;
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходит уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую или совершая необходимые действия в игре, например комбо. &lt;br /&gt;
Настройки для '''прогресса''' : &lt;br /&gt;
&lt;br /&gt;
 [[Файл:555.png]]&lt;br /&gt;
&lt;br /&gt;
Графика для Progress: [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины-блокатора «ban_H» (machine) (подобъектe '''black''' изменяем тип на rectangle, более подробно о нем дальше):&lt;br /&gt;
&lt;br /&gt;
 [[Файл:ban_h.png]]&lt;br /&gt;
 [[Файл:9.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для '''hiddenList''':&lt;br /&gt;
&lt;br /&gt;
 [[Файл:HOL Final.png]]&lt;br /&gt;
&lt;br /&gt;
Группа - звезды combo num =1 - количество быстро найденных объектов, нужное для получения звезды Combo. Combo time = 3000 - интервал между кликами, считающимися быстрыми. Combo accuracy = 0,85 - точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные). Лимит ложных кликов = 5 - количество неверных кликов. Формула расчета его: количество верных кликов делим на общее количество получаем коэффициент, если он равен или больше указного нами, то в опции пишем параметр, если нет то не пишем.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В HiddenList в разделе очковая система для сохранения данных в профиль необходимо указать '''id игры''' (например &amp;quot;hidden&amp;quot;).&lt;br /&gt;
Для HiddenList и Counter пункт &amp;quot;сохранить в профиль&amp;quot; должен совпадать. Если в HiddenList указано &amp;quot;глобально&amp;quot;, то и в Counter также необходимо установить &amp;quot;глобально&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина ''win_lose_1'' помогает определить победителя и вызывает соответствующее окно ''win'' после победы или поражения.&lt;br /&gt;
[[Файл:Photo07.png]]&lt;br /&gt;
&lt;br /&gt;
Добавим правой кнопкой мыши функцию &amp;quot;разбор: изменить состояние объекта&amp;quot; и укажем там машину ''win_lose_1'' состояние win. Состояние lose укажем в таймере timer_H также через добавление функции правой копкой мыши &amp;quot;время истекло: изменить состояние объекта&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Настройка окна вывода ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создаем новую сцену '''w''' и создаем в ней объект c типом machine ''win'', на которой формируем окно вывода результатов из ректангла ([[Rectangle]]), текстовых объектов и счетчиков. Окно&lt;br /&gt;
должно открываться по окончанию игры и при выигрыше показывать набранные очки и надпись об удаче, при проигрыше - нулевые очки и надпись о неудаче. Также названия фотографий в рамке и в фоне могут отличатся!&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]]    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Rectangle black (Цвет задается в свойстве фон-&amp;gt;цвет заливки) используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:1012.png]] [[Файл:0102.png]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее копируем Rectangle &amp;quot;black&amp;quot; и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!), устанавливаем параметр фон и alpha на свое усмотрение.&lt;br /&gt;
&lt;br /&gt;
Создадим еще 5 счетчиков. Они нам понадобятся в конце игры для выведения бонусного счета.&lt;br /&gt;
&lt;br /&gt;
В свойствах счетчиков необходимо прописать уровень!&lt;br /&gt;
&lt;br /&gt;
1) счетчик 7_4_1 — игровые очки;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_total&lt;br /&gt;
&lt;br /&gt;
2) счетчик 7_4_2 — бонус за время;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_time&lt;br /&gt;
&lt;br /&gt;
3) счетчик 7_4_3 — бонус за аккуратность;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_accuracy&lt;br /&gt;
&lt;br /&gt;
4) счетчик 7_4_4 — бонус за комбо;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.ecmbRowMax&lt;br /&gt;
&lt;br /&gt;
5) счетчик 7_4_5 — очки за уровень;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_level&lt;br /&gt;
&lt;br /&gt;
[[Файл:Counters.png]]&lt;br /&gt;
&lt;br /&gt;
Важный аспект: после того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.&lt;br /&gt;
&lt;br /&gt;
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).&lt;br /&gt;
&lt;br /&gt;
=== Вывод итогов ===&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star1''' &lt;br /&gt;
(проверка в опциях параметра last_game.last_star_accuracy0, &lt;br /&gt;
last_game.last_star_time0, )&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo08.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star2''' &lt;br /&gt;
(если параметр accuracy=0)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo09.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star3''' &lt;br /&gt;
(если игра пройдена за указанное время)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo10.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''win'''&lt;br /&gt;
&lt;br /&gt;
 [[Файл:0306.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина '''win''' считывает «read» показания счетчика и запускает star1 если игра пройдена.&lt;br /&gt;
&lt;br /&gt;
Также создаем кнопку ''close'' (button), которая должна закрывать окно результатов. Добавляем &amp;quot;изменить состояние объекта&amp;quot;; объект win, состояние close. &lt;br /&gt;
&lt;br /&gt;
'''(Подсказка)''' Для того, чтобы перезагрузить сцену с '''hiddenList''' и начать игру заново, в машине можно использовать команду '''set''' с параметром '''next_scr'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ban_h.png&amp;diff=10040</id>
		<title>Файл:Ban h.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ban_h.png&amp;diff=10040"/>
		<updated>2021-08-05T11:53:41Z</updated>

		<summary type="html">&lt;p&gt;Blymar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10039</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10039"/>
		<updated>2021-08-05T11:43:20Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Настройка полноценной системы подсчета очков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. &lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&lt;br /&gt;
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]&lt;br /&gt;
В экране Lesson_7 добавляем новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])&lt;br /&gt;
&lt;br /&gt;
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья». Перетягиваем сначала '''bg''', потом остальные объекты с папки ''hiddenObj''.&lt;br /&gt;
&lt;br /&gt;
Создадим папку Lesson_7  в базе текстовых описаний с помощью TextEditor.  Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи 2 значения, один из которых называет сам предмет, а второе - является его синонимом или ассоцией, которая укажет на него ([[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]]), добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип &amp;quot;icon1&amp;quot; (текстовая база должна быть подвязана к базе ресурсов). Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].&lt;br /&gt;
&lt;br /&gt;
== Общая настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
1. Для всех поисковых графических объектов изменяем тип с image на [[HiddenObject]]: выделяем первый и последний элементы, удерживая кнопку Shift, в окне Property выбраем соответствующий параметр.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_hidden_obj.png]]&lt;br /&gt;
&lt;br /&gt;
2. Создаем новую сцену, которую называем 7_1 и добавляем на нее специальные объекты [[Table]] и [[HiddenList]]. Для этого переносим графическое изображение table и изменяем его тип с image на Table. Название объекта изменить на table**&lt;br /&gt;
&lt;br /&gt;
[[Файл:07 5.png]]&lt;br /&gt;
&lt;br /&gt;
3. Для объекта HiddenList создаем  новый объект и меняем его тип с image на HiddenList. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HiddenList**&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_HiddenList.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''**''' Имена для специальных объектов могут использоваться любые.&lt;br /&gt;
&lt;br /&gt;
== Детальная настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
'''1. Описание HiddenObject.'''&lt;br /&gt;
&lt;br /&gt;
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:Photo01.png|right]]&lt;br /&gt;
&lt;br /&gt;
Необходимо выбрать используемый объект с именем HiddenList (тип HiddenObjectList) в поле list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;&lt;br /&gt;
&lt;br /&gt;
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);&lt;br /&gt;
&lt;br /&gt;
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;&lt;br /&gt;
&lt;br /&gt;
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);&lt;br /&gt;
&lt;br /&gt;
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.&lt;br /&gt;
&lt;br /&gt;
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2. Описание HiddenObjectList.'''&lt;br /&gt;
&lt;br /&gt;
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:Photo02.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подготовка спрятанных объектов: &lt;br /&gt;
&lt;br /&gt;
''num'' (поле &amp;quot;объектов&amp;quot;) – максимальное количество объектов, участвующие в поиске. (int)&lt;br /&gt;
&lt;br /&gt;
''hide'' (поле &amp;quot;прятать&amp;quot;) – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) &lt;br /&gt;
&lt;br /&gt;
Визуальные параметры списка: &lt;br /&gt;
&lt;br /&gt;
''table'' (поле &amp;quot;таблица&amp;quot;) – идентификатор объекта Table. (objid)&lt;br /&gt;
&lt;br /&gt;
''kind'' (внешний вид - поле &amp;quot;тип списка&amp;quot;) – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)&lt;br /&gt;
&lt;br /&gt;
''cross'' (внешний вид - поле &amp;quot;вычеркнуть&amp;quot;) – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе &amp;quot;зачеркивается&amp;quot;.(int).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''3. Настройка Table'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo03.png]] &lt;br /&gt;
&lt;br /&gt;
 Хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица”, чтобы настроить внешний вид , вспомогательную область для поиска предметов.&lt;br /&gt;
&lt;br /&gt;
'''4. Параметры, общие для всех спрятанных объектов:'''&lt;br /&gt;
&lt;br /&gt;
''die'' –  тип исчезания при удачном клике на объект (если нет актера) (int): &lt;br /&gt;
&lt;br /&gt;
0: просто исчезает;&lt;br /&gt;
&lt;br /&gt;
1: летит к пункту с описанием в списке HiddenList;&lt;br /&gt;
&lt;br /&gt;
2: улетает в случайном направлении;&lt;br /&gt;
&lt;br /&gt;
3: улетает к заданным координатам (fx, fy).&lt;br /&gt;
&lt;br /&gt;
vm - скорость движения при полете к списку предметов после клика в px/sec (float) &lt;br /&gt;
&lt;br /&gt;
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) &lt;br /&gt;
&lt;br /&gt;
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) &lt;br /&gt;
&lt;br /&gt;
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. &lt;br /&gt;
&lt;br /&gt;
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) &lt;br /&gt;
&lt;br /&gt;
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
        '''Внимание!'''  HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -&amp;gt; id игры; для теста заполним его любой строкой).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену (с названием stg_7_1).&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7). (Одновременно можно выделять или копировать только объекты одного типа)&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированные объекты в новую сцену stg_7_1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Screenshot 1.png]] &lt;br /&gt;
&lt;br /&gt;
5. В новой сцене:&lt;br /&gt;
&lt;br /&gt;
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;&lt;br /&gt;
&lt;br /&gt;
b) разместить на местах предназначенных для их «Прятанья»;&lt;br /&gt;
&lt;br /&gt;
c) добавить текстовое описание в TextEditor;&lt;br /&gt;
&lt;br /&gt;
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
== Настройка полноценной системы подсчета очков ==&lt;br /&gt;
&lt;br /&gt;
Экран lesson_7  необходимо модифицировать в полноценный уровень с выводом количества очков, игрой на время и графикой.&lt;br /&gt;
&lt;br /&gt;
Для этого создаем еще одну сцену 7_3 в первом экране с объектами, которые сделают игру полноценной: первый экран дополняем  2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), прогрессом ([[progress]]), таблица (table, перенесите данный объект со сцены 7_1 в 7_3) и подложкой (image). Второй экран с выводом очков составим позже.&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo04.png]] &lt;br /&gt;
&lt;br /&gt;
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «prog» ([[progress]]) активируется во время комбо.&lt;br /&gt;
&lt;br /&gt;
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор и прогресс в свойствах HiddenList ([[hiddenList]]).&lt;br /&gt;
&lt;br /&gt;
=== Счетчик ===&lt;br /&gt;
&lt;br /&gt;
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!'''  Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её -  это просто). Анимация создается с названием папки, в которой хранились картинки, избегайте кириллицы в названии  папок.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель уже указан в настройках. Настройки для счетчика:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:243.png]]&lt;br /&gt;
&lt;br /&gt;
=== Таймер ===&lt;br /&gt;
&lt;br /&gt;
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (20000 = 20 сек.). &lt;br /&gt;
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие или делаем его обычным шрифтом, редактируя в свойствах параметр '''шрифт'''. Настройки для таймера:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo05.png]]&lt;br /&gt;
&lt;br /&gt;
Также стоит обновить настройки в HiddenObjectList , т.к. если мы их не укажем, то отсчет времени просто не начнется. Время таймера и время указанное в HiddenObjectList должны совпадать, иначе отсчет времени будет идти от меньшего времени вне зависимости указано оно в HiddenList или в таймере.&lt;br /&gt;
  [[Файл:Photo06.png]]&lt;br /&gt;
&lt;br /&gt;
=== Прогресс ===&lt;br /&gt;
&lt;br /&gt;
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходит уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую или совершая необходимые действия в игре, например комбо. &lt;br /&gt;
Настройки для '''прогресса''' : &lt;br /&gt;
&lt;br /&gt;
 [[Файл:555.png]]&lt;br /&gt;
&lt;br /&gt;
Графика для Progress: [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины-блокатора «ban_H» (machine) (подобъектe '''black''' изменяем тип на rectangle, более подробно о нем дальше):&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Ban h na max.png]]&lt;br /&gt;
 [[Файл:9.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для '''hiddenList''':&lt;br /&gt;
&lt;br /&gt;
 [[Файл:HOL Final.png]]&lt;br /&gt;
&lt;br /&gt;
Группа - звезды combo num =1 - количество быстро найденных объектов, нужное для получения звезды Combo. Combo time = 3000 - интервал между кликами, считающимися быстрыми. Combo accuracy = 0,85 - точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные). Лимит ложных кликов = 5 - количество неверных кликов. Формула расчета его: количество верных кликов делим на общее количество получаем коэффициент, если он равен или больше указного нами, то в опции пишем параметр, если нет то не пишем.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В HiddenList в разделе очковая система для сохранения данных в профиль необходимо указать '''id игры''' (например &amp;quot;hidden&amp;quot;).&lt;br /&gt;
Для HiddenList и Counter пункт &amp;quot;сохранить в профиль&amp;quot; должен совпадать. Если в HiddenList указано &amp;quot;глобально&amp;quot;, то и в Counter также необходимо установить &amp;quot;глобально&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина ''win_lose_1'' помогает определить победителя и вызывает соответствующее окно ''win'' после победы или поражения.&lt;br /&gt;
[[Файл:Photo07.png]]&lt;br /&gt;
&lt;br /&gt;
Добавим правой кнопкой мыши функцию &amp;quot;разбор: изменить состояние объекта&amp;quot; и укажем там машину ''win_lose_1'' состояние win. Состояние lose укажем в таймере timer_H также через добавление функции правой копкой мыши &amp;quot;время истекло: изменить состояние объекта&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Настройка окна вывода ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создаем новую сцену '''w''' и создаем в ней объект c типом machine ''win'', на которой формируем окно вывода результатов из ректангла ([[Rectangle]]), текстовых объектов и счетчиков. Окно&lt;br /&gt;
должно открываться по окончанию игры и при выигрыше показывать набранные очки и надпись об удаче, при проигрыше - нулевые очки и надпись о неудаче. Также названия фотографий в рамке и в фоне могут отличатся!&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]]    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Rectangle black (Цвет задается в свойстве фон-&amp;gt;цвет заливки) используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:1012.png]] [[Файл:0102.png]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее копируем Rectangle &amp;quot;black&amp;quot; и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!), устанавливаем параметр фон и alpha на свое усмотрение.&lt;br /&gt;
&lt;br /&gt;
Создадим еще 5 счетчиков. Они нам понадобятся в конце игры для выведения бонусного счета.&lt;br /&gt;
&lt;br /&gt;
В свойствах счетчиков необходимо прописать уровень!&lt;br /&gt;
&lt;br /&gt;
1) счетчик 7_4_1 — игровые очки;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_total&lt;br /&gt;
&lt;br /&gt;
2) счетчик 7_4_2 — бонус за время;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_time&lt;br /&gt;
&lt;br /&gt;
3) счетчик 7_4_3 — бонус за аккуратность;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_accuracy&lt;br /&gt;
&lt;br /&gt;
4) счетчик 7_4_4 — бонус за комбо;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.ecmbRowMax&lt;br /&gt;
&lt;br /&gt;
5) счетчик 7_4_5 — очки за уровень;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_level&lt;br /&gt;
&lt;br /&gt;
[[Файл:Counters.png]]&lt;br /&gt;
&lt;br /&gt;
Важный аспект: после того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.&lt;br /&gt;
&lt;br /&gt;
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).&lt;br /&gt;
&lt;br /&gt;
=== Вывод итогов ===&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star1''' &lt;br /&gt;
(проверка в опциях параметра last_game.last_star_accuracy0, &lt;br /&gt;
last_game.last_star_time0, )&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo08.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star2''' &lt;br /&gt;
(если параметр accuracy=0)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo09.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star3''' &lt;br /&gt;
(если игра пройдена за указанное время)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo10.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''win'''&lt;br /&gt;
&lt;br /&gt;
 [[Файл:0306.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина '''win''' считывает «read» показания счетчика и запускает star1 если игра пройдена.&lt;br /&gt;
&lt;br /&gt;
Также создаем кнопку ''close'' (button), которая должна закрывать окно результатов. Добавляем &amp;quot;изменить состояние объекта&amp;quot;; объект win, состояние close. &lt;br /&gt;
&lt;br /&gt;
'''(Подсказка)''' Для того, чтобы перезагрузить сцену с '''hiddenList''' и начать игру заново, в машине можно использовать команду '''set''' с параметром '''next_scr'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10038</id>
		<title>Создание игры «Hidden Object Game»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&amp;diff=10038"/>
		<updated>2021-08-05T11:36:18Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Создание экрана и сцены в игровом проекте */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и  [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.&lt;br /&gt;
 &lt;br /&gt;
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. &lt;br /&gt;
&lt;br /&gt;
== Создание экрана и сцены в игровом проекте ==&lt;br /&gt;
&lt;br /&gt;
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]&lt;br /&gt;
В экране Lesson_7 добавляем новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])&lt;br /&gt;
&lt;br /&gt;
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья». Перетягиваем сначала '''bg''', потом остальные объекты с папки ''hiddenObj''.&lt;br /&gt;
&lt;br /&gt;
Создадим папку Lesson_7  в базе текстовых описаний с помощью TextEditor.  Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи 2 значения, один из которых называет сам предмет, а второе - является его синонимом или ассоцией, которая укажет на него ([[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]]), добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип &amp;quot;icon1&amp;quot; (текстовая база должна быть подвязана к базе ресурсов). Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].&lt;br /&gt;
&lt;br /&gt;
== Общая настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
1. Для всех поисковых графических объектов изменяем тип с image на [[HiddenObject]]: выделяем первый и последний элементы, удерживая кнопку Shift, в окне Property выбраем соответствующий параметр.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_hidden_obj.png]]&lt;br /&gt;
&lt;br /&gt;
2. Создаем новую сцену, которую называем 7_1 и добавляем на нее специальные объекты [[Table]] и [[HiddenList]]. Для этого переносим графическое изображение table и изменяем его тип с image на Table. Название объекта изменить на table**&lt;br /&gt;
&lt;br /&gt;
[[Файл:07 5.png]]&lt;br /&gt;
&lt;br /&gt;
3. Для объекта HiddenList создаем  новый объект и меняем его тип с image на HiddenList. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HiddenList**&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson7_HiddenList.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''**''' Имена для специальных объектов могут использоваться любые.&lt;br /&gt;
&lt;br /&gt;
== Детальная настройка объектов ==&lt;br /&gt;
&lt;br /&gt;
'''1. Описание HiddenObject.'''&lt;br /&gt;
&lt;br /&gt;
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:Photo01.png|right]]&lt;br /&gt;
&lt;br /&gt;
Необходимо выбрать используемый объект с именем HiddenList (тип HiddenObjectList) в поле list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;&lt;br /&gt;
&lt;br /&gt;
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);&lt;br /&gt;
&lt;br /&gt;
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;&lt;br /&gt;
&lt;br /&gt;
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);&lt;br /&gt;
&lt;br /&gt;
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.&lt;br /&gt;
&lt;br /&gt;
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2. Описание HiddenObjectList.'''&lt;br /&gt;
&lt;br /&gt;
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:Photo02.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле &amp;quot;объектов&amp;quot;). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле &amp;quot;количество&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они &amp;quot;перебивали&amp;quot; общие значения для всех.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подготовка спрятанных объектов: &lt;br /&gt;
&lt;br /&gt;
''num'' (поле &amp;quot;объектов&amp;quot;) – максимальное количество объектов, участвующие в поиске. (int)&lt;br /&gt;
&lt;br /&gt;
''hide'' (поле &amp;quot;прятать&amp;quot;) – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) &lt;br /&gt;
&lt;br /&gt;
Визуальные параметры списка: &lt;br /&gt;
&lt;br /&gt;
''table'' (поле &amp;quot;таблица&amp;quot;) – идентификатор объекта Table. (objid)&lt;br /&gt;
&lt;br /&gt;
''kind'' (внешний вид - поле &amp;quot;тип списка&amp;quot;) – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)&lt;br /&gt;
&lt;br /&gt;
''cross'' (внешний вид - поле &amp;quot;вычеркнуть&amp;quot;) – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе &amp;quot;зачеркивается&amp;quot;.(int).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
'''3. Настройка Table'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Photo03.png]] &lt;br /&gt;
&lt;br /&gt;
 Хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица”, чтобы настроить внешний вид , вспомогательную область для поиска предметов.&lt;br /&gt;
&lt;br /&gt;
'''4. Параметры, общие для всех спрятанных объектов:'''&lt;br /&gt;
&lt;br /&gt;
''die'' –  тип исчезания при удачном клике на объект (если нет актера) (int): &lt;br /&gt;
&lt;br /&gt;
0: просто исчезает;&lt;br /&gt;
&lt;br /&gt;
1: летит к пункту с описанием в списке HiddenList;&lt;br /&gt;
&lt;br /&gt;
2: улетает в случайном направлении;&lt;br /&gt;
&lt;br /&gt;
3: улетает к заданным координатам (fx, fy).&lt;br /&gt;
&lt;br /&gt;
vm - скорость движения при полете к списку предметов после клика в px/sec (float) &lt;br /&gt;
&lt;br /&gt;
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) &lt;br /&gt;
&lt;br /&gt;
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) &lt;br /&gt;
&lt;br /&gt;
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. &lt;br /&gt;
&lt;br /&gt;
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) &lt;br /&gt;
&lt;br /&gt;
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
        '''Внимание!'''  HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -&amp;gt; id игры; для теста заполним его любой строкой).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
2. Создать новую сцену (с названием stg_7_1).&lt;br /&gt;
&lt;br /&gt;
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7). (Одновременно можно выделять или копировать только объекты одного типа)&lt;br /&gt;
&lt;br /&gt;
4. Вставить скопированные объекты в новую сцену stg_7_1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Screenshot 1.png]] &lt;br /&gt;
&lt;br /&gt;
5. В новой сцене:&lt;br /&gt;
&lt;br /&gt;
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;&lt;br /&gt;
&lt;br /&gt;
b) разместить на местах предназначенных для их «Прятанья»;&lt;br /&gt;
&lt;br /&gt;
c) добавить текстовое описание в TextEditor;&lt;br /&gt;
&lt;br /&gt;
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.&lt;br /&gt;
&lt;br /&gt;
== Настройка полноценной системы подсчета очков ==&lt;br /&gt;
&lt;br /&gt;
Экран lesson_7  необходимо модифицировать в полноценный уровень с выводом количества очков, игрой на время и графикой.&lt;br /&gt;
&lt;br /&gt;
Для этого создаем еще одну сцену 7_3 в первом экране с объектами, которые сделают игру полноценной: первый экран дополняем  2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), прогрессом ([[progress]]), таблица (table) и подложкой (image). Второй экран с выводом очков составим позже.&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo04.png]] &lt;br /&gt;
&lt;br /&gt;
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «prog» ([[progress]]) активируется во время комбо.&lt;br /&gt;
&lt;br /&gt;
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор и прогресс в свойствах HiddenList ([[hiddenList]]).&lt;br /&gt;
&lt;br /&gt;
=== Счетчик ===&lt;br /&gt;
&lt;br /&gt;
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!'''  Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её -  это просто). Анимация создается с названием папки, в которой хранились картинки, избегайте кириллицы в названии  папок.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ‎[[Файл:Count 0.png]] ‎[[Файл:Count 1.png]] [[Файл:Count 2.png]] [[Файл:Count 3.png]] ‎[[Файл:Count 4.png]] [[Файл:Count 5.png]] ‎[[Файл:Count 6.png]] ‎[[Файл:Count 7.png]] ‎‎[[Файл:Count 8.png]] ‎[[Файл:Count 9.png]] ‎[[‎Файл:Coun (5).png]]&lt;br /&gt;
&lt;br /&gt;
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель уже указан в настройках. Настройки для счетчика:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:243.png]]&lt;br /&gt;
&lt;br /&gt;
=== Таймер ===&lt;br /&gt;
&lt;br /&gt;
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (20000 = 20 сек.). &lt;br /&gt;
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие или делаем его обычным шрифтом, редактируя в свойствах параметр '''шрифт'''. Настройки для таймера:&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo05.png]]&lt;br /&gt;
&lt;br /&gt;
Также стоит обновить настройки в HiddenObjectList , т.к. если мы их не укажем, то отсчет времени просто не начнется. Время таймера и время указанное в HiddenObjectList должны совпадать, иначе отсчет времени будет идти от меньшего времени вне зависимости указано оно в HiddenList или в таймере.&lt;br /&gt;
  [[Файл:Photo06.png]]&lt;br /&gt;
&lt;br /&gt;
=== Прогресс ===&lt;br /&gt;
&lt;br /&gt;
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходит уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую или совершая необходимые действия в игре, например комбо. &lt;br /&gt;
Настройки для '''прогресса''' : &lt;br /&gt;
&lt;br /&gt;
 [[Файл:555.png]]&lt;br /&gt;
&lt;br /&gt;
Графика для Progress: [[Файл:666.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины-блокатора «ban_H» (machine) (подобъектe '''black''' изменяем тип на rectangle, более подробно о нем дальше):&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Ban h na max.png]]&lt;br /&gt;
 [[Файл:9.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для '''hiddenList''':&lt;br /&gt;
&lt;br /&gt;
 [[Файл:HOL Final.png]]&lt;br /&gt;
&lt;br /&gt;
Группа - звезды combo num =1 - количество быстро найденных объектов, нужное для получения звезды Combo. Combo time = 3000 - интервал между кликами, считающимися быстрыми. Combo accuracy = 0,85 - точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные). Лимит ложных кликов = 5 - количество неверных кликов. Формула расчета его: количество верных кликов делим на общее количество получаем коэффициент, если он равен или больше указного нами, то в опции пишем параметр, если нет то не пишем.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В HiddenList в разделе очковая система для сохранения данных в профиль необходимо указать '''id игры''' (например &amp;quot;hidden&amp;quot;).&lt;br /&gt;
Для HiddenList и Counter пункт &amp;quot;сохранить в профиль&amp;quot; должен совпадать. Если в HiddenList указано &amp;quot;глобально&amp;quot;, то и в Counter также необходимо установить &amp;quot;глобально&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина ''win_lose_1'' помогает определить победителя и вызывает соответствующее окно ''win'' после победы или поражения.&lt;br /&gt;
[[Файл:Photo07.png]]&lt;br /&gt;
&lt;br /&gt;
Добавим правой кнопкой мыши функцию &amp;quot;разбор: изменить состояние объекта&amp;quot; и укажем там машину ''win_lose_1'' состояние win. Состояние lose укажем в таймере timer_H также через добавление функции правой копкой мыши &amp;quot;время истекло: изменить состояние объекта&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Настройка окна вывода ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создаем новую сцену '''w''' и создаем в ней объект c типом machine ''win'', на которой формируем окно вывода результатов из ректангла ([[Rectangle]]), текстовых объектов и счетчиков. Окно&lt;br /&gt;
должно открываться по окончанию игры и при выигрыше показывать набранные очки и надпись об удаче, при проигрыше - нулевые очки и надпись о неудаче. Также названия фотографий в рамке и в фоне могут отличатся!&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]]    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Rectangle black (Цвет задается в свойстве фон-&amp;gt;цвет заливки) используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Файл:1012.png]] [[Файл:0102.png]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее копируем Rectangle &amp;quot;black&amp;quot; и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!), устанавливаем параметр фон и alpha на свое усмотрение.&lt;br /&gt;
&lt;br /&gt;
Создадим еще 5 счетчиков. Они нам понадобятся в конце игры для выведения бонусного счета.&lt;br /&gt;
&lt;br /&gt;
В свойствах счетчиков необходимо прописать уровень!&lt;br /&gt;
&lt;br /&gt;
1) счетчик 7_4_1 — игровые очки;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_total&lt;br /&gt;
&lt;br /&gt;
2) счетчик 7_4_2 — бонус за время;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_time&lt;br /&gt;
&lt;br /&gt;
3) счетчик 7_4_3 — бонус за аккуратность;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_accuracy&lt;br /&gt;
&lt;br /&gt;
4) счетчик 7_4_4 — бонус за комбо;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.ecmbRowMax&lt;br /&gt;
&lt;br /&gt;
5) счетчик 7_4_5 — очки за уровень;&lt;br /&gt;
&lt;br /&gt;
уровень: last_game.score30_level&lt;br /&gt;
&lt;br /&gt;
[[Файл:Counters.png]]&lt;br /&gt;
&lt;br /&gt;
Важный аспект: после того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.&lt;br /&gt;
&lt;br /&gt;
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).&lt;br /&gt;
&lt;br /&gt;
=== Вывод итогов ===&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star1''' &lt;br /&gt;
(проверка в опциях параметра last_game.last_star_accuracy0, &lt;br /&gt;
last_game.last_star_time0, )&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo08.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star2''' &lt;br /&gt;
(если параметр accuracy=0)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo09.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''star3''' &lt;br /&gt;
(если игра пройдена за указанное время)&lt;br /&gt;
&lt;br /&gt;
 [[Файл:Photo10.png]]&lt;br /&gt;
&lt;br /&gt;
Настройки для машины — '''win'''&lt;br /&gt;
&lt;br /&gt;
 [[Файл:0306.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Машина '''win''' считывает «read» показания счетчика и запускает star1 если игра пройдена.&lt;br /&gt;
&lt;br /&gt;
Также создаем кнопку ''close'' (button), которая должна закрывать окно результатов. Добавляем &amp;quot;изменить состояние объекта&amp;quot;; объект win, состояние close. &lt;br /&gt;
&lt;br /&gt;
'''(Подсказка)''' Для того, чтобы перезагрузить сцену с '''hiddenList''' и начать игру заново, в машине можно использовать команду '''set''' с параметром '''next_scr'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Редактор текстовых ресурсов|Урок 6]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Настройка миниигр|Урок 8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10037</id>
		<title>Редактор текстовых ресурсов</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10037"/>
		<updated>2021-08-04T12:50:11Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Создаем текстовую базу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
----&lt;br /&gt;
'''Цель:''' научится пользоваться редактором текстовых ресурсов на примере использования объекта типа &amp;quot;text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Cоздать новый экран и сцену для этого урока.&lt;br /&gt;
* Вывести на экран последовательно два текста с помощью двух текстовых объектов.&lt;br /&gt;
* Вывести на экран эти же тексты, но с помощью только одного текстового объекта.&lt;br /&gt;
&lt;br /&gt;
== Объект Text ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Начнём урок, как обычно,  с открытия проекта lessons. В нём добавим новый экран lesson_6&lt;br /&gt;
со сценой stg_main, так как это было описано в предыдущем [[Создание экранов, сцен. Работа с кнопками|уроке]]. Поместим из редактора ресурсов на сцену любой фон из папки этого или предыдущего  урока. Для примера далее используется &amp;quot;лунный пейзаж&amp;quot; (картинка '''bg''').&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_1.jpg|right]]&lt;br /&gt;
Поверх фона поместите на сцену картинку ввиде стрелки вправо. Назовите ее '''button_next'''. Выберите для нее тип '''machine'''. Кликая на сцене правой кнопкой мыши, выберете пункт из выпадающего меню &amp;quot;Создать объект в текущем элементе&amp;quot;. Новый объект переименуйте в Text и выберите для него тип '''[[Text|Text]]''' (также нужно выставить размеры данному объекту, чтобы текст был виден).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Меняем текст машиной ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы было что менять, скопируем объект Text и вставим его в этой же сцене. Переименуем его в text2. Так как эти два объекта без графического ресурса, то на сцене мы можем их видеть как пустые рамки (зеленая рамка, если объет выделен, и красная - если не выделен).&lt;br /&gt;
[[Файл:Lesson6_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Text_prop.png‎|right]]&lt;br /&gt;
Посмотрим на свойства объекта Text. В поле &amp;quot;текст&amp;quot; впишем &amp;quot;Первая часть текста&amp;quot;. В поле &amp;quot;шрифт&amp;quot; в строке &amp;quot;цвет 1&amp;quot; выберем белый цвет. В свойствах объекта text2 в поле текст впишем &amp;quot;Вторая часть текста&amp;quot;. Цвет шрифта поставим такой же. Таким образом, мы получили две текстовых надписей на сцене, которые располагаются одна поверх другой. Если мы сейчас сохраним проект и запустим, то обе надписи будут видны одновременно, что затруднит их читаемость. Для того, чтобы мы могли без проблем их прочитать, сделаем переключение текстов по нажатию на кнопку. На самом деле, '''button_next''' только выглядит как кнопка - это машина состояний. Пропишем для нее логику таким образом, чтобы при нажатии на машину, она по-очереди делала видимым то один текст, то другой. Создайте для этой машины следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_4.jpg]]&lt;br /&gt;
&lt;br /&gt;
За видимость объектов отвечает параметр '''vis'''. Если vis=0, то объект не видно, если 1 - видно. По клику осуществляется переход между состояниями. Сохраните проект и запустите этот экран. Вы видите, что по клику на кнопку текст изменяется.&lt;br /&gt;
[[Файл:Lesson6_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Переключать текстовые объекты можно еще несколькими способами:&lt;br /&gt;
&lt;br /&gt;
- менять параметр '''al''' (alpha); это позволит делать текст полупрозрачным (в отличии от '''vis''', параметр '''al''' может принимать промежуточные значения между 0 и 1);&lt;br /&gt;
&lt;br /&gt;
- менять текстовому объекту состояние; как известно, у объекта [[Text#Состояния | text]] есть 3 состояния '''first''', '''next''', '''end''', чтобы текст стал видимым, достаточно передать ему состояние '''first''', чтобы текст исчез, достаточно передать ему состояние '''end'''.&lt;br /&gt;
&lt;br /&gt;
== Создаем текстовую базу ==&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере мы научились вставлять текстовые объекты на сцену и менять их видимость. Все это мы сделали не имея текстовой базы. Текстовая база предназначена для хранения всей текстовой информации вашего проекта, с возможностью мультиязычной поддержки. Она значительно облегчает управление текстом в проекте.&lt;br /&gt;
&lt;br /&gt;
Для вызова текстового редактора можно воспользоваться меню '''Tools -&amp;gt; [[Интерфейс TextEditor|Text Editor]]''', либо кнопкой быстрого запуска [[Файл:Text_base.png‎]].&lt;br /&gt;
Сначала текстовая база будет отсутствовать, поэтому ее нужно создать. Заходите в пункт меню '''Project -&amp;gt; New'''. Появляется пустая база ресурсов, по умолчанию названная '''Untitled'''. Ее можно переименовать как вам удобней. Аналогично как в редакторе ресурсов слева вы видите дерево текстовых объектов. Нажимаем правой кнопкой по названию базы Untitled и выбираем ''add folder'''. Таким образом мы создали новую папку. Назовем ее lesson_6. Нажимая по папке правой кнопкой выбираем '''Add record'''. Каждый раз при добавлении новой текстовой записи редактор просит нас написать ее имя. Это имя можно будет изменить в любой момент. Запишем имя first_part. Создавать папки и записи можно также с помощью кнопок быстрого доступа на панели. Выделим папку lesson_6 и нажмем на значок &amp;quot;Add record&amp;quot;. Запишем имя новой текстовой записи second_part.&lt;br /&gt;
[[Файл:Именитый.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Пока эти текстовые записи пустые. Для того чтобы заполнить их, выделим первую запись. Справа мы видим столбцы '''word''', '''sentence1''', '''sentence2''' и '''voice'''. В данном уроке нам понадобится только первый столбец '''word'''. Об остальных подробнее узнаете в следующем уроке. В строках записывается текст на разных языках. Запишем текст на русском и его перевод на английский в соответствующие поля. Для first_part - Первая часть текста (The first part of the text), для second_part - Вторая часть текста (The second part of the text). Запись на разных языках позволяет, в зависимости от локализации мобильного устройства, выбирать язык текстовых объектов.&lt;br /&gt;
&lt;br /&gt;
Для того что бы добавить какой-либо язык в базу данных необходимо выполнить следующие действия:&lt;br /&gt;
1) Проходим путь Project/Properties/Select languages…&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление языка (1).png|600px]]&lt;br /&gt;
&lt;br /&gt;
2) После этого необходимо выбрать языки которые вы хотите добавить&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление_языка_(2).png|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Можете похвалить себя&lt;br /&gt;
&lt;br /&gt;
Если вы добавили языки, но они не видны, проверьте, не создали ли вы случайно свою папку в папке Untranslatable.&lt;br /&gt;
&lt;br /&gt;
Чтобы корректно пользоваться текстовой базой после каждого ее изменения, ее необходимо сохранять. Можно воспользоваться кнопками быстрого доступа и нажать на значок дискеты. При первом сохранении текстовый редактор просит вас выбрать место сохранения и имя файла. Сохраним его в папку с проектом lessons и назовем text_base. Также текстовую базу нужно подвязать к базе ресурсов. Для этого заходим в пункт меню '''Resource -&amp;gt; Choose Resource File'''. Выбираем папку, в которая является базой ресурсов проекта и выбираем файл с расширением '''.sirx'''  . Вернемся теперь к редактору сцен. &lt;br /&gt;
В пункте меню '''Project -&amp;gt; Project options''' выбираем вкладку '''Text database''' и указываем путь к нашей текстовой базе '''text_base.xml'''  .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!'''  Во время роботы в редакторе, когда вы создаете новый проект, автоматически создается и текстовая база. В данном уроке вам лишь нужно внести изменения в уже существующую базу '''File -&amp;gt; Open -&amp;gt; \\....\\text.xml'''.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый объект текстовой базы имеет свой уникальный '''id'''. Мы можем вызывать текст из текстовой базы меняя текстовому объекту на сцене этот id с помощью кнопки или машины состояний.&lt;br /&gt;
&lt;br /&gt;
Давайте сделаем это на примере нашего проекта.&lt;br /&gt;
Так как теперь мы будем пользоваться только одним текстовым объектом на сцене, то второй text2 можно удалить. В объекте text удалим из пункта текст запись &amp;quot;Первая часть текста&amp;quot;. Перепишем также немного состояния нашей машины. В поле '''val_txt''' мы записываем id текста путем перетаскивания его из текстовой базы (перед перетаскиванием id текста нужно сохранять и переоткрывать текстовую базу).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_7.jpg]]&lt;br /&gt;
&lt;br /&gt;
Теперь в состояниях машины мы присваиваем нашему объекту text только текстовые id из текстовой базы. Сохраняем проект и запускаем. Результат тот же, что и в первом случае. Заметим, что на сцене стало на один объект меньше, а состояния машины сократились на одну строчку. Может это не существенно в таком маленьком проекте, но в больших проектах количество объектов и величина исполняемого файла может стать решающей причиной к упрощению кода.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Добавьте в текстовую базу еще несколько записей.&lt;br /&gt;
* Расширьте состояния машины, чтобы последовательно вывести на экран все текстовые записи.&lt;br /&gt;
* Поменяйте язык приложения, используя объект '''[[Options|Options]]'''.&lt;br /&gt;
До сих пор мы изучали объекты и их свойства для каждого определенного экрана. Рассмотрим возможность изменять параметры всего приложения.&lt;br /&gt;
Будем изменять язык приложения. Для этого необходимо ознакомится с объектом Options.&lt;br /&gt;
&lt;br /&gt;
'''Options''' — объект, который используется для хранения и управления глобальными параметрами приложения. Также Options позволяет хранить и использовать параметры записанные в него другими объектами.&lt;br /&gt;
&lt;br /&gt;
В проекте lessons создаем новый экран, для которого в свойствах устанавливаем глобальный&lt;br /&gt;
&lt;br /&gt;
[[Файл:Глобальный.PNG]]&lt;br /&gt;
&lt;br /&gt;
В экране '''opt''' создадим сцену '''opt'''. Создадим на сцене opt новый объект, переименуем его в '''Options'''. Поменяем ему тип на option (Option → option).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Опции.PNG]]&lt;br /&gt;
&lt;br /&gt;
Создадим в проекте новый экран '''lessons_6_1''' со сценой '''6_1'''. В сцену из проекта '''lessons_6''' копируем объекты '''bg_1''', '''button_next''', Text не изменяя их параметры. Перенесем на сцену из редактора ресурсов, из папки lessons_2, объекты: '''arrow_lf_norm''' и '''arrow_rt_norm'''. Переименуем,  arrow_lf_norm в '''en''',  arrow_rt_norm в '''ru''', и сделаем их машинами. Добавляем ниже на сцену новый объект, изменяем ему тип на '''[[Groupset|Groupset]]''' и имя на '''groupset'''. Щелкаем в свойствах по имени правой кнопкой мыши, добавляем в свойства объект, из списка объектов выбираем Text.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Группа.PNG]]&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Groupset'''&lt;br /&gt;
&lt;br /&gt;
'''Groupset (группа)'''  позволяет передавать состояния и параметры множеству объектов, которые являются участниками группы. Участником группы является любой объект, указанный в в объекте Groupset.&lt;br /&gt;
&lt;br /&gt;
Groupset удобно использовать, когда необходимо обращаться к множеству объектов.&lt;br /&gt;
Если объекту Groupset передается состояние (например st_1), то все объекты принадлежащие объекту Groupset должны иметь состояние st_1, иначе возникнет ошибка.&lt;br /&gt;
&lt;br /&gt;
Объекты принадлежащие одной группе могут быть разного типа и разноименными.&lt;br /&gt;
&lt;br /&gt;
Команды применимые к группе:&lt;br /&gt;
&lt;br /&gt;
• ''set'' — группе можно установить состояние st и параметр (значение) par(val);&lt;br /&gt;
&lt;br /&gt;
• ''drop'' —  на группу (объекты принадлежащие группе) можно отпустить объект.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для каждой из добавленных машин запишем состояния.&lt;br /&gt;
&lt;br /&gt;
Машина en:&lt;br /&gt;
&lt;br /&gt;
[[Файл:En.PNG]]&lt;br /&gt;
&lt;br /&gt;
Машина ru&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ru.PNG]]&lt;br /&gt;
&lt;br /&gt;
Как видно, в состоянии on, каждой машины, задается lang (язык) в глобальном объекте Options. В состояние r  Groupset передается состояние init (инициализация объекта).&lt;br /&gt;
&lt;br /&gt;
Сохраняем и запускаем вьювер.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Вьювер.PNG]]&lt;br /&gt;
&lt;br /&gt;
На экране  расположено три кнопки и текст. При нажатие кнопки вперед язык текста меняется — на русский, при нажатие назад — на английский, желтая кнопка вперед меняет сам текст.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10036</id>
		<title>Редактор текстовых ресурсов</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2&amp;diff=10036"/>
		<updated>2021-08-04T12:34:45Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Объект Text */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
----&lt;br /&gt;
'''Цель:''' научится пользоваться редактором текстовых ресурсов на примере использования объекта типа &amp;quot;text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Cоздать новый экран и сцену для этого урока.&lt;br /&gt;
* Вывести на экран последовательно два текста с помощью двух текстовых объектов.&lt;br /&gt;
* Вывести на экран эти же тексты, но с помощью только одного текстового объекта.&lt;br /&gt;
&lt;br /&gt;
== Объект Text ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Начнём урок, как обычно,  с открытия проекта lessons. В нём добавим новый экран lesson_6&lt;br /&gt;
со сценой stg_main, так как это было описано в предыдущем [[Создание экранов, сцен. Работа с кнопками|уроке]]. Поместим из редактора ресурсов на сцену любой фон из папки этого или предыдущего  урока. Для примера далее используется &amp;quot;лунный пейзаж&amp;quot; (картинка '''bg''').&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_1.jpg|right]]&lt;br /&gt;
Поверх фона поместите на сцену картинку ввиде стрелки вправо. Назовите ее '''button_next'''. Выберите для нее тип '''machine'''. Кликая на сцене правой кнопкой мыши, выберете пункт из выпадающего меню &amp;quot;Создать объект в текущем элементе&amp;quot;. Новый объект переименуйте в Text и выберите для него тип '''[[Text|Text]]''' (также нужно выставить размеры данному объекту, чтобы текст был виден).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Меняем текст машиной ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы было что менять, скопируем объект Text и вставим его в этой же сцене. Переименуем его в text2. Так как эти два объекта без графического ресурса, то на сцене мы можем их видеть как пустые рамки (зеленая рамка, если объет выделен, и красная - если не выделен).&lt;br /&gt;
[[Файл:Lesson6_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Text_prop.png‎|right]]&lt;br /&gt;
Посмотрим на свойства объекта Text. В поле &amp;quot;текст&amp;quot; впишем &amp;quot;Первая часть текста&amp;quot;. В поле &amp;quot;шрифт&amp;quot; в строке &amp;quot;цвет 1&amp;quot; выберем белый цвет. В свойствах объекта text2 в поле текст впишем &amp;quot;Вторая часть текста&amp;quot;. Цвет шрифта поставим такой же. Таким образом, мы получили две текстовых надписей на сцене, которые располагаются одна поверх другой. Если мы сейчас сохраним проект и запустим, то обе надписи будут видны одновременно, что затруднит их читаемость. Для того, чтобы мы могли без проблем их прочитать, сделаем переключение текстов по нажатию на кнопку. На самом деле, '''button_next''' только выглядит как кнопка - это машина состояний. Пропишем для нее логику таким образом, чтобы при нажатии на машину, она по-очереди делала видимым то один текст, то другой. Создайте для этой машины следующие состояния.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_4.jpg]]&lt;br /&gt;
&lt;br /&gt;
За видимость объектов отвечает параметр '''vis'''. Если vis=0, то объект не видно, если 1 - видно. По клику осуществляется переход между состояниями. Сохраните проект и запустите этот экран. Вы видите, что по клику на кнопку текст изменяется.&lt;br /&gt;
[[Файл:Lesson6_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Переключать текстовые объекты можно еще несколькими способами:&lt;br /&gt;
&lt;br /&gt;
- менять параметр '''al''' (alpha); это позволит делать текст полупрозрачным (в отличии от '''vis''', параметр '''al''' может принимать промежуточные значения между 0 и 1);&lt;br /&gt;
&lt;br /&gt;
- менять текстовому объекту состояние; как известно, у объекта [[Text#Состояния | text]] есть 3 состояния '''first''', '''next''', '''end''', чтобы текст стал видимым, достаточно передать ему состояние '''first''', чтобы текст исчез, достаточно передать ему состояние '''end'''.&lt;br /&gt;
&lt;br /&gt;
== Создаем текстовую базу ==&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере мы научились вставлять текстовые объекты на сцену и менять их видимость. Все это мы сделали не имея текстовой базы. Текстовая база предназначена для хранения всей текстовой информации вашего проекта, с возможностью мультиязычной поддержки. Она значительно облегчает управление текстом в проекте.&lt;br /&gt;
&lt;br /&gt;
Для вызова текстового редактора можно воспользоваться меню '''Tools -&amp;gt; [[Интерфейс TextEditor|Text Editor]]''', либо кнопкой быстрого запуска [[Файл:Text_base.png‎]].&lt;br /&gt;
Сначала текстовая база будет отсутствовать, поэтому ее нужно создать. Заходите в пункт меню '''file -&amp;gt; New'''. Появляется пустая база ресурсов, по умолчанию названная '''Untitled'''. Ее можно переименовать как вам удобней. Аналогично как в редакторе ресурсов слева вы видите дерево текстовых объектов. Нажимаем правой кнопкой по названию базы Untitled и выбираем ''add folder'''. Таким образом мы создали новую папку. Назовем ее lesson_6. Нажимая по папке правой кнопкой выбираем '''Add record'''. Каждый раз при добавлении новой текстовой записи редактор просит нас написать ее имя. Это имя можно будет изменить в любой момент. Запишем имя first_part. Создавать папки и записи можно также с помощью кнопок быстрого доступа на панели. Выделим папку lesson_6 и нажмем на значок &amp;quot;Add record&amp;quot;. Запишем имя новой текстовой записи second_part.&lt;br /&gt;
[[Файл:Именитый.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Пока эти текстовые записи пустые. Для того чтобы заполнить их, выделим первую запись. Справа мы видим столбцы '''word''', '''sentence1''', '''sentence2''' и '''voice'''. В данном уроке нам понадобится только первый столбец '''word'''. Об остальных подробнее узнаете в следующем уроке. В строках записывается текст на разных языках. Запишем текст на русском и его перевод на английский в соответствующие поля. Для first_part - Первая часть текста (The first part of the text), для second_part - Вторая часть текста (The second part of the text). Запись на разных языках позволяет, в зависимости от локализации мобильного устройства, выбирать язык текстовых объектов.&lt;br /&gt;
&lt;br /&gt;
Для того что бы добавить какой-либо язык в базу данных необходимо выполнить следующие действия:&lt;br /&gt;
1) Проходим путь Project/Properties/Select languages…&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление языка (1).png|600px]]&lt;br /&gt;
&lt;br /&gt;
2) После этого необходимо выбрать языки которые вы хотите добавить&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Добавление_языка_(2).png|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Можете похвалить себя&lt;br /&gt;
&lt;br /&gt;
Если вы добавили языки, но они не видны, проверьте, не создали ли вы случайно свою папку в папке Untranslatable.&lt;br /&gt;
&lt;br /&gt;
Чтобы корректно пользоваться текстовой базой после каждого ее изменения, ее необходимо сохранять. Можно воспользоваться кнопками быстрого доступа и нажать на значок дискеты. При первом сохранении текстовый редактор просит вас выбрать место сохранения и имя файла. Сохраним его в папку с проектом lessons и назовем text_base. Также текстовую базу нужно подвязать к базе ресурсов. Для этого заходим в пункт меню '''Resource -&amp;gt; Choose Resource File'''. Выбираем папку, в которая является базой ресурсов проекта и выбираем файл с расширением '''.sirx'''  . Вернемся теперь к редактору сцен. &lt;br /&gt;
В пункте меню '''Project -&amp;gt; Project options''' выбираем вкладку '''Text database''' и указываем путь к нашей текстовой базе '''text_base.xml'''  .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:wrong.png|right|32px]]&lt;br /&gt;
'''Внимание!'''  Во время роботы в редакторе, когда вы создаете новый проект, автоматически создается и текстовая база. В данном уроке вам лишь нужно внести изменения в уже существующую базу '''File -&amp;gt; Open -&amp;gt; \\....\\text.xml'''.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый объект текстовой базы имеет свой уникальный '''id'''. Мы можем вызывать текст из текстовой базы меняя текстовому объекту на сцене этот id с помощью кнопки или машины состояний.&lt;br /&gt;
&lt;br /&gt;
Давайте сделаем это на примере нашего проекта.&lt;br /&gt;
Так как теперь мы будем пользоваться только одним текстовым объектом на сцене, то второй text2 можно удалить. В объекте text удалим из пункта текст запись &amp;quot;Первая часть текста&amp;quot;. Перепишем также немного состояния нашей машины. В поле '''val_txt''' мы записываем id текста путем перетаскивания его из текстовой базы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lesson6_7.jpg]]&lt;br /&gt;
&lt;br /&gt;
Теперь в состояниях машины мы присваиваем нашему объекту text только текстовые id из текстовой базы. Сохраняем проект и запускаем. Результат тот же, что и в первом случае. Заметим, что на сцене стало на один объект меньше, а состояния машины сократились на одну строчку. Может это не существенно в таком маленьком проекте, но в больших проектах количество объектов и величина исполняемого файла может стать решающей причиной к упрощению кода.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Добавьте в текстовую базу еще несколько записей.&lt;br /&gt;
* Расширьте состояния машины, чтобы последовательно вывести на экран все текстовые записи.&lt;br /&gt;
* Поменяйте язык приложения, используя объект '''[[Options|Options]]'''.&lt;br /&gt;
До сих пор мы изучали объекты и их свойства для каждого определенного экрана. Рассмотрим возможность изменять параметры всего приложения.&lt;br /&gt;
Будем изменять язык приложения. Для этого необходимо ознакомится с объектом Options.&lt;br /&gt;
&lt;br /&gt;
'''Options''' — объект, который используется для хранения и управления глобальными параметрами приложения. Также Options позволяет хранить и использовать параметры записанные в него другими объектами.&lt;br /&gt;
&lt;br /&gt;
В проекте lessons создаем новый экран, для которого в свойствах устанавливаем глобальный&lt;br /&gt;
&lt;br /&gt;
[[Файл:Глобальный.PNG]]&lt;br /&gt;
&lt;br /&gt;
В экране '''opt''' создадим сцену '''opt'''. Создадим на сцене opt новый объект, переименуем его в '''Options'''. Поменяем ему тип на option (Option → option).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Опции.PNG]]&lt;br /&gt;
&lt;br /&gt;
Создадим в проекте новый экран '''lessons_6_1''' со сценой '''6_1'''. В сцену из проекта '''lessons_6''' копируем объекты '''bg_1''', '''button_next''', Text не изменяя их параметры. Перенесем на сцену из редактора ресурсов, из папки lessons_2, объекты: '''arrow_lf_norm''' и '''arrow_rt_norm'''. Переименуем,  arrow_lf_norm в '''en''',  arrow_rt_norm в '''ru''', и сделаем их машинами. Добавляем ниже на сцену новый объект, изменяем ему тип на '''[[Groupset|Groupset]]''' и имя на '''groupset'''. Щелкаем в свойствах по имени правой кнопкой мыши, добавляем в свойства объект, из списка объектов выбираем Text.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Группа.PNG]]&lt;br /&gt;
&lt;br /&gt;
'''Описание объекта Groupset'''&lt;br /&gt;
&lt;br /&gt;
'''Groupset (группа)'''  позволяет передавать состояния и параметры множеству объектов, которые являются участниками группы. Участником группы является любой объект, указанный в в объекте Groupset.&lt;br /&gt;
&lt;br /&gt;
Groupset удобно использовать, когда необходимо обращаться к множеству объектов.&lt;br /&gt;
Если объекту Groupset передается состояние (например st_1), то все объекты принадлежащие объекту Groupset должны иметь состояние st_1, иначе возникнет ошибка.&lt;br /&gt;
&lt;br /&gt;
Объекты принадлежащие одной группе могут быть разного типа и разноименными.&lt;br /&gt;
&lt;br /&gt;
Команды применимые к группе:&lt;br /&gt;
&lt;br /&gt;
• ''set'' — группе можно установить состояние st и параметр (значение) par(val);&lt;br /&gt;
&lt;br /&gt;
• ''drop'' —  на группу (объекты принадлежащие группе) можно отпустить объект.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для каждой из добавленных машин запишем состояния.&lt;br /&gt;
&lt;br /&gt;
Машина en:&lt;br /&gt;
&lt;br /&gt;
[[Файл:En.PNG]]&lt;br /&gt;
&lt;br /&gt;
Машина ru&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ru.PNG]]&lt;br /&gt;
&lt;br /&gt;
Как видно, в состоянии on, каждой машины, задается lang (язык) в глобальном объекте Options. В состояние r  Groupset передается состояние init (инициализация объекта).&lt;br /&gt;
&lt;br /&gt;
Сохраняем и запускаем вьювер.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Вьювер.PNG]]&lt;br /&gt;
&lt;br /&gt;
На экране  расположено три кнопки и текст. При нажатие кнопки вперед язык текста меняется — на русский, при нажатие назад — на английский, желтая кнопка вперед меняет сам текст.&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Движение машин: жучки, ключи и многое другое|Урок 5]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Создание игры «Hidden Object Game»|Урок 7]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10035</id>
		<title>Движение машин: жучки, ключи и многое другое</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10035"/>
		<updated>2021-08-04T12:29:13Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Саквояж и жук */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить процессы движения и способы взаимодействия машин.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* реализовать разными методами &amp;quot;ход конем&amp;quot;;&lt;br /&gt;
* организовать циклическое движение по квадрату;&lt;br /&gt;
* разобраться с понятием точки пивота;&lt;br /&gt;
* научиться согласовывать поступательное и вращательное движение;&lt;br /&gt;
* рассмотреть способ применения одного предмета на другой.&lt;br /&gt;
&lt;br /&gt;
== Процессы и движение ==&lt;br /&gt;
&lt;br /&gt;
До сих пор мы ограничивались только одной командой процессов - '''wait''' (ожидание).&lt;br /&gt;
В этом уроке мы рассмотрим другие процессы. Существуют следующие команды движения (изменения объекта):&lt;br /&gt;
* '''move''' - движение по прямой&lt;br /&gt;
* '''rot'''  - вращение &lt;br /&gt;
* '''scale''' - изменение размера&lt;br /&gt;
* '''alpha''' - изменение прозрачности&lt;br /&gt;
* '''phys''' - движение в силовом поле.&lt;br /&gt;
 &lt;br /&gt;
В каждой команде достаточно много параметров. Например, можно сдвинуться (move)&lt;br /&gt;
по горизонтали на '''dx''' пикселей за время '''t'''. Вместо времени можно указать скорость  '''v''' в пикселях в секунду.&lt;br /&gt;
Можно двигаться в определенную целевую точку с координатами ('''tx''', '''ty''') и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Ход конем ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lady_bug_64.png|right]]&lt;br /&gt;
Рассмотрим простой пример в котором объект движется сначала вверх на 100 пикселей, а затем вправо на 200.&lt;br /&gt;
В качестве такого объекта будем использовать ladybug (божья коровка или для краткости жучок), &lt;br /&gt;
картинку которой можно найти в редакторе ресурсов в папке этого урока.&lt;br /&gt;
Как обычно, перетаскиваем её на сцену, переименовываем и превращаем в машину состояний.&lt;br /&gt;
Организуем сначала движние нашего жучка при помощи трёх состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug1.png]] &lt;br /&gt;
&lt;br /&gt;
Первое, стартовое состояние является запускающим. Если кликнуть на жучка, то он начнет своё движение.&lt;br /&gt;
Когда перемещение по вертикали заканчивается (состояние up), жучок переходит в третье состояние (right), в котором движется вправо.&lt;br /&gt;
Закончив движение, он возвращается в стартовое состояние и ждет очередного клика.&lt;br /&gt;
&lt;br /&gt;
Координатная ось Y (вертикальная) на сцене направлена вниз, а ось X (горизонтальная) -- вправо.&lt;br /&gt;
Поэтому, чтобы жучок начал двигаться вверх, его смещение должно быть отрицательным.&lt;br /&gt;
В нашем случае это dy=-100. Эти 100 пикселей объект должен пройти за одну секунду (t=1000).&lt;br /&gt;
В конце выполнения команды move происходит переход в следующее состояние, имя которого задается в поле &amp;quot;'''go'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
При движении вправо, происходит смещение на 200 пикселей.&lt;br /&gt;
Чтобы скорость движения вверх и вправо была постоянной, необходимо соответственно увеличить&lt;br /&gt;
время движения (t=2000).&lt;br /&gt;
&lt;br /&gt;
Точно такое же движение можно организовать в рамках одного, а не двух состояний.&lt;br /&gt;
Поместите на сцену еще одного жучка, дайте ему другое имя и задайте следующую машину состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug2.png]]&lt;br /&gt;
&lt;br /&gt;
Команды move в состоянии way выполняются последовательно.&lt;br /&gt;
Сначала отрабатывает нулевой move, а затем первый.&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат. Оба жучка должны двигаться одинаковым образом.&lt;br /&gt;
Не забывайте при тестировании включать отладочную информацию о текущих состояниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательно и параллельно ===&lt;br /&gt;
&lt;br /&gt;
И так, в рамках данного состояния все команды процессов с одинаковым названием выполняются '''последовательно'''.&lt;br /&gt;
При этом команды с разными именами выполняются '''параллельно'''.&lt;br /&gt;
&lt;br /&gt;
[[файл:Def_procesess1.png|right]]&lt;br /&gt;
Пусть в состянии есть несколько команд move и несколько команд rot (вращения):&lt;br /&gt;
* move0 move1 rot0 move2 rot1 rot2&lt;br /&gt;
Независимо от их чередования, они выстраиваются в параллельные списки процессов:&lt;br /&gt;
* move0   rot0&lt;br /&gt;
* move1   rot1&lt;br /&gt;
* move2   rot2&lt;br /&gt;
Эти списки начинают одновременно выполняться сверху вниз: &lt;br /&gt;
отрабатывают команды move и одновременно с ними комананды rot.&lt;br /&gt;
&lt;br /&gt;
Заставим нашего жучка при совершении хода конем поворачиваться на 360 градусов.&lt;br /&gt;
Для этого поместим третью машину со следующими состояниями:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug3.png]]&lt;br /&gt;
&lt;br /&gt;
Запустите проект во вьювере. &lt;br /&gt;
Одновременно с выполнением двух команд move будет выполняться одна команда rot.&lt;br /&gt;
Время выполнения rot равно суммарному времени двух команд move (t=3000=1000+2000).&lt;br /&gt;
В результате, к концу движения, жучок поворачивается на da=360 градусов ('''da''' - изменение угла).&lt;br /&gt;
&lt;br /&gt;
Переход в следующее состояние '''go''' в данном случае можно было бы поставить не в команду '''rot''',&lt;br /&gt;
а в последнюю команду '''move'''. Однако приведенное решение лучше, так как&lt;br /&gt;
гарантирует, что переход произойдет только, когда жучок полностью развернется.&lt;br /&gt;
Хотя суммарное время move совпадает с временем rot, реальное компьютерное время&lt;br /&gt;
выполнения этих команд может немного отличаться. В результате, если выйти из&lt;br /&gt;
состояния по окончанию движения, можно получить не до конца развернувшегося жучка.&lt;br /&gt;
&lt;br /&gt;
=== Циклическое движение ===&lt;br /&gt;
&lt;br /&gt;
С командами движения, также как и с командой ожидания, можно использовать циклы.&lt;br /&gt;
Например, заставим (уже четвертого) жучка при клике два раз оббегать стороны квадрата.&lt;br /&gt;
Это можно сделать при помощи следующей машины:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug4.png]]&lt;br /&gt;
&lt;br /&gt;
Четыре команды move выполняются одна за одной.&lt;br /&gt;
Затем вьювер натыкается на параметр loop=1 и еще раз выполняет&lt;br /&gt;
это движение с самого начала. Последняя команда move служит для перехода в стартовое состояние&lt;br /&gt;
ожидания клика. &lt;br /&gt;
&lt;br /&gt;
Заметим, что нельзя было для перехода использовать '''wait'''.&lt;br /&gt;
Она, как и остальные команды процессов, запустилась бы параллельно с командами&lt;br /&gt;
и сработала бы сразу. В результате ни какого движения не получилось бы!&lt;br /&gt;
&lt;br /&gt;
Если параметр loop=-1, то движение будет бесконечным. &lt;br /&gt;
Этого же можно было добиться, поставив вместо loop=-1 параметр go с переходом в это же состояние (перезапустить состояние). &lt;br /&gt;
&lt;br /&gt;
=== Управление командами ===&lt;br /&gt;
&lt;br /&gt;
Кроме команды зацикливания данного процесса, можно из одних команд запускать другие (начинать процессы другого типа). Например, пусть жучок движется вправо в течении 1 секунды и вращается 2 секунды.&lt;br /&gt;
Команда move закончится раньше команды rot.&lt;br /&gt;
Пусть затем, закончив полный оборот (на уже остановившемся объекте), он начинает снова двигаться вправо. Реализуется это так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_move_rot.png]]&lt;br /&gt;
&lt;br /&gt;
Команда '''rot''' зациклена (loop=-1). Кроме этого, она имеет параметр move=0&lt;br /&gt;
в котором задается номер команды move которую надо запустить на выполнение после окончания вращения.&lt;br /&gt;
&lt;br /&gt;
Вызов одних команд процессов из других очень мощный, но одновременно и опасный инструмент. &lt;br /&gt;
Множественные вызовы различных команд превращают состояние в спагетти переходов,&lt;br /&gt;
логику которого часто сложно понять. Более того, иногда можно получить зависание вьювера&lt;br /&gt;
при неудачной перекрестной ссылке двух команд друг на друга.&lt;br /&gt;
По этой причине запрещено вызывать из данной команды другие команды этого же типа&lt;br /&gt;
(из rot вызывать rot и т.д.). Однако это, к сожалению, не снимает полностью проблему зависания.&lt;br /&gt;
Так, что готовьтесь...&lt;br /&gt;
&lt;br /&gt;
=== Вращение вокруг пивота ===&lt;br /&gt;
&lt;br /&gt;
При вращении (команда '''rot''') машина вращается вокруг, так называемой,&lt;br /&gt;
'''точки пивота''' (''pivot'' - штырь, болт; опорная точка).&lt;br /&gt;
В примерах выше эта точка находилась в центре картинки.&lt;br /&gt;
Изменим теперь её положение и посмотрим к какому эффекту это приведет.&lt;br /&gt;
&lt;br /&gt;
Откроем редактор ресурсов и в папке этого урока найдем солнышко. &lt;br /&gt;
Сделаем четыре действий:&lt;br /&gt;
# Кликнем на имя солнышка (sun_1) в дереве на левой панели&lt;br /&gt;
# Под этой панелью поставим галочку в чекбоксе ''Edit''.&lt;br /&gt;
# Схватимся мышкой за красный крестик в центре солнышка на правой панели и перетащим этот крестик влево.&lt;br /&gt;
# Уберем галочку в чекбоксе ''Save''&lt;br /&gt;
800&lt;br /&gt;
[[Файл:Vot-tak-vot.png|800px]]&lt;br /&gt;
Теперь перетащим солнышко на сцену этого урока (лучше для него создать отдельный экран).&lt;br /&gt;
Уменьшим его размеры модификаторами scale x и scale y, поставив там значение 0.5.&lt;br /&gt;
Превратим солнышко в такую машину:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_pivot2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохранив проект и запустив вьювер, мы увидим, что солнышко начало вращаться &lt;br /&gt;
по окружности. Машина по прежнему вращается вокруг точки пивота.&lt;br /&gt;
Однако теперь эта точка смещена в центр окружности.&lt;br /&gt;
&lt;br /&gt;
В качестве упражнения попробуйте организовать вращение, подобное вращению Земли и Луны&lt;br /&gt;
(Земля вращается по окружности, а Луна вращается по окружности меньшего радиуса вокруг Земли).&lt;br /&gt;
Для этого Вам потребуется &amp;quot;Луну&amp;quot; сделать подобъектом &amp;quot;Земли&amp;quot; и правильно выставить&lt;br /&gt;
положение &amp;quot;Луны&amp;quot; относительно &amp;quot;Земли&amp;quot;. &lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:Ok.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Если объект помещен в группу, то координаты его пивота изменяются относительно точки пивота того объекта, чьим подобъектом он является. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Поэкспериментируйте. Можно использовать следующие картинки:&lt;br /&gt;
&lt;br /&gt;
[[файл:eath.png]]  [[файл:moon.png]]&lt;br /&gt;
&lt;br /&gt;
== Как ездят кареты ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Если Вы уже организовали движение Земли и Луны, то сложное движение,&lt;br /&gt;
возникающие при наличие подобъектов, не должно вызывать затруднений.&lt;br /&gt;
В этом примере мы покажем как согласовывать поступательное и &lt;br /&gt;
вращательное движение на примере кареты с двумя колёсами.&lt;br /&gt;
Разместим все три объекта (карету и её два колеса) на сцене&lt;br /&gt;
и сделаем колеса подобъектами кареты.&lt;br /&gt;
Превратим их все в машины состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть при клике на карету она проезжает некоторое расстояние по горизонтали и останавливается.&lt;br /&gt;
Сделайте самостоятельно такую машину и протестируйте её.&lt;br /&gt;
Карета должна перемещаться, а  колеса, являясь её подобъектами, двигаться вместе с ней.&lt;br /&gt;
Однако, они пока не вращаются. Если в ресурсах не окажется колеса и кареты,&lt;br /&gt;
можно загрузить их непосредственно из этого урока:&lt;br /&gt;
&lt;br /&gt;
[[файл:kareta.png]] [[файл:koleso.png]]&lt;br /&gt;
&lt;br /&gt;
=== Немного математики ===&lt;br /&gt;
&lt;br /&gt;
Разберемся как согласовать ''поступательную'' скорость кареты и ''угловую'' скорость вращения колес. Последняя должна быть подобрана таким образом, чтобы движение &lt;br /&gt;
выглядело естественным (колеса не проскальзывали вперед или назад).&lt;br /&gt;
&lt;br /&gt;
Посмотрите на формулы возле рисунка кареты. В первой из них приводится связь длины окружности L колеса и его радиуса r. Ниже - коэффициент 57.3 перевода числа пи из углов в радианы (пи - это 3.1415.. в радианах или 180 градусов). Во второй колонке даны определения поступательной и угловой скорости (изменение расстояния или угла за некоторое время t).  &lt;br /&gt;
Наконец, в третей колонке дана ключевая для нашей задачи формула, связывающая радиус '''r''', линейную '''v''' и угловую скорости '''w'''. Попробуйте её самостоятельно вывести, из предположения, что за одно и тоже время длина смещения кареты должна совпадать с длиной окружности обода колеса.&lt;br /&gt;
При этом поступательная скорость '''v''' измеряется в пикселях за секунду, а угловая скорость '''w''' в градусах за секунду.&lt;br /&gt;
&lt;br /&gt;
=== Машины ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем теперь карету и колеса так, что бы после клика начинала двигаться карета&lt;br /&gt;
и вращаться колеса. Когда карета останавливается, то и колеса должны переставать крутится.&lt;br /&gt;
Колеса сделаем одинаковыми простыми машинами с двумя состояниями, которые назовем '''off''' (неподвижны) и '''on''' (крутятся):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что в состояниях колес нет команды draw, так как колесо всегда рисуется при помощи одной картинки, она берется по умолчанию, из той, которая была перетащена на сцену (свойство '''res''').&lt;br /&gt;
Угловая скорость '''v''' (в формулах она была обозначена как w) в команде rot измеряется в градусах в секунду. Поэтому v=180 означает, что колесо будет делать полный оборот (360 градусов) за 2 секунды.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что раньше вращение мы задавали двумя параметрами: изменением угла '''da''' за время '''t'''. Так как сейчас время вращения колеса не фиксируется (этим занимается карета),&lt;br /&gt;
то указан только один параметр: угловая скорость v.&lt;br /&gt;
&lt;br /&gt;
Так как колеса одинаковые, то имеет смысл создать сначала одно колесо, запрограммировать его, а затем скопировать, получив готовое второе колесо. Его надо будет только затем мышкой перетащить на нужное место.&lt;br /&gt;
Не забываем также переименовать машины (в нашем случае это '''koleso1''' и '''koleso2'''). &lt;br /&gt;
&lt;br /&gt;
Карета должна при клике запускать на вращение колеса (переводя в состояние on),&lt;br /&gt;
а при остановке их останавливать:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Проверьте что параметр v=66 в команде move состояния run кареты, угловая скорость колес v=180 в команде rot состояния on согласуются с радиусом колеса r=21. Радиус колеса равен половине ширины его картинки (свойство &amp;quot;размер&amp;quot;). Если Ваше колесо имеет другой размер, пересчитайте поступательную скорость по приведенной выше формуле.&lt;br /&gt;
&lt;br /&gt;
== Как открыть замок ключом ==&lt;br /&gt;
&lt;br /&gt;
В адвентюрных играх часто используется прием применения предметов.&lt;br /&gt;
При этом один предмет мышкой перетаскивается на другой, в результате&lt;br /&gt;
чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.)&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим простой пример подобного взаимодействия объектов.&lt;br /&gt;
Создайте новый экран и сцену на нём, так как предыдущий экран должен быть уже&lt;br /&gt;
забит различными насекомыми.&lt;br /&gt;
Перетащите на сцену из редактора ресурсов очередного жука, саквояж и ключ.&lt;br /&gt;
Лучше их перетаскивать именно в таком порядке.&lt;br /&gt;
Если порядок получился другой, мышкой в дереве проекта упорядочите&lt;br /&gt;
эти объекты, так  чтобы последовательность рисования была: жук, затем саквояж, затем ключ.&lt;br /&gt;
Расположите эти объекты примерно в центре сцены и сделайте их машинами состояний.&lt;br /&gt;
Поменяйте их имена на '''ladybug''' (божья коровка), '''bag''' (саквояж) и '''key''' (ключ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наша задача состоит в организации взаимодействия ключа, саквояжа и жука при котором,&lt;br /&gt;
работают такие правила:&lt;br /&gt;
* если схватить ключ мышкой, он будет таскаться по сцене в определенных границах;&lt;br /&gt;
* если отпустить ключ над саквояжем, саквояж должен &amp;quot;растаять&amp;quot;, уменьшив свою прозрачность, а ключ уменьшиться в размерах, сжавшись в точку;&lt;br /&gt;
* одновременно с этим, из-под саквояжа начинает вверх бежать жук;&lt;br /&gt;
* когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж.&lt;br /&gt;
&lt;br /&gt;
=== Ключ ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем сначала машину для ключа:&lt;br /&gt;
 &lt;br /&gt;
[[файл:lesson_5_key3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Три состояния соответствуют трём режимам функционирования ключа:&lt;br /&gt;
* '''drag''' - в этом, стартовом состоянии мы таскаем ключ по экрану &lt;br /&gt;
* '''open''' - открываем саквояж и уменьшаемся до 0&lt;br /&gt;
* '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране&lt;br /&gt;
&lt;br /&gt;
Второе состояние состояние '''open''' не должно вызвать особых затруднений.&lt;br /&gt;
В команде '''set''' меняется состояние объекта '''bag''' (саквояж) на open.&lt;br /&gt;
В этот момент саквояж должен изобразить своё открытие.&lt;br /&gt;
В команде процессов '''scale''' происходит за время t=500 миллисекунд уменьшение масштаба рисования&lt;br /&gt;
ключа (его размера) до ''целевых значений'' tx, ty которые выбраны близкими к нулю. &lt;br /&gt;
После этого ключ переходит в третье состояние back.&lt;br /&gt;
&lt;br /&gt;
В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1&lt;br /&gt;
по ширине и высоте. &lt;br /&gt;
Кроме этого появилась новая команда '''init'''. Это команда инициализации&lt;br /&gt;
или переустановки свойств данной машины. В нашем случае, мы меняем её координаты&lt;br /&gt;
на значения x=0 и y=250 пикселей. Как и команда '''set''', команда '''init''' выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции.&lt;br /&gt;
Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250,&lt;br /&gt;
чтобы туда в дальнейшем он и возвращался.&lt;br /&gt;
&lt;br /&gt;
Разберемся теперь с системой координат на сцене. &lt;br /&gt;
&lt;br /&gt;
=== Координаты на сцене ===&lt;br /&gt;
&lt;br /&gt;
Если сцена создавалась по умолчанию, то она имеет ширину 960 пикселей,&lt;br /&gt;
а высоту - 640. Начало отсчёта координат на сцене расположено в её центре.&lt;br /&gt;
Ось x, по которой откладывается горизонтальная координата объекта направлена вправо,&lt;br /&gt;
а ось Y для вертикальной координаты - вниз: &lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key2.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Стоит раскрыть координаты любого объекта (свойство положение) на панели Properties.&lt;br /&gt;
Затем потаскать объект по сцене, наблюдая как эти координаты меняются.&lt;br /&gt;
Если '''x''' стало отрицательным, значит объект находится левее центра сцены.&lt;br /&gt;
Если же отрицательный '''y''', то объект расположен выше центра.&lt;br /&gt;
&lt;br /&gt;
Заметим, что координата объекта определяется его точкой пивота.&lt;br /&gt;
Для трех объектов, находящихся сейчас на сцене точка пивота должна&lt;br /&gt;
совпадать с центрами картинок.&lt;br /&gt;
&lt;br /&gt;
Таким образом, когда мы задали в команде init положение для ключа x=0, y=250,&lt;br /&gt;
мы поместили его по середине, в нижней части сцены.&lt;br /&gt;
&lt;br /&gt;
=== Драг энд дроп ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key3_drag.png|right]]&lt;br /&gt;
Осталось разобраться с ещё двумя новыми командами,&lt;br /&gt;
которые появились в состоянии drag.&lt;br /&gt;
Первая команда '''drag''' (таскать) означает, что данную машину в этом состоянии&lt;br /&gt;
разрешено мышкой таскать по экрану.&lt;br /&gt;
При этом могут быть заданы координаты области за которую объект вытащить нельзя.&lt;br /&gt;
Эта область определяется двумя точками - верхним левым углом с координатами (x1,y1)&lt;br /&gt;
и правым нижним углом с координатами (x2,y2).&lt;br /&gt;
&lt;br /&gt;
В нашем случае эти точки почти совпадают с углами сцены.&lt;br /&gt;
На самом деле область разрешенного таскания чуть меньше размера сцены.&lt;br /&gt;
Сделано это для того, чтобы ключ нельзя было даже краешком вытащить за сцену.&lt;br /&gt;
Правый нижний угол сцены имеет координаты (x2, y2)=(480, 320)=(960/2, 640/2).&lt;br /&gt;
Ширина ключа 128 пикселей (см. свойство размер).&lt;br /&gt;
Поэтому, чтобы правая сторона ключа не выехала за сцену, для координаты y1&lt;br /&gt;
мы берем значение 416 = 480-128/2 (сужаем границу таскания на половину ширины ключа). Аналогично считаются остальные координаты области разрешенного таскания.&lt;br /&gt;
&lt;br /&gt;
Наконец, команда '''drop''' (бросить), регулирует, что должно произойти при бросании ключа&lt;br /&gt;
(отпускания мышки) если оно произошло на объекте '''obj'''.&lt;br /&gt;
В данном случае происходит переход в новое состояние (поле '''go''').&lt;br /&gt;
&lt;br /&gt;
=== Саквояж и жук ===&lt;br /&gt;
&lt;br /&gt;
Создадим теперь машину для саквояжа.&lt;br /&gt;
Она будет иметь два состояния open и close:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В состоянии close в команде '''init''' саквояж переустанавливает свою прозрачность в единичное значение (непрозрачен) al=1.00. Это необходимо, что бы появиться на экране после исчезновения.&lt;br /&gt;
Сам процесс исчезновения задается командой процесса '''alpha''' в состоянии open.&lt;br /&gt;
Эта команда меняет текущую прозрачность объекта до целевого значения ta=0 (полностью прозрачен) за время t=500 миллисекунд (пол секунды).&lt;br /&gt;
Кроме этого в этом состоянии меняется состояние жука (команда '''set'''), который должен из под саквояжа начать бежать.&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!''' Если в параметре '''ta''' команды '''alpha''' установлено значение 0, то, помимо того что объект станет полностью прозрачен, стоить иметь ввиду, что он также станет невосприимчив к кликам. Для того, чтобы прозрачный объект считывал клики, стоит задать для '''ta''' следующее значение '''ta=0.02'''&lt;br /&gt;
&lt;br /&gt;
Осталось создать два состояния для жука, который будет выбегать из под саквояжа.&lt;br /&gt;
Ничего сложного в его поведении нет:&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[файл:lesson_5_key5.png]]&lt;br /&gt;
&lt;br /&gt;
Теперь самое время протестировать результат наших действий.&lt;br /&gt;
Потаскайте сначала ключ по сцене, убедившись, что он за неё не входит.&lt;br /&gt;
Затем наведите ключом на саквояж и отпустите мышку. &lt;br /&gt;
Всё должно прийти в движение.&lt;br /&gt;
Включите отладку (кнопка S и потом кнопка C) и понаблюдайте как изменяются состояния объектов.&lt;br /&gt;
В момент выполнения процессов можно несколько раз понажимать на пробел,&lt;br /&gt;
чтобы приостановить их выполнение и запустить снова.&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Мы разобрали много команд и их параметров.&lt;br /&gt;
Однако это далеко не все возможности машин состояний.&lt;br /&gt;
Стоит прочитать документ [[Machine]] в котором описан весь язык машин.&lt;br /&gt;
Чем больше Вы создадите машин с различным поведением, тем увереннее будете с ними работать.&lt;br /&gt;
&lt;br /&gt;
В заключение приведем несколько общих советов:&lt;br /&gt;
* Проектируйте сначала логику поведения машин на бумаге.&lt;br /&gt;
* Давайте осмысленные названия для машин и их состояний.&lt;br /&gt;
* Обязательно документируйте машины, описывая их поведение на естественном языке.&lt;br /&gt;
* Копируйте однотипные машины для сокращения времени по их программированию.&lt;br /&gt;
* При сложном взаимодействии нескольких машин, вводите управляющую машину (возможно невидимую), в которой концентрируйте основную логику поведения.    &lt;br /&gt;
* Не увлекайтесь длинными состояниями с множеством команд процессов. Иногда поведение становится понятнее, если состояние разбить на несколько последовательных состояний. &lt;br /&gt;
* Смело спрашивайте совета у более опытных дизайнеров. Они в своё время поступали именно так.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* создайте движение Земли по окружности, а Луны также по окружности, но вокруг Земли;&lt;br /&gt;
* сделайте движение кареты бесконечным так, что после того как она уезжает за правый край экрана, она появлялась из-за левого края; &lt;br /&gt;
* заставьте жука начинать бежать, только когда саквояж полностью уменьшится (set на выходе из состояния).&lt;br /&gt;
* организуйте так, чтобы при перетаскивании ключа в область саквояжа, жук развернулся на 180 градусов и двигался вниз, обратно под саквояж.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10034</id>
		<title>Движение машин: жучки, ключи и многое другое</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%D0%B6%D1%83%D1%87%D0%BA%D0%B8,_%D0%BA%D0%BB%D1%8E%D1%87%D0%B8_%D0%B8_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B5_%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5&amp;diff=10034"/>
		<updated>2021-08-04T12:28:12Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Саквояж и жук */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить процессы движения и способы взаимодействия машин.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* реализовать разными методами &amp;quot;ход конем&amp;quot;;&lt;br /&gt;
* организовать циклическое движение по квадрату;&lt;br /&gt;
* разобраться с понятием точки пивота;&lt;br /&gt;
* научиться согласовывать поступательное и вращательное движение;&lt;br /&gt;
* рассмотреть способ применения одного предмета на другой.&lt;br /&gt;
&lt;br /&gt;
== Процессы и движение ==&lt;br /&gt;
&lt;br /&gt;
До сих пор мы ограничивались только одной командой процессов - '''wait''' (ожидание).&lt;br /&gt;
В этом уроке мы рассмотрим другие процессы. Существуют следующие команды движения (изменения объекта):&lt;br /&gt;
* '''move''' - движение по прямой&lt;br /&gt;
* '''rot'''  - вращение &lt;br /&gt;
* '''scale''' - изменение размера&lt;br /&gt;
* '''alpha''' - изменение прозрачности&lt;br /&gt;
* '''phys''' - движение в силовом поле.&lt;br /&gt;
 &lt;br /&gt;
В каждой команде достаточно много параметров. Например, можно сдвинуться (move)&lt;br /&gt;
по горизонтали на '''dx''' пикселей за время '''t'''. Вместо времени можно указать скорость  '''v''' в пикселях в секунду.&lt;br /&gt;
Можно двигаться в определенную целевую точку с координатами ('''tx''', '''ty''') и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Ход конем ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lady_bug_64.png|right]]&lt;br /&gt;
Рассмотрим простой пример в котором объект движется сначала вверх на 100 пикселей, а затем вправо на 200.&lt;br /&gt;
В качестве такого объекта будем использовать ladybug (божья коровка или для краткости жучок), &lt;br /&gt;
картинку которой можно найти в редакторе ресурсов в папке этого урока.&lt;br /&gt;
Как обычно, перетаскиваем её на сцену, переименовываем и превращаем в машину состояний.&lt;br /&gt;
Организуем сначала движние нашего жучка при помощи трёх состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug1.png]] &lt;br /&gt;
&lt;br /&gt;
Первое, стартовое состояние является запускающим. Если кликнуть на жучка, то он начнет своё движение.&lt;br /&gt;
Когда перемещение по вертикали заканчивается (состояние up), жучок переходит в третье состояние (right), в котором движется вправо.&lt;br /&gt;
Закончив движение, он возвращается в стартовое состояние и ждет очередного клика.&lt;br /&gt;
&lt;br /&gt;
Координатная ось Y (вертикальная) на сцене направлена вниз, а ось X (горизонтальная) -- вправо.&lt;br /&gt;
Поэтому, чтобы жучок начал двигаться вверх, его смещение должно быть отрицательным.&lt;br /&gt;
В нашем случае это dy=-100. Эти 100 пикселей объект должен пройти за одну секунду (t=1000).&lt;br /&gt;
В конце выполнения команды move происходит переход в следующее состояние, имя которого задается в поле &amp;quot;'''go'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
При движении вправо, происходит смещение на 200 пикселей.&lt;br /&gt;
Чтобы скорость движения вверх и вправо была постоянной, необходимо соответственно увеличить&lt;br /&gt;
время движения (t=2000).&lt;br /&gt;
&lt;br /&gt;
Точно такое же движение можно организовать в рамках одного, а не двух состояний.&lt;br /&gt;
Поместите на сцену еще одного жучка, дайте ему другое имя и задайте следующую машину состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug2.png]]&lt;br /&gt;
&lt;br /&gt;
Команды move в состоянии way выполняются последовательно.&lt;br /&gt;
Сначала отрабатывает нулевой move, а затем первый.&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат. Оба жучка должны двигаться одинаковым образом.&lt;br /&gt;
Не забывайте при тестировании включать отладочную информацию о текущих состояниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательно и параллельно ===&lt;br /&gt;
&lt;br /&gt;
И так, в рамках данного состояния все команды процессов с одинаковым названием выполняются '''последовательно'''.&lt;br /&gt;
При этом команды с разными именами выполняются '''параллельно'''.&lt;br /&gt;
&lt;br /&gt;
[[файл:Def_procesess1.png|right]]&lt;br /&gt;
Пусть в состянии есть несколько команд move и несколько команд rot (вращения):&lt;br /&gt;
* move0 move1 rot0 move2 rot1 rot2&lt;br /&gt;
Независимо от их чередования, они выстраиваются в параллельные списки процессов:&lt;br /&gt;
* move0   rot0&lt;br /&gt;
* move1   rot1&lt;br /&gt;
* move2   rot2&lt;br /&gt;
Эти списки начинают одновременно выполняться сверху вниз: &lt;br /&gt;
отрабатывают команды move и одновременно с ними комананды rot.&lt;br /&gt;
&lt;br /&gt;
Заставим нашего жучка при совершении хода конем поворачиваться на 360 градусов.&lt;br /&gt;
Для этого поместим третью машину со следующими состояниями:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug3.png]]&lt;br /&gt;
&lt;br /&gt;
Запустите проект во вьювере. &lt;br /&gt;
Одновременно с выполнением двух команд move будет выполняться одна команда rot.&lt;br /&gt;
Время выполнения rot равно суммарному времени двух команд move (t=3000=1000+2000).&lt;br /&gt;
В результате, к концу движения, жучок поворачивается на da=360 градусов ('''da''' - изменение угла).&lt;br /&gt;
&lt;br /&gt;
Переход в следующее состояние '''go''' в данном случае можно было бы поставить не в команду '''rot''',&lt;br /&gt;
а в последнюю команду '''move'''. Однако приведенное решение лучше, так как&lt;br /&gt;
гарантирует, что переход произойдет только, когда жучок полностью развернется.&lt;br /&gt;
Хотя суммарное время move совпадает с временем rot, реальное компьютерное время&lt;br /&gt;
выполнения этих команд может немного отличаться. В результате, если выйти из&lt;br /&gt;
состояния по окончанию движения, можно получить не до конца развернувшегося жучка.&lt;br /&gt;
&lt;br /&gt;
=== Циклическое движение ===&lt;br /&gt;
&lt;br /&gt;
С командами движения, также как и с командой ожидания, можно использовать циклы.&lt;br /&gt;
Например, заставим (уже четвертого) жучка при клике два раз оббегать стороны квадрата.&lt;br /&gt;
Это можно сделать при помощи следующей машины:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_bug4.png]]&lt;br /&gt;
&lt;br /&gt;
Четыре команды move выполняются одна за одной.&lt;br /&gt;
Затем вьювер натыкается на параметр loop=1 и еще раз выполняет&lt;br /&gt;
это движение с самого начала. Последняя команда move служит для перехода в стартовое состояние&lt;br /&gt;
ожидания клика. &lt;br /&gt;
&lt;br /&gt;
Заметим, что нельзя было для перехода использовать '''wait'''.&lt;br /&gt;
Она, как и остальные команды процессов, запустилась бы параллельно с командами&lt;br /&gt;
и сработала бы сразу. В результате ни какого движения не получилось бы!&lt;br /&gt;
&lt;br /&gt;
Если параметр loop=-1, то движение будет бесконечным. &lt;br /&gt;
Этого же можно было добиться, поставив вместо loop=-1 параметр go с переходом в это же состояние (перезапустить состояние). &lt;br /&gt;
&lt;br /&gt;
=== Управление командами ===&lt;br /&gt;
&lt;br /&gt;
Кроме команды зацикливания данного процесса, можно из одних команд запускать другие (начинать процессы другого типа). Например, пусть жучок движется вправо в течении 1 секунды и вращается 2 секунды.&lt;br /&gt;
Команда move закончится раньше команды rot.&lt;br /&gt;
Пусть затем, закончив полный оборот (на уже остановившемся объекте), он начинает снова двигаться вправо. Реализуется это так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_move_rot.png]]&lt;br /&gt;
&lt;br /&gt;
Команда '''rot''' зациклена (loop=-1). Кроме этого, она имеет параметр move=0&lt;br /&gt;
в котором задается номер команды move которую надо запустить на выполнение после окончания вращения.&lt;br /&gt;
&lt;br /&gt;
Вызов одних команд процессов из других очень мощный, но одновременно и опасный инструмент. &lt;br /&gt;
Множественные вызовы различных команд превращают состояние в спагетти переходов,&lt;br /&gt;
логику которого часто сложно понять. Более того, иногда можно получить зависание вьювера&lt;br /&gt;
при неудачной перекрестной ссылке двух команд друг на друга.&lt;br /&gt;
По этой причине запрещено вызывать из данной команды другие команды этого же типа&lt;br /&gt;
(из rot вызывать rot и т.д.). Однако это, к сожалению, не снимает полностью проблему зависания.&lt;br /&gt;
Так, что готовьтесь...&lt;br /&gt;
&lt;br /&gt;
=== Вращение вокруг пивота ===&lt;br /&gt;
&lt;br /&gt;
При вращении (команда '''rot''') машина вращается вокруг, так называемой,&lt;br /&gt;
'''точки пивота''' (''pivot'' - штырь, болт; опорная точка).&lt;br /&gt;
В примерах выше эта точка находилась в центре картинки.&lt;br /&gt;
Изменим теперь её положение и посмотрим к какому эффекту это приведет.&lt;br /&gt;
&lt;br /&gt;
Откроем редактор ресурсов и в папке этого урока найдем солнышко. &lt;br /&gt;
Сделаем четыре действий:&lt;br /&gt;
# Кликнем на имя солнышка (sun_1) в дереве на левой панели&lt;br /&gt;
# Под этой панелью поставим галочку в чекбоксе ''Edit''.&lt;br /&gt;
# Схватимся мышкой за красный крестик в центре солнышка на правой панели и перетащим этот крестик влево.&lt;br /&gt;
# Уберем галочку в чекбоксе ''Save''&lt;br /&gt;
800&lt;br /&gt;
[[Файл:Vot-tak-vot.png|800px]]&lt;br /&gt;
Теперь перетащим солнышко на сцену этого урока (лучше для него создать отдельный экран).&lt;br /&gt;
Уменьшим его размеры модификаторами scale x и scale y, поставив там значение 0.5.&lt;br /&gt;
Превратим солнышко в такую машину:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_pivot2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохранив проект и запустив вьювер, мы увидим, что солнышко начало вращаться &lt;br /&gt;
по окружности. Машина по прежнему вращается вокруг точки пивота.&lt;br /&gt;
Однако теперь эта точка смещена в центр окружности.&lt;br /&gt;
&lt;br /&gt;
В качестве упражнения попробуйте организовать вращение, подобное вращению Земли и Луны&lt;br /&gt;
(Земля вращается по окружности, а Луна вращается по окружности меньшего радиуса вокруг Земли).&lt;br /&gt;
Для этого Вам потребуется &amp;quot;Луну&amp;quot; сделать подобъектом &amp;quot;Земли&amp;quot; и правильно выставить&lt;br /&gt;
положение &amp;quot;Луны&amp;quot; относительно &amp;quot;Земли&amp;quot;. &lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[файл:Ok.png|right|32px]]&lt;br /&gt;
'''Внимание!''' Если объект помещен в группу, то координаты его пивота изменяются относительно точки пивота того объекта, чьим подобъектом он является. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Поэкспериментируйте. Можно использовать следующие картинки:&lt;br /&gt;
&lt;br /&gt;
[[файл:eath.png]]  [[файл:moon.png]]&lt;br /&gt;
&lt;br /&gt;
== Как ездят кареты ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Если Вы уже организовали движение Земли и Луны, то сложное движение,&lt;br /&gt;
возникающие при наличие подобъектов, не должно вызывать затруднений.&lt;br /&gt;
В этом примере мы покажем как согласовывать поступательное и &lt;br /&gt;
вращательное движение на примере кареты с двумя колёсами.&lt;br /&gt;
Разместим все три объекта (карету и её два колеса) на сцене&lt;br /&gt;
и сделаем колеса подобъектами кареты.&lt;br /&gt;
Превратим их все в машины состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть при клике на карету она проезжает некоторое расстояние по горизонтали и останавливается.&lt;br /&gt;
Сделайте самостоятельно такую машину и протестируйте её.&lt;br /&gt;
Карета должна перемещаться, а  колеса, являясь её подобъектами, двигаться вместе с ней.&lt;br /&gt;
Однако, они пока не вращаются. Если в ресурсах не окажется колеса и кареты,&lt;br /&gt;
можно загрузить их непосредственно из этого урока:&lt;br /&gt;
&lt;br /&gt;
[[файл:kareta.png]] [[файл:koleso.png]]&lt;br /&gt;
&lt;br /&gt;
=== Немного математики ===&lt;br /&gt;
&lt;br /&gt;
Разберемся как согласовать ''поступательную'' скорость кареты и ''угловую'' скорость вращения колес. Последняя должна быть подобрана таким образом, чтобы движение &lt;br /&gt;
выглядело естественным (колеса не проскальзывали вперед или назад).&lt;br /&gt;
&lt;br /&gt;
Посмотрите на формулы возле рисунка кареты. В первой из них приводится связь длины окружности L колеса и его радиуса r. Ниже - коэффициент 57.3 перевода числа пи из углов в радианы (пи - это 3.1415.. в радианах или 180 градусов). Во второй колонке даны определения поступательной и угловой скорости (изменение расстояния или угла за некоторое время t).  &lt;br /&gt;
Наконец, в третей колонке дана ключевая для нашей задачи формула, связывающая радиус '''r''', линейную '''v''' и угловую скорости '''w'''. Попробуйте её самостоятельно вывести, из предположения, что за одно и тоже время длина смещения кареты должна совпадать с длиной окружности обода колеса.&lt;br /&gt;
При этом поступательная скорость '''v''' измеряется в пикселях за секунду, а угловая скорость '''w''' в градусах за секунду.&lt;br /&gt;
&lt;br /&gt;
=== Машины ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем теперь карету и колеса так, что бы после клика начинала двигаться карета&lt;br /&gt;
и вращаться колеса. Когда карета останавливается, то и колеса должны переставать крутится.&lt;br /&gt;
Колеса сделаем одинаковыми простыми машинами с двумя состояниями, которые назовем '''off''' (неподвижны) и '''on''' (крутятся):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что в состояниях колес нет команды draw, так как колесо всегда рисуется при помощи одной картинки, она берется по умолчанию, из той, которая была перетащена на сцену (свойство '''res''').&lt;br /&gt;
Угловая скорость '''v''' (в формулах она была обозначена как w) в команде rot измеряется в градусах в секунду. Поэтому v=180 означает, что колесо будет делать полный оборот (360 градусов) за 2 секунды.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что раньше вращение мы задавали двумя параметрами: изменением угла '''da''' за время '''t'''. Так как сейчас время вращения колеса не фиксируется (этим занимается карета),&lt;br /&gt;
то указан только один параметр: угловая скорость v.&lt;br /&gt;
&lt;br /&gt;
Так как колеса одинаковые, то имеет смысл создать сначала одно колесо, запрограммировать его, а затем скопировать, получив готовое второе колесо. Его надо будет только затем мышкой перетащить на нужное место.&lt;br /&gt;
Не забываем также переименовать машины (в нашем случае это '''koleso1''' и '''koleso2'''). &lt;br /&gt;
&lt;br /&gt;
Карета должна при клике запускать на вращение колеса (переводя в состояние on),&lt;br /&gt;
а при остановке их останавливать:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_kareta3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Проверьте что параметр v=66 в команде move состояния run кареты, угловая скорость колес v=180 в команде rot состояния on согласуются с радиусом колеса r=21. Радиус колеса равен половине ширины его картинки (свойство &amp;quot;размер&amp;quot;). Если Ваше колесо имеет другой размер, пересчитайте поступательную скорость по приведенной выше формуле.&lt;br /&gt;
&lt;br /&gt;
== Как открыть замок ключом ==&lt;br /&gt;
&lt;br /&gt;
В адвентюрных играх часто используется прием применения предметов.&lt;br /&gt;
При этом один предмет мышкой перетаскивается на другой, в результате&lt;br /&gt;
чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.)&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим простой пример подобного взаимодействия объектов.&lt;br /&gt;
Создайте новый экран и сцену на нём, так как предыдущий экран должен быть уже&lt;br /&gt;
забит различными насекомыми.&lt;br /&gt;
Перетащите на сцену из редактора ресурсов очередного жука, саквояж и ключ.&lt;br /&gt;
Лучше их перетаскивать именно в таком порядке.&lt;br /&gt;
Если порядок получился другой, мышкой в дереве проекта упорядочите&lt;br /&gt;
эти объекты, так  чтобы последовательность рисования была: жук, затем саквояж, затем ключ.&lt;br /&gt;
Расположите эти объекты примерно в центре сцены и сделайте их машинами состояний.&lt;br /&gt;
Поменяйте их имена на '''ladybug''' (божья коровка), '''bag''' (саквояж) и '''key''' (ключ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наша задача состоит в организации взаимодействия ключа, саквояжа и жука при котором,&lt;br /&gt;
работают такие правила:&lt;br /&gt;
* если схватить ключ мышкой, он будет таскаться по сцене в определенных границах;&lt;br /&gt;
* если отпустить ключ над саквояжем, саквояж должен &amp;quot;растаять&amp;quot;, уменьшив свою прозрачность, а ключ уменьшиться в размерах, сжавшись в точку;&lt;br /&gt;
* одновременно с этим, из-под саквояжа начинает вверх бежать жук;&lt;br /&gt;
* когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж.&lt;br /&gt;
&lt;br /&gt;
=== Ключ ===&lt;br /&gt;
&lt;br /&gt;
Запрограммируем сначала машину для ключа:&lt;br /&gt;
 &lt;br /&gt;
[[файл:lesson_5_key3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Три состояния соответствуют трём режимам функционирования ключа:&lt;br /&gt;
* '''drag''' - в этом, стартовом состоянии мы таскаем ключ по экрану &lt;br /&gt;
* '''open''' - открываем саквояж и уменьшаемся до 0&lt;br /&gt;
* '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране&lt;br /&gt;
&lt;br /&gt;
Второе состояние состояние '''open''' не должно вызвать особых затруднений.&lt;br /&gt;
В команде '''set''' меняется состояние объекта '''bag''' (саквояж) на open.&lt;br /&gt;
В этот момент саквояж должен изобразить своё открытие.&lt;br /&gt;
В команде процессов '''scale''' происходит за время t=500 миллисекунд уменьшение масштаба рисования&lt;br /&gt;
ключа (его размера) до ''целевых значений'' tx, ty которые выбраны близкими к нулю. &lt;br /&gt;
После этого ключ переходит в третье состояние back.&lt;br /&gt;
&lt;br /&gt;
В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1&lt;br /&gt;
по ширине и высоте. &lt;br /&gt;
Кроме этого появилась новая команда '''init'''. Это команда инициализации&lt;br /&gt;
или переустановки свойств данной машины. В нашем случае, мы меняем её координаты&lt;br /&gt;
на значения x=0 и y=250 пикселей. Как и команда '''set''', команда '''init''' выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции.&lt;br /&gt;
Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250,&lt;br /&gt;
чтобы туда в дальнейшем он и возвращался.&lt;br /&gt;
&lt;br /&gt;
Разберемся теперь с системой координат на сцене. &lt;br /&gt;
&lt;br /&gt;
=== Координаты на сцене ===&lt;br /&gt;
&lt;br /&gt;
Если сцена создавалась по умолчанию, то она имеет ширину 960 пикселей,&lt;br /&gt;
а высоту - 640. Начало отсчёта координат на сцене расположено в её центре.&lt;br /&gt;
Ось x, по которой откладывается горизонтальная координата объекта направлена вправо,&lt;br /&gt;
а ось Y для вертикальной координаты - вниз: &lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key2.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Стоит раскрыть координаты любого объекта (свойство положение) на панели Properties.&lt;br /&gt;
Затем потаскать объект по сцене, наблюдая как эти координаты меняются.&lt;br /&gt;
Если '''x''' стало отрицательным, значит объект находится левее центра сцены.&lt;br /&gt;
Если же отрицательный '''y''', то объект расположен выше центра.&lt;br /&gt;
&lt;br /&gt;
Заметим, что координата объекта определяется его точкой пивота.&lt;br /&gt;
Для трех объектов, находящихся сейчас на сцене точка пивота должна&lt;br /&gt;
совпадать с центрами картинок.&lt;br /&gt;
&lt;br /&gt;
Таким образом, когда мы задали в команде init положение для ключа x=0, y=250,&lt;br /&gt;
мы поместили его по середине, в нижней части сцены.&lt;br /&gt;
&lt;br /&gt;
=== Драг энд дроп ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key3_drag.png|right]]&lt;br /&gt;
Осталось разобраться с ещё двумя новыми командами,&lt;br /&gt;
которые появились в состоянии drag.&lt;br /&gt;
Первая команда '''drag''' (таскать) означает, что данную машину в этом состоянии&lt;br /&gt;
разрешено мышкой таскать по экрану.&lt;br /&gt;
При этом могут быть заданы координаты области за которую объект вытащить нельзя.&lt;br /&gt;
Эта область определяется двумя точками - верхним левым углом с координатами (x1,y1)&lt;br /&gt;
и правым нижним углом с координатами (x2,y2).&lt;br /&gt;
&lt;br /&gt;
В нашем случае эти точки почти совпадают с углами сцены.&lt;br /&gt;
На самом деле область разрешенного таскания чуть меньше размера сцены.&lt;br /&gt;
Сделано это для того, чтобы ключ нельзя было даже краешком вытащить за сцену.&lt;br /&gt;
Правый нижний угол сцены имеет координаты (x2, y2)=(480, 320)=(960/2, 640/2).&lt;br /&gt;
Ширина ключа 128 пикселей (см. свойство размер).&lt;br /&gt;
Поэтому, чтобы правая сторона ключа не выехала за сцену, для координаты y1&lt;br /&gt;
мы берем значение 416 = 480-128/2 (сужаем границу таскания на половину ширины ключа). Аналогично считаются остальные координаты области разрешенного таскания.&lt;br /&gt;
&lt;br /&gt;
Наконец, команда '''drop''' (бросить), регулирует, что должно произойти при бросании ключа&lt;br /&gt;
(отпускания мышки) если оно произошло на объекте '''obj'''.&lt;br /&gt;
В данном случае происходит переход в новое состояние (поле '''go''').&lt;br /&gt;
&lt;br /&gt;
=== Саквояж и жук ===&lt;br /&gt;
&lt;br /&gt;
Создадим теперь машину для саквояжа.&lt;br /&gt;
Она будет иметь два состояния open и close:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_5_key4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В состоянии close в команде '''init''' саквояж переустанавливает свою прозрачность в единичное значение (непрозрачен) al=1.00. Это необходимо, что бы появиться на экране после исчезновения.&lt;br /&gt;
Сам процесс исчезновения задается командой процесса '''alpha''' в состоянии open.&lt;br /&gt;
Эта команда меняет текущую прозрачность объекта до целевого значения ta=0 (полностью прозрачен) за время t=500 миллисекунд (пол секунды).&lt;br /&gt;
Кроме этого в этом состоянии меняется состояние жука (команда '''set'''), который должен из под саквояжа начать бежать.&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!''' Если в параметре '''ta''' команды '''alpha''' установлено значение 0, то, помимо того что объект станет полностью прозрачен, стоить иметь ввиду, что он также станет невосприимчив к кликам. Для того, чтобы прозрачный объект считывал клики, стоит задать для '''ta''' следующее значение '''ta=0.02'''&lt;br /&gt;
&lt;br /&gt;
Осталось создать два состояния для жука, который будет выбегать из под саквояжа.&lt;br /&gt;
Ничего сложного в его поведении нет:&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[файл:lesson_5_key5.png]]&lt;br /&gt;
&lt;br /&gt;
Теперь самое время протестировать результат наших действий.&lt;br /&gt;
Потаскайте сначала ключ по сцене, убедившись, что он за неё не входит.&lt;br /&gt;
Затем наведите ключом на саквояж и отпустите мышку. &lt;br /&gt;
Всё должно прийти в движение.&lt;br /&gt;
Включите отладку (кнопка S и потом кнопку C) и понаблюдайте как изменяются состояния объектов.&lt;br /&gt;
В момент выполнения процессов можно несколько раз понажимать на пробел,&lt;br /&gt;
чтобы приостановить их выполнение и запустить снова.&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Мы разобрали много команд и их параметров.&lt;br /&gt;
Однако это далеко не все возможности машин состояний.&lt;br /&gt;
Стоит прочитать документ [[Machine]] в котором описан весь язык машин.&lt;br /&gt;
Чем больше Вы создадите машин с различным поведением, тем увереннее будете с ними работать.&lt;br /&gt;
&lt;br /&gt;
В заключение приведем несколько общих советов:&lt;br /&gt;
* Проектируйте сначала логику поведения машин на бумаге.&lt;br /&gt;
* Давайте осмысленные названия для машин и их состояний.&lt;br /&gt;
* Обязательно документируйте машины, описывая их поведение на естественном языке.&lt;br /&gt;
* Копируйте однотипные машины для сокращения времени по их программированию.&lt;br /&gt;
* При сложном взаимодействии нескольких машин, вводите управляющую машину (возможно невидимую), в которой концентрируйте основную логику поведения.    &lt;br /&gt;
* Не увлекайтесь длинными состояниями с множеством команд процессов. Иногда поведение становится понятнее, если состояние разбить на несколько последовательных состояний. &lt;br /&gt;
* Смело спрашивайте совета у более опытных дизайнеров. Они в своё время поступали именно так.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* создайте движение Земли по окружности, а Луны также по окружности, но вокруг Земли;&lt;br /&gt;
* сделайте движение кареты бесконечным так, что после того как она уезжает за правый край экрана, она появлялась из-за левого края; &lt;br /&gt;
* заставьте жука начинать бежать, только когда саквояж полностью уменьшится (set на выходе из состояния).&lt;br /&gt;
* организуйте так, чтобы при перетаскивании ключа в область саквояжа, жук развернулся на 180 градусов и двигался вниз, обратно под саквояж.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Редактор текстовых ресурсов|Урок 6]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%C2%AB%D0%9B%D0%B0%D0%BC%D0%BF%D0%BE%D1%87%D0%BA%D0%B0%C2%BB_%D0%B8_%C2%AB%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D1%84%D0%BE%D1%80%C2%BB&amp;diff=10033</id>
		<title>Взаимодействие машин: «Лампочка» и «Светофор»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%C2%AB%D0%9B%D0%B0%D0%BC%D0%BF%D0%BE%D1%87%D0%BA%D0%B0%C2%BB_%D0%B8_%C2%AB%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D1%84%D0%BE%D1%80%C2%BB&amp;diff=10033"/>
		<updated>2021-08-04T12:19:36Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Мигание как цикл */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Checkbox как машина состояний|Урок 3]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Движение машин: жучки, ключи и многое другое|Урок 5]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить взаимодействие машин состояний и организацию циклов.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать переключатель, включающий и выключающий лампочку;&lt;br /&gt;
* сделать лампу активной, знающей о состоянии переключателя;&lt;br /&gt;
* создать простой  светофор, переключающий по кругу три лампы;&lt;br /&gt;
* создать уличный светофор с &amp;quot;правильным&amp;quot; поведением на основе управляющей машины;&lt;br /&gt;
* включать и выключать светофор при помощи кнопки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Лампочка и выключатель ==&lt;br /&gt;
&lt;br /&gt;
=== Создание машин ===&lt;br /&gt;
&lt;br /&gt;
Создайте в учебном проекте новый экран lesson_4 и сцену stg_main.&lt;br /&gt;
Перетащите на сцену из редактора ресурсов переключатель и лампочку:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson4_switch_lamp.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поменяйте обоим объектам тип, сделав их [[Machine|машинами состояний]].&lt;br /&gt;
Переименуйте (поле свойств &amp;quot;'''имя'''&amp;quot;) переключатель в '''switch''', а лампочку в '''lamp'''.&lt;br /&gt;
&lt;br /&gt;
Наша задача состоит в организации взаимодействия переключателя и лампочки.&lt;br /&gt;
Переключатель, как ему и положено, включает и выключает свет.&lt;br /&gt;
Поэтому, связанная с ним машина состояний, должна воздействовать на вторую&lt;br /&gt;
машину, которой является лампочка.&lt;br /&gt;
Нарисуем сначала граф машин состояний:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_state1.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Верхние красные кружочки относятся к переключателю.&lt;br /&gt;
Он может находиться в двух состояниях '''on''' и '''off'''.&lt;br /&gt;
Лампочка (синие кружочки), также имеет два состояния, которые мы&lt;br /&gt;
назовем '''dark''' и '''light'''.&lt;br /&gt;
&lt;br /&gt;
Cоздайте эти состояния в машинах так, как это было описано в предыдущем уроке. Добавьте в каждое состояние команду draw с параметром res, в которые перетащите&lt;br /&gt;
картинки из редактора ресурсов.&lt;br /&gt;
Затем в переключателе добавьте команду '''click''' с параметром '''go'''.&lt;br /&gt;
Сделайте из него &amp;quot;чекбокс&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_switch_state1_new.png]]&lt;br /&gt;
&lt;br /&gt;
В лампочке создайте пока только по команде рисования draw:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_lamp_state1.png]]&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат.&lt;br /&gt;
Переключатель должен переключаться, тогда как лампочка на это ни как не реагирует.&lt;br /&gt;
&lt;br /&gt;
=== Подключаем провода ===&lt;br /&gt;
&lt;br /&gt;
Теперь самое время подключить к лампочке и выключателю провода.&lt;br /&gt;
Этими проводами будет служить команда '''set'''.&lt;br /&gt;
Вспомним теорию. '''При входе''' в состояние происходит выполнение &lt;br /&gt;
команд инициализации, которые сразу выполняются, как только машина поменяла своё состояние.&lt;br /&gt;
К таким командам и относится команда '''set'''.&lt;br /&gt;
С её помощью происходит изменение состояния других машин.&lt;br /&gt;
Добавим в каждое из состояний переключателя по команде set с параметрами '''obj''' и '''st'''.&lt;br /&gt;
Для параметра obj из выпадалки выберем объект '''lamp'''.&lt;br /&gt;
В параметре st зададим руками требуемые состояния лампочки.&lt;br /&gt;
В результате должно получиться:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_switch_state2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Снова протестируйте работу машин. Стоит во вьювере нажать '''S''',&lt;br /&gt;
чтобы понаблюдать за происходящими изменениями состояний объектов.&lt;br /&gt;
&lt;br /&gt;
=== Активная лампочка ===&lt;br /&gt;
&lt;br /&gt;
Давайте усложним поведение лампочки.&lt;br /&gt;
Пусть она, независимо от переключателя, может включаться,&lt;br /&gt;
если на неё кликнули в состоянии '''dark'''. &lt;br /&gt;
Перейдя в горящее состояние '''light''' она горит 2 секунды,&lt;br /&gt;
а затем сама выключается, возвращаясь в '''dark''':&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_states2.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Не подглядывая на следующую картинку, запрограммируйте такое поведение лампочки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
У Вас, конечно, должен был получиться следующий результат:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lamp2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Условия переходов ===&lt;br /&gt;
&lt;br /&gt;
Потребуем теперь, чтобы лампочка, при клике на неё, могла включаться только,&lt;br /&gt;
если в этот момент включен переключатель.&lt;br /&gt;
Таким образом, необходимо заблокировать команду click если переключатель находится&lt;br /&gt;
в состоянии off. Делается это при помощи команды '''if''',&lt;br /&gt;
которую необходимо добавить в состояние dark лампочки:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lamp3.png]]&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что кроме команды if, было добавлено одноименное поле&lt;br /&gt;
в команде '''click''' с параметром 0. Разберемся, как работают эти команды.&lt;br /&gt;
В состоянии может быть несколько команд-условий if.&lt;br /&gt;
Все они нумеруются начиная с нуля. Т.е. первая сверху в списке команда if&lt;br /&gt;
имеет номер 0, следующая 1 и т.д. &lt;br /&gt;
Однако сами по себе условия ещё ничего не делают.&lt;br /&gt;
Запуск их на проверку выполнимости осуществляют другие команды.&lt;br /&gt;
В нашем случае это делает команда click.&lt;br /&gt;
В её поле if стоит ноль. Это означает, что при клике на лампочку&lt;br /&gt;
переход go произойдет только, если выполняется условие под номером 0.&lt;br /&gt;
В этом условии происходит проверка того, находится ли объект '''obj''' в состоянии '''st'''.&lt;br /&gt;
Если находится, то условие срабатывает и клик приводит к требуемой смене состояния.&lt;br /&gt;
Все просто :).&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат. &lt;br /&gt;
Сначала на выключенном переключателе кликните на лампочку.&lt;br /&gt;
Она не загорится. Теперь, включите переключатель.&lt;br /&gt;
Лампа загорится и после 2-х секунд погаснет.&lt;br /&gt;
Теперь, если кликнуть на лампочку, она снова загорится,&lt;br /&gt;
так как переключатель находится в состоянии on.&lt;br /&gt;
Стоит, как обычно, в процессе этих экспериментов понаблюдать за отладочной информацией.&lt;br /&gt;
&lt;br /&gt;
=== Начальное состояние ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_prop.png|right]]&lt;br /&gt;
Каждая машина в момент начала работы находится в определённом состоянии.&lt;br /&gt;
По умолчанию, это первое состояние в линейке состояний, в соответствующем окне редактирования.&lt;br /&gt;
Однако его можно изменить.&lt;br /&gt;
Сделаем так, чтобы в начальный момент времени переключатель&lt;br /&gt;
был включен, а не выключен. Для этого необходимо в его свойствах (панель Properties) в поле '''состояние'''  задать имя начального состояния '''on'''.&lt;br /&gt;
&lt;br /&gt;
Запустим вьювер. Обратим внимание, что лампочка сразу загорелась.&lt;br /&gt;
Так и должно быть, так как машина переключателя начала работать из&lt;br /&gt;
состояния on, а, следовательно, запустила команаду '''set''',&lt;br /&gt;
меняющую состояние лампочки.&lt;br /&gt;
&lt;br /&gt;
Если лампочка сразу не загорелась, это означает, что в дереве проекта&lt;br /&gt;
она находится ниже переключателя. Поменяйте их местами, перетащив мышкой, и все заработает как описано выше.&lt;br /&gt;
С чем связаны такие магические действия, мы выясним ниже, при рассмотрении простого светофора.&lt;br /&gt;
&lt;br /&gt;
=== Подробнее о командах  ===&lt;br /&gt;
&lt;br /&gt;
Подытожим информацию о командах, работающих в состояниях внутри машин.&lt;br /&gt;
Существует четыре типа команд:&lt;br /&gt;
* '''инициализаций''' (draw, set) - выполняется сразу как только машина оказалась в данном состоянии. Это &amp;quot;мгновенные&amp;quot; команды, т.к. их действие не растянуто во времени;&lt;br /&gt;
* '''воздействий''' (click) - выполняются, если на машину было оказано внешнее воздействие, например, в неё кликнули мышкой;&lt;br /&gt;
* '''процессов''' (wait) - эти команды начинают выполняться, когда произошел переход в данное состояние. В отличии от команд инициализации, их действие растянуто во времени. К этому типу команд относится также команда move, которая встречалась в машинах первого урока;&lt;br /&gt;
* '''условий''' (if) - описание различных логических условий, которые могут использовать другие команды данного состояния.&lt;br /&gt;
&lt;br /&gt;
К настоящему моменту нам уже известны следующие команды:&lt;br /&gt;
&lt;br /&gt;
* '''draw''' — управление внешним видом машины, определение её графического ресурса. Эта команда, как и set является командой инициализации, т.е. выполняется в момент попадания машины в данное состояние. Если в состоянии машины такой команды нет, то автоматически устанавливается графический ресурс, указанный в свойствах данной машины (поле '''res''');&lt;br /&gt;
 &lt;br /&gt;
* '''set''' – установка состояния другого объекта (команда инициализации);&lt;br /&gt;
&lt;br /&gt;
* '''click''' – что делать при клике на объект (команда воздействия). В нашем случае - переход в другое состояние той же машины;&lt;br /&gt;
&lt;br /&gt;
* '''wait''' – временная пауза, после которой происходит переход в другое состояние (время исчисляется в миллисекундах, где 1 сек = 1000 миллисекунд). Это команда процессов, т.е. её выполнение длится во времени;&lt;br /&gt;
&lt;br /&gt;
* '''if''' – логическое условие перехода (команда перехода).&lt;br /&gt;
&lt;br /&gt;
== Светофор ==&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lights1.png|right]]&lt;br /&gt;
Рассмотрим теперь обычный уличный светофор. Вспомним как он работает:&lt;br /&gt;
* сначала обычно (к сожалению) горит красная лампа, остальные выключены;&lt;br /&gt;
* затем, при горящей красной лампе, загорается ещё и желтая;&lt;br /&gt;
* затем желтая и красная лампы гаснут и загорается зеленая;&lt;br /&gt;
* в конце горения зеленой лампы она три раза мигает и выключается;&lt;br /&gt;
* затем включается желтая лампа, горит и гаснет&lt;br /&gt;
* затем включается красный, чтобы повторить весь процесс с самого начала.&lt;br /&gt;
&lt;br /&gt;
Подобное сложное поведение можно реализовать с помощью самых разных машин состояния.&lt;br /&gt;
Сначала мы создадим три машины для каждой лампочки, которые будут взаимодействовать друг с другом,&lt;br /&gt;
переключая себя и своих соседей.&lt;br /&gt;
&lt;br /&gt;
[[файл:lessons_4_tree.png|right]]&lt;br /&gt;
Разместим на сцене подложку для светофора. Она останется статической картинкой.&lt;br /&gt;
Затем поместим поверх неё три лампы разного цвета и сделаем их подобъектами подложки.&lt;br /&gt;
Обложку назовем lights, а лампы '''light_R''', '''light_Y''', '''light_G'''.&lt;br /&gt;
Изменяя тип у ламп, превратим их в машины.&lt;br /&gt;
&lt;br /&gt;
=== Простой светофор ===&lt;br /&gt;
&lt;br /&gt;
Проигнорируем пока одновременное горение и мигание, сделав просто последовательное&lt;br /&gt;
переключений ламп по кругу. &lt;br /&gt;
Такой &amp;quot;простой светофор&amp;quot; можно попробовать реализовать тремя машинами, имеющих по два состояния в каждой из них. В качестве графического ресурса в выключенном состоянии off перетащите серую картинку light_D:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R1.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_Y1.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Хотя &amp;quot;простой светофор&amp;quot; будет работать вполне корректно,&lt;br /&gt;
приведенные выше машины не очень хороши. &lt;br /&gt;
Все лампы находятся в своем стартовом состоянии '''off'''.&lt;br /&gt;
В них есть команда инициализации '''set''', которая устанавливает состояние горения&lt;br /&gt;
следующей лампы. Что должно произойти в начальный момент запуска проекта?&lt;br /&gt;
Машины работают также как и рисуются - сверху вниз по дереву проекта.&lt;br /&gt;
Сначала инициализируется красная лампа. Это её первое попадание в состояние '''off''',&lt;br /&gt;
поэтому она пытается включить желтую лампу. Однако этого не происходит,&lt;br /&gt;
так как желтая лампа еще &amp;quot;не существует&amp;quot;. Когда до неё доходит очередь, она создается&lt;br /&gt;
и пытается включить зеленую лампу которой также &amp;quot;ещё нет&amp;quot;,&lt;br /&gt;
поэтому этого тоже не происходит. И только когда доходит дело до создания зеленой&lt;br /&gt;
лампы, она включает (уже существующую и находящуюся в состоянии '''off''') красную лампу.&lt;br /&gt;
&lt;br /&gt;
С этого момента всё начинает работать вполне логично. При входе в состояние '''on'''&lt;br /&gt;
выключается предыдущая лампа, а при входе в состояние '''off''' включается следующая.&lt;br /&gt;
&lt;br /&gt;
Стоит теперь вспомнить, отмеченную выше, важность порядка переключателя и лампы в дереве проекта.&lt;br /&gt;
Если там лампа не зажигалась при запуске проекта, это значит, что она была ниже&lt;br /&gt;
по дереву. В момент запуска проекта сначала создавался переключатель, который пытался зажечь&lt;br /&gt;
еще не существующую лампу. &lt;br /&gt;
&lt;br /&gt;
Почему же &amp;quot;простой светофор&amp;quot; плох, если он верно работает?&lt;br /&gt;
Потому, что держать в голове детали последовательного создания машин состояний&lt;br /&gt;
не стоит, т.к. это усложняет логику понимания их функционирования.&lt;br /&gt;
Если что-либо в этом разделе показалось неясным - нестрашно:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Надо по-возможности проектировать машины так, чтобы их стартовое состояние было максимально простым и не вызывало из себя цепочки изменений состояний других машин.'''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Тогда не возникнет непредсказуемости в поведении проекта.&lt;br /&gt;
&lt;br /&gt;
=== Промежуточные состояния ===&lt;br /&gt;
&lt;br /&gt;
Исправить ситуацию можно, добавив в каждую лампу промежуточное состояние next,&lt;br /&gt;
в котором собственно происходит управление переключением следующей лампы.&lt;br /&gt;
Приведем пример такой машины для красной лампы. Остальные сделайте по её образу и подобию:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R2.png]]&lt;br /&gt;
&lt;br /&gt;
Как мы видим, в добавленное состояние '''next''' переехала команда '''set''',&lt;br /&gt;
которая раньше была в состоянии '''off'''.&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R2_prop.png|right]]&lt;br /&gt;
Зададим в свойствах (Properties) стартовое состояние красной лампы в '''on''', а остальным лампам поставим состояние  '''off''' (этого можно не делать, если состояние off в линейках состояний стоит первым).&lt;br /&gt;
&lt;br /&gt;
В выключенных состояниях ничего не происходит кроме рисования серой картинки для выключенной лампы.&lt;br /&gt;
Поэтому,теперь ни каких попыток изменить состояния других ламп у light_Y и light_G не будет.&lt;br /&gt;
Красная лампа light_R начнет работать из состояния on. Прогорев 1 сек, она перейдет &lt;br /&gt;
в состояние next, в котором переустановит состояние следующей лампы.&lt;br /&gt;
В состоянии next красная лампа и останется (рисуя серую картинку), пока её не включит &lt;br /&gt;
на очередном цикле зеленая лампа.&lt;br /&gt;
&lt;br /&gt;
Подчеркнем еще раз, что команда '''set''' является командой инициализации состояния.&lt;br /&gt;
Она запускается при '''входе''' в состояние. Если бы она запускалась при выходе,&lt;br /&gt;
дополнительное состояние next не потребовалось бы и set можно было бы вставить в on.&lt;br /&gt;
Именно из-за &amp;quot;стартовости&amp;quot; выполнения set нам потребовалось ещё одно состояние.&lt;br /&gt;
&lt;br /&gt;
=== Управляющая машина ===&lt;br /&gt;
&lt;br /&gt;
Продолжая аналогичным образом, можно превратить простой светофор в светофор реалистичный.&lt;br /&gt;
Однако, мы пойдем другим путём. &lt;br /&gt;
&lt;br /&gt;
Взаимодействие нескольких, достаточно сложных машин, часто затрудняет анализ&lt;br /&gt;
их логики, т.к. приходится постоянно перемещаться между описаниями состояний этих машин,&lt;br /&gt;
чтобы разобраться в их работе. &lt;br /&gt;
&lt;br /&gt;
Обычно, более удобным является создание одной управляющей машины, в которой сконцентрирована &lt;br /&gt;
вся логика. Продемонстрируем, как это сделать на примере светофора.&lt;br /&gt;
Для этого превратим подложку светофора (серый прямоугольник) в машину и создадим&lt;br /&gt;
в ней состояния со следующими командами:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lights.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Каждое состояние является этапом функционирования светофора, между которыми происходят переходы.&lt;br /&gt;
Красная и желая лампы - это простые машины с двумя состояниями '''on''' и '''off'''&lt;br /&gt;
в которых только рисуются соответствующие картинки:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R3.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_Y3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Зеленая лампа пока состоит из 3-х состояний '''on''', '''off''' и '''blink'''.&lt;br /&gt;
Первые два аналогичны предыдущим лампам. В состоянии мигания blink&lt;br /&gt;
временно поставим рисование картинки желтого цвета (draw) и команду wait,&lt;br /&gt;
после действия которой происходит переход в состояние off.&lt;br /&gt;
Дальше мы это состояние подправим.&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G3.png]]&lt;br /&gt;
&lt;br /&gt;
Как мы видим теперь вся логика работы сконцентрирована в управляющей машине (подложка)&lt;br /&gt;
и легко прослеживается. Остальные машины очень простые (за исключением мигающей зеленой лампы).&lt;br /&gt;
Такой стиль организации взаимодействия машин часто оказывается существенно более ясным и удобным.&lt;br /&gt;
&lt;br /&gt;
Анализ поведения управляющей машины не должен составить труда.&lt;br /&gt;
Прокомментируем только состояние '''G_blink'''.&lt;br /&gt;
В этом состоянии зеленая лампа переводится в состояние мигания ('''blink''').&lt;br /&gt;
Предполагается, что когда мигание закончится, зеленая лампа должна перейти в состояние '''off'''.&lt;br /&gt;
В управляющей машине в команде wait мы ждем этого перехода при помощи проверки условия if.&lt;br /&gt;
&lt;br /&gt;
На выходе у нас должен получится светофор, лампочки которого загораются в таком порядке :&lt;br /&gt;
&lt;br /&gt;
1. Загорается красная лампочка.&lt;br /&gt;
&lt;br /&gt;
2. Загорается желтая лампочка.&lt;br /&gt;
&lt;br /&gt;
3. Загорается зеленая лампочка, остальные гаснут.&lt;br /&gt;
&lt;br /&gt;
4. Процесс мигания зеленой лампы представлено при помощи рисования на её месте желтой лампы.&lt;br /&gt;
&lt;br /&gt;
5. Все возвращается на исходную в обратном порядке.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что сама команда wait вызвана без параметра t. Если время ожидания t не указано, это означает, что &lt;br /&gt;
wait должен выполниться &amp;quot;мгновенно&amp;quot; и произойти переход в следующее состояние (go=Y). &lt;br /&gt;
Однако это случится только, если выполнится условие '''if''' (зеленая лампа отмигает).&lt;br /&gt;
Иначе идет переход к следующей команде wait. В ней находится единственный параметр '''loop'''&lt;br /&gt;
со значением -1. Это означает, что все команды wait нужно зациклить, &lt;br /&gt;
повторяя сверху вниз (до loop) бесконечное число раз,&lt;br /&gt;
пока условие не выполнится и машина совершит переход go=Y.&lt;br /&gt;
Подробнее использование циклов в командах мы разберем чуть ниже.&lt;br /&gt;
&lt;br /&gt;
=== Мигание как цепочка состояний ===&lt;br /&gt;
&lt;br /&gt;
Выше процесс мигания зеленой лампы мы временно представили при помощи рисования на её месте желтой лампы.&lt;br /&gt;
Займемся теперь вплотную настоящим процессом мигания.&lt;br /&gt;
Как и многие машины состояний, это поведение можно запрограммировать при помощи различных приёмов.&lt;br /&gt;
Самым простым  (но не очень удобным) является представление каждого&lt;br /&gt;
включения и выключения лампы при помощи отдельного состояния.&lt;br /&gt;
Для простоты, пусть она мигает не 3, а 2 раза.&lt;br /&gt;
Тогда такая машина может выглядеть следующим образом:    &lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Начиная с состояния blink происходит последовательный переход в состояния blink1, blink2, blink3.&lt;br /&gt;
Из последнего состояния blink3 мы прыгаем в состояние off, где процесс мигания заканчивается.&lt;br /&gt;
&lt;br /&gt;
Почему такая машина не удобна? Если нам необходимо изменить период мигания,&lt;br /&gt;
прийдётся менять параметр t в каждой команде wait всех 4-х состояний.&lt;br /&gt;
А если надо мигнуть не 2, а 10 раз?&lt;br /&gt;
Понятно, что для решения такой задачи необходимо использовать другие механизмы.&lt;br /&gt;
&lt;br /&gt;
=== Мигание как цикл ===&lt;br /&gt;
&lt;br /&gt;
Для реализации повторяющихся событий можно использовать&lt;br /&gt;
процессы, длящиеся внутри одного события. Сейчас мы рассмотрим как это делается.&lt;br /&gt;
Изменим машину зеленой лампы на следующую:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_G5.png]]&lt;br /&gt;
&lt;br /&gt;
Запустим вьювер, убедившись, что всё работает правильно. &lt;br /&gt;
Теперь разберемся с функционированием состояния '''blink'''.&lt;br /&gt;
&lt;br /&gt;
Напомним, что команды set и draw -- это команды инициализации.&lt;br /&gt;
Сколько бы их не было в состоянии, они все сразу выполнятся сверху вниз, как только машина переходит в это состояние.&lt;br /&gt;
Последовательное выполнение нескольких команд draw - достаточно бессмысленное мероприятие.&lt;br /&gt;
Эта команда задает ресурс рисования, поэтому в последовательности команд draw реально сработает только последняя, &lt;br /&gt;
которая &amp;quot;перебьет&amp;quot; ресурс рисования предыдущих команд draw.&lt;br /&gt;
&lt;br /&gt;
Последовательность выполнения инициализационных команд с одинаковым именем можно прервать, если добавить в некоторые из&lt;br /&gt;
них параметр '''break''' (прервать). В примере выше есть 2 команды draw. &lt;br /&gt;
Нулевая из них имеет в своих параметрах break&lt;br /&gt;
(напоминаем, что нумерация всех команд, как и if-ов начинается с нуля).&lt;br /&gt;
Поэтому, в момент запуска состояния, выполнится эта нулевая команда и следующая (первая) команда draw выполняться не будет.&lt;br /&gt;
В нулевом draw мы гасим лампочку (res=light_D).&lt;br /&gt;
&lt;br /&gt;
Посмотрим теперь на последовательность команд wait. &lt;br /&gt;
Это команды процессов и, в отличии от команд инициализации, их выполнение занимает некоторое время.&lt;br /&gt;
Команды процессов с одним названием выполняются '''последовательно''' друг за другом.&lt;br /&gt;
В нашем случае начнет выполняться нулевая команда wait и только после t=500ms будет передано управление следующему wait-у.&lt;br /&gt;
&lt;br /&gt;
В нулевой команде команде wait появился новый параметр draw со значением 1.&lt;br /&gt;
Этот параметр означает, что когда wait закончит работать она перезапустит команду draw под номером 1 (которая еще не выполнялась). &lt;br /&gt;
В этой команде установится картинка рисования включенной зеленой лампы (res=light_G).&lt;br /&gt;
&lt;br /&gt;
Теперь настало время следующей команды wait.&lt;br /&gt;
Отработав, она также перезапустит команду draw, но уже под номером 0 (т.е. лампочка погаснет).&lt;br /&gt;
Если бы в этой команде wait не было параметра loop произошла бы передача управления последней команде wait.&lt;br /&gt;
&lt;br /&gt;
Параметр loop в командах процессов означает, что цепочку команд с данным именем надо повторить loop раз (в нашем случае еще 2 раза).&lt;br /&gt;
Фактически, когда вьювер пробегается по командам wait, он каждый раз уменьшает loop на 1.&lt;br /&gt;
Если в поле loop ещё не получился ноль, он запускает по новой выполнение последовательности команд wait.&lt;br /&gt;
&lt;br /&gt;
Таким образом, первые 2 команды wait выполнятся при первом прохождении по ним сверху вниз,&lt;br /&gt;
а затем ещё два раза. В результате и получится три мигания.&lt;br /&gt;
&lt;br /&gt;
Когда цикл отработает, он передаст управление последней команде wait без параметра t.&lt;br /&gt;
Она сработает мгновенно, осуществляя переход из состояния blink в состояние off.&lt;br /&gt;
&lt;br /&gt;
Заметим, что если в параметре loop стоит значение -1, то такой цикл будет длится бесконечное число раз. Он может быть прерван только в результате срабатывания условия при наличие параметра go&lt;br /&gt;
(посмотрите еще раз на состояние blink_G управляющей машины светофора).&lt;br /&gt;
&lt;br /&gt;
=== Инициализация на выходе ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Команды '''set''' (как команды инициализации) выполняются при входе в состояние.&lt;br /&gt;
Выше нам потребовалось еще одно состояние, &lt;br /&gt;
для реализации простого светофора, чтобы осуществить инициализацию на выходе. &lt;br /&gt;
При помощи параметров запуска команд, введение дополнительного состояния можно избежать.&lt;br /&gt;
Для этого надо сделать команду-пустышку set, которая никого не меняет и на ней прервать&lt;br /&gt;
выполнение set-команд.&lt;br /&gt;
Затем, при выходе из состояния вызвать нужную последовательность set-ов.&lt;br /&gt;
Так, машина зеленой лампы простого светофора может выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_set.png]]&lt;br /&gt;
&lt;br /&gt;
=== Случайные мигания ===&lt;br /&gt;
&lt;br /&gt;
В заключение урока cделаем отдельную машину '''flasher''' (мигалка), которую заставим случайно гореть одним из трех  цветов. Для этого перетащим на сцену из редактора ресурсов&lt;br /&gt;
одну из ламп светофора и превратим её в машину состояний.&lt;br /&gt;
Введем следующие команды в четырех состояниях этой машины:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_flash1.png]]&lt;br /&gt;
&lt;br /&gt;
Последние три состояния -  это просто рисование того или иного цвета&lt;br /&gt;
в течении секунды, после чего переход в стартовое состояние switch.&lt;br /&gt;
В этом состоянии происходит случайный выбор следующего состояния.&lt;br /&gt;
Делается это при помощи трех команд wait не имеющих временной задержки.&lt;br /&gt;
В первых двух командах стоит параметр &amp;quot;'''p'''&amp;quot;. &lt;br /&gt;
Это вероятность с которой осуществляется переход в состояние, определяемое параметром &amp;quot;'''go'''&amp;quot;.&lt;br /&gt;
Если &amp;quot;'''p'''&amp;quot; отсутствует, то переход по &amp;quot;'''go'''&amp;quot; происходит в любом случае.&lt;br /&gt;
Иначе только с вероятностью p. С вероятностью же 1-p передается управление следующей команде&lt;br /&gt;
wait. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в нулевом wait-e состояния switch с вероятностью 0.33 машина перейдет в состояние R (красная лампа). &lt;br /&gt;
С вероятностью 0.67=1-0.33 перехода не будет и запустится следующий wait.&lt;br /&gt;
Из него с вероятностью 0.50 загорится желтая лампа (итоговая вероятность её горения будет равна  0.67*0.50=0.33). Наконец, если и этого не произойдет, то включится зеленый цвет.&lt;br /&gt;
Все три цвета будут зажигаться с одинаковой вероятностью.&lt;br /&gt;
&lt;br /&gt;
В общем случае, если есть n случайных переходов, чтобы добиться их равновероятности,&lt;br /&gt;
необходимо использовать следующие вероятности:&lt;br /&gt;
 p1=1/n, p2=1/(n-1), p3=1/(n-2),.... &lt;br /&gt;
Ниже в таблице приведены значения вероятностей для некоторых n:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
 ! n &lt;br /&gt;
 ! p1 &lt;br /&gt;
 ! p2 &lt;br /&gt;
 ! p3 &lt;br /&gt;
 ! p4 &lt;br /&gt;
 |-&lt;br /&gt;
 | 2 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 3 || 0.33 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 4 || 0.25 || 0.33 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 5 || 0.20 || 0.25 || 0.33 || 0.50 &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Заметим, что иногда длительность горения может оказаться больше секунды (две, три и т.д.)&lt;br /&gt;
Это просто означает, что данный цвет зажегся подряд несколько раз.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Создать машину состояний, имитирующую поведение обычной кнопки. &lt;br /&gt;
* Сделать так, чтобы нажатием на кнопку (машину) светофор из любого состояния переводился в стартовое горение красной лампы.&lt;br /&gt;
* Сделать то-же при помощи обычной кнопки, используя добавляемое при помощи правой кнопки мыши свойство &amp;quot;изменить состояние объекта&amp;quot;. &lt;br /&gt;
* Добавить в светофор состояние off, сделав его стартовым. В этом состоянии все лампы должны быть серыми. При помощи чекбокса (с любыми картинками, например, скопируйте голову слоненка из [[Checkbox как машина состояний|третьего урока]]) включайте и выключайте светофор (для этого правой кнопкой мыши в панели свойств добавьте свойства &amp;quot;''при включении изменить состояние объекта''&amp;quot; и &amp;quot;''при выключении изменить состояние объекта''&amp;quot;). &lt;br /&gt;
* Сделать предыдущую задачу при помощи машины состояний вместо чекбокса. Какое решение у Вас получилось быстрее?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Checkbox как машина состояний|Урок 3]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Движение машин: жучки, ключи и многое другое|Урок 5]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%C2%AB%D0%9B%D0%B0%D0%BC%D0%BF%D0%BE%D1%87%D0%BA%D0%B0%C2%BB_%D0%B8_%C2%AB%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D1%84%D0%BE%D1%80%C2%BB&amp;diff=10032</id>
		<title>Взаимодействие машин: «Лампочка» и «Светофор»</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD:_%C2%AB%D0%9B%D0%B0%D0%BC%D0%BF%D0%BE%D1%87%D0%BA%D0%B0%C2%BB_%D0%B8_%C2%AB%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D1%84%D0%BE%D1%80%C2%BB&amp;diff=10032"/>
		<updated>2021-08-04T12:15:38Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Управляющая машина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Checkbox как машина состояний|Урок 3]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Движение машин: жучки, ключи и многое другое|Урок 5]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить взаимодействие машин состояний и организацию циклов.&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* создать переключатель, включающий и выключающий лампочку;&lt;br /&gt;
* сделать лампу активной, знающей о состоянии переключателя;&lt;br /&gt;
* создать простой  светофор, переключающий по кругу три лампы;&lt;br /&gt;
* создать уличный светофор с &amp;quot;правильным&amp;quot; поведением на основе управляющей машины;&lt;br /&gt;
* включать и выключать светофор при помощи кнопки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Лампочка и выключатель ==&lt;br /&gt;
&lt;br /&gt;
=== Создание машин ===&lt;br /&gt;
&lt;br /&gt;
Создайте в учебном проекте новый экран lesson_4 и сцену stg_main.&lt;br /&gt;
Перетащите на сцену из редактора ресурсов переключатель и лампочку:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson4_switch_lamp.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поменяйте обоим объектам тип, сделав их [[Machine|машинами состояний]].&lt;br /&gt;
Переименуйте (поле свойств &amp;quot;'''имя'''&amp;quot;) переключатель в '''switch''', а лампочку в '''lamp'''.&lt;br /&gt;
&lt;br /&gt;
Наша задача состоит в организации взаимодействия переключателя и лампочки.&lt;br /&gt;
Переключатель, как ему и положено, включает и выключает свет.&lt;br /&gt;
Поэтому, связанная с ним машина состояний, должна воздействовать на вторую&lt;br /&gt;
машину, которой является лампочка.&lt;br /&gt;
Нарисуем сначала граф машин состояний:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_state1.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Верхние красные кружочки относятся к переключателю.&lt;br /&gt;
Он может находиться в двух состояниях '''on''' и '''off'''.&lt;br /&gt;
Лампочка (синие кружочки), также имеет два состояния, которые мы&lt;br /&gt;
назовем '''dark''' и '''light'''.&lt;br /&gt;
&lt;br /&gt;
Cоздайте эти состояния в машинах так, как это было описано в предыдущем уроке. Добавьте в каждое состояние команду draw с параметром res, в которые перетащите&lt;br /&gt;
картинки из редактора ресурсов.&lt;br /&gt;
Затем в переключателе добавьте команду '''click''' с параметром '''go'''.&lt;br /&gt;
Сделайте из него &amp;quot;чекбокс&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_switch_state1_new.png]]&lt;br /&gt;
&lt;br /&gt;
В лампочке создайте пока только по команде рисования draw:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_lamp_state1.png]]&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат.&lt;br /&gt;
Переключатель должен переключаться, тогда как лампочка на это ни как не реагирует.&lt;br /&gt;
&lt;br /&gt;
=== Подключаем провода ===&lt;br /&gt;
&lt;br /&gt;
Теперь самое время подключить к лампочке и выключателю провода.&lt;br /&gt;
Этими проводами будет служить команда '''set'''.&lt;br /&gt;
Вспомним теорию. '''При входе''' в состояние происходит выполнение &lt;br /&gt;
команд инициализации, которые сразу выполняются, как только машина поменяла своё состояние.&lt;br /&gt;
К таким командам и относится команда '''set'''.&lt;br /&gt;
С её помощью происходит изменение состояния других машин.&lt;br /&gt;
Добавим в каждое из состояний переключателя по команде set с параметрами '''obj''' и '''st'''.&lt;br /&gt;
Для параметра obj из выпадалки выберем объект '''lamp'''.&lt;br /&gt;
В параметре st зададим руками требуемые состояния лампочки.&lt;br /&gt;
В результате должно получиться:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_switch_state2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Снова протестируйте работу машин. Стоит во вьювере нажать '''S''',&lt;br /&gt;
чтобы понаблюдать за происходящими изменениями состояний объектов.&lt;br /&gt;
&lt;br /&gt;
=== Активная лампочка ===&lt;br /&gt;
&lt;br /&gt;
Давайте усложним поведение лампочки.&lt;br /&gt;
Пусть она, независимо от переключателя, может включаться,&lt;br /&gt;
если на неё кликнули в состоянии '''dark'''. &lt;br /&gt;
Перейдя в горящее состояние '''light''' она горит 2 секунды,&lt;br /&gt;
а затем сама выключается, возвращаясь в '''dark''':&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_states2.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Не подглядывая на следующую картинку, запрограммируйте такое поведение лампочки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
У Вас, конечно, должен был получиться следующий результат:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lamp2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Условия переходов ===&lt;br /&gt;
&lt;br /&gt;
Потребуем теперь, чтобы лампочка, при клике на неё, могла включаться только,&lt;br /&gt;
если в этот момент включен переключатель.&lt;br /&gt;
Таким образом, необходимо заблокировать команду click если переключатель находится&lt;br /&gt;
в состоянии off. Делается это при помощи команды '''if''',&lt;br /&gt;
которую необходимо добавить в состояние dark лампочки:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lamp3.png]]&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что кроме команды if, было добавлено одноименное поле&lt;br /&gt;
в команде '''click''' с параметром 0. Разберемся, как работают эти команды.&lt;br /&gt;
В состоянии может быть несколько команд-условий if.&lt;br /&gt;
Все они нумеруются начиная с нуля. Т.е. первая сверху в списке команда if&lt;br /&gt;
имеет номер 0, следующая 1 и т.д. &lt;br /&gt;
Однако сами по себе условия ещё ничего не делают.&lt;br /&gt;
Запуск их на проверку выполнимости осуществляют другие команды.&lt;br /&gt;
В нашем случае это делает команда click.&lt;br /&gt;
В её поле if стоит ноль. Это означает, что при клике на лампочку&lt;br /&gt;
переход go произойдет только, если выполняется условие под номером 0.&lt;br /&gt;
В этом условии происходит проверка того, находится ли объект '''obj''' в состоянии '''st'''.&lt;br /&gt;
Если находится, то условие срабатывает и клик приводит к требуемой смене состояния.&lt;br /&gt;
Все просто :).&lt;br /&gt;
&lt;br /&gt;
Протестируйте получившийся результат. &lt;br /&gt;
Сначала на выключенном переключателе кликните на лампочку.&lt;br /&gt;
Она не загорится. Теперь, включите переключатель.&lt;br /&gt;
Лампа загорится и после 2-х секунд погаснет.&lt;br /&gt;
Теперь, если кликнуть на лампочку, она снова загорится,&lt;br /&gt;
так как переключатель находится в состоянии on.&lt;br /&gt;
Стоит, как обычно, в процессе этих экспериментов понаблюдать за отладочной информацией.&lt;br /&gt;
&lt;br /&gt;
=== Начальное состояние ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_prop.png|right]]&lt;br /&gt;
Каждая машина в момент начала работы находится в определённом состоянии.&lt;br /&gt;
По умолчанию, это первое состояние в линейке состояний, в соответствующем окне редактирования.&lt;br /&gt;
Однако его можно изменить.&lt;br /&gt;
Сделаем так, чтобы в начальный момент времени переключатель&lt;br /&gt;
был включен, а не выключен. Для этого необходимо в его свойствах (панель Properties) в поле '''состояние'''  задать имя начального состояния '''on'''.&lt;br /&gt;
&lt;br /&gt;
Запустим вьювер. Обратим внимание, что лампочка сразу загорелась.&lt;br /&gt;
Так и должно быть, так как машина переключателя начала работать из&lt;br /&gt;
состояния on, а, следовательно, запустила команаду '''set''',&lt;br /&gt;
меняющую состояние лампочки.&lt;br /&gt;
&lt;br /&gt;
Если лампочка сразу не загорелась, это означает, что в дереве проекта&lt;br /&gt;
она находится ниже переключателя. Поменяйте их местами, перетащив мышкой, и все заработает как описано выше.&lt;br /&gt;
С чем связаны такие магические действия, мы выясним ниже, при рассмотрении простого светофора.&lt;br /&gt;
&lt;br /&gt;
=== Подробнее о командах  ===&lt;br /&gt;
&lt;br /&gt;
Подытожим информацию о командах, работающих в состояниях внутри машин.&lt;br /&gt;
Существует четыре типа команд:&lt;br /&gt;
* '''инициализаций''' (draw, set) - выполняется сразу как только машина оказалась в данном состоянии. Это &amp;quot;мгновенные&amp;quot; команды, т.к. их действие не растянуто во времени;&lt;br /&gt;
* '''воздействий''' (click) - выполняются, если на машину было оказано внешнее воздействие, например, в неё кликнули мышкой;&lt;br /&gt;
* '''процессов''' (wait) - эти команды начинают выполняться, когда произошел переход в данное состояние. В отличии от команд инициализации, их действие растянуто во времени. К этому типу команд относится также команда move, которая встречалась в машинах первого урока;&lt;br /&gt;
* '''условий''' (if) - описание различных логических условий, которые могут использовать другие команды данного состояния.&lt;br /&gt;
&lt;br /&gt;
К настоящему моменту нам уже известны следующие команды:&lt;br /&gt;
&lt;br /&gt;
* '''draw''' — управление внешним видом машины, определение её графического ресурса. Эта команда, как и set является командой инициализации, т.е. выполняется в момент попадания машины в данное состояние. Если в состоянии машины такой команды нет, то автоматически устанавливается графический ресурс, указанный в свойствах данной машины (поле '''res''');&lt;br /&gt;
 &lt;br /&gt;
* '''set''' – установка состояния другого объекта (команда инициализации);&lt;br /&gt;
&lt;br /&gt;
* '''click''' – что делать при клике на объект (команда воздействия). В нашем случае - переход в другое состояние той же машины;&lt;br /&gt;
&lt;br /&gt;
* '''wait''' – временная пауза, после которой происходит переход в другое состояние (время исчисляется в миллисекундах, где 1 сек = 1000 миллисекунд). Это команда процессов, т.е. её выполнение длится во времени;&lt;br /&gt;
&lt;br /&gt;
* '''if''' – логическое условие перехода (команда перехода).&lt;br /&gt;
&lt;br /&gt;
== Светофор ==&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lights1.png|right]]&lt;br /&gt;
Рассмотрим теперь обычный уличный светофор. Вспомним как он работает:&lt;br /&gt;
* сначала обычно (к сожалению) горит красная лампа, остальные выключены;&lt;br /&gt;
* затем, при горящей красной лампе, загорается ещё и желтая;&lt;br /&gt;
* затем желтая и красная лампы гаснут и загорается зеленая;&lt;br /&gt;
* в конце горения зеленой лампы она три раза мигает и выключается;&lt;br /&gt;
* затем включается желтая лампа, горит и гаснет&lt;br /&gt;
* затем включается красный, чтобы повторить весь процесс с самого начала.&lt;br /&gt;
&lt;br /&gt;
Подобное сложное поведение можно реализовать с помощью самых разных машин состояния.&lt;br /&gt;
Сначала мы создадим три машины для каждой лампочки, которые будут взаимодействовать друг с другом,&lt;br /&gt;
переключая себя и своих соседей.&lt;br /&gt;
&lt;br /&gt;
[[файл:lessons_4_tree.png|right]]&lt;br /&gt;
Разместим на сцене подложку для светофора. Она останется статической картинкой.&lt;br /&gt;
Затем поместим поверх неё три лампы разного цвета и сделаем их подобъектами подложки.&lt;br /&gt;
Обложку назовем lights, а лампы '''light_R''', '''light_Y''', '''light_G'''.&lt;br /&gt;
Изменяя тип у ламп, превратим их в машины.&lt;br /&gt;
&lt;br /&gt;
=== Простой светофор ===&lt;br /&gt;
&lt;br /&gt;
Проигнорируем пока одновременное горение и мигание, сделав просто последовательное&lt;br /&gt;
переключений ламп по кругу. &lt;br /&gt;
Такой &amp;quot;простой светофор&amp;quot; можно попробовать реализовать тремя машинами, имеющих по два состояния в каждой из них. В качестве графического ресурса в выключенном состоянии off перетащите серую картинку light_D:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R1.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_Y1.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Хотя &amp;quot;простой светофор&amp;quot; будет работать вполне корректно,&lt;br /&gt;
приведенные выше машины не очень хороши. &lt;br /&gt;
Все лампы находятся в своем стартовом состоянии '''off'''.&lt;br /&gt;
В них есть команда инициализации '''set''', которая устанавливает состояние горения&lt;br /&gt;
следующей лампы. Что должно произойти в начальный момент запуска проекта?&lt;br /&gt;
Машины работают также как и рисуются - сверху вниз по дереву проекта.&lt;br /&gt;
Сначала инициализируется красная лампа. Это её первое попадание в состояние '''off''',&lt;br /&gt;
поэтому она пытается включить желтую лампу. Однако этого не происходит,&lt;br /&gt;
так как желтая лампа еще &amp;quot;не существует&amp;quot;. Когда до неё доходит очередь, она создается&lt;br /&gt;
и пытается включить зеленую лампу которой также &amp;quot;ещё нет&amp;quot;,&lt;br /&gt;
поэтому этого тоже не происходит. И только когда доходит дело до создания зеленой&lt;br /&gt;
лампы, она включает (уже существующую и находящуюся в состоянии '''off''') красную лампу.&lt;br /&gt;
&lt;br /&gt;
С этого момента всё начинает работать вполне логично. При входе в состояние '''on'''&lt;br /&gt;
выключается предыдущая лампа, а при входе в состояние '''off''' включается следующая.&lt;br /&gt;
&lt;br /&gt;
Стоит теперь вспомнить, отмеченную выше, важность порядка переключателя и лампы в дереве проекта.&lt;br /&gt;
Если там лампа не зажигалась при запуске проекта, это значит, что она была ниже&lt;br /&gt;
по дереву. В момент запуска проекта сначала создавался переключатель, который пытался зажечь&lt;br /&gt;
еще не существующую лампу. &lt;br /&gt;
&lt;br /&gt;
Почему же &amp;quot;простой светофор&amp;quot; плох, если он верно работает?&lt;br /&gt;
Потому, что держать в голове детали последовательного создания машин состояний&lt;br /&gt;
не стоит, т.к. это усложняет логику понимания их функционирования.&lt;br /&gt;
Если что-либо в этом разделе показалось неясным - нестрашно:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Надо по-возможности проектировать машины так, чтобы их стартовое состояние было максимально простым и не вызывало из себя цепочки изменений состояний других машин.'''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Тогда не возникнет непредсказуемости в поведении проекта.&lt;br /&gt;
&lt;br /&gt;
=== Промежуточные состояния ===&lt;br /&gt;
&lt;br /&gt;
Исправить ситуацию можно, добавив в каждую лампу промежуточное состояние next,&lt;br /&gt;
в котором собственно происходит управление переключением следующей лампы.&lt;br /&gt;
Приведем пример такой машины для красной лампы. Остальные сделайте по её образу и подобию:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R2.png]]&lt;br /&gt;
&lt;br /&gt;
Как мы видим, в добавленное состояние '''next''' переехала команда '''set''',&lt;br /&gt;
которая раньше была в состоянии '''off'''.&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R2_prop.png|right]]&lt;br /&gt;
Зададим в свойствах (Properties) стартовое состояние красной лампы в '''on''', а остальным лампам поставим состояние  '''off''' (этого можно не делать, если состояние off в линейках состояний стоит первым).&lt;br /&gt;
&lt;br /&gt;
В выключенных состояниях ничего не происходит кроме рисования серой картинки для выключенной лампы.&lt;br /&gt;
Поэтому,теперь ни каких попыток изменить состояния других ламп у light_Y и light_G не будет.&lt;br /&gt;
Красная лампа light_R начнет работать из состояния on. Прогорев 1 сек, она перейдет &lt;br /&gt;
в состояние next, в котором переустановит состояние следующей лампы.&lt;br /&gt;
В состоянии next красная лампа и останется (рисуя серую картинку), пока её не включит &lt;br /&gt;
на очередном цикле зеленая лампа.&lt;br /&gt;
&lt;br /&gt;
Подчеркнем еще раз, что команда '''set''' является командой инициализации состояния.&lt;br /&gt;
Она запускается при '''входе''' в состояние. Если бы она запускалась при выходе,&lt;br /&gt;
дополнительное состояние next не потребовалось бы и set можно было бы вставить в on.&lt;br /&gt;
Именно из-за &amp;quot;стартовости&amp;quot; выполнения set нам потребовалось ещё одно состояние.&lt;br /&gt;
&lt;br /&gt;
=== Управляющая машина ===&lt;br /&gt;
&lt;br /&gt;
Продолжая аналогичным образом, можно превратить простой светофор в светофор реалистичный.&lt;br /&gt;
Однако, мы пойдем другим путём. &lt;br /&gt;
&lt;br /&gt;
Взаимодействие нескольких, достаточно сложных машин, часто затрудняет анализ&lt;br /&gt;
их логики, т.к. приходится постоянно перемещаться между описаниями состояний этих машин,&lt;br /&gt;
чтобы разобраться в их работе. &lt;br /&gt;
&lt;br /&gt;
Обычно, более удобным является создание одной управляющей машины, в которой сконцентрирована &lt;br /&gt;
вся логика. Продемонстрируем, как это сделать на примере светофора.&lt;br /&gt;
Для этого превратим подложку светофора (серый прямоугольник) в машину и создадим&lt;br /&gt;
в ней состояния со следующими командами:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_lights.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Каждое состояние является этапом функционирования светофора, между которыми происходят переходы.&lt;br /&gt;
Красная и желая лампы - это простые машины с двумя состояниями '''on''' и '''off'''&lt;br /&gt;
в которых только рисуются соответствующие картинки:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_R3.png]]&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_Y3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Зеленая лампа пока состоит из 3-х состояний '''on''', '''off''' и '''blink'''.&lt;br /&gt;
Первые два аналогичны предыдущим лампам. В состоянии мигания blink&lt;br /&gt;
временно поставим рисование картинки желтого цвета (draw) и команду wait,&lt;br /&gt;
после действия которой происходит переход в состояние off.&lt;br /&gt;
Дальше мы это состояние подправим.&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G3.png]]&lt;br /&gt;
&lt;br /&gt;
Как мы видим теперь вся логика работы сконцентрирована в управляющей машине (подложка)&lt;br /&gt;
и легко прослеживается. Остальные машины очень простые (за исключением мигающей зеленой лампы).&lt;br /&gt;
Такой стиль организации взаимодействия машин часто оказывается существенно более ясным и удобным.&lt;br /&gt;
&lt;br /&gt;
Анализ поведения управляющей машины не должен составить труда.&lt;br /&gt;
Прокомментируем только состояние '''G_blink'''.&lt;br /&gt;
В этом состоянии зеленая лампа переводится в состояние мигания ('''blink''').&lt;br /&gt;
Предполагается, что когда мигание закончится, зеленая лампа должна перейти в состояние '''off'''.&lt;br /&gt;
В управляющей машине в команде wait мы ждем этого перехода при помощи проверки условия if.&lt;br /&gt;
&lt;br /&gt;
На выходе у нас должен получится светофор, лампочки которого загораются в таком порядке :&lt;br /&gt;
&lt;br /&gt;
1. Загорается красная лампочка.&lt;br /&gt;
&lt;br /&gt;
2. Загорается желтая лампочка.&lt;br /&gt;
&lt;br /&gt;
3. Загорается зеленая лампочка, остальные гаснут.&lt;br /&gt;
&lt;br /&gt;
4. Процесс мигания зеленой лампы представлено при помощи рисования на её месте желтой лампы.&lt;br /&gt;
&lt;br /&gt;
5. Все возвращается на исходную в обратном порядке.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание, что сама команда wait вызвана без параметра t. Если время ожидания t не указано, это означает, что &lt;br /&gt;
wait должен выполниться &amp;quot;мгновенно&amp;quot; и произойти переход в следующее состояние (go=Y). &lt;br /&gt;
Однако это случится только, если выполнится условие '''if''' (зеленая лампа отмигает).&lt;br /&gt;
Иначе идет переход к следующей команде wait. В ней находится единственный параметр '''loop'''&lt;br /&gt;
со значением -1. Это означает, что все команды wait нужно зациклить, &lt;br /&gt;
повторяя сверху вниз (до loop) бесконечное число раз,&lt;br /&gt;
пока условие не выполнится и машина совершит переход go=Y.&lt;br /&gt;
Подробнее использование циклов в командах мы разберем чуть ниже.&lt;br /&gt;
&lt;br /&gt;
=== Мигание как цепочка состояний ===&lt;br /&gt;
&lt;br /&gt;
Выше процесс мигания зеленой лампы мы временно представили при помощи рисования на её месте желтой лампы.&lt;br /&gt;
Займемся теперь вплотную настоящим процессом мигания.&lt;br /&gt;
Как и многие машины состояний, это поведение можно запрограммировать при помощи различных приёмов.&lt;br /&gt;
Самым простым  (но не очень удобным) является представление каждого&lt;br /&gt;
включения и выключения лампы при помощи отдельного состояния.&lt;br /&gt;
Для простоты, пусть она мигает не 3, а 2 раза.&lt;br /&gt;
Тогда такая машина может выглядеть следующим образом:    &lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_G4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Начиная с состояния blink происходит последовательный переход в состояния blink1, blink2, blink3.&lt;br /&gt;
Из последнего состояния blink3 мы прыгаем в состояние off, где процесс мигания заканчивается.&lt;br /&gt;
&lt;br /&gt;
Почему такая машина не удобна? Если нам необходимо изменить период мигания,&lt;br /&gt;
прийдётся менять параметр t в каждой команде wait всех 4-х состояний.&lt;br /&gt;
А если надо мигнуть не 2, а 10 раз?&lt;br /&gt;
Понятно, что для решения такой задачи необходимо использовать другие механизмы.&lt;br /&gt;
&lt;br /&gt;
=== Мигание как цикл ===&lt;br /&gt;
&lt;br /&gt;
Для реализации повторяющихся событий можно использовать&lt;br /&gt;
процессы, длящиеся внутри одного события. Сейчас мы рассмотрим как это делается.&lt;br /&gt;
Изменим машину зеленой лампы на следующую:&lt;br /&gt;
&lt;br /&gt;
[[Файл:lesson_4_G5.png]]&lt;br /&gt;
&lt;br /&gt;
Запустим вьювер, убедившись, что всё работает правильно. &lt;br /&gt;
Теперь разберемся с функционированием состояния '''blink'''.&lt;br /&gt;
&lt;br /&gt;
Напомним, что команды set и draw -- это команды инициализации.&lt;br /&gt;
Сколько бы их не было в состоянии, они все сразу выполнятся сверху вниз, как только машина переходит в это состояние.&lt;br /&gt;
Последовательное выполнение нескольких команд draw - достаточно бессмысленное мероприятие.&lt;br /&gt;
Эта команда задает ресурс рисования, поэтому в последовательности команд draw реально сработает только последняя, &lt;br /&gt;
которая &amp;quot;перебьет&amp;quot; ресурс рисования предыдущих команд draw.&lt;br /&gt;
&lt;br /&gt;
Последовательность выполнения инициализационных команд с одинаковым именем можно прервать, если добавить в некоторые из&lt;br /&gt;
них параметр '''break''' (прервать). В примере выше есть 2 команды draw. &lt;br /&gt;
Нулевая из них имеет в своих параметрах break&lt;br /&gt;
(напоминаем, что нумерация всех команд, как и if-ов начинается с нуля).&lt;br /&gt;
Поэтому, в момент запуска состояния, выполнится эта нулевая команда и следующая (первая) команда draw выполняться не будет.&lt;br /&gt;
В нулевом draw мы гасим лампочку (res=light_D).&lt;br /&gt;
&lt;br /&gt;
Посмотрим теперь на последовательность команд wait. &lt;br /&gt;
Это команды процессов и, в отличии от команд инициализации, их выполнение занимает некоторое время.&lt;br /&gt;
Команды процессов с одним названием выполняются '''последовательно''' друг за другом.&lt;br /&gt;
В нашем случае начнет выполняться нулевая команда wait и только после t=500ms будет передано управление следующему wait-у.&lt;br /&gt;
&lt;br /&gt;
В нулевой команде команде wait появился новый параметр draw со значением 1.&lt;br /&gt;
Этот параметр означает, что когда wait закончит работать она перезапустит команду draw под номером 1 (которая еще не выполнялась). &lt;br /&gt;
В этой команде установится картинка рисования включенной зеленой лампы (res=light_D).&lt;br /&gt;
&lt;br /&gt;
Теперь настало время следующей команды wait.&lt;br /&gt;
Отработав, она также перезапустит команду draw, но уже под номером 0 (т.е. лампочка погаснет).&lt;br /&gt;
Если бы в этой команде wait не было параметра loop произошла бы передача управления последней команде wait.&lt;br /&gt;
&lt;br /&gt;
Параметр loop в командах процессов означает, что цепочку команд с данным именем надо повторить loop раз (в нашем случае еще 2 раза).&lt;br /&gt;
Фактически, когда вьювер пробегается по командам wait, он каждый раз уменьшает loop на 1.&lt;br /&gt;
Если в поле loop ещё не получился ноль, он запускает по новой выполнение последовательности команд wait.&lt;br /&gt;
&lt;br /&gt;
Таким образом, первые 2 команды wait выполнятся при первом прохождении по ним сверху вниз,&lt;br /&gt;
а затем ещё два раза. В результате и получится три мигания.&lt;br /&gt;
&lt;br /&gt;
Когда цикл отработает, он передаст управление последней команде wait без параметра t.&lt;br /&gt;
Она сработает мгновенно, осуществляя переход из состояния blink в состояние off.&lt;br /&gt;
&lt;br /&gt;
Заметим, что если в параметре loop стоит значение -1, то такой цикл будет длится бесконечное число раз. Он может быть прерван только в результате срабатывания условия при наличие параметра go&lt;br /&gt;
(посмотрите еще раз на состояние blink_G управляющей машины светофора).&lt;br /&gt;
&lt;br /&gt;
=== Инициализация на выходе ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Команды '''set''' (как команды инициализации) выполняются при входе в состояние.&lt;br /&gt;
Выше нам потребовалось еще одно состояние, &lt;br /&gt;
для реализации простого светофора, чтобы осуществить инициализацию на выходе. &lt;br /&gt;
При помощи параметров запуска команд, введение дополнительного состояния можно избежать.&lt;br /&gt;
Для этого надо сделать команду-пустышку set, которая никого не меняет и на ней прервать&lt;br /&gt;
выполнение set-команд.&lt;br /&gt;
Затем, при выходе из состояния вызвать нужную последовательность set-ов.&lt;br /&gt;
Так, машина зеленой лампы простого светофора может выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_set.png]]&lt;br /&gt;
&lt;br /&gt;
=== Случайные мигания ===&lt;br /&gt;
&lt;br /&gt;
В заключение урока cделаем отдельную машину '''flasher''' (мигалка), которую заставим случайно гореть одним из трех  цветов. Для этого перетащим на сцену из редактора ресурсов&lt;br /&gt;
одну из ламп светофора и превратим её в машину состояний.&lt;br /&gt;
Введем следующие команды в четырех состояниях этой машины:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_4_flash1.png]]&lt;br /&gt;
&lt;br /&gt;
Последние три состояния -  это просто рисование того или иного цвета&lt;br /&gt;
в течении секунды, после чего переход в стартовое состояние switch.&lt;br /&gt;
В этом состоянии происходит случайный выбор следующего состояния.&lt;br /&gt;
Делается это при помощи трех команд wait не имеющих временной задержки.&lt;br /&gt;
В первых двух командах стоит параметр &amp;quot;'''p'''&amp;quot;. &lt;br /&gt;
Это вероятность с которой осуществляется переход в состояние, определяемое параметром &amp;quot;'''go'''&amp;quot;.&lt;br /&gt;
Если &amp;quot;'''p'''&amp;quot; отсутствует, то переход по &amp;quot;'''go'''&amp;quot; происходит в любом случае.&lt;br /&gt;
Иначе только с вероятностью p. С вероятностью же 1-p передается управление следующей команде&lt;br /&gt;
wait. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в нулевом wait-e состояния switch с вероятностью 0.33 машина перейдет в состояние R (красная лампа). &lt;br /&gt;
С вероятностью 0.67=1-0.33 перехода не будет и запустится следующий wait.&lt;br /&gt;
Из него с вероятностью 0.50 загорится желтая лампа (итоговая вероятность её горения будет равна  0.67*0.50=0.33). Наконец, если и этого не произойдет, то включится зеленый цвет.&lt;br /&gt;
Все три цвета будут зажигаться с одинаковой вероятностью.&lt;br /&gt;
&lt;br /&gt;
В общем случае, если есть n случайных переходов, чтобы добиться их равновероятности,&lt;br /&gt;
необходимо использовать следующие вероятности:&lt;br /&gt;
 p1=1/n, p2=1/(n-1), p3=1/(n-2),.... &lt;br /&gt;
Ниже в таблице приведены значения вероятностей для некоторых n:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
 ! n &lt;br /&gt;
 ! p1 &lt;br /&gt;
 ! p2 &lt;br /&gt;
 ! p3 &lt;br /&gt;
 ! p4 &lt;br /&gt;
 |-&lt;br /&gt;
 | 2 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 3 || 0.33 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 4 || 0.25 || 0.33 || 0.50 &lt;br /&gt;
 |-&lt;br /&gt;
 | 5 || 0.20 || 0.25 || 0.33 || 0.50 &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Заметим, что иногда длительность горения может оказаться больше секунды (две, три и т.д.)&lt;br /&gt;
Это просто означает, что данный цвет зажегся подряд несколько раз.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Создать машину состояний, имитирующую поведение обычной кнопки. &lt;br /&gt;
* Сделать так, чтобы нажатием на кнопку (машину) светофор из любого состояния переводился в стартовое горение красной лампы.&lt;br /&gt;
* Сделать то-же при помощи обычной кнопки, используя добавляемое при помощи правой кнопки мыши свойство &amp;quot;изменить состояние объекта&amp;quot;. &lt;br /&gt;
* Добавить в светофор состояние off, сделав его стартовым. В этом состоянии все лампы должны быть серыми. При помощи чекбокса (с любыми картинками, например, скопируйте голову слоненка из [[Checkbox как машина состояний|третьего урока]]) включайте и выключайте светофор (для этого правой кнопкой мыши в панели свойств добавьте свойства &amp;quot;''при включении изменить состояние объекта''&amp;quot; и &amp;quot;''при выключении изменить состояние объекта''&amp;quot;). &lt;br /&gt;
* Сделать предыдущую задачу при помощи машины состояний вместо чекбокса. Какое решение у Вас получилось быстрее?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Checkbox как машина состояний|Урок 3]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Движение машин: жучки, ключи и многое другое|Урок 5]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.appsalutecreator.com/index.php?title=Checkbox_%D0%BA%D0%B0%D0%BA_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9&amp;diff=10031</id>
		<title>Checkbox как машина состояний</title>
		<link rel="alternate" type="text/html" href="https://wiki.appsalutecreator.com/index.php?title=Checkbox_%D0%BA%D0%B0%D0%BA_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9&amp;diff=10031"/>
		<updated>2021-08-04T12:10:51Z</updated>

		<summary type="html">&lt;p&gt;Blymar: /* Ускорение работы и отладка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание экранов, сцен. Работа с кнопками|Урок 2]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{{TOC right}}&lt;br /&gt;
&lt;br /&gt;
'''Цель:''' изучить понятие машины состояний на примере объекта Checkbox&lt;br /&gt;
&lt;br /&gt;
'''Задачи:''' &lt;br /&gt;
* Cоздать новый экран и сцену для этого урока.&lt;br /&gt;
* При помощи объекта Checkbox заставит слонёнка поворачивать голову.&lt;br /&gt;
* Воспроизвести этого же слонёнка при помощи машины состояний.&lt;br /&gt;
* Добавить разнообразия в поведении слонёнка.&lt;br /&gt;
* Создать эмоциональную рожицу. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Checkbox ==&lt;br /&gt;
&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
&lt;br /&gt;
Начнём урок, как обычно,  с открытия проекта lessons. В нём добавим новый экран lesson_3&lt;br /&gt;
со сценой stg_main, так как это было описано в предыдущем [[Создание экранов, сцен. Работа с кнопками|уроке]]. Поместим из редактора ресурсов на сцену любой фон из папки этого или предыдущего  урока. Для примера далее используется &amp;quot;лунный пейзаж&amp;quot; (картинка '''bg''').&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_chk1.png|right]]&lt;br /&gt;
Поверх фона перетащите из редактора ресурсов тело слонёнка (ресурс '''body''')&lt;br /&gt;
и затем его голову '''head_1'''. Расположите их так, чтобы получился примерно целый слонёнок.&lt;br /&gt;
Переименуйте эти 2 объекта в '''elephant_body''' и '''elephant_head_chk'''&lt;br /&gt;
(помним о необходимости осмысленности в именах объектов?). Чтобы голова и тело стали &amp;quot;целым&amp;quot; существом, стоит в дереве проекта (Layout) перетащить голову на тело, сделав её подобъектом.&lt;br /&gt;
Теперь, если на сцене начать таскать тело слоненка, то голова будет послушно следовать за ним.&lt;br /&gt;
Хотя, если схватить за голову, то её легко можно оторвать. Так, что будьте со слоненком поласковее.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Внимание!!!''' Подобъект наследует все модификации своего родителя. Если, к примеру, изменить '''scale x''' и '''scale y''' родительскому объекту, у дочернего точно также изменится '''scale x''' и '''scale y'''. &lt;br /&gt;
Более того, изменения могут накладываться друг на друга. Если дочерний объект был, как вариант, уменьшен с помощью тех же '''scale x''' и '''scale y''', а потом вы уменьшили родительский, то дочерний объект рискует уменьшиться еще сильнее. '''Будьте внимательны!'''&lt;br /&gt;
&lt;br /&gt;
=== Создание чекбокса ===&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_chk.png|right]]&lt;br /&gt;
Зайдем в свойство головы '''elephant_head_chk''' и изменим её тип на '''[[Checkbox|checkbox]]'''.&lt;br /&gt;
Раскроем треугольнички возле свойств &amp;quot;'''не отмечена (внешний вид)'''&amp;quot; и &amp;quot;'''отмечена (внешний вид)'''&amp;quot;. Поля '''не отмечена (внешний вид)''' и '''отмечена (внешний вид)''' содержат по три ресурса (&amp;lt;tt&amp;gt;up, down и over&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''Не отмечена (внешний вид):'''&lt;br /&gt;
&amp;lt;tt&amp;gt;up&amp;lt;/tt&amp;gt; - так выглядит чекбокс, пока мы на него не нажали;&lt;br /&gt;
&amp;lt;tt&amp;gt;down&amp;lt;/tt&amp;gt; - так выглядит чекбокс, если мы на него нажмём, но не откликнем в не нажатом состоянии;&lt;br /&gt;
&amp;lt;tt&amp;gt;over&amp;lt;/tt&amp;gt; – так выглядит чекбокс, если мы на него наведём мышкой, в не нажатом состоянии.&lt;br /&gt;
&lt;br /&gt;
'''Отмечена (внешний вид):'''&lt;br /&gt;
&amp;lt;tt&amp;gt;up&amp;lt;/tt&amp;gt; - так выглядит чекбокс, когда мы на него нажали;&lt;br /&gt;
&amp;lt;tt&amp;gt;down&amp;lt;/tt&amp;gt; - так выглядит чекбокс, если мы на него нажмём, но не откликнем в нажатом состоянии;&lt;br /&gt;
&amp;lt;tt&amp;gt;over&amp;lt;/tt&amp;gt; – так выглядит чекбокс, если мы на него наведём мышкой, в нажатом состоянии.&lt;br /&gt;
Разместим поверх окна редактор ресурсов и перетащим в поле '''up''' первой группы (не отмечена) картинку '''head_1''', а в такое же поле второй группы (отмечена) картинку '''head_2'''.&lt;br /&gt;
Делается это также, как и формирование внешнего вида кнопки из предыдущего [[Создание экранов, сцен. Работа с кнопками|урока]].&lt;br /&gt;
&lt;br /&gt;
Сохраняем проект и запускаем вьювер. При клике на голову слонёнка она должна туда-сюда поворачиваться. Вы узнали в этом поведении чекбокс?&lt;br /&gt;
Обычно  чекбоксы (сheckbox) это такие квадратики в которых ставят или убирают галочку.&lt;br /&gt;
Конечно и в игровом приложении может понадобиться подобный чекбокс.&lt;br /&gt;
В этом случае необходимо будет подготовить соответствующие картинки.&lt;br /&gt;
Простые игровые объекты (типа подобной головы) часто могут находиться в двух состояниях (выбран, не выбран). Они не похожи на чекбокс внешним видом, но являются им в силу правил своего поведения.&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача состоит в воспроизведении поведения чекбокса при помощи объекта&lt;br /&gt;
другого типа - '''[[Machine|машины состояний]]'''. Мы не только повторим вращающего головой слоненка,&lt;br /&gt;
но и придадим его поведению новые функции.&lt;br /&gt;
&lt;br /&gt;
== Машины состояний ==&lt;br /&gt;
&lt;br /&gt;
=== Немного теории ===&lt;br /&gt;
&lt;br /&gt;
''Машина состояний (state machine)'' является универсальным инструментом для программирования в редакторе сцен сложного поведения объектов.  Логика поведения машины состояний разбивается на отдельные узлы (состояния). Объект всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на объект, либо в результате окончания некоторых процессов протекающих внутри объекта. &lt;br /&gt;
&lt;br /&gt;
Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. Настоятельно рекомендуется рисовать такие графы в процессе проектирования машины, а лишь затем переходить к их описанию в окне редактора состояний. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Файл:def_states.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Машина состояний не обладает памятью. Это означает, что для анализа того, что произойдет в данном состоянии, неважно как мы в него попали, и какова была предыстория переходов. Важно, только, что мы находимся в этом состоянии. Такое отсутствие памяти упрощает анализ логики машины, так как каждый раз мы концентрируемся на одном конкретном состоянии, а всю логику работы разбиваем на отдельные кирпичики-состояния.&lt;br /&gt;
&lt;br /&gt;
Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы.&lt;br /&gt;
&lt;br /&gt;
=== Проектирование машины ===&lt;br /&gt;
&lt;br /&gt;
Перейдем теперь от нудной теории к веселой практике. Посмотрим внимательно на поведение головы слоненка, которая является чекбоксом. На самом деле это типичная машина состояний с двумя состояниями. Назовём их '''left''' и '''right''' по направлению ориентации головы слонёнка. Сначала слоненок находится в состоянии  left (смотрит влево). Когда мы кликаем в голову, машина переходит в новое состояние right (голова поворачивается вправо). Это поведение жестко запрограммированно внутри объекта checkbox. Попробуем добиться того же эффекта, используя универсальный игровой объект &amp;quot;машина состояний&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Прежде всего не поленимся нарисовать весёлый граф состояний и переходов между ними:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states.png|center|300px]]&lt;br /&gt;
&lt;br /&gt;
Теперь, когда на бумаге всё стало ясно :), необходимо эту машину создать в редакторе.&lt;br /&gt;
&lt;br /&gt;
=== Создание машины ===&lt;br /&gt;
&lt;br /&gt;
Чтобы не тратить время на редактор ресурсов, скопируем уже существующего слонёнка. &lt;br /&gt;
Для этого станем в дереве проекта на его тело (elephant_body) и правой кнопкой мыши вызовем меню.&lt;br /&gt;
В нём выбираем пункт Copy. Затем повторяем операцию, но выбираем уже пункт вставить (&amp;quot;''Paste after curent object''&amp;quot;). В дереве проекта появятся два слоненка. Причем оба будут иерархичной веткой,&lt;br /&gt;
состоящей из &amp;quot;тела&amp;quot; (elephant_body) и подобъекта &amp;quot;голова&amp;quot; (elephant_head).&lt;br /&gt;
А вот на сцене редактора видимых изменений не произойдет.&lt;br /&gt;
Мы помним, что при копировании объектов копируются также все их свойства.&lt;br /&gt;
Поэтому на сцене, на самом деле, два слоненка, но они имеют одинаковые координаты.&lt;br /&gt;
Поэтому хватаемся за тело и тащим его правее на свободное место:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_2elephants.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Левого слона оставим чекбоксом, а голову правого превратим в [[Machine|машину состояний]].&lt;br /&gt;
Для этого кликаем в голову и меняем её тип с checkbox на '''machine''' (поле '''тип''' в панели Properties). Поменяем также имя головы, укоротив его до &amp;quot;'''elephant_head'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Можно попробовать посмотреть, что у нас получилось. Сохраняем проект и запускаем вьювер.&lt;br /&gt;
Упс... Голова исчезла, а вверху экрана появилось малопонятное ругательство,&lt;br /&gt;
из которого можно заключить, что у объекта elephant_head состояний то и нет.&lt;br /&gt;
&lt;br /&gt;
Таким образом, не достаточно создать машину, её еще необходимо научить ездить.&lt;br /&gt;
Поэтому закрываем окно вьювера и начинаем заниматься программированием.&lt;br /&gt;
&lt;br /&gt;
=== Программирование состояний ===&lt;br /&gt;
&lt;br /&gt;
Сделаем активной голову правого слонёнка, которая стала машиной состояний.&lt;br /&gt;
В панели её свойств кликаем на поле '''states''', а затем на появившиеся в нём три точки (помним [[Введение в AppSalute Сreator|первый урок]]?). Также открыть машину состояний, можно двойным щелчком левой клавиши мыши. В результате этих действий, выскочит окошко в котором мы будем создавать состояния &lt;br /&gt;
и их программировать. Два раза нажмём кнопку '''Добавить состояние''' в левом нижнем углу окна:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате появилось две области, каждая из которых будущее состояние головы.&lt;br /&gt;
Зададим имена состояний, введя названия left и right в полях '''имя''' каждой области.&lt;br /&gt;
Затем станем мышкой на поле '''имя''' левого состояния и нажмём правую кнопку мышки.&lt;br /&gt;
Появится большое меню, в котором кликнем на первый пункт &amp;quot;''draw - внешний вид''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В левом состояни под его именем добавится команда '''draw'''.&lt;br /&gt;
Эта команда управляет способом отрисовки машины в данном состоянии.&lt;br /&gt;
Нам потребуется ещё одна команда '''click''', которую добавим аналогичным&lt;br /&gt;
образом (правая кнопка мыши на команде draw).&lt;br /&gt;
&lt;br /&gt;
В команды необходимо добавить параметры, определяющие их свойства.&lt;br /&gt;
Для этого кликнем справа от draw и затем ещё раз на появившиеся три точки.&lt;br /&gt;
В выскочившем диалоговом окне поставим галочку возле пункта &amp;quot;''графический ресурс''&amp;quot;&lt;br /&gt;
и нажмем кнопку Ok:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states_dlg.png]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Аналогично кликаем на команду '''click''' и добавляем ей параметр &amp;quot;''go - новое состояние''&amp;quot;.&lt;br /&gt;
Те же действие проделываем с правым состоянием. В результате должно получиться:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Осталось заполнить поля команд. В поле go команды click левого состояния пишем '''right''',&lt;br /&gt;
а в тоже поле правого состояния пишем '''left'''. Это означает, что при клике машина должна перейти  в то состояние, которое указано в поле go. Имена состояний вводятся с клавиатуры руками,&lt;br /&gt;
поэтому необходимо следить за правильностью их написания.&lt;br /&gt;
&lt;br /&gt;
Теперь откроем окно редактора ресурсов. Сделав активным значение поля '''res''' команды draw левого состояния, перетащим в него из ресурсов картинку '''head_1'''. В аналогичное поле правого состояния перетащим картинку '''head_2'''. Делается это точно так, как мы задавали поля внешнего вида кнопки или чекбокса в панели Properties. Финальный результат наших действий&lt;br /&gt;
приводит к следующей машине (мы не будем больше приводить всё окно редактирования состояний):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Насладимся результатами нашей работы. Закроем окно с состояниями (крестик в правом верхнем углу).&lt;br /&gt;
Сохраним проект и запустим вьювер (для ускорения можно не закрывать окно состояний, а кликнуть на иконки сохранения и запуска вьювера внизу этого окна). &lt;br /&gt;
В результате, во вьювере оба слоненка должны вести себя абсолютно одинаково.&lt;br /&gt;
&lt;br /&gt;
=== Ускорение работы и отладка ===&lt;br /&gt;
&lt;br /&gt;
При программировании состояний машины можно использовать некоторые приёмы&lt;br /&gt;
ускоряющие процесс. Так, в примере с головой, команды обоих состояний выглядят одинаково.&lt;br /&gt;
Поэтому имеет смысл сначала создать одно состояние (left),&lt;br /&gt;
наполнить его командами и параметрами. Затем нажать кнопку &amp;quot;Скопировать состояние&amp;quot;.&lt;br /&gt;
Состояние продублируется и останется только подправить его параметры.&lt;br /&gt;
&lt;br /&gt;
Машины состояний, как и другие объекты, можно копировать вместе со всеми их состояниями. Поэтому, если уже есть  машина, похожая на ту, которую надо создать, мы её просто копируем и подправляем команды и их параметры.&lt;br /&gt;
&lt;br /&gt;
Если машина создается из картинки, изменением типа, то не стоит глазами искать слово '''machine''' в списке типов. Необходимо на клавиатуре нажать клавишу '''M''' и затем '''Enter'''.&lt;br /&gt;
Вообще, активнее пользуйтесь горячими клавишами. Например, если в дереве проекта (Layout)&lt;br /&gt;
активна машина, то нажатие '''Ctrl+M''' приведет к открытию окна редактирования состояний.&lt;br /&gt;
&lt;br /&gt;
При запуске проекта во вьювере можно следить за отладочной информацией о состояниях объектов.&lt;br /&gt;
Это помогает понять почему что-то работает не так как надо. &lt;br /&gt;
&lt;br /&gt;
:'''Важно''' !!! Чтобы отладочная информация отображалась нужно для каждого наблюдаемого объекта (машины), поставить в поле отладка значение '''вкл''' и включить &amp;quot;Debug enabled&amp;quot;. Для этого нужно зайти в пункте меню Project -&amp;gt; Project Options -&amp;gt; Debug Options и напротив Debug enabled поставить галочку.&lt;br /&gt;
&lt;br /&gt;
Запустим вьювер и нажмём кнопку &amp;quot;'''F1'''&amp;quot;. Появится небольшое меню с командами, которое гасится повторным нажатием F1. Кнопка &amp;quot;'''S'''&amp;quot;  (на клавиатуре) выводит список всех активных объектов на сцене. Если текст информации совпадает с текстом фона, то эта информация будет плохо видна. В этом случае необходимо несколько раз нажать клавишу &amp;quot;'''C'''&amp;quot;, меняя по кругу цвет текста.&lt;br /&gt;
&lt;br /&gt;
Первые две колонки отладочной информации, это имя сцены и объекта. В колонке state видно текущее состояние. Понажимайте на голову слоненка, наблюдая как его состояние меняется с left на right и наоборот.&lt;br /&gt;
&lt;br /&gt;
Запустите теперь во вьювере экран первого урока и нажмите &amp;quot;'''S'''&amp;quot; потом на клавишу &amp;quot;'''С'''&amp;quot;.&lt;br /&gt;
Покликайте на слоненка, его голову и солнышко, наблюдая как изменяется информация об этих машинах.&lt;br /&gt;
Так как внутри состояний могут происходить некоторые процессы, их&lt;br /&gt;
можно затормозить, нажав '''пробел''' (в этот момент солнышко остановится). Повторное нажатие пробела, снова запустит все процессы.&lt;br /&gt;
&lt;br /&gt;
=== Немного нравоучений ===&lt;br /&gt;
&lt;br /&gt;
Освоив машины состояний, дизайнеры обычно применяют их там где надо и там где не надо.&lt;br /&gt;
Например, в этом уроке быстрее оформить голову слонёнка как чекбокс,&lt;br /&gt;
а не как машину состояний. Поэтому прежде чем хвататься за шестеренку, стоит сначала подумать&lt;br /&gt;
о том, каким игровым объектом можно реализовать данное поведение.&lt;br /&gt;
&lt;br /&gt;
При работе над проектами, некоторые машины иногда повторяются. Их конечно можно копировать, подправляя соответствующие поля команд. Однако, на определенном этапе, возможно, стоит начать дергать руководство и С++ программистов, чтобы они оформили эту &amp;quot;типовую&amp;quot; машину в виде отдельного игрового объекта. Как это, например, сделано с чекбоксом или кнопкой.&lt;br /&gt;
&lt;br /&gt;
Если Вы пытаетесь сделать что-то при помощи машины состояний, но получается очень громоздкий объект (куча состояний, переходов, команд), значит Вы делаете что-то не так.&lt;br /&gt;
Либо машина плохо спроектирована, либо вообще эту задачу не стоит решать при помощи машин.&lt;br /&gt;
Возможно это уже миниигра и необходимо подключать C++ программистов для её реализации.&lt;br /&gt;
&lt;br /&gt;
Стоит также помнить, что работа над проектом это коллективный процесс. &lt;br /&gt;
Спустя некоторое время Вашу работу может подправлять другой человек.&lt;br /&gt;
Да и Вы к этому моменту станете другим человеком и все забудете. &lt;br /&gt;
Поэтому относитесь максимально ответственно к процессу документирования.&lt;br /&gt;
Это означает выбор осмысленных имен объектов и заполнение поля &amp;quot;'''описание'''&amp;quot;,&lt;br /&gt;
находящееся у большинства сложных объектов в Properties.&lt;br /&gt;
Для машин это поле находится в окне редактирования состояний, сразу под состояниями.&lt;br /&gt;
Например, в нашем случае текст документации может выглядеть примерно так: &amp;quot;''При клике на голову она поворачивается влево или в право''&amp;quot;.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Правильно работающий незадокументированный проект - это плохой проект.'''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Усложняем машину ==&lt;br /&gt;
&lt;br /&gt;
=== Непослушный слоненок ===&lt;br /&gt;
&lt;br /&gt;
Реабилитируем немного нашу деятельность по воспроизводству стандартного чекбокса при помощи машины состояний.&lt;br /&gt;
Для этого придадим голове правого слонёнка дополнительное поведение, которым чекбокс не обладает.&lt;br /&gt;
Пусть правый слоненок нежно относится к левому и не хочет на долго от него отворачиваться.&lt;br /&gt;
Поэтому, повернувшись после клика вправо, он затем сам снова поворачивается влево.&lt;br /&gt;
&lt;br /&gt;
Для реализации этого поведения добавим в состояние '''right''' команду '''wait''' c параметром '''t''', равным 1000 миллисекундам (что равно одной секунде) и параметром '''go'''=left&lt;br /&gt;
В результате должна получиться такая машина:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
До сих пор, переход из одного состояния в другое происходил в результате клика на машину.&lt;br /&gt;
Это было внешнее воздействие.&lt;br /&gt;
Однако, переход между состояниями может происходить в результате некоторых процессов внутри состояния.&lt;br /&gt;
В нашем случае, при заходе в правое состояние начинает работать команда '''wait'''. Она&lt;br /&gt;
ждет в течении времени, определяемом полем '''t'''. Затем, если задано поле '''go''', машина сама инициирует переход в соответствующее состояние.&lt;br /&gt;
&lt;br /&gt;
Сохраните и запустите во вьювере этот проект. Кликая на головы обоих слонят,&lt;br /&gt;
сравните их поведение.&lt;br /&gt;
&lt;br /&gt;
=== Сумашедший слоненок ===&lt;br /&gt;
&lt;br /&gt;
В заключение, поиздеваемся немного над слоненком, сделав его голове&lt;br /&gt;
такую машину состояний:&lt;br /&gt;
&lt;br /&gt;
[[файл:lesson_3_states6.png]]&lt;br /&gt;
&lt;br /&gt;
В результате слонёнок начнет нерегулярно крутит головой то влево, то вправо.&lt;br /&gt;
В каждом состоянии он будет находиться  случайное время от 1-й до 3-х секунд.&lt;br /&gt;
Это определяется параметрами '''t''' и '''dt''', которые задают&lt;br /&gt;
интервал времени от t-dt до t+dt.&lt;br /&gt;
&lt;br /&gt;
Заметим, что, не смотря на самовольное вращение головой,&lt;br /&gt;
слоненок по-прежнему реагирует на клики мышки.&lt;br /&gt;
&lt;br /&gt;
== Машина эмоций ==&lt;br /&gt;
&lt;br /&gt;
Выше мы рассмотрели несколько машин состояний, не сильно отличающихся&lt;br /&gt;
от бездушного чекбокса. &lt;br /&gt;
Приведем теперь пример машины, которую и машиной неловко назвать.&lt;br /&gt;
Это существо, обладающее целым спектром эмоций и реакций на внешнее воздействие:&lt;br /&gt;
&lt;br /&gt;
[[файл:smiles.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберемся, что нарисовано на картинке. Каждая рожица - это отдельное состояние,&lt;br /&gt;
отражающее настроение нашего существа. Стрелки - переходы между состояниями&lt;br /&gt;
по командам '''click''' и '''wait'''.&lt;br /&gt;
&lt;br /&gt;
Начинает работать существо из состояния [[файл:s1.png|24px]].&lt;br /&gt;
Как и любые существа, Оно любит внимание. &lt;br /&gt;
Поэтому, при клике переходит в более жизнерадостное состояние [[файл:s2.png|24px]].&lt;br /&gt;
Если больше на него не кликать, Оно опять вернется в начальное состояние,&lt;br /&gt;
а спустя еще какое то время начнет плакать [[файл:s5.png|24px]], из-за полного отсутствия&lt;br /&gt;
внимания. Впрочем, небольшой клик - и Оно снова довольно жизнью.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на последовательность состояний [[файл:s3.png|24px]], переходящих в &lt;br /&gt;
недовольную гримасу [[файл:s4.png|24px]]. Излишнее внимание также вредно, как &lt;br /&gt;
и его отсутствие. &lt;br /&gt;
&lt;br /&gt;
В качестве упражнения, попробуйте создать такую машину состояний,&lt;br /&gt;
самостоятельно найдя в интернете или нарисовав соответствующие картинки.&lt;br /&gt;
Вы можете также вытащить картинки рожиц из этого урока, кликнув на них для увеличения, а затем нажав правую кнопку мышки, сохранить их на диске.&lt;br /&gt;
Как загрузить картинки в редактор ресурсов было описано в конце предыдущего [[Введение в AppSalute Сreator|урока]].&lt;br /&gt;
Естественно, Вы можете изменить эмоциональное поведение, сделав его более реалистичным :).&lt;br /&gt;
&lt;br /&gt;
В заключение, несколько общих замечаний:&lt;br /&gt;
* Если машина имеет более двух состояний, её необходимо сначала проектировать на бумаге. Именно на диаграмме состояний отчетливо проявляется логика поведения машины.&lt;br /&gt;
* Обычно не должно быть тупиковых состояний, из которых ни куда попасть нельзя. В эмоциональной машине с рожицами таких состояний нет.&lt;br /&gt;
* Всегда необходимо выделять начальное состояние в котором машина начинает своё существование.&lt;br /&gt;
* Памятью машины состояний не обладают, однако имитация памяти может быть реализована при помощи цепочки состояний, как было сделано выше с состояниями счастливой рожицы.&lt;br /&gt;
&lt;br /&gt;
== Упражнения ==&lt;br /&gt;
&lt;br /&gt;
* Уменьшите в 2 раза размер слонят (параметр scale в модификаторах свойств). Для этого достаточно поменять масштаб у тела, т.е. его scale распространится и на подобъект.&lt;br /&gt;
* Копированием создайте третьего слонёнка.&lt;br /&gt;
* Запрограммируйте его голову как машину, состоящую из 3-х состояний. В качестве картинки третьего состояния возьмите солнышко из первого урока. Пусть состояния при клике прокручиваются по кругу (left, right, sun,left,...)&lt;br /&gt;
* Добавьте четвертого слонёнка с тремя состояниями и сделайте с ним что хотите.&lt;br /&gt;
* Создайте эмоциональную рожицу&lt;br /&gt;
* Посмотрите снова на описание машин состояний из первого урока. Стало ли понятнее их поведение?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;  &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot;|[[Создание экранов, сцен. Работа с кнопками|Урок 2]] &amp;lt;&amp;lt; &lt;br /&gt;
 ! width=&amp;quot;20%&amp;quot;|[[Learning|Оглавление]] &lt;br /&gt;
 | width=&amp;quot;40%&amp;quot; align=&amp;quot;right&amp;quot;| &amp;gt;&amp;gt; [[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Learning]]&lt;/div&gt;</summary>
		<author><name>Blymar</name></author>
		
	</entry>
</feed>