https://wiki.appsalutecreator.com/api.php?action=feedcontributions&user=Sred&feedformat=atomwiki.appsalutecreator.com - Вклад участника [ru]2024-03-28T20:19:30ZВклад участникаMediaWiki 1.31.15https://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Table_lesson7.png&diff=9439Файл:Table lesson7.png2018-02-15T12:03:43Z<p>Sred: Sred загрузил новую версию Файл:Table lesson7.png</p>
<hr />
<div></div>Sredhttps://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&diff=9035Настройка миниигр2017-09-19T07:38:25Z<p>Sred: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Создание игры «Hidden Object Game»|Урок 7]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Работа с эффектами|Урок 9]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' изучить настройки объектов, реализующих различные минигры.<br />
<br />
'''Задачи:''' <br />
* создать уровень игры с объектом, содержащим тип механики Puzzle<br />
* создать уровень игры с объектом, содержащим тип механики Patchwork <br />
<br />
== Puzzle ==<br />
<br />
=== Создание экрана и сцены в игровом проекте ===<br />
<br />
1. Запустить SceneEditor.<br />
<br />
2. В меню Проект → Загрузить → Learning.seproj. <br />
<br />
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_07.1, создать экран Lesson_08.<br />
<br />
[[Файл:08 1.png]]<br />
<br />
4. В экране Lesson_08 создать новые сцены 08 и Buttons, в которую (через ResourcesEditor) добавить графические ресурсы (Level_01, hint_normal в папку 05 и hint_normal, ico_R_normal2 в папку Buttons) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»).<br />
<br />
[[Файл:08 2.png]] [[Файл:08 3.png]]<br />
<br />
=== Настройка объектов, создание машин состояний ===<br />
<br />
1. В сцене 08 изменить название графического ресурса hint_normal на applause и в общих настройках элемента удалить саму графику через модификаторы → res.<br />
<br />
[[Файл:08 4.png]]<br />
<br />
2. Графическое изображение level_01 перевести в тип [[Puzzle|puzzle]] и установить такие настройки:<br />
<br />
[[Файл:08 5.png]]<br />
<br />
3. Объект applause перевести в тип машина и прописать ему состояния on и off.<br />
<br />
4. В состоянии on добавить команду play (проиграть звук) и в списке команды выбрать snd (короткий звук), подгружаемый с помощью ResourcesEditor из папки ресурсов Level_08; <br />
<br />
[[Файл:08 6.png]]<br />
<br />
5. Создать новое состояние с именем off. В общих настройка свойства элемента изначально установить состояние off.<br />
<br />
[[Файл:08 7.png]] [[Файл:08 8.png]]<br />
<br />
6. Далее перейти к сцене Buttons, перевести графические объекты hint_normal, ico_R_normal2 в тип button, в свойстве элемента установить такие настройки:<br />
<br />
[[Файл:08 9.png]] [[Файл:08 10.png]]<br />
<br />
''Кнопка R (переиграть)'' — кнопка, запускающая игру Puzzle сначала. В общих настройках свойства элемента устанавливаем, в какое начало должна возвращать кнопка (в нашем случае перейти на экран Lesson_08).Для данной игры, мы сделали переход на экран <tt>Lesson_08</tt>, который запускает игру сначала. Но в дальнейшем, чтобы не переводить все объекты в начальное состояние правильнее будет, в графе '''«изменить состояние»''' выбрать объект <tt>Level_01</tt> и указать ему состояние <tt>mix</tt>, которое означает, что игра возвращается в состояние перемешивания картинок, а не запускает всю игру заново.<br />
<br />
7. В объекте (кнопке) hint_normal нажать правой кнопкой и выбрать изменить состояние объекта → потом выбрать объект level_01 и вписать состояние hint, которое означает, что при нажатии кнопки, в качестве подсказки, игра покажет картинку в собранном виде.<br />
<br />
[[Файл:08 11.png]] [[Файл:08 12.png]]<br />
<br />
''hint'' – кнопка, реализующая подсказку на экране поиска.<br />
<br />
8. Вернуться на сцену 08 к объекту level_01 и в общих настройках свойства элемента изменить состояние объекта → выбрать объект applause и вписать состояние on.<br />
<br />
[[Файл:08 13.png]]<br />
<br />
9. Проверить выполнение задачи с помощью проигрывателя сцен Viewer.<br />
<br />
=== Упражнения ===<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_08, создать новый экран Lesson_08.1<br />
<br />
2. Создать новые сцены (с названием 08.1 и Buttons).<br />
<br />
3. Скопировать все объекты из сцены 08 (экрана Lesson_08) и Buttons (экрана Lesson_08).<br />
<br />
4. Вставить скопированые объекты в новую сцену 08.1 и Buttons (экрана Lesson_08.1).<br />
<br />
[[Файл:08 15.png]]<br />
<br />
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:<br />
<br />
a) заменить звук аплодисментов другим аудиофайлом, имеющимся в базе ресурсов;<br />
<br />
b) в пазле изменить количество разбиваемых частей на шесть (3х2), добавить сетку, изменить перестановку ячеек на смешивание по alpha, изменить время смешивания на 500 миллисекунд;<br />
<br />
c) при нажатии hint (подсказки) изменить время показа подсказки на 2 секунды, изменить время финального показа пазла на 3 секунды, установить время закрытия пазла 500 миллисекунд.<br />
<br />
6. Сделать счетчик подсказок, используя объект '''[[Store|Store]]''' создать возможность совершать покупки подсказок за реальные деньги.<br />
<br />
Щелкнув правой кнопкой мыши по экрану Lesson_08.1 создадим новый экран '''lessons_8_1_1'''. Добавим в него сцены str_8_1 и Button_8_1. В сцену str_8_1 поместим объекты из экрана Lesson_08.1: level_01, applause; оставим их без изменения. В сцену Button_8_1 скопируем из Lesson_08.1 кнопки hint_normal и ico_R_normal2 и создадим новый объект, поменяв ему тип на '''counter''' (счетчик) и названия на '''hint'''. Добавим ресурс из базы ресурсов — анимацию brown_big. Счетчик hint будет считывать купленные подсказки.<br />
<br />
[[Файл:Счетчик.PNG]]<br />
<br />
В hint_normal добавим подобьет, сделаем его машиной и назовем '''hint_m'''.<br />
<br />
Щелкнув правой кнопкой мыши на сцену Button_8_1 создадим новые сцены store и error, которые, соответственно, будут предназначены для совершения покупок — начисления подсказок и окна с ошибкой при невозможности купить подсказку.<br />
<br />
В сцену store добавим две машины: '''buy''' и '''store'''; в error - машину '''error'''.<br />
<br />
[[Файл:8 1 1 .PNG]]<br />
<br />
Для машины buy зададим состояния, при котором значении параметра hint=1, то есть она начисляет подсказку:<br />
<br />
[[Файл:Buy.PNG]]<br />
<br />
Соответственно в машине store зададим считывания со счетчика и прозрачность экрана:<br />
<br />
[[Файл:Store.PNG]]<br />
<br />
Машина error будет отвечать за вывод ошибки при неудачной покупке, то есть задает прозрачность экрана с ошибкой<br />
<br />
[[Файл:Error.PNG]]<br />
<br />
Вернемся к машине hint_m сцены Button_8_1 и пропишем для нее состояния. Машина отвечает за начисление подсказки при удачной покупке<br />
<br />
[[Файл:Hint m.PNG]]<br />
<br />
<br />
'''Совершение покупки'''<br />
<br />
Для того что бы покупку можно было совершить необходимо задать в глобальных свойствах возможность совершения покупки. Для этого на сцене в глобальном экране opt добавим новый элемент, которому изменим тип на store. В свойствах объекта store кликнем правой кнопкой мыши на свойстве wallet, вставляем новое свойство — '''in-app покупка'''. Добавляем поля для покупки: внутренний id, и выбираем расходуемая.<br />
<br />
[[Файл:Store2.PNG]]<br />
<br />
<br />
'''Описание объекта Store'''<br />
<br />
Объект '''Store''' необходим для описания InApp покупок (позволяют продавать отдельные бонусы, паки и т.п.) в игре.<br />
<br />
Основные параметры объекта Store<br />
<br />
''id покупки'' – внутренний id покупки.<br />
<br />
''Расходуемая'' – 1 – покупка расходуемая, 0 – покупка раз и навсегда, если параметр не указан, по-умолчанию покупка – одноразовая.<br />
<br />
''объект (restore)'' – объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.<br />
состояние (restore) – это состояние будет установлено объекту при успешном восстановлении этой покупки.<br />
<br />
'''Для того, чтобы объект Store работал во Вьювере, нужно подкорректировать файл app.icf'''<br />
<br />
1. Найти файл app.icf в папке с вашим проектом.<br />
<br />
2. Открыть его и найти тег [Game].<br />
<br />
3. В теге Game добавить строку purchaseEverything=1.<br />
<br />
4. Сохранить файл<br />
<br />
<pre><br />
<br />
[Game]<br />
purchaseEverything=1<br />
DispFixRot="Landscape"<br />
# comments and whitespace stripped by deployment tool<br />
debug="Absolutist-2253"<br />
show_build_date=1<br />
AppTitle="Viewer"<br />
DebuggerIP="127.0.0.1"<br />
DebuggerPort=5322<br />
<br />
</pre><br />
<br />
<br />
<br />
'''Оформление'''<br />
<br />
Теперь перейдем к оформлению. Для того что бы на экране появлялось окно с предложением о покупке подсказке необходимо его создать. В начальный момент оно должно быть невидимым и прокликиваем, это состояние задано в машине store. Создадим в ней 5 подобъектов.<br />
<br />
<br />
1.1. Первые два переименуем в '''black''' и '''rec''', изменим им тип на '''[[Rectangle|Rectangle]]'''.<br />
<br />
Откроем объект black, пропишем ему свойствах, оставив его пустым рамку, и цвет фона<br />
<br />
[[Файл:Black.PNG]]<br />
<br />
Для объекта rec зададим рамку и текстуру заливки. Для этого из базы ресурсов мышкой перетащим соответствующие элементы. Ресурсы для графики находятся в предыдущем уроке.<br />
<br />
[[Файл:Rec.PNG]]<br />
<br />
<br />
1.2. Третьему элементу поменяем тип на text с текстом<br />
<br />
[[Файл:Text.PNG]]<br />
<br />
<br />
1.3. Четвертый и пятый объекты сделаем кнопками, и назовем их '''ok''' – купить подсказку, '''no''' – отказаться от покупки. <br />
<br />
Для кнопки ok из базы ресурсов выберем внешний вид<br />
<br />
[[Файл:Ok1.PNG]]<br />
<br />
и зададим переход на совершение или провал покупки. Для этого кликнем правой кнопкой мыши на свойстве позиционирование и добавим свойство совершить in-app покупку, заполним для нее поля как указано на картинки<br />
<br />
[[Файл:Ok2.PNG]]<br />
<br />
Аналогично поступим с кнопкой no. Добавим графический ресурс и свойство «изменить состояние объекта», которое будет закрывать окно с предложением о покупке<br />
<br />
[[Файл:No1.PNG]] [[Файл:No2.PNG]]<br />
<br />
<br />
2. Таким же само сделаем со сценой error. В ней создадим четыре объекта: два rectangle: '''rec_error''' – пустой, '''black_error''' — оформленный в такую же рамку; кнопку '''buy''', которая будет делать активным состояние error; текстовый объект '''text_error''' с текстом «error!»<br />
<br />
[[Файл:Buy1.PNG]]<br />
<br />
Разместим все объекты так, что бы картинка хорошо смотрелась. Сохраним все изменения и запустим вьювер. <br />
<br />
[[Файл:Снимок1.PNG]] <br />
<br />
Сейчас при покупке подсказки количество покупок не имеет лимита, по этому вывод ошибки мы не получим. Этот параметр в реальной игре будет реализован с помощью объекта store, заданием ему соответствующих свойств.<br />
<br />
== Patchwork ==<br />
<br />
=== Создание экрана и сцены в игровом проекте ===<br />
<br />
1. Запустить SceneEditor.<br />
<br />
2. В меню Проект → Загрузить → Learning.seproj. <br />
<br />
3. Кликнув правой кнопкой мыши по ранее созданному экрану Lesson_08.1, создать экран Lesson_08.2.<br />
<br />
[[Файл:Lesson8_1.jpg|right]]<br />
<br />
4. В экране Lesson_08.2 создать новую сцену 08, в которую (через ResourcesEditor) добавить графические ресурсы (bg_game, panel_down, btb_replay_normal) из папки Sources\Lesson_08 (см. подготовка к работе «Создание проекта»). В редактор ресурсов добавить графику нашего будущего Patchwork: level_17, level_17_mask.<br />
<br />
=== Настройка объектов ===<br />
<br />
1. Создадим на сцене 08 еще два объекта. Для этого нажмем правой кнопкой мыши по сцене и выберем "Создать объект в текущем элементе".<br />
<br />
[[Файл:Lesson8_2.jpg]]<br />
<br />
2. Переименуем один из созданных объектов в Patchwork, а другой в table.<br />
<br />
[[Файл:Lesson8_3.jpg]]<br />
<br />
[[Файл:Lesson8_4.jpg|right]]<br />
<br />
3. Теперь будем изменять тип объектов на сцене, чтобы получить нужные нам элементы. Графические ресурсы bg_game и panel_down оставляем без изменений. Ресурсу btb_replay_normal изменяем тип на button. Объекту Patchwork меняем тип на patchwork, table изменяем на тип table.<br />
4. Теперь объекты нужно разместить на сцене. Обратим внимание на то, что два последних объекта которые мы добавили без графического ресурса. По умолчанию, создаваемые на сцене объекты имеют размер 100х100 пикселей. Увеличим размер таблицы по высоте до 450 пикселей и перетащим ее влево, поместив над объектом panel_down.<br />
<br />
[[Файл:Lesson8_5.jpg]]<br />
<br />
Кнопку поместим в левый нижний угол. Добиваемся такого расположения объектов, как показанно на рисунке.<br />
<br />
[[Файл:Lesson8_6.jpg]]<br />
<br />
5. Настроим наши объекты. Для кнопки btb_replay_normal в поле "перейти на" укажите текущий экран Lesson_8.2.<br />
<br />
<br />
[[Файл:правка_намба_1.png|200px]]<br />
<br />
<br />
Для таблицы измените следующие параметры<br />
<br />
<br />
[[Файл:правка_намба_2.png|200px]]<br />
<br />
<br />
Для Patchwork устанавливаем следующие настройки. Обратите внимание, что поля "карт.спереди" и "шаблон" заполняются перетаскиванием графического ресурса из редактора ресурсов.<br />
<br />
[[Файл:Lesson8_9.jpg]]<br />
<br />
6. Для корректной работы вашего Patchwork необходимо, чтобы таблица находилась выше Patchwork по дереву объектов.<br />
<br />
[[Файл:Lesson8_10.jpg]]<br />
<br />
<br />
7. Проверьте выполнение задачи с помощью проигрывателя сцен Viewer.<br />
<br />
<br />
=== Упражнения ===<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_08.2, создать новый экран Lesson_08.3<br />
<br />
2. Создать новую сцену с названием game.<br />
<br />
3. Скопировать все объекты из сцены 08 (экрана Lesson_08.2).<br />
<br />
4. Вставить скопированые объекты в новую сцену game (экрана Lesson_08.3).<br />
<br />
5. В новой сцене постарайтесь сами прописать состояния и команды в измененную задачу. Сделайте так, чтобы:<br />
<br />
a) заменить картинку пэчворка и маски на другую, имеющуюся в базе ресурсов;<br />
<br />
b) изменить настройки кнопки рестарта таким образом, чтобы не переходить на экран Lesson_08.3, а сразу передавать пэчворку состояние mix.<br />
----<br />
{| width="100%" <br />
| width="40%"|[[Создание игры «Hidden Object Game»|Урок 7]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Работа с эффектами|Урок 9]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D1%80%D0%B0%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0%D0%BC%D0%B1%D0%B0_2.png&diff=9034Файл:Правка намба 2.png2017-09-19T07:35:30Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D1%80%D0%B0%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0%D0%BC%D0%B1%D0%B0_1.png&diff=9033Файл:Правка намба 1.png2017-09-19T07:35:13Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&diff=9032Создание игры «Hidden Object Game»2017-09-19T07:33:12Z<p>Sred: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.<br />
<br />
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. <br />
<br />
== Создание экрана и сцены в игровом проекте ==<br />
<br />
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]<br />
В экране Lesson_7 создадим новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])<br />
<br />
* Для корректной работы на мобильном устройстве необходимо настроить параметр.<br />
<br />
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья».<br />
<br />
Создадим папку Lesson_7 в базе текстовых описаний с помощью TextEditor. Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи значение [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]], добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип "icon1". Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].<br />
<br />
== Общая настройка объектов ==<br />
<br />
1. Для всех поисковых графических объектов изменить тип с image на [[HiddenObject]].<br />
<br />
[[Файл:Lesson7_hidden_obj.png]]<br />
<br />
2. Создать специальные объекты [[Table]] и [[HiddenList]]. Для этого необходимо перенести графическое изображение table с последующим изменением типа с image на Table. Название объекта изменить на HOT**<br />
<br />
[[Файл:07 5.png]]<br />
<br />
3. Для объекта HiddenList перенести любое графическое изображение с последующим изменением типа с image на HiddenList и удалением графического ресурса из поля настроек (res)*. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HOL**<br />
<br />
[[Файл:Lesson7_HiddenList.png]]<br />
<br />
<br />
'''**''' Имена для специальных объектов могут использоваться любые.<br />
<br />
== Детальная настройка объектов ==<br />
<br />
'''1. Описание HiddenObject.'''<br />
<br />
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:07 7.png|right]]<br />
<br />
Необходимо выбрать используемый объект с именем HOL (тип HiddenObjectList) в поле list.<br />
<br />
<br />
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;<br />
<br />
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);<br />
<br />
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;<br />
<br />
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);<br />
<br />
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.<br />
<br />
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList.<br />
<br />
<br />
<br />
<br />
'''2. Описание HiddenObjectList.'''<br />
<br />
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:07 8.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле "объектов"). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле "количество".<br />
<br />
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они "перебивали" общие значения для всех.<br />
<br />
<br />
Подготовка спрятанных объектов: <br />
<br />
''num'' (поле "объектов") – максимальное количество объектов, участвующие в поиске. (int)<br />
<br />
''hide'' (поле "прятать") – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) <br />
<br />
Визуальные параметры списка: <br />
<br />
''table'' (поле "таблица") – идентификатор объекта Table. (objid)<br />
<br />
''kind'' (внешний вид - поле "тип списка") – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)<br />
<br />
''cross'' (внешний вид - поле "вычеркнуть") – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе "зачеркивается".(int).<br />
<br />
<br />
<br />
3. Описание Table<br />
<br />
<br />
[[Файл:Table lesson7.png]]<br />
<br />
хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица” , что бы настроить внешний вид , вспомогательную область для поиска предметов.<br />
<br />
6. Параметры, общие для всех спрятанных объектов:<br />
<br />
''die'' – тип исчезания при удачном клике на объект (если нет актера) (int): <br />
<br />
0: просто исчезает;<br />
<br />
1: летит к пункту с описанием в списке HiddenList;<br />
<br />
2: улетает в случайном направлении;<br />
<br />
3: улетает к заданным координатам (fx, fy).<br />
<br />
vm - скорость движения при полете к списку предметов после клика в px/sec (float) <br />
<br />
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) <br />
<br />
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) <br />
<br />
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. <br />
<br />
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) <br />
<br />
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)<br />
<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -> id игры; для теста заполним его любой строкой).<br />
</blockquote><br />
<br />
== Упражнения ==<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.<br />
<br />
2. Создать новую сцену (с названием stg_7_1).<br />
<br />
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7).<br />
<br />
4. Вставить скопированые объекты в новую сцену stg_7_1.<br />
<br />
[[Файл:07 11.png]]<br />
<br />
5. В новой сцене:<br />
<br />
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;<br />
<br />
b) разместить на местах предназначенных для их «Прятанья»;<br />
<br />
c) добавить текстовое описание в TextEditor;<br />
<br />
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.<br />
<br />
6. Модифицировать экран Lesson_7 в полноценный уровень с выводом количества очков, игрой на время и графикой.<br />
<br />
== Упражнение № 6 ==<br />
Экран lesson_7 необходимо модифицировать в полноценный уровень.<br />
<br />
Для этого первый экран дополняем 2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), машиной-комбо3 ([[machine]]) и прогрессом ([[progress]]). Второй экран с выводом очков составим позже.<br />
<br />
[[Файл:1.png]] <br />
<br />
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «progr» ([[progress]]) отображает уровень прохождения игры.<br />
<br />
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор, машину-комбо3 и прогресс в хиденлисте «HL_01» ([[hiddenList]]).<br />
<br />
== СЧЕТЧИК ==<br />
<br />
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. <br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её - это просто).<br />
</blockquote><br />
<br />
[[Файл:Coun (5).png]] [[Файл:Coun (6).png]] [[Файл:Coun (7).png]] [[Файл:Coun (8).png]] [[Файл:Coun (9).png]] [[Файл:Coun_(10).png]] [[Файл:Coun (11).png]] [[Файл:Coun (1).png]] [[Файл:Coun (2).png]] [[Файл:Coun (3).png]] [[Файл:Coun (4).png]]<br />
<br />
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель перетаскиваем в отдельную графу без анимации. Настройки для счетчика:<br />
<br />
[[Файл:243.png]] [[Файл:33.png]]<br />
<br />
== ТАЙМЕР ==<br />
<br />
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (18000 = 18 сек.). <br />
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие. Настройки для таймера:<br />
<br />
[[Файл:444.png]]<br />
<br />
Также стоит обновить настройки , в HiddenObjectList , т.к. если мы его не укажем отсчет времени просто не начнется , и так же нужно помнить чтобы время таймера и время указанное в HiddenObjectList должны совпадать , иначе отсчет будет идти от меньшего времени вне зависимости указано оно в HOL или в таймере<br />
[[Файл:HOL_time.png]]<br />
<br />
<br />
== ПРОГРЕСС ==<br />
<br />
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходить уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую. <br />
Настройки для прогресса : <br />
<br />
[[Файл:555.png]]<br />
<br />
Графика для Progress: [[Файл:666.png]]<br />
<br />
Настройки для машины-Combo3c :<br />
<br />
[[Файл:777.png]]<br />
<br />
Во всех HiddenObject изменить параметры и свойства объекта combo3c [[Файл:1818.png]]<br />
<br />
Настройки для машины-блокатора «ban_H» (machine) :<br />
<br />
[[Файл:9.png]]<br />
<br />
Настройки для hiddenList:<br />
<br />
[[Файл:1010.png]] [[Файл:1011.png]]<br />
<br />
Группа - звезды combo num =1 Количество быстро найденных объектов, нужное для получения звезды Combo combo time = 3000 Интервал между кликами, считающимися быстрыми для Combo accuracy = 0,85 Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные) лимит ложных кликов =5 Лимит ложных кликов. Формула расчета количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
Для HiddenList и Counter пункт "сохранить в профиль" должен совпадать. Если в HiddenList указано "глобально", то и в Counter также необходимо установить "глобально".<br />
<br />
<br />
Создаем вторую сцену на которой формируем окно вывода результатов из ректангла (Rectangle), текстовых объектов и счетчиков, окно<br />
должно открываться по окончанию игры, при выигрыше показывать набранные очки и надпись об удаче,при проигрыше нулевые очки и надпись о неудаче.<br />
<br />
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]] <br />
<br />
Графика для Rectangle black : [[Файл:0101.png]]<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Графика для Rectangle black используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. <br />
</blockquote><br />
<br />
[[Файл:1012.png]] [[Файл:0102.png]] <br />
<br />
<br />
Далее копируем Rectangle black и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!).<br />
<br />
<br />
В свойствах счетчиков необходимо прописать уровень!<br />
<br />
1) счетчик 7_4_1 — игровые очки;<br />
<br />
уровень: last_game.score30_total<br />
<br />
2) счетчик 7_4_2 — бонус за время;<br />
<br />
уровень: last_game.score30_time<br />
<br />
3) счетчик 7_4_3 — бонус за аккуратность;<br />
<br />
уровень: last_game.score30_accuracy<br />
<br />
4) счетчик 7_4_4 — бонус за комбо;<br />
<br />
уровень: last_game.ecmbRowMax<br />
<br />
5) счетчик 7_4_5 — очки за уровень;<br />
<br />
уровень: last_game.score30_level<br />
<br />
Важный аспект:После того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.<br />
<br />
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).<br />
<br />
<br />
Настройки для машины — star1 <br />
(проверка в опциях параметра last_game.last_star_accuracy0, <br />
last_game.last_star_time0, )<br />
<br />
[[Файл:0303.png]]<br />
<br />
Настройки для машины — star2 <br />
(если параметр accuracy=0)<br />
<br />
[[Файл:0304.png]]<br />
<br />
Настройки для машины — star3 <br />
(если игра пройдена за указанное время)<br />
<br />
[[Файл:0305.png]]<br />
<br />
Настройки для машины — win<br />
<br />
[[Файл:0306.png]]<br />
<br />
<br />
Машина win считывает «read» показания счетчика и запускает star1 если игра пройдена.<br />
<br />
Также создаем кнопку close (button), которая должна закрывать окно результатов. Добавляем "изменить состояние объекта"; объект win, состояние close. <br />
<br />
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
----<br />
<br />
{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B_%C2%ABHidden_Object_Game%C2%BB&diff=9031Создание игры «Hidden Object Game»2017-09-19T07:32:30Z<p>Sred: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' Изучить настройки объектов [[HiddenList]], [[HiddenObject]] и [[Table]] для типа механики Hidden Object Game на базе создания уровня из игры Travel.<br />
<br />
'''Задача:''' Создать уровень игры содержащей 10 поисковых объектов расположенных на одном бэкграунде (фоне). При инициализации сцены обеспечить размещение 5 объектов для поиска. <br />
<br />
== Создание экрана и сцены в игровом проекте ==<br />
<br />
Откроем проект lessons. Создадим экран Lesson_7. [[Файл:Lesson7_textbase.png|right]]<br />
В экране Lesson_7 создадим новую сцену* stg_7 с разрешением 960*640 (по умолчанию), в которую (через ResourcesEditor) добавим графические ресурсы из папки Lesson_7. (см. подготовка к работе [[Создание проекта]])<br />
<br />
* Для корректной работы на мобильном устройстве необходимо настроить параметр.<br />
<br />
* Графические объекты должны разместиться точно на местах предназначенных для их «Прятанья».<br />
<br />
Создадим папку Lesson_7 в базе текстовых описаний с помощью TextEditor. Добавим в неё 10 текстовых записей, соответствующих именам поисковых объектов. Заполним для каждой текстовой записи значение [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Word]], [[Интерфейс TextEditor#Создание и заполнение текстовой базы проекта | Sentence-En]], добавим графическое отображение поискового объекта. Сделать это можно вручную, перетащив картинку соответствующего объекта из редактора ресурсов и, по нажатию на картинке правой кнопкой мыши, выберем тип "icon1". Или же более быстрым [[Интерфейс TextEditor#Добавление иконок в текстовый элемент | способом]].<br />
<br />
== Общая настройка объектов ==<br />
<br />
1. Для всех поисковых графических объектов изменить тип с image на [[HiddenObject]].<br />
<br />
[[Файл:Lesson7_hidden_obj.png]]<br />
<br />
2. Создать специальные объекты [[Table]] и [[HiddenList]]. Для этого необходимо перенести графическое изображение table с последующим изменением типа с image на Table. Название объекта изменить на HOT**<br />
<br />
[[Файл:07 5.png]]<br />
<br />
3. Для объекта HiddenList перенести любое графическое изображение с последующим изменением типа с image на HiddenList и удалением графического ресурса из поля настроек (res)*. Для данного типа объекта не требуется графический ресурс. Название объекта изменить на HOL**<br />
<br />
[[Файл:Lesson7_HiddenList.png]]<br />
<br />
<br />
'''**''' Имена для специальных объектов могут использоваться любые.<br />
<br />
== Детальная настройка объектов ==<br />
<br />
'''1. Описание HiddenObject.'''<br />
<br />
''HiddenObject'' - это поисковый объект, взаимодействующий со списком HiddenList. Каждому поисковому объекту необходимо указать графический ресурс (картинку), идентификатор объекта HiddenList и идентификатор текстового ресурса (строки описания) в HiddenList.[[Файл:07 7.png|right]]<br />
<br />
Необходимо выбрать используемый объект с именем HOL (тип HiddenObjectList) в поле list.<br />
<br />
<br />
''текстID'' – название хидден-объекта, которое будет отображаться в списке. Перетаскивается мышкой из текстового редактора;<br />
<br />
''текст'' – обычный текст (будет отображаться в таблице при отсутствии ТекстID, для быстрых экспериментов);<br />
<br />
''list'' – ссылка на HiddenList, к которому будет подключен объект, для обеспечения связи между ними;<br />
<br />
''flyer'' – объект типа flyer, который запустится в работу при нахождении поискового объекта. Неудачный клик обрабатывает HiddenList. Если параметр не задан, используется fly_ok объекта HiddenList.(objid);<br />
<br />
''actor'' – объект, который отображает анимацию спрятанного объекта после удачного клика на него (обычно это машина состояния). Парметр необязателен. Актёры нужны тогда, когда отличается графика объекта, который непосредственно находится на сцене и который летит к таблице. Это может быть случай, когда на сцене лежит часть объекта, а летит целый. Или же на сцене - с тенью, а летит - без.<br />
<br />
''тип'' – номер типа объекта, используется для логического разделения объектов при обработке HiddenList.<br />
<br />
<br />
<br />
<br />
'''2. Описание HiddenObjectList.'''<br />
<br />
HiddenList - это список поисковых объектов (Hidden), которые надо найти в хидден-сцене. [[Файл:07 8.png|right]] Каждый поисковый объект на сцене связывают со списком. Объектов может быть больше, чем будет показано в данной игровой сессии (поле "объектов"). В этом случае они выбираются случайным образом. Запоминаются те из них, по которым произошёл клик (увеличивается счетчик их кликов). При следующем заходе на сцену, поисковые слова сортируются по возрастанию числа кликов и снова активизируется количество спрятанных объектов, указанных в поле "количество".<br />
<br />
HiddenList определяет основные параметры для настройки HiddenObject (скорость полета и т.п.). В дальнейшем, при необходимости, эти же параметры можно добавить в HiddenObject, чтобы для данного объекта они "перебивали" общие значения для всех.<br />
<br />
<br />
Подготовка спрятанных объектов: <br />
<br />
''num'' (поле "объектов") – максимальное количество объектов, участвующие в поиске. (int)<br />
<br />
''hide'' (поле "прятать") – если 1, то делать невидимыми объекты, не участвующие в поиске. (int) <br />
<br />
Визуальные параметры списка: <br />
<br />
''table'' (поле "таблица") – идентификатор объекта Table. (objid)<br />
<br />
''kind'' (внешний вид - поле "тип списка") – тип отображения объекта в списке (0-слово,1-ассоциация, 2-иконка, 3-иконка). (int)<br />
<br />
''cross'' (внешний вид - поле "вычеркнуть") – зачеркивать найденный элемент списка. Eсли 0 (по умолчанию), то найденный элемент удаляется, иначе "зачеркивается".(int).<br />
<br />
<br />
<br />
3. Описание Table<br />
<br />
<br />
[[Файл:07 9.png]]<br />
<br />
[[Файл:Table lesson7.png]]<br />
<br />
хотелось бы напомнить , что вы можете “поиграться” с вкладкой “таблица” , что бы настроить внешний вид , вспомогательную область для поиска предметов.<br />
<br />
6. Параметры, общие для всех спрятанных объектов:<br />
<br />
''die'' – тип исчезания при удачном клике на объект (если нет актера) (int): <br />
<br />
0: просто исчезает;<br />
<br />
1: летит к пункту с описанием в списке HiddenList;<br />
<br />
2: улетает в случайном направлении;<br />
<br />
3: улетает к заданным координатам (fx, fy).<br />
<br />
vm - скорость движения при полете к списку предметов после клика в px/sec (float) <br />
<br />
vr - скорость вращения при полете к списку предметов после клик в град/sec (float) <br />
<br />
fw - финальная ширина к которой надо уменьшится при подлете к финальной точке (int) <br />
<br />
fh - финальная высота к которой надо уменьшится при подлете к финальной точке (int). Объект не должен изменять своих пропорций, поэтому fw или fh (или оба) всегда отрицательны. <br />
<br />
fx - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int) <br />
<br />
fy - финальная координата x, к которой объект должен перелететь, при удачном клике (см. тип исчезания). (int)<br />
<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' HiddenList не будет работать без объекта [[Редактор текстовых ресурсов#Упражнения|Options]], который вы должны были создать в предыдущем уроке, а так же без параметра ''id игры'' (Очковая система -> id игры; для теста заполним его любой строкой).<br />
</blockquote><br />
<br />
== Упражнения ==<br />
<br />
1. Щелкнув правой кнопкой мыши по экрану Lesson_7, создать новый экран Lesson_7_1.<br />
<br />
2. Создать новую сцену (с названием stg_7_1).<br />
<br />
3. Скопировать все объекты из сцены stg_7 (экрана Lesson_7).<br />
<br />
4. Вставить скопированые объекты в новую сцену stg_7_1.<br />
<br />
[[Файл:07 11.png]]<br />
<br />
5. В новой сцене:<br />
<br />
a) добавить еще 3 графических ресурса и перевести в тип HiddenObject;<br />
<br />
b) разместить на местах предназначенных для их «Прятанья»;<br />
<br />
c) добавить текстовое описание в TextEditor;<br />
<br />
e) установить время игры 20 секунд, паузу 2 секунды с переходом на экран Lesson_7_1.<br />
<br />
6. Модифицировать экран Lesson_7 в полноценный уровень с выводом количества очков, игрой на время и графикой.<br />
<br />
== Упражнение № 6 ==<br />
Экран lesson_7 необходимо модифицировать в полноценный уровень.<br />
<br />
Для этого первый экран дополняем 2 счетчиками ([[counter]]), таймером ([[timer]]), машиной-блокатором ([[machine]]), машиной-комбо3 ([[machine]]) и прогрессом ([[progress]]). Второй экран с выводом очков составим позже.<br />
<br />
[[Файл:1.png]] <br />
<br />
Счетчик «amt» ([[counter]]) показывает сколько объектов найдено. Счетчик «score_H» ([[counter]]) насчитывает баллы за собранные объекты. Таймер ([[timer]]) запускается при старте игры и отсчитывает заданное время на игру, машина-блокатор «ban_H» блокирует сцену при серии ошибочных кликов. Прогресс «progr» ([[progress]]) отображает уровень прохождения игры.<br />
<br />
Чтобы всё заработало необходимо указать счетчики, таймер, машину-блокатор, машину-комбо3 и прогресс в хиденлисте «HL_01» ([[hiddenList]]).<br />
<br />
== СЧЕТЧИК ==<br />
<br />
В редакторе ресурсов выбираем анимацию и добавляем графику для счетчика. <br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Если в редакторе ресурсов нету анимации, то [[Интерфейс_ResourceEditor#Анимация|создайте]] её - это просто).<br />
</blockquote><br />
<br />
[[Файл:Coun (5).png]] [[Файл:Coun (6).png]] [[Файл:Coun (7).png]] [[Файл:Coun (8).png]] [[Файл:Coun (9).png]] [[Файл:Coun_(10).png]] [[Файл:Coun (11).png]] [[Файл:Coun (1).png]] [[Файл:Coun (2).png]] [[Файл:Coun (3).png]] [[Файл:Coun (4).png]]<br />
<br />
Создаем объект сцены с типом «[[counter]]», в поле res перетаскиваем анимацию с цифрами от 0 до 9, разделитель перетаскиваем в отдельную графу без анимации. Настройки для счетчика:<br />
<br />
[[Файл:243.png]] [[Файл:33.png]]<br />
<br />
== ТАЙМЕР ==<br />
<br />
В свойствах таймера «[[timer]]» необходимо указать «значение» с которого начнется отсчет времени (18000 = 18 сек.). <br />
В свойство «графика» из графического редактора перетаскиваем анимацию которую делали для счетчика и двоеточие. Настройки для таймера:<br />
<br />
[[Файл:444.png]]<br />
<br />
Также стоит обновить настройки , в HiddenObjectList , т.к. если мы его не укажем отсчет времени просто не начнется , и так же нужно помнить чтобы время таймера и время указанное в HiddenObjectList должны совпадать , иначе отсчет будет идти от меньшего времени вне зависимости указано оно в HOL или в таймере<br />
[[Файл:HOL_time.png]]<br />
<br />
<br />
== ПРОГРЕСС ==<br />
<br />
[[Progress]] используют для отображения каких либо ачивментов, например когда игрок проходить уровень он может получить 1,2,3 звезды или бронзовую, серебряную, золотую. <br />
Настройки для прогресса : <br />
<br />
[[Файл:555.png]]<br />
<br />
Графика для Progress: [[Файл:666.png]]<br />
<br />
Настройки для машины-Combo3c :<br />
<br />
[[Файл:777.png]]<br />
<br />
Во всех HiddenObject изменить параметры и свойства объекта combo3c [[Файл:1818.png]]<br />
<br />
Настройки для машины-блокатора «ban_H» (machine) :<br />
<br />
[[Файл:9.png]]<br />
<br />
Настройки для hiddenList:<br />
<br />
[[Файл:1010.png]] [[Файл:1011.png]]<br />
<br />
Группа - звезды combo num =1 Количество быстро найденных объектов, нужное для получения звезды Combo combo time = 3000 Интервал между кликами, считающимися быстрыми для Combo accuracy = 0,85 Точность кликов для получения звезды Accuracy (1 = 100%, все клики должны быть только удачные) лимит ложных кликов =5 Лимит ложных кликов. Формула расчета количество верных кликов делим на общее количество получаем коэффициент если он равен или больше указного нами то в опции пишем параметр, если нет то не пишем.<br />
<br />
<br />
Для HiddenList и Counter пункт "сохранить в профиль" должен совпадать. Если в HiddenList указано "глобально", то и в Counter также необходимо установить "глобально".<br />
<br />
<br />
Создаем вторую сцену на которой формируем окно вывода результатов из ректангла (Rectangle), текстовых объектов и счетчиков, окно<br />
должно открываться по окончанию игры, при выигрыше показывать набранные очки и надпись об удаче,при проигрыше нулевые очки и надпись о неудаче.<br />
<br />
Графика для Rectangle rec: [[Файл:0001.png]] [[Файл:0002.png]] [[Файл:0003.png]] [[Файл:0004.png]] [[Файл:0005.png]] [[Файл:0006.png]] [[Файл:0007.png]] [[Файл:0008.png]] [[Файл:0009.png]] [[Файл:00010.png]] <br />
<br />
Графика для Rectangle black : [[Файл:0101.png]]<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Графика для Rectangle black используется в качестве фона, на котором будет размещаться всплывающие окно с показаниями результата пройденной игры. <br />
</blockquote><br />
<br />
[[Файл:1012.png]] [[Файл:0102.png]] <br />
<br />
<br />
Далее копируем Rectangle black и делаем подобъектом блокатора ban_H, а также меняем размеры rectangle black (устанавливаем не нулевые!).<br />
<br />
<br />
В свойствах счетчиков необходимо прописать уровень!<br />
<br />
1) счетчик 7_4_1 — игровые очки;<br />
<br />
уровень: last_game.score30_total<br />
<br />
2) счетчик 7_4_2 — бонус за время;<br />
<br />
уровень: last_game.score30_time<br />
<br />
3) счетчик 7_4_3 — бонус за аккуратность;<br />
<br />
уровень: last_game.score30_accuracy<br />
<br />
4) счетчик 7_4_4 — бонус за комбо;<br />
<br />
уровень: last_game.ecmbRowMax<br />
<br />
5) счетчик 7_4_5 — очки за уровень;<br />
<br />
уровень: last_game.score30_level<br />
<br />
Важный аспект:После того как вы добавили last.game.xxx в графу уровень в каждом счетчике , графа игра должна остаться пустой и так же не стоит эти счетчики закидывать в HOL , т.к. одни и те же данные могут конфликтовать между собой. Также обязательным условием является включение графы “очки 3.0” в HOL`e.<br />
<br />
После создания счетчиков и установки уровней добавляем 5 текстовых объектов, которые описывают значения, выводящиеся счетчиками в конце игры в окне результатов (игровые очки, бонус за время и т.д.).<br />
<br />
<br />
Настройки для машины — star1 <br />
(проверка в опциях параметра last_game.last_star_accuracy0, <br />
last_game.last_star_time0, )<br />
<br />
[[Файл:0303.png]]<br />
<br />
Настройки для машины — star2 <br />
(если параметр accuracy=0)<br />
<br />
[[Файл:0304.png]]<br />
<br />
Настройки для машины — star3 <br />
(если игра пройдена за указанное время)<br />
<br />
[[Файл:0305.png]]<br />
<br />
Настройки для машины — win<br />
<br />
[[Файл:0306.png]]<br />
<br />
<br />
Машина win считывает «read» показания счетчика и запускает star1 если игра пройдена.<br />
<br />
Также создаем кнопку close (button), которая должна закрывать окно результатов. Добавляем "изменить состояние объекта"; объект win, состояние close. <br />
<br />
Включаем вьювер и наблюдаем как автоматически включается таймер, за каждый собранный предмет вам начисляются очки, прогресс показывает прохождение игры, в конце игры появляется окно с выводом результатов набранных очков с звездами.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
----<br />
<br />
{| width="100%" <br />
| width="40%"|[[Редактор текстовых ресурсов|Урок 6]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Настройка миниигр|Урок 8]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Table_lesson7.png&diff=9030Файл:Table lesson7.png2017-09-19T07:27:43Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:HOL_time.png&diff=9029Файл:HOL time.png2017-09-19T07:26:41Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://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&diff=9028Редактор текстовых ресурсов2017-09-19T07:18:16Z<p>Sred: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Движение машин: жучки, ключи и многое другое|Урок 5]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Создание игры «Hidden Object Game»|Урок 7]]<br />
|}<br />
----<br />
{{TOC right}}<br />
----<br />
'''Цель:''' научится пользоваться редактором текстовых ресурсов на примере использования объекта типа "text"<br />
<br />
'''Задачи:''' <br />
* Cоздать новый экран и сцену для этого урока.<br />
* Вывести на экран последовательно два текста с помощью двух текстовых объектов.<br />
* Вывести на экран эти же тексты, но с помощью только одного текстового объекта.<br />
<br />
== Объект Text ==<br />
<br />
=== Подготовка ===<br />
<br />
Начнём урок, как обычно, с открытия проекта lessons. В нём добавим новый экран lesson_6<br />
со сценой stg_main, так как это было описано в предыдущем [[Создание экранов, сцен. Работа с кнопками|уроке]]. Поместим из редактора ресурсов на сцену любой фон из папки этого или предыдущего урока. Для примера далее используется "лунный пейзаж" (картинка '''bg''').<br />
<br />
[[Файл:Lesson6_1.jpg|right]]<br />
Поверх фона поместите на сцену картинку ввиде стрелки вправо. Назовите ее '''button_next'''. Выберите для нее тип '''machine'''. Кликая на сцене правой кнопкой мыши, выберете пункт из выпадающего меню "Создать объект в текущем элементе". Новый объект переименуйте в Text и выберите для него тип '''[[Text|Text]]'''.<br />
<br />
<br />
=== Меняем текст машиной ===<br />
<br />
Для того, чтобы было что менять, скопируем объект Text и вставим его в этой же сцене. Переименуем его в text2. Так как эти два объекта без графического ресурса, то на сцене мы можем их видеть как пустые рамки (зеленая рамка, если объет выделен, и красная - если не выделен).<br />
[[Файл:Lesson6_2.jpg]]<br />
<br />
<br />
[[Файл:Text_prop.png|right]]<br />
Посмотрим на свойства объекта Text. В поле "текст" впишем "Первая часть текста". В поле "шрифт" в строке "цвет 1" выберем белый цвет. В свойствах объекта text2 в поле текст впишем "Вторая часть текста". Цвет шрифта поставим такой же. Таким образом, мы получили две текстовых надписей на сцене, которые располагаются одна поверх другой. Если мы сейчас сохраним проект и запустим, то обе надписи будут видны одновременно, что затруднит их читаемость. Для того, чтобы мы могли без проблем их прочитать, сделаем переключение текстов по нажатию на кнопку. На самом деле, '''button_next''' только выглядит как кнопка - это машина состояний. Пропишем для нее логику таким образом, чтобы при нажатии на машину, она по-очереди делала видимым то один текст, то другой. Создайте для этой машины следующие состояния.<br />
<br />
[[Файл:Lesson6_4.jpg]]<br />
<br />
За видимость объектов отвечает параметр '''vis'''. Если vis=0, то объект не видно, если 1 - видно. По клику осуществляется переход между состояниями. Сохраните проект и запустите этот экран. Вы видите, что по клику на кнопку текст изменяется.<br />
[[Файл:Lesson6_5.jpg]]<br />
<br />
Переключать текстовые объекты можно еще несколькими способами:<br />
<br />
- менять параметр '''al''' (alpha); это позволит делать текст полупрозрачным (в отличии от '''vis''', параметр '''al''' может принимать промежуточные значения между 0 и 1);<br />
<br />
- менять текстовому объекту состояние; как известно, у объекта [[Text#Состояния | text]] есть 3 состояния '''first''', '''next''', '''end''', чтобы текст стал видимым, достаточно передать ему состояние '''first''', чтобы текст исчез, достаточно передать ему состояние '''end'''.<br />
<br />
== Создаем текстовую базу ==<br />
<br />
В предыдущем примере мы научились вставлять текстовые объекты на сцену и менять их видимость. Все это мы сделали не имея текстовой базы. Текстовая база предназначена для хранения всей текстовой информации вашего проекта, с возможностью мультиязычной поддержки. Она значительно облегчает управление текстом в проекте.<br />
<br />
Для вызова текстового редактора можно воспользоваться меню '''Tools -> [[Интерфейс TextEditor|Text Editor]]''', либо кнопкой быстрого запуска [[Файл:Text_base.png]].<br />
Сначала текстовая база будет отсутствовать, поэтому ее нужно создать. Заходите в пункт меню '''file -> New'''. Появляется пустая база ресурсов, по умолчанию названная '''Untitled'''. Ее можно переименовать как вам удобней. Аналогично как в редакторе ресурсов слева вы видите дерево текстовых объектов. Нажимаем правой кнопкой по названию базы Untitled и выбираем ''add folder'''. Таким образом мы создали новую папку. Назовем ее lesson_6. Нажимая по папке правой кнопкой выбираем '''Add record'''. Каждый раз при добавлении новой текстовой записи редактор просит нас написать ее имя. Это имя можно будет изменить в любой момент. Запишем имя first_part. Создавать папки и записи можно также с помощью кнопок быстрого доступа на панели. Выделим папку lesson_6 и нажмем на значок "Add record". Запишем имя новой текстовой записи second_part.<br />
[[Файл:Именитый.png|600px]]<br />
<br />
Пока эти текстовые записи пустые. Для того чтобы заполнить их, выделим первую запись. Справа мы видим столбцы '''word''', '''sentence1''', '''sentence2''' и '''voice'''. В данном уроке нам понадобится только первый столбец '''word'''. Об остальных подробнее узнаете в следующем уроке. В строках записывается текст на разных языках. Запишем текст на русском и его перевод на английский в соответствующие поля. Для first_part - Первая часть текста (The first part of the text), для second_part - Вторая часть текста (The second part of the text). Запись на разных языках позволяет, в зависимости от локализации мобильного устройства, выбирать язык текстовых объектов.<br />
<br />
Для того что бы добавить какой-либо язык в базу данных необходимо выполнить следующие действия:<br />
1) Проходим путь Project/Properties/Select languages…<br />
<br />
[[Файл:Добавление языка (1).png|600px]]<br />
<br />
2) После этого необходимо выбрать языки которые вы хотите добавить<br />
<br />
<br />
[[Файл:Добавление_языка_(2).png|400px]]<br />
<br />
<br />
3) Можете похвалить себя<br />
<br />
Чтобы корректно пользоваться текстовой базой после каждого ее изменения, ее необходимо сохранять. Можно воспользоваться кнопками быстрого доступа и нажать на значок дискеты. При первом сохранении текстовый редактор просит вас выбрать место сохранения и имя файла. Сохраним его в папку с проектом lessons и назовем text_base. Также текстовую базу нужно подвязать к базе ресурсов. Для этого заходим в пункт меню '''Resource -> Choose Resource File'''. Выбираем папку, в которая является базой ресурсов проекта и выбираем файл с расширением '''.sirx''' . Вернемся теперь к редактору сцен. <br />
В пункте меню '''Project -> Project options''' выбираем вкладку '''Text database''' и указываем путь к нашей текстовой базе '''text_base.xml''' .<br />
<br />
<blockquote><br />
[[файл:wrong.png|right|32px]]<br />
'''Внимание!''' Во время роботы в редакторе, когда вы создаете новый проект, автоматически создается и текстовая база. В данном уроке вам лишь нужно внести изменения в уже существующую базу '''File -> Open -> \\....\\text.xml'''.<br />
</blockquote><br />
<br />
Каждый объект текстовой базы имеет свой уникальный '''id'''. Мы можем вызывать текст из текстовой базы меняя текстовому объекту на сцене этот id с помощью кнопки или машины состояний.<br />
<br />
Давайте сделаем это на примере нашего проекта.<br />
Так как теперь мы будем пользоваться только одним текстовым объектом на сцене, то второй text2 можно удалить. В объекте text удалим из пункта текст запись "Первая часть текста". Перепишем также немного состояния нашей машины. В поле '''val_txt''' мы записываем id текста путем перетаскивания его из текстовой базы.<br />
<br />
[[Файл:Lesson6_7.jpg]]<br />
<br />
Теперь в состояниях машины мы присваиваем нашему объекту text только текстовые id из текстовой базы. Сохраняем проект и запускаем. Результат тот же, что и в первом случае. Заметим, что на сцене стало на один объект меньше, а состояния машины сократились на одну строчку. Может это не существенно в таком маленьком проекте, но в больших проектах количество объектов и величина исполняемого файла может стать решающей причиной к упрощению кода.<br />
<br />
== Упражнения ==<br />
<br />
* Добавьте в текстовую базу еще несколько записей.<br />
* Расширьте состояния машины, чтобы последовательно вывести на экран все текстовые записи.<br />
* Поменяйте язык приложения, используя объект '''[[Options|Options]]'''.<br />
До сих пор мы изучали объекты и их свойства для каждого определенного экрана. Рассмотрим возможность изменять параметры всего приложения.<br />
Будем изменять язык приложения. Для этого необходимо ознакомится с объектом Options.<br />
<br />
'''Options''' — объект, который используется для хранения и управления глобальными параметрами приложения. Также Options позволяет хранить и использовать параметры записанные в него другими объектами.<br />
<br />
В проекте lessons создаем новый экран, для которого в свойствах устанавливаем глобальный<br />
<br />
[[Файл:Глобальный.PNG]]<br />
<br />
В экране '''opt''' создадим сцену '''opt'''. Создадим на сцене opt новый объект, переименуем его в '''Options'''. Поменяем ему тип на option (Option → option).<br />
<br />
[[Файл:Опции.PNG]]<br />
<br />
Создадим в проекте новый экран '''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_lf_norm в '''ru''', и сделаем их машинами. Добавляем ниже на сцену новый объект, изменяем ему тип на '''[[Groupset|Groupset]]''' и имя на '''groupset'''. Щелкаем в свойствах по имени правой кнопкой мыши, добавляем в свойства объект, из списка объектов выбираем Text.<br />
<br />
[[Файл:Группа.PNG]]<br />
<br />
'''Описание объекта Groupset'''<br />
<br />
'''Groupset (группа)''' позволяет передавать состояния и параметры множеству объектов, которые являются участниками группы. Участником группы является любой объект, указанный в в объекте Groupset.<br />
<br />
Groupset удобно использовать, когда необходимо обращаться к множеству объектов.<br />
Если объекту Groupset передается состояние (например st_1), то все объекты принадлежащие объекту Groupset должны иметь состояние st_1, иначе возникнет ошибка.<br />
<br />
Объекты принадлежащие одной группе могут быть разного типа и разноименными.<br />
<br />
Команды применимые к группе:<br />
<br />
• ''set'' — группе можно установить состояние st и параметр (значение) par(val);<br />
<br />
• ''drop'' — на группу (объекты принадлежащие группе) можно отпустить объект.<br />
<br />
<br />
Для каждой из добавленных машин запишем состояния.<br />
<br />
Машина en:<br />
<br />
[[Файл:En.PNG]]<br />
<br />
Машина ru<br />
<br />
[[Файл:Ru.PNG]]<br />
<br />
Как видно, в состоянии on, каждой машины, задается lang (язык) в глобальном объекте Options. В состояние r Groupset передается состояние init (инициализация объекта).<br />
<br />
Сохраняем и запускаем вьювер.<br />
<br />
[[Файл:Вьювер.PNG]]<br />
<br />
На экране расположено три кнопки и текст. При нажатие кнопки вперед язык текста меняется — на русский, при нажатие назад — на английский, желтая кнопка вперед меняет сам текст.<br />
----<br />
{| width="100%" <br />
| width="40%"|[[Движение машин: жучки, ключи и многое другое|Урок 5]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Создание игры «Hidden Object Game»|Урок 7]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_(2).png&diff=9027Файл:Добавление языка (2).png2017-09-19T07:13:17Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_(1).png&diff=9026Файл:Добавление языка (1).png2017-09-19T07:13:08Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8B%D0%B9.png&diff=9025Файл:Именитый.png2017-09-19T07:12:57Z<p>Sred: </p>
<hr />
<div></div>Sredhttps://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&diff=9024Движение машин: жучки, ключи и многое другое2017-09-19T07:12:06Z<p>Sred: </p>
<hr />
<div>{| width="100%" <br />
| width="40%"|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Редактор текстовых ресурсов|Урок 6]]<br />
|}<br />
----<br />
{{TOC right}}<br />
<br />
'''Цель:''' изучить процессы движения и способы взаимодействия машин.<br />
<br />
'''Задачи:''' <br />
* реализовать разными методами "ход конем";<br />
* организовать циклическое движение по квадрату;<br />
* разобраться с понятием точки пивота;<br />
* научиться согласовывать поступательное и вращательное движение;<br />
* рассмотреть способ применения одного предмета на другой.<br />
<br />
== Процессы и движение ==<br />
<br />
До сих пор мы ограничивались только одной командой процессов - '''wait''' (ожидание).<br />
В этом уроке мы рассмотрим другие процессы. Существуют следующие команды движения (изменения объекта):<br />
* '''move''' - движение по прямой<br />
* '''rot''' - вращение <br />
* '''scale''' - изменение размера<br />
* '''alpha''' - изменение прозрачности<br />
* '''phys''' - движение в силовом поле.<br />
<br />
В каждой команде достаточно много параметров. Например, можно сдвинуться (move)<br />
по горизонтали на '''dx''' пикселей за время '''t'''. Вместо времени можно указать скорость '''v''' в пикселях в секунду.<br />
Можно двигаться в определенную целевую точку с координатами ('''tx''', '''ty''') и т.д.<br />
<br />
=== Ход конем ===<br />
<br />
[[файл:lady_bug_64.png|right]]<br />
Рассмотрим простой пример в котором объект движется сначала вверх на 100 пикселей, а затем вправо на 200.<br />
В качестве такого объекта будем использовать ladybug (божья коровка или для краткости жучок), <br />
картинку которой можно найти в редакторе ресурсов в папке этого урока.<br />
Как обычно, перетаскиваем её на сцену, переименовываем и превращаем в машину состояний.<br />
Организуем сначала движние нашего жучка при помощи трёх состояний:<br />
<br />
[[файл:lesson_5_bug1.png]] <br />
<br />
Первое, стартовое состояние является запускающим. Если кликнуть на жучка, то он начнет своё движение.<br />
Когда перемещение по вертикали заканчивается (состояние up), жучок переходит в третье состояние (right), в котором движется вправо.<br />
Закончив движение, он возвращается в стартовое состояние и ждет очередного клика.<br />
<br />
Координатная ось Y (вертикальная) на сцене направлена вниз, а ось X (горизонтальная) -- вправо.<br />
Поэтому, чтобы жучок начал двигаться вверх, его смещение должно быть отрицательным.<br />
В нашем случае это dy=-100. Эти 100 пикселей объект должен пройти за одну секунду (t=1000).<br />
В конце выполнения команды move происходит переход в следующее состояние, имя которого задается в поле "'''go'''".<br />
<br />
При движении вправо, происходит смещение на 200 пикселей.<br />
Чтобы скорость движения вверх и вправо была постоянной, необходимо соответственно увеличить<br />
время движения (t=2000).<br />
<br />
Точно такое же движение можно организовать в рамках одного, а не двух состояний.<br />
Поместите на сцену еще одного жучка, дайте ему другое имя и задайте следующую машину состояний:<br />
<br />
[[файл:lesson_5_bug2.png]]<br />
<br />
Команды move в состоянии way выполняются последовательно.<br />
Сначала отрабатывает нулевой move, а затем первый.<br />
<br />
Протестируйте получившийся результат. Оба жучка должны двигаться одинаковым образом.<br />
Не забывайте при тестировании включать отладочную информацию о текущих состояниях.<br />
<br />
=== Последовательно и параллельно ===<br />
<br />
И так, в рамках данного состояния все команды процессов с одинаковым названием выполняются '''последовательно'''.<br />
При этом команды с разными именами выполняются '''параллельно'''.<br />
<br />
[[файл:Def_procesess1.png|right]]<br />
Пусть в состянии есть несколько команд move и несколько команд rot (вращения):<br />
* move0 move1 rot0 move2 rot1 rot2<br />
Независимо от их чередования, они выстраиваются в параллельные списки процессов:<br />
* move0 rot0<br />
* move1 rot1<br />
* move2 rot2<br />
Эти списки начинают одновременно выполняться сверху вниз: <br />
отрабатывают команды move и одновременно с ними комананды rot.<br />
<br />
Заставим нашего жучка при совершении хода конем поворачиваться на 360 градусов.<br />
Для этого поместим третью машину со следующими состояниями:<br />
<br />
[[файл:lesson_5_bug3.png]]<br />
<br />
Запустите проект во вьювере. <br />
Одновременно с выполнением двух команд move будет выполняться одна команда rot.<br />
Время выполнения rot равно суммарному времени двух команд move (t=3000=1000+2000).<br />
В результате, к концу движения, жучок поворачивается на da=360 градусов ('''da''' - изменение угла).<br />
<br />
Переход в следующее состояние '''go''' в данном случае можно было бы поставить не в команду '''rot''',<br />
а в последнюю команду '''move'''. Однако приведенное решение лучше, так как<br />
гарантирует, что переход произойдет только, когда жучок полностью развернется.<br />
Хотя суммарное время move совпадает с временем rot, реальное компьютерное время<br />
выполнения этих команд может немного отличаться. В результате, если выйти из<br />
состояния по окончанию движения, можно получить не до конца развернувшегося жучка.<br />
<br />
=== Циклическое движение ===<br />
<br />
С командами движения, также как и с командой ожидания, можно использовать циклы.<br />
Например, заставим (уже четвертого) жучка при клике два раз оббегать стороны квадрата.<br />
Это можно сделать при помощи следующей машины:<br />
<br />
[[файл:lesson_5_bug4.png]]<br />
<br />
Четыре команды move выполняются одна за одной.<br />
Затем вьювер натыкается на параметр loop=1 и еще раз выполняет<br />
это движение с самого начала. Последняя команда move служит для перехода в стартовое состояние<br />
ожидания клика. <br />
<br />
Заметим, что нельзя было для перехода использовать '''wait'''.<br />
Она, как и остальные команды процессов, запустилась бы параллельно с командами<br />
и сработала бы сразу. В результате ни какого движения не получилось бы!<br />
<br />
Если параметр loop=-1, то движение будет бесконечным. <br />
Этого же можно было добиться, поставив вместо loop=-1 параметр go с переходом в это же состояние (перезапустить состояние). <br />
<br />
=== Управление командами ===<br />
<br />
Кроме команды зацикливания данного процесса, можно из одних команд запускать другие (начинать процессы другого типа). Например, пусть жучок движется вправо в течении 1 секунды и вращается 2 секунды.<br />
Команда move закончится раньше команды rot.<br />
Пусть затем, закончив полный оборот (на уже остановившемся объекте), он начинает снова двигаться вправо. Реализуется это так:<br />
<br />
<br />
[[файл:lesson_5_move_rot.png]]<br />
<br />
Команда '''rot''' зациклена (loop=-1). Кроме этого, она имеет параметр move=0<br />
в котором задается номер команды move которую надо запустить на выполнение после окончания вращения.<br />
<br />
Вызов одних команд процессов из других очень мощный, но одновременно и опасный инструмент. <br />
Множественные вызовы различных команд превращают состояние в спагетти переходов,<br />
логику которого часто сложно понять. Более того, иногда можно получить зависание вьювера<br />
при неудачной перекрестной ссылке двух команд друг на друга.<br />
По этой причине запрещено вызывать из данной команды другие команды этого же типа<br />
(из rot вызывать rot и т.д.). Однако это, к сожалению, не снимает полностью проблему зависания.<br />
Так, что готовьтесь...<br />
<br />
=== Вращение вокруг пивота ===<br />
<br />
При вращении (команда '''rot''') машина вращается вокруг, так называемой,<br />
'''точки пивота''' (''pivot'' - штырь, болт; опорная точка).<br />
В примерах выше эта точка находилась в центре картинки.<br />
Изменим теперь её положение и посмотрим к какому эффекту это приведет.<br />
<br />
Откроем редактор ресурсов и в папке этого урока найдем солнышко. <br />
Сделаем четыре действий:<br />
# Кликнем на имя солнышка (sun_1) в дереве на левой панели<br />
# Под этой панелью поставим галочку в чекбоксе ''Edit''.<br />
# Схватимся мышкой за красный крестик в центре солнышка на правой панели и перетащим этот крестик влево.<br />
# Уберем галочку в чекбоксе ''Save''<br />
800<br />
[[Файл:Vot-tak-vot.png|800px]]<br />
Теперь перетащим солнышко на сцену этого урока (лучше для него создать отдельный экран).<br />
Уменьшим его размеры модификаторами scale x и scale y, поставив там значение 0.5.<br />
Превратим солнышко в такую машину:<br />
<br />
<br />
[[файл:lesson_5_pivot2.png]]<br />
<br />
<br />
Сохранив проект и запустив вьювер, мы увидим, что солнышко начало вращаться <br />
по окружности. Машина по прежнему вращается вокруг точки пивота.<br />
Однако теперь эта точка смещена в центр окружности.<br />
<br />
В качестве упражнения попробуйте организовать вращение, подобное вращению Земли и Луны<br />
(Земля вращается по окружности, а Луна вращается по окружности меньшего радиуса вокруг Земли).<br />
Для этого Вам потребуется "Луну" сделать подобъектом "Земли" и правильно выставить<br />
положение "Луны" относительно "Земли". <br />
<blockquote><br />
[[файл:Ok.png|right|32px]]<br />
'''Внимание!''' Если объект помещен в группу, то координаты его пивота изменяются относительно точки пивота того объекта, чьим подобъектом он является. <br />
</blockquote><br />
Поэкспериментируйте. Можно использовать следующие картинки:<br />
<br />
[[файл:eath.png]] [[файл:moon.png]]<br />
<br />
== Как ездят кареты ==<br />
<br />
=== Подготовка ===<br />
<br />
Если Вы уже организовали движение Земли и Луны, то сложное движение,<br />
возникающие при наличие подобъектов, не должно вызывать затруднений.<br />
В этом примере мы покажем как согласовывать поступательное и <br />
вращательное движение на примере кареты с двумя колёсами.<br />
Разместим все три объекта (карету и её два колеса) на сцене<br />
и сделаем колеса подобъектами кареты.<br />
Превратим их все в машины состояний:<br />
<br />
[[файл:lesson_5_kareta1.png]]<br />
<br />
<br />
Пусть при клике на карету она проезжает некоторое расстояние по горизонтали и останавливается.<br />
Сделайте самостоятельно такую машину и протестируйте её.<br />
Карета должна перемещаться, а колеса, являясь её подобъектами, двигаться вместе с ней.<br />
Однако, они пока не вращаются. Если в ресурсах не окажется колеса и кареты,<br />
можно загрузить их непосредственно из этого урока:<br />
<br />
[[файл:kareta.png]] [[файл:koleso.png]]<br />
<br />
=== Немного математики ===<br />
<br />
Разберемся как согласовать ''поступательную'' скорость кареты и ''угловую'' скорость вращения колес. Последняя должна быть подобрана таким образом, чтобы движение <br />
выглядело естественным (колеса не проскальзывали вперед или назад).<br />
<br />
Посмотрите на формулы возле рисунка кареты. В первой из них приводится связь длины окружности L колеса и его радиуса r. Ниже - коэффициент 57.3 перевода числа пи из углов в радианы (пи - это 3.1415.. в радианах или 180 градусов). Во второй колонке даны определения поступательной и угловой скорости (изменение расстояния или угла за некоторое время t). <br />
Наконец, в третей колонке дана ключевая для нашей задачи формула, связывающая радиус '''r''', линейную '''v''' и угловую скорости '''w'''. Попробуйте её самостоятельно вывести, из предположения, что за одно и тоже время длина смещения кареты должна совпадать с длиной окружности обода колеса.<br />
При этом поступательная скорость '''v''' измеряется в пикселях за секунду, а угловая скорость '''w''' в градусах за секунду.<br />
<br />
=== Машины ===<br />
<br />
Запрограммируем теперь карету и колеса так, что бы после клика начинала двигаться карета<br />
и вращаться колеса. Когда карета останавливается, то и колеса должны переставать крутится.<br />
Колеса сделаем одинаковыми простыми машинами с двумя состояниями, которые назовем '''off''' (неподвижны) и '''on''' (крутятся):<br />
<br />
<br />
[[файл:lesson_5_kareta2.png]]<br />
<br />
<br />
Заметим, что в состояниях колес нет команды draw, так как колесо всегда рисуется при помощи одной картинки, она берется по умолчанию, из той, которая была перетащена на сцену (свойство '''res''').<br />
Угловая скорость '''v''' (в формулах она была обозначена как w) в команде rot измеряется в градусах в секунду. Поэтому v=180 означает, что колесо будет делать полный оборот (360 градусов) за 2 секунды.<br />
<br />
Обратим внимание, что раньше вращение мы задавали двумя параметрами: изменением угла '''da''' за время '''t'''. Так как сейчас время вращения колеса не фиксируется (этим занимается карета),<br />
то указан только один параметр: угловая скорость v.<br />
<br />
Так как колеса одинаковые, то имеет смысл создать сначала одно колесо, запрограммировать его, а затем скопировать, получив готовое второе колесо. Его надо будет только затем мышкой перетащить на нужное место.<br />
Не забываем также переименовать машины (в нашем случае это '''koleso1''' и '''koleso2'''). <br />
<br />
Карета должна при клике запускать на вращение колеса (переводя в состояние on),<br />
а при остановке их останавливать:<br />
<br />
<br />
[[файл:lesson_5_kareta3.png]]<br />
<br />
<br />
Проверьте что параметр v=66 в команде move состояния run кареты, угловая скорость колес v=180 в команде rot состояния on согласуются с радиусом колеса r=21. Радиус колеса равен половине ширины его картинки (свойство "размер"). Если Ваше колесо имеет другой размер, пересчитайте поступательную скорость по приведенной выше формуле.<br />
<br />
== Как открыть замок ключом ==<br />
<br />
В адвентюрных играх часто используется прием применения предметов.<br />
При этом один предмет мышкой перетаскивается на другой, в результате<br />
чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.)<br />
<br />
=== Постановка задачи ===<br />
<br />
Рассмотрим простой пример подобного взаимодействия объектов.<br />
Создайте новый экран и сцену на нём, так как предыдущий экран должен быть уже<br />
забит различными насекомыми.<br />
Перетащите на сцену из редактора ресурсов очередного жука, саквояж и ключ.<br />
Лучше их перетаскивать именно в таком порядке.<br />
Если порядок получился другой, мышкой в дереве проекта упорядочите<br />
эти объекты, так чтобы последовательность рисования была: жук, затем саквояж, затем ключ.<br />
Расположите эти объекты примерно в центре сцены и сделайте их машинами состояний.<br />
Поменяйте их имена на '''ladybug''' (божья коровка), '''bag''' (саквояж) и '''key''' (ключ).<br />
<br />
<br />
[[файл:lesson_5_key1.png|300px]]<br />
<br />
<br />
Наша задача состоит в организации взаимодействия ключа, саквояжа и жука при котором,<br />
работают такие правила:<br />
* если схватить ключ мышкой, он будет таскаться по сцене в определенных границах;<br />
* если отпустить ключ над саквояжем, саквояж должен "растаять", уменьшив свою прозрачность, а ключ уменьшиться в размерах, сжавшись в точку;<br />
* одновременно с этим, из-под саквояжа начинает вверх бежать жук;<br />
* когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж.<br />
<br />
=== Ключ ===<br />
<br />
Запрограммируем сначала машину для ключа:<br />
<br />
[[файл:lesson_5_key3.png]]<br />
<br />
<br />
Три состояния соответствуют трём режимам функционирования ключа:<br />
* '''drag''' - в этом, стартовом состоянии мы таскаем ключ по экрану <br />
* '''open''' - открываем саквояж и уменьшаемся до 0<br />
* '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране<br />
<br />
Второе состояние состояние '''open''' не должно вызвать особых затруднений.<br />
В команде '''set''' меняется состояние объекта '''bag''' (саквояж) на open.<br />
В этот момент саквояж должен изобразить своё открытие.<br />
В команде процессов '''scale''' происходит за время t=500 миллисекунд уменьшение масштаба рисования<br />
ключа (его размера) до ''целевых значений'' tx, ty которые выбраны близкими к нулю. <br />
После этого ключ переходит в третье состояние back.<br />
<br />
В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1<br />
по ширине и высоте. <br />
Кроме этого появилась новая команда '''init'''. Это команда инициализации<br />
или переустановки свойств данной машины. В нашем случае, мы меняем её координаты<br />
на значения x=0 и y=250 пикселей. Как и команда '''set''', команда '''init''' выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции.<br />
Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250,<br />
чтобы туда в дальнейшем он и возвращался.<br />
<br />
Разберемся теперь с системой координат на сцене. <br />
<br />
=== Координаты на сцене ===<br />
<br />
Если сцена создавалась по умолчанию, то она имеет ширину 960 пикселей,<br />
а высоту - 640. Начало отсчёта координат на сцене расположено в её центре.<br />
Ось x, по которой откладывается горизонтальная координата объекта направлена вправо,<br />
а ось Y для вертикальной координаты - вниз: <br />
<br />
[[файл:lesson_5_key2.png|600px]]<br />
<br />
Стоит раскрыть координаты любого объекта (свойство положение) на панели Properties.<br />
Затем потаскать объект по сцене, наблюдая как эти координаты меняются.<br />
Если '''x''' стало отрицательным, значит объект находится левее центра сцены.<br />
Если же отрицательный '''y''', то объект расположен выше центра.<br />
<br />
Заметим, что координата объекта определяется его точкой пивота.<br />
Для трех объектов, находящихся сейчас на сцене точка пивота должна<br />
совпадать с центрами картинок.<br />
<br />
Таким образом, когда мы задали в команде init положение для ключа x=0, y=250,<br />
мы поместили его по середине, в нижней части сцены.<br />
<br />
=== Драг энд дроп ===<br />
<br />
[[файл:lesson_5_key3_drag.png|right]]<br />
Осталось разобраться с ещё двумя новыми командами,<br />
которые появились в состоянии drag.<br />
Первая команда '''drag''' (таскать) означает, что данную машину в этом состоянии<br />
разрешено мышкой таскать по экрану.<br />
При этом могут быть заданы координаты области за которую объект вытащить нельзя.<br />
Эта область определяется двумя точками - верхним левым углом с координатами (x1,y1)<br />
и правым нижним углом с координатами (x2,y2).<br />
<br />
В нашем случае эти точки почти совпадают с углами сцены.<br />
На самом деле область разрешенного таскания чуть меньше размера сцены.<br />
Сделано это для того, чтобы ключ нельзя было даже краешком вытащить за сцену.<br />
Правый нижний угол сцены имеет координаты (x2, y2)=(480, 320)=(960/2, 640/2).<br />
Ширина ключа 128 пикселей (см. свойство размер).<br />
Поэтому, чтобы правая сторона ключа не выехала за сцену, для координаты y1<br />
мы берем значение 416 = 480-128/2 (сужаем границу таскания на половину ширины ключа). Аналогично считаются остальные координаты области разрешенного таскания.<br />
<br />
Наконец, команда '''drop''' (бросить), регулирует, что должно произойти при бросании ключа<br />
(отпускания мышки) если оно произошло на объекте '''obj'''.<br />
В данном случае происходит переход в новое состояние (поле '''go''').<br />
<br />
=== Саквояж и жук ===<br />
<br />
Создадим теперь машину для саквояжа.<br />
Она будет иметь два состояния open и close:<br />
<br />
<br />
[[файл:lesson_5_key4.png]]<br />
<br />
<br />
В состоянии close в команде '''init''' саквояж переустанавливает свою прозрачность в единичное значение (непрозрачен) al=1.00. Это необходимо, что бы появиться на экране после исчезновения.<br />
Сам процесс исчезновения задается командой процесса '''alpha''' в состоянии open.<br />
Эта команда меняет текущую прозрачность объекта до целевого значения ta=0 (полностью прозрачен) за время t=500 миллисекунд (пол секунды).<br />
Кроме этого в этом состоянии меняется состояние жука (команда '''set'''), который должен из под саквояжа начать бежать.<br />
<br />
Осталось создать два состояния для жука, который будет выбегать из под саквояжа.<br />
Ничего сложного в его поведении нет:<br />
<br />
<br />
[[файл:lesson_5_key5.png]]<br />
<br />
Теперь самое время протестировать результат наших действий.<br />
Потаскайте сначала ключ по сцене, убедившись, что он за неё не входит.<br />
Затем наведите ключом на саквояж и отпустите мышку. <br />
Всё должно прийти в движение.<br />
Включите отладку (кнопка S) и понаблюдайте как изменяются состояния объектов.<br />
В момент выполнения процессов можно несколько раз понажимать на пробел,<br />
чтобы приостановить их выполнение и запустить снова.<br />
<br />
== Что дальше? ==<br />
<br />
Мы разобрали много команд и их параметров.<br />
Однако это далеко не все возможности машин состояний.<br />
Стоит прочитать документ [[Machine]] в котором описан весь язык машин.<br />
Чем больше Вы создадите машин с различным поведением, тем увереннее будете с ними работать.<br />
<br />
В заключение приведем несколько общих советов:<br />
* Проектируйте сначала логику поведения машин на бумаге.<br />
* Давайте осмысленные названия для машин и их состояний.<br />
* Обязательно документируйте машины, описывая их поведение на естественном языке.<br />
* Копируйте однотипные машины для сокращения времени по их программированию.<br />
* При сложном взаимодействии нескольких машин, вводите управляющую машину (возможно невидимую), в которой концентрируйте основную логику поведения. <br />
* Не увлекайтесь длинными состояниями с множеством команд процессов. Иногда поведение становится понятнее, если состояние разбить на несколько последовательных состояний. <br />
* Смело спрашивайте совета у более опытных дизайнеров. Они в своё время поступали именно так.<br />
<br />
== Упражнения ==<br />
<br />
* создайте движение Земли по окружности, а Луны также по окружности, но вокруг Земли;<br />
* сделайте движение кареты бесконечным так, что после того как она уезжает за правый край экрана, она появлялась из-за левого края; <br />
* заставьте жука начинать бежать, только когда саквояж полностью уменьшится (set на выходе из состояния).<br />
* организуйте так, чтобы при перетаскивании ключа в область саквояжа, жук развернулся на 180 градусов и двигался вниз, обратно под саквояж.<br />
<br />
----<br />
{| width="100%" <br />
| width="40%"|[[Взаимодействие машин: «Лампочка» и «Светофор»|Урок 4]] << <br />
! width="20%"|[[Learning|Оглавление]] <br />
| width="40%" align="right"| >> [[Редактор текстовых ресурсов|Урок 6]]<br />
|}<br />
<br />
[[Category:Learning]]</div>Sredhttps://wiki.appsalutecreator.com/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Vot-tak-vot.png&diff=9023Файл:Vot-tak-vot.png2017-09-19T07:06:30Z<p>Sred: </p>
<hr />
<div></div>Sred