Script Game — различия между версиями

Материал из wiki.appsalutecreator.com
Перейти к: навигация, поиск
 
(не показано 27 промежуточных версий 3 участников)
Строка 1: Строка 1:
[[Object|Объект]] '''JSGame''' служит для встраивания миниигр, написанных на языке Java Script, в редактор
+
[[Object|Объект]] '''ScriptGame''' служит для встраивания игр, написанных на различных скриптовых языках, в редактор
  
 
=Свойства=
 
=Свойства=
  
*'''иконка ресурса 1''' - Графический ресурс иконки монет.
+
*'''скрипт''' - Скрипт игровой механники данного объекта (Type Script, Java Script, LUA ...)
*'''иконка ресурса 2''' - Графический ресурс иконки кристаллов
+
*'''config''' - [[config|конфиг]] для игровой механики. Чтобы добавить конфиг нужно нажать правой кнопкой на области свойств и выбрать "config". После чего загрузить заранее подготовленный конфиг для игровой механики. Как подготовить конфиг см. [[Config|тут]]
  
==Ссылки на объекты==
+
==Структура скрипта==
 +
При сохранении проекта редактором сцен формируется файл scripts.js в котором собран код тех механиик имена которых были указаны в поле "скрипт" (скрипты вьювер забирает с ресурса: http://dart/svn/HO_EDITOR_TOOLS/JavaScript/Last/GameMechanics при сборке).
  
[[Файл:Eitems.jpg|right]]
+
Вьювер при инициализации создает глобальный объект:
*'''economics''' - Ссылка на объект economics.
 
  
*'''таблица''' - Ссылка на таблицу, где будут размещаться шаблоны.
+
<pre>var __viewer = {}</pre>
  
==Ссылки на объекты 1==
+
Затем в зависимости от операционной системы добавляются функции форматирования массива и вывода отладочной информации:
  
[[Файл:Eitems.jpg|right]]
+
Для IOS (WKWebView):
*'''economics''' - Ссылка на объект economics.
+
<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 в каждом кадре (в котором перечислены интервал времени,тачи,системные сообщения), затем скрипт выполняет логику кадра и возвращает аналогичной структуры массив в котором указаны события что и где рисовать.

События из вьювера в скрипт

  1. DT - Время, после последнего кадра
    1. размер - 1
    2. dt - время, после последнего кадра
  2. Mouse/Touch down - Нажали левую кнопку мыши/тач по экрану
    1. размер - 2
    2. x - позиция тача по оси X
    3. y - позиция тача по оси Y
  3. Mouse/Touch move - движение нажатой мыши/тача по экрану
    1. размер - 2
    2. x - позиция тача по оси X
    3. y - позиция тача по оси Y
  4. Mouse/Touch up - отпускание левой кнопки мыши/тача
    1. размер - 2
    2. x - позиция тача по оси X
    3. y - позиция тача по оси Y
  5. Mouse over - мышь над объектом
    1. размер - 2
    2. x - позиция мыши по оси X
    3. y - позиция мыши по оси Y
  6. Mouse whell down - скрол мыши вниз
    1. размер - 2
    2. x - позиция мыши по оси X
    3. y - позиция мыши по оси Y
  7. Mouse whell up - скрол мыши вверх
    1. размер - 2
    2. x - позиция мыши по оси X
    3. y - позиция мыши по оси Y
  8. Multi touch down - мультитач нажатие
    1. размер - X
    2. touches - число тачей
    3. id - идентификатор тача
    4. pressed - флаг нажатости
    5. x - позиция тача по оси X
    6. y - позиция тача по оси Y
    7. следующий тач
  9. Multi touch move - мультитач движение
    1. размер - X
    2. touches - число тачей
    3. id - идентификатор тача
    4. pressed - флаг нажатости
    5. x - позиция тача по оси X
    6. y - позиция тача по оси Y
    7. следующий тач
  10. Multi touch up - мультитач отпускание
    1. размер - X
    2. touches - число тачей
    3. id - идентификатор тача
    4. pressed - флаг нажатости
    5. x - позиция тача по оси X
    6. y - позиция тача по оси Y
    7. следующий тач
  11. Resize - изменился размер объекта
    1. размер - 2
    2. w - ширина объекта
    3. h - высота объекта

События из скрипта во вьювер