Script Game — различия между версиями
Avereskun (обсуждение | вклад) (→Свойства) |
Abeyn (обсуждение | вклад) |
||
(не показано 17 промежуточных версий этого же участника) | |||
Строка 6: | Строка 6: | ||
*'''config''' - [[config|конфиг]] для игровой механики. Чтобы добавить конфиг нужно нажать правой кнопкой на области свойств и выбрать "config". После чего загрузить заранее подготовленный конфиг для игровой механики. Как подготовить конфиг см. [[Config|тут]] | *'''config''' - [[config|конфиг]] для игровой механики. Чтобы добавить конфиг нужно нажать правой кнопкой на области свойств и выбрать "config". После чего загрузить заранее подготовленный конфиг для игровой механики. Как подготовить конфиг см. [[Config|тут]] | ||
− | == | + | ==Структура скрипта== |
+ | При сохранении проекта редактором сцен формируется файл scripts.js в котором собран код тех механиик имена которых были указаны в поле "скрипт" (скрипты вьювер забирает с ресурса: http://dart/svn/HO_EDITOR_TOOLS/JavaScript/Last/GameMechanics при сборке). | ||
− | + | Вьювер при инициализации создает глобальный объект: | |
− | + | <pre>var __viewer = {}</pre> | |
− | + | Затем в зависимости от операционной системы добавляются функции форматирования массива и вывода отладочной информации: | |
− | + | Для IOS (WKWebView): | |
+ | <pre>__viewer.float32ArrPrepare = function (float32Arr) | ||
+ | { | ||
+ | var str = new TextDecoder('utf-16').decode(float32Arr.buffer); | ||
+ | return str; }} | ||
− | + | __viewer.print = function (str) | |
+ | { | ||
+ | window.webkit.messageHandlers.print.postMessage(str); | ||
+ | } | ||
+ | </pre> | ||
− | = | + | ---------------------------------------------------------------------------- |
− | + | ||
+ | Для Android и Windows (V8): | ||
+ | <pre> | ||
+ | __viewer.float32ArrPrepare = function (float32Arr) | ||
+ | { | ||
+ | return float32Arr; | ||
+ | } | ||
+ | |||
+ | __viewer.print = function (str) | ||
+ | { | ||
+ | viewer_print(str); | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | Затем загружается код из файла scripts.js | ||
+ | Пример: | ||
+ | <pre> | ||
+ | var gameMechanic1 = function (obj) | ||
+ | { | ||
+ | obj = obj || {}; | ||
+ | |||
+ | obj.modules_init = function(config) | ||
+ | { | ||
+ | __viewer.print("config:" + config); | ||
+ | }; | ||
+ | |||
+ | obj.update_handler = function(p) | ||
+ | { | ||
+ | __viewer.print("p[0]=" + p[0]); | ||
+ | return __viewer.float32ArrPrepare(obj.__viewerFloat32Array) | ||
+ | }; | ||
+ | |||
+ | obj.__viewerFloat32Array = new Float32Array(1000); | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==Инициализация== | ||
+ | При инициализации создается объект в глобальном пространстве имен с именем <Имя игровой механники (указанное в поле "скрипт")>_<Идентификатор объекта во вьюере>. | ||
+ | Затем вызывается функция modules_init в которую передается конфигурацонный файл объекта сдедующей структуры: | ||
+ | |||
+ | { | ||
+ | "id" : 2 //Идентификатор объекта | ||
+ | "width" : 1024, //Ширина объекта | ||
+ | "height" : 768, //Высота объекта | ||
+ | "resourcesInfo" : { //Ресурсы, используемые механникой | ||
+ | "images" : [ //Изображения | ||
+ | { | ||
+ | "w" : 183, //Высота | ||
+ | "h" : 183, //Ширина | ||
+ | "id" : 68, //Идентификатор ресурса | ||
+ | "px" : 92, //Пивот Х | ||
+ | "py" : 92 //Пивот Y | ||
+ | } | ||
+ | ] | ||
+ | }, | ||
+ | "config" : { //Основной конфигурационный файл указанный в поле "config" | ||
+ | "defaultIcoID" : 68, | ||
+ | "levels" : [ | ||
+ | { | ||
+ | "config" : { //Конфигурационный файл соответствующего уровня | ||
+ | "level" : { | ||
+ | "cols" : 5, | ||
+ | "field" : "0,1,4,5,2" | ||
+ | "id" : 1, | ||
+ | "moveSnd" : 70, | ||
+ | "picture" : 69, | ||
+ | "rows" : 5 | ||
+ | }, | ||
+ | "resources" : { | ||
+ | "images" : "69", | ||
+ | "sounds" : "70" | ||
+ | } | ||
+ | }, | ||
+ | "dir" : "levels/1/", | ||
+ | "id" : 73 | ||
+ | } | ||
+ | ], | ||
+ | "name" : "levels config", | ||
+ | "nameID" : 20, | ||
+ | "resources" : { | ||
+ | "images" : "68", | ||
+ | "sounds" : "", | ||
+ | "texts" : "20" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ==Обмен событиями== | ||
+ | Для оптимизации скорости обмена между вьювером и скриптом в качестве формата сообщения выбран массив вещественных чисел следующего формата: | ||
+ | *'''число событий''' | ||
+ | *'''тип события''' | ||
+ | *'''размер данных события''' | ||
+ | *'''данные события''' | ||
+ | ... | ||
+ | *'''тип события''' | ||
+ | *'''размер данных события''' | ||
+ | *'''данные события''' | ||
+ | |||
+ | Данный массив передается параметром в функцию update_handler в каждом кадре (в котором перечислены интервал времени,тачи,системные сообщения), затем скрипт выполняет логику кадра и возвращает аналогичной структуры массив в котором указаны события что и где рисовать. | ||
+ | |||
+ | ===События из вьювера в скрипт=== | ||
+ | #'''DT''' - Время, после последнего кадра | ||
+ | ##''размер'' - 1 | ||
+ | ##''dt'' - время, после последнего кадра | ||
+ | #'''Mouse/Touch down''' - Нажали левую кнопку мыши/тач по экрану | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | #'''Mouse/Touch move''' - движение нажатой мыши/тача по экрану | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | #'''Mouse/Touch up''' - отпускание левой кнопки мыши/тача | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | #'''Mouse over''' - мышь над объектом | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция мыши по оси X | ||
+ | ##''y'' - позиция мыши по оси Y | ||
+ | #'''Mouse whell down''' - скрол мыши вниз | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция мыши по оси X | ||
+ | ##''y'' - позиция мыши по оси Y | ||
+ | #'''Mouse whell up''' - скрол мыши вверх | ||
+ | ##''размер'' - 2 | ||
+ | ##''x'' - позиция мыши по оси X | ||
+ | ##''y'' - позиция мыши по оси Y | ||
+ | #'''Multi touch down''' - мультитач нажатие | ||
+ | ##''размер'' - X | ||
+ | ##''touches'' - число тачей | ||
+ | ##''id'' - идентификатор тача | ||
+ | ##''pressed'' - флаг нажатости | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | ## следующий тач | ||
+ | #'''Multi touch move''' - мультитач движение | ||
+ | ##''размер'' - X | ||
+ | ##''touches'' - число тачей | ||
+ | ##''id'' - идентификатор тача | ||
+ | ##''pressed'' - флаг нажатости | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | ## следующий тач | ||
+ | #'''Multi touch up''' - мультитач отпускание | ||
+ | ##''размер'' - X | ||
+ | ##''touches'' - число тачей | ||
+ | ##''id'' - идентификатор тача | ||
+ | ##''pressed'' - флаг нажатости | ||
+ | ##''x'' - позиция тача по оси X | ||
+ | ##''y'' - позиция тача по оси Y | ||
+ | ## следующий тач | ||
+ | #'''Resize''' - изменился размер объекта | ||
+ | ##''размер'' - 2 | ||
+ | ##''w'' - ширина объекта | ||
+ | ##''h'' - высота объекта | ||
+ | |||
+ | ===События из скрипта во вьювер=== |
Текущая версия на 12:36, 14 декабря 2017
Объект ScriptGame служит для встраивания игр, написанных на различных скриптовых языках, в редактор
Содержание
Свойства
- скрипт - Скрипт игровой механники данного объекта (Type Script, Java Script, LUA ...)
- config - конфиг для игровой механики. Чтобы добавить конфиг нужно нажать правой кнопкой на области свойств и выбрать "config". После чего загрузить заранее подготовленный конфиг для игровой механики. Как подготовить конфиг см. тут
Структура скрипта
При сохранении проекта редактором сцен формируется файл scripts.js в котором собран код тех механиик имена которых были указаны в поле "скрипт" (скрипты вьювер забирает с ресурса: http://dart/svn/HO_EDITOR_TOOLS/JavaScript/Last/GameMechanics при сборке).
Вьювер при инициализации создает глобальный объект:
var __viewer = {}
Затем в зависимости от операционной системы добавляются функции форматирования массива и вывода отладочной информации:
Для IOS (WKWebView):
__viewer.float32ArrPrepare = function (float32Arr) { var str = new TextDecoder('utf-16').decode(float32Arr.buffer); return str; }} __viewer.print = function (str) { window.webkit.messageHandlers.print.postMessage(str); }
Для Android и Windows (V8):
__viewer.float32ArrPrepare = function (float32Arr) { return float32Arr; } __viewer.print = function (str) { viewer_print(str); }
Затем загружается код из файла scripts.js Пример:
var gameMechanic1 = function (obj) { obj = obj || {}; obj.modules_init = function(config) { __viewer.print("config:" + config); }; obj.update_handler = function(p) { __viewer.print("p[0]=" + p[0]); return __viewer.float32ArrPrepare(obj.__viewerFloat32Array) }; obj.__viewerFloat32Array = new Float32Array(1000); }
Инициализация
При инициализации создается объект в глобальном пространстве имен с именем <Имя игровой механники (указанное в поле "скрипт")>_<Идентификатор объекта во вьюере>. Затем вызывается функция modules_init в которую передается конфигурацонный файл объекта сдедующей структуры:
{
"id" : 2 //Идентификатор объекта "width" : 1024, //Ширина объекта "height" : 768, //Высота объекта "resourcesInfo" : { //Ресурсы, используемые механникой "images" : [ //Изображения { "w" : 183, //Высота "h" : 183, //Ширина "id" : 68, //Идентификатор ресурса "px" : 92, //Пивот Х "py" : 92 //Пивот Y } ] }, "config" : { //Основной конфигурационный файл указанный в поле "config" "defaultIcoID" : 68, "levels" : [ { "config" : { //Конфигурационный файл соответствующего уровня "level" : { "cols" : 5, "field" : "0,1,4,5,2" "id" : 1, "moveSnd" : 70, "picture" : 69, "rows" : 5 }, "resources" : { "images" : "69", "sounds" : "70" } }, "dir" : "levels/1/", "id" : 73 } ], "name" : "levels config", "nameID" : 20, "resources" : { "images" : "68", "sounds" : "", "texts" : "20" } }
}
Обмен событиями
Для оптимизации скорости обмена между вьювером и скриптом в качестве формата сообщения выбран массив вещественных чисел следующего формата:
*число событий *тип события *размер данных события *данные события
...
*тип события *размер данных события *данные события
Данный массив передается параметром в функцию update_handler в каждом кадре (в котором перечислены интервал времени,тачи,системные сообщения), затем скрипт выполняет логику кадра и возвращает аналогичной структуры массив в котором указаны события что и где рисовать.
События из вьювера в скрипт
- DT - Время, после последнего кадра
- размер - 1
- dt - время, после последнего кадра
- Mouse/Touch down - Нажали левую кнопку мыши/тач по экрану
- размер - 2
- x - позиция тача по оси X
- y - позиция тача по оси Y
- Mouse/Touch move - движение нажатой мыши/тача по экрану
- размер - 2
- x - позиция тача по оси X
- y - позиция тача по оси Y
- Mouse/Touch up - отпускание левой кнопки мыши/тача
- размер - 2
- x - позиция тача по оси X
- y - позиция тача по оси Y
- Mouse over - мышь над объектом
- размер - 2
- x - позиция мыши по оси X
- y - позиция мыши по оси Y
- Mouse whell down - скрол мыши вниз
- размер - 2
- x - позиция мыши по оси X
- y - позиция мыши по оси Y
- Mouse whell up - скрол мыши вверх
- размер - 2
- x - позиция мыши по оси X
- y - позиция мыши по оси Y
- Multi touch down - мультитач нажатие
- размер - X
- touches - число тачей
- id - идентификатор тача
- pressed - флаг нажатости
- x - позиция тача по оси X
- y - позиция тача по оси Y
- следующий тач
- Multi touch move - мультитач движение
- размер - X
- touches - число тачей
- id - идентификатор тача
- pressed - флаг нажатости
- x - позиция тача по оси X
- y - позиция тача по оси Y
- следующий тач
- Multi touch up - мультитач отпускание
- размер - X
- touches - число тачей
- id - идентификатор тача
- pressed - флаг нажатости
- x - позиция тача по оси X
- y - позиция тача по оси Y
- следующий тач
- Resize - изменился размер объекта
- размер - 2
- w - ширина объекта
- h - высота объекта