Создание пользовательских событий для ct.js
Создание пользовательских событий для ct.js
Автоматически переведённая страница
К сожалению, на полный ручной перевод у нас не хватает ресурсов.
Если вы увидели ошибку — отправьте пул-риквест с исправлениями (ссылка для редактирования в конце страницы).
Пользовательские события — это отличный способ сделать вашу библиотеку более простой для изучения и использования. Это позволяет пользователям упростить свои скрипты и избежать шаблонного кода. Вы уже используете события в шаблонах и комнатах через список событий, и ваши события тоже могут быть там.
Но сначала вам нужно понять, как работают такие события.
Целевые коды событий
Каждое событие добавляет дополнительный код в игровой цикл игры или шаблон актива. Существует 8 возможных целевых областей кода, которые можно использовать:
thisOnCreate
— код, вызываемый при создании сущности (копии шаблона) или переходе в целевую комнату;thisOnDestroy
— код, вызываемый при уничтожении текущей редактируемой сущности (комната/шаблон). Для комнат этот код срабатывает при переходе из одной комнаты в другую или при удалении интерфейсной комнаты со сцены;thisOnStep
— код «старта кадра» для текущей редактируемой сущности (шаблон/комната);thisOnDraw
— код «конца кадра» для текущей редактируемой сущности (шаблон/комната).
Это регулярные целевые области жизненного цикла. Они выполняются для каждой копии/комнаты, и ключевое слово this
указывает на текущую сущность. Но иногда нужно запустить код один раз для всех комнат/копий, возможно, для инициализации свойств или глобальных игровых правил. Ниже представлены аналогичные события, но они выполняются только корневыми комнатами. Корневая комната всегда — это ct.room
, комната, с помощью которой начинается или в которую переключается ваша игра, и которая может содержать слои интерфейса и другие подкомнаты.
rootRoomOnCreate
rootRoomOnStep
rootRoomOnDraw
rootRoomOnLeave
Контекст выполнения отличается здесь. Ключевое слово this
будет указывать на ct.room
, и вам нужно будет работать с вашими шаблонами/комнатами, используя замены переменных из /*%%ENTITY_TYPE%%*/
и /*%%ENTITY_NAME%%*/
. Возможно, вам понадобится использовать ct.templates.list
или ct.rooms.list
, чтобы получить доступ к вашим копиям и комнатам.
Обратите внимание, что использование полей rootRoom*
делает поведение статическим, увеличивая размер пакета игры и не позволяя разработчику игры добавлять и удалять это поведение в реальном времени игры. Эти события следует использовать только в тех случаях, когда вы не можете использовать поля thisOn*
.
Когда ct.IDE экспортирует игру, он объединяет все события в thisOnCreate
, thisOnDestroy
, thisOnStep
и thisOnDraw
для каждого шаблона и комнаты, а также собирает события для корневых комнат со всех скриптовых сущностей. Одно событие пользователя может способствовать нескольким целевым областям кода одновременно: например, таймер будет объявлен в thisOnCreate
и проверять выполнение в thisOnStep
.
Создание события:
События должны быть объявлены в module.json
, затем их код должен быть либо вложен в module.json
, либо написан в отдельных файлах в папке events
.
Декларация события
События объявляются в объекте events
в module.json
. Ниже приведен отрывок из ct.place в качестве примера с большинством полей событий:
{
"main": {
"name": "ct.place",
"version": "4.0.0",
/* ... */
},
/* ... */
"events": {
"collisionTemplate": {
/* Название события, отображаемое в селекторе событий и списке событий */
"name": "Сражаясь с шаблоном",
/* Пример локализованного названия. `Ru` - код языка здесь. */
"name_Ru": "Столкновение с шаблоном",
/* События с аргументами, такие как это, могут иметь специальное шаблонизированное название для списков событий.
%%template%% соответствует значению аргумента `template` ниже. */
"parameterizedName": "Сражаясь с %%template%% шаблоном",
/* Пример локализованного названия. `Ru` - код языка здесь. */
"parameterizedName_Ru": "Столкновение с шаблоном %%template%%",
/* События также могут иметь расширенные описания, отображаемые в меню "Добавить событие".
Эти описания также могут быть локализованы */
/* "hint": "Пример описания", */
/* Отображаемый значок этого события.
См. список иконок в разделе Meta основного файла ct.js.*/
"icon": "копия",
/* Если установлено значение true, событие в редакторе списка событий будет пытаться получить миниатюру
первого зала, шаблона или текстуры в списке аргументов и отобразить ее. */
"useAssetThumbnail": true,
/* Список сценариев, поддерживающих это событие. В настоящее время могут включать `шаблон`, `room`. */
"applicable": ["шаблон"],
/* Если вы проектируете событие только для шаблонов, укажите поддерживаемые базовые классы здесь,
или не используйте это поле, если они поддерживаются все. */
"baseClasses": ["AnimatedSprite", "NineSlicePlane", "Text"],
/* Кодовое имя категории, в которой будет отображаться это событие. */
"category": "сражения",
/* Список аргументов (необязательно) требуемых событием. */
"arguments": {
/* Имя поля соответствует имени переменной в шаблоне кода */
"шаблон": {
/* Отображаемое имя в редакторе аргументов */
"name": "Шаблон",
/* Пример локализованного названия. `Ru` - код языка здесь. */
"name_Ru": "Шаблон",
/* Тип аргумента. */
"type": "шаблон"
/* Аргументы числового и строкового типов также могут иметь значение по умолчанию.
Они заполняют список аргументов для новых событий. */
/* "default": 404 */
}
},
/* Список целевых кодов из первого раздела этой страницы, к которым это событие вносит свой вклад. */
"codeTargets": ["thisOnStep"],
/* Местные переменные, предоставляемые событием для кода пользователя. */
"locals": {
/* Объявляет переменную `other` типа ` Копия`. */
"other": {
/* Тип передается в TypeScript как есть. */
"type": "Копия",
/* Местные переменные перечислены в списке событий вместе с их описаниями */
"description": "Сражаясь с копией",
/* Описания местных переменных также могут быть локализованы */
"description_Ru": "Сражаясь с копией",
}
}
},
"collisionCGroup": {
"name": "Сражаясь с группой",
/* ... та же структура */
}
},
"eventCategories": {
"сражения": {
"name": "Сражения",
"icon": "копия"
}
}
}
Совет
Типы в events.yourEventCode.locals
- это имена TypeScript. Копия
- это копия ct.js, Room
- это комната (см. документацию по этим и другим встроенным классам).
Помимо этих простых значений, вы можете использовать boolean
, number
, string
как типы локальных переменных, а также любой другой допустимый тип описателя TypeScript.
Параметризованные события и типы аргументов
Любое событие, у которого есть по крайней мере один аргумент, является параметризованным событием. В сравнении с простыми событиями может быть несколько параметризованных событий одного типа в одной шаблонной или комнате.
Вы можете использовать аргументы для дальнейшего уточнения события или для предоставления настроек пользователю. Например, событие столкновения является параметризованным событием, где пользователь может добавить несколько событий столкновения с разными аргументами — шаблонами для проверки столкновений. Встроенный пример ct.js параметризованного события — любое событие действия: действие само по себе является аргументом здесь.
Ct.js поддерживает следующие типы аргументов:
integer
float
string
boolean
template
room
sound
tandem
font
style
texture
action
.
Создание категорий событий
Вы также можете добавлять категории внутри module.json
в объекте eventCategories
, с помощью которых ваши события могут заполнять пользовательские категории вместо встроенных.
Если категория оказывается пустой, она не отображается.
Структура объекта категории, как можно увидеть на предыдущем примере кода, довольно проста:
{
"main": {
"name": "ct.place",
"version": "4.0.0",
/*...*/
},
/* ... */
"eventCategories": {
/* Кодовое название вашей категории. Вы используете его для связи событий с ней. */
"collisions": {
/* Отображенное название категории */
"name": "Collisions",
/* Пример локализованного названия для локали Ru. */
"name_Ru": "Столкновения",
/* Отображаемый значок этой категории.
См. список значков в разделе Meta главного меню ct.js.*/
"icon": "copy"
}
}
}
Совет
Вы также можете использовать встроенные категории для ваших событий вместо создания новых. Встроенные имена категорий включают в себя следующие:
lifecycle
;actions
;pointer
;animation
;misc
(по умолчанию).
Написание кода события
Существует два способа определения кода для каждого целевого объекта кода события: внедрение в module.json
или размещение в файлах с путями events/eventCode_codeTarget.js
. Первый метод подходит для небольших шаблонов и в основном используется для встроенных событий.
Примечание
При написании событий убедитесь, что вы не утекаете переменные за пределы своего события, поскольку это может привести к непредвиденному поведению в других модулях событий или коде пользователя. Если вы объявляете переменные, используйте let
и const
вместо var
, и оберните вашу функцию в { }
.
Встраиваемые события
Вот пример кода встроенного события:
{
"name": "Action press",
"parameterizedName": "%%action%% press",
"applicable": ["template", "room"],
"icon": "airplay",
"category": {
"key": "actions",
"custom": false
},
"arguments": {
"action": {
"name": "Action",
"type": "action"
}
},
"codeTargets": ["thisOnStep"],
"inlineCodeTemplates": {
/* This matches with codeTargets with its keys*/
"thisOnStep": "if (ct.actions[/*%%action%%*/].pressed) {\n/*%%USER_CODE%%*/\n}"
}
}
Написание кода события в отдельных файлах
Вот структура модуля с двумя событиями, одно из которых имеет три целевые файла кода:
catmod
│
└─ docs
│ └─ ... (файлы документации)
│
└─ events
| │
| └─ complexEvent_thisOnStep.js
| └─ complexEvent_thisOnDraw.js
| └─ complexEvent_rootRoomOnLeave.js
| └─ simpleEvent_thisOnStep.js
│
└─ index.js
└─ module.json
Вы пишете JS-код в эти файлы так, как есть, без каких-либо оболочек.
Шаблонирование кода события
/*%%USER_CODE%%*/
заменяется кодом, который пишет пользователь в вашем событии.
Вы можете использовать значения аргументов с /*%%argumentName%%*/
. Вам, вероятно, понадобится добавить оболочку, чтобы сохранить синтаксис JS действительным, например: var targetEnemy = [/*%%enemy%%*/][0];
.
Также есть две дополнительные токены шаблонизации, которые вы можете использовать: /*%%ENTITY_TYPE%%*/
и /*%%ENTITY_NAME%%*/
, которые заменяются типом ассета ('room'
, 'template'
) и именем этого ассета.
Примечание
Строчные значения автоматически заключаются в кавычки, а также действия, шаблоны и другие имена сущностей.
Совет
Вам нужны больше примеров? Посмотрите на place
catmod внутри папки установки ct.js > data > ct.libs > place.