Тонкости работы в Construct. Делимся опытом

раздел для свободного общения

Сообщение Тонкости работы в Construct. Делимся опытом
» 25 сен 2020, 07:48

Наверняка, у каждого из вас есть свои рабочие "лайфхаки", которые помогают эффективнее решать различные задачи. Предлагаю в этой теме обмениваться опытом на эту тему. Как минимум, это любопытно. А возможно, кому-то это ещё и пригодится :)

Начну с себя.

Сразу скажу, что я занимаюсь играми достаточно узкого жанра — это стратегии, симуляторы. То есть игры, где есть много элементов интерфейса и взаимодействия с ним.

1. Для создания окна использовать отдельный слой.

Создаю отдельный слой и размещаю на него все необходимые элементы. Когда нужно показать/убрать окно, то делаю слой видимым/невидимым. Все события связанные с окном находятся под условием "Layer is visible". То есть, если окно невидимое, то его события даже не проверяются игровым движком и не несут никакой нагрузки. Если нужно сделать плавное появление/исчезание окна, то использую параметр "layer opacity".

А чтобы избежать множественного нажатия на объекты окна (например, вы нажимаете кнопку открытия окна и тут же происходит нажатие чего-то в самом окне), устанавливаю задержку перед его появлением/исчезанием в 0 секунд (wait 0 sec). Таким образом, события окна будут активны только на следующий тик.

2. Две обязательные переменные для всех объектов.

Я всегда задаю объектам две обязательные переменных — текстовую переменную "class" и числовую "id". Для чего это нужно? Для того, чтобы можно было одним условием пикнуть необходимые объекты.

Например, у меня есть панель, состоящая из нескольких спрайтов и текстовых объектов. По нажатию на экран эта панель должна появится по координатам нажатия. Так вот, вместо того, чтобы в условиях указывать каждую копию объекта по UID, я заранее устанавливаю объектам единое значение переменной class, а потом добавляю всего одно условие, чтобы пикнуть все объекты, которые имеют эту переменную. А если добавить нужные объекты в семью, то можно таким же образом пикнуть все нужные объекты одного типа (при помощи всего одного условия).

Переменная "id" нужна для того, чтобы в случае необходимости пикнуть разные объекты с одинаковой переменной "class". Ну то есть, если у меня есть два объекта с одинаковым значением "class", то я устанавливаю им разные значения "id". Очень удобно.

 Показать пример
ИзображениеИзображение
tabs_select.capx
(199.91 КБ) Скачиваний: 95


3. Использование семей.

Если у меня есть несколько объектов, выполняющих одну и ту же функцию, например, юниты для RTS стратегии, то вместо того, чтобы добавлять каждому объекту переменные/поведения, я объединяю эти объекты в семью и добавляю переменные/поведения самой семье. Благодаря чему, любые изменения в игровую механику (добавление/удаление переменных или поведений) больше не требуют изменения параметров для каждого объекта. Достаточно просто изменить параметры семье.

4. Распределение событий по группам

Группы помогут вам структурировать ваш проект. Вы больше не будете тратить по несколько минут на поиск нужного события. Вы всегда сможете знать где что находится. Для этого важно правильным образом распределить события по группам.

Здесь есть разные подходы, кому как удобнее. Я, например, создаю группы, внутри которой должны находиться события, решающие одну задачу. То есть, если я отключу группу (например, для поиска багов), то отключится всего одна игровая механика.

5. Группы и статичные локальные переменные

Иногда можно встретить разработчиков, которые стараются лишний раз не добавлять в проект глобальную переменную, якобы из-за этого снижается производительность. На мой взгляд, есть более приземлённая проблема — чем больше глобальных переменных — тем более неудобным становится работа с проектом. Например, вы добавляете действие "System > set value" и дальше долго и муторно ищите в длиннючем списке нужную вам переменную.

В большинстве случаев, нет никакой необходимости в том, чтобы переменные были доступны из любой точки проекта. На помощь приходят группы и статичные локальные переменные. Вы добавляете переменную и перемещаете её в ту группу событий, внутри которой она должна использоваться. Соответственно, из другой группы событий вы эту переменную даже не увидите.

На этом пока всё, предлагаю теперь вам поделиться своими лайфхаками. :drinks:
Последний раз редактировалось ViGaCi 25 сен 2020, 09:36, всего редактировалось 2 раз(а).
Аватара пользователя

Редактор
Сообщений: 314
Я тут с 01 авг 2017
Репутация 81 [ ? ]

Сообщение Тонкости работы в C2. Делимся опытом
» 25 сен 2020, 09:18

6. Использование функций и их параметров

Когда мне нужно выполнить какую-то задачу, где нужна индивидуальная настройка к каждому условию, то я использую функции. Например, мне нужно реализовать плавные всплывающие уведомления с помощью поведения Fade. Для этого я создаю функцию Fade_Notifications (можно любое название), и добавляю в нее 4 параметра (текст в уведомлении, Fade-in time, Wait time, Fade-out time), а также действия которые должны происходить в функции. Теперь каждый раз когда мне нужно вызывать такие уведомления, то я просто вызываю функцию и записываю в нее необходимые параметры. А выглядит это примерно так:

screen.png

Если много таких функций, то я обычно храню их в отдельном листе событий и присоединяю их к листу событий с игрой.
Исходники:
Библиотека исходников для Construct Classic - http://c2community.ru/forum/viewtopic.php?f=16&t=16843

Плагины:
Портирование плагины [C3Runtime] - http://c2community.ru/forum/viewtopic.php?f=200&t=17021
Поддельные плагины [C3Runtime] - http://c2community.ru/forum/viewtopic.php?f=200&t=16933
Аватара пользователя

Участник
Сообщений: 633
Я тут с 12 мар 2020
Откуда: GameSoul Inc.
Двиг: Construct,Unity
Лицензия: Business
Репутация 92 [ ? ]

Сообщение Тонкости работы в C2. Делимся опытом
» 25 сен 2020, 09:45

7. Тестовый полигон

В спорных моментах не экспериментирую в рабочем проекте, а создаю новый, воссоздаю спорный момент и тестирую варианты. После нахождения оптимального решения экспериментирую дальше, если сам вижу, что может в каком-то неизученном мною случае возникнуть проблема.
Например, не работал с Return value у Function. Не знал, по какому принципу возвращает значение. Поэкспериментировал, разобрался. Затем дополнительно попробовал запустить 2 функции "одновременно" и посмотреть, от какой вернет. Попробовал одну функцию с задержкой (Wait dt), попробовал функцию в функции... Мне сейчас это не надо, но в будущем может пригодиться.
Не бойтесь и не ленитесь проводить тестовые испытания на тестовом полигоне.
Аватара пользователя

Модератор
Сообщений: 4529
Я тут с 18 сен 2015
Откуда: Екатеринбург
Двиг: С2/С3
Лицензия: Personal
VK: id21590703
Репутация 658 [ ? ]

Сообщение Тонкости работы в C2. Делимся опытом
» 25 сен 2020, 10:05

4.1. Распределение событий для будущих проектов

Дополню пункт 4.
4.1.1. Используйте не только группы, но и другие листы событий, если нужно просто рассортировать события.
4.1.2. Конструируйте отдельные механики на разных листах событий, чтобы можно было целым листом перенести в будущие проекты. Например, я сделал свайп на отдельном листе событий, включил его в основной лист событий и использую функцию Function - On function - "Swipe_left", как будто это Touch - On Swipe left. Соответственно в другие проекты могу просто скопировать лист событий и также использовать вызов функции.
Изображение Изображение
Аватара пользователя

Модератор
Сообщений: 4529
Я тут с 18 сен 2015
Откуда: Екатеринбург
Двиг: С2/С3
Лицензия: Personal
VK: id21590703
Репутация 658 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 26 сен 2020, 09:25

8. Отступы по краям Layout

Изображение

В параметрах Layout есть пункт "Margins". Это размер границ по краям сцены, до которых мы можем прокручивать экран в редакторе С2. Один из способов использовать это пространство - это временное(!) размещение референсов. Например, вы работаете над интерфейсом игры и перед вами есть примеры, на которые вы ориентируетесь. Можно поместить все референсы на отдельный заблокированный слой (чтобы эти объекты не нажимались, т.е. не мешали работе). Разумеется, перед компиляцией нужно удалять все лишние изображения, чтобы не увеличивать размер игры.
Аватара пользователя

Редактор
Сообщений: 314
Я тут с 01 авг 2017
Репутация 81 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 27 сен 2020, 18:44

ViGaCi, маржа нужна только для веб-разметки. Сейчас только заметил, что С3 не привязан к марже.
Аватара пользователя

Модератор
Сообщений: 4529
Я тут с 18 сен 2015
Откуда: Екатеринбург
Двиг: С2/С3
Лицензия: Personal
VK: id21590703
Репутация 658 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 13 окт 2020, 00:13

Тем кто читает эту тему, предлагаю взглянуть также на эту: ССЫЛКА
Аватара пользователя

Участник
Сообщений: 59
Я тут с 09 авг 2013
Двиг: Construct 2
Лицензия: Personal
Репутация 11 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 24 окт 2020, 21:26

Lezvie писал(а):2. Две обязательные переменные для всех объектов.

пример изменил - просто короче
tabs_select.capx
(199.74 КБ) Скачиваний: 44
Аватара пользователя

Игродел
Сообщений: 2803
Я тут с 24 окт 2014
Откуда: Москва
Двиг: C2
Лицензия: Personal
Репутация 565 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 26 окт 2020, 10:59

smebor, пример стал короче, но появился баг - при нажатии на кнопку изменяется прозрачность текста "нажмите на кнопку ниже". Смысл использования двух переменных как раз и заключался в решении этой проблемы - чтобы фильтровать ненужные экземпляры объектов.
Аватара пользователя

Редактор
Сообщений: 314
Я тут с 01 авг 2017
Репутация 81 [ ? ]

Сообщение Тонкости работы в Construct. Делимся опытом
» 26 окт 2020, 11:54

ViGaCi писал(а):smebor, пример стал короче, но появился баг - при нажатии на кнопку изменяется прозрачность текста "нажмите на кнопку ниже". Смысл использования двух переменных как раз и заключался в решении этой проблемы - чтобы фильтровать ненужные экземпляры объектов.

Бага нет - у текста "нажмите на кнопку ниже" стоит id=0. Я просто не стал менять, а нужно поставить id например равным 5...
Сама идея применить класс для объектов очень понравилась, но в данном примере это избыточно. Хорошо бы сделать пример где это просто необходимо.
Аватара пользователя

Игродел
Сообщений: 2803
Я тут с 24 окт 2014
Откуда: Москва
Двиг: C2
Лицензия: Personal
Репутация 565 [ ? ]



Вернуться в Открытая тема

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх