Перейти к содержимому

MatroseFuchs

Разработчик
  • Публикации

    1 403
  • Зарегистрирован

  • Посещение

  • Бои

    7631
  • Клан

    [LESTA]

Все публикации пользователя MatroseFuchs

  1. Добрый день! В текущей версии клиента все моды устанавливаются в каталог "World_of_Warships\bin\2744482\res_mods\0.9.7.0". Если вы устанавливаете прицел из модпака, то как правило модпаки устанавливают моды в нужную папку и вам остается после установки мода запустить клиент игры, затем в клиенте игры открыть настройки->управление->выбрать прицел->динамический прицел и выбрать из списка установленный. Если же вы устанавливаете вручную, то смотрите инструкцию по установке.
  2. Здравствуйте, пришлите пожалуйста мне в ЛС лог файл "C:\ProgramData\Wargaming.net\World of Warships ModStation\WorldOfWarships.ModStation.log".
  3. MatroseFuchs

    💬 Обсуждение ModAPI

    Прошу прощения, к сожалению ошибся, класс этой кнопки не доступен, тут либо пользоваться простой кнопкой "fl.controls.Button" или нарисовать свой объект кнопки, т.к. сам по себе "scaleform.clik.controls.Button;" еще не кнопка а простой DisplayObject.
  4. MatroseFuchs

    💬 Обсуждение ModAPI

    Свойство видимости у кнопки "visible" пробовали настроить?
  5. MatroseFuchs

    💬 Обсуждение ModAPI

    Забыл еще кое что добавить
  6. MatroseFuchs

    💬 Обсуждение ModAPI

    Здравствуйте. Вам нужно использовать другие кнопки: import scaleform.clik.controls.Button; private var myButton:Button; private var buttonClass:Class = getDefinitionByName("button_default") as Class; # стиль кнопки как в игре myButton = new buttonClass; gameAPI.stage.addChild(myButton);
  7. MatroseFuchs

    [ALL] ModStation

    Обновление модификаций для версии 0.9.0.0 Обновлена и доступна модификация "Счетовод" Обновлена и доступна модификация "Быстрый доступ к сигналам" Обновлена и доступна модификация "Трюм-рей v2" Обновлена и доступна модификация "Компаньон" Исправлена модификация "Расширенный чат BADoBEST" Обновление модификаций происходит при запуске ModStation и не требует переустановки самой программы, достаточно запустить программу и при необходимости применить обновление установленных ранее модификаций игры. С уважением,
  8. MatroseFuchs

    [ALL] ModStation

    Небольшое обновление ModStation Добавлены ссылки на видео превью для следующих модификаций: Nomogram Classic Ламповый набор '12 вариантов' Камо для FSI Amagi Камо для XJBMG Cronus Миникарта от AutoSpy Модифицированный загрузочный экран "ModStation" Ссылка доступна при наведении курсора на картинку превью. С уважением,
  9. В этом руководстве разберем на простом примере как добавить и использовать технологию Unbound на сцене ModAPI. Т.к. верстка Unbound обрабатывается на стороне Flash, то разработка мода будет связана в осноном с файлами ActionScript. Итак, нам понадобится обработчик верстки и основной файл для Flash API аналогичный тому что мы уже делали в предыдущих примерах. Но сначала подготовим XML файлик с простым кодом верстки, над которым будем эксперементировать, например нарисуем квадрат в углу. test_window.xml Создадим XML файл с простенькой версткой простого белого квадрата. Полученный XML файл необходимо прогнать через утилиту "xml2as.bat", чтобы скомпилировать выражения верстки в SWF файл аналогично тому что мы делали с модификацией готовых XML. Полученный SWF файл положим в "..\res_mods\<X.X.X.X>\gui\unbound\flash" и добавим его путь в "..\gui\flash\USSExpressionsLoader.xml". Movie.as Для обработки XML файлов с версткой Unbound нам нужно создать инструмент обработки. Для этого откроем редактор AcrionScript (например FlashDevelop) и создадим новый проект. Основной Flash файл мода назовем, как это принято "Main.as", а для обработки верстки создадим другой и назавем его например "Movie.as" с которого и начнем. Наш класс обработчика Movie нам нужно унаследовать от класса "ScaleformMovie", который мы импортируем из внешней библиотеки "wows_library.swc" (см. настройку редактора), командой "import lesta.dialogs.ScaleformMovie;". В этом родительском классе у нас будет почти весь необходимый арсенал для работы с версткой Unbound. Далее объявим переменную для "элемента" верстки "private var unboundElement:UnboundElement;" и импортируем этот тип данных "import lesta.libs.unbound.UnboundElement;". Еще нам понадобится контроллер для нашего элемента, объявим и его "private var unboundController:UnboundElementController;", так же импортируем его класс "import lesta.dialogs.battle_window_controllers.UnboundElementController;". Т.к. наш класс обработчик унаследован от родительского класса, то теперь необходимо корректно описать главную функцию класса "public function Movie()". Если мы заглянем в родительский класс, то увидим что его главная функция имеет три параметра, поэтому нам тоже нужно задать эти три параметра. При создании экземпляра нашего класса мы передадим туда все необходимые параметры. Теперь в этой функции Movie() по правилам добавим вызов родительского класса (super()) и передадим ему параметры функции нашего класса. Здесь же добавим коллбэк, который будет обновлять размер сцены элемента. Следующую функцию которую мы опишем будет основная функция обработки верстки. Итак, объявим функцию, например назавем ее "public function buildUnboundApplication():void", создадим экземпляр элемента "new UnboundElement()". Теперь нашему элементу нужно указать в свойстве "config" путь до XML файл с версткой. Это можно сделать например указав прямой путь в формате "C:\\Games\\Korabli\\res_mods\\0.8.7.0\\PnFMods\\ubtest\\test_window.xml" (так указывется путь в ActionScript), или добавиф функцию поиска файла "get configPath()", это нужно из-за особенностей загрузки файлов, т.к папка с модом находится вне дериктроии загрузки файлов. После этого в свойстве элемента "rootElementId" укажем название элемента в верстке, который будет главным за отображение на сцене. Далее нам нужно создать экземпляр контроллера элемента "new UnboundElementController()", который будет ответственным за загрузку этого элемента. В свойство "clip" нужно задать экземпляр элемента "unboundElement", через метод "setDataHub" в свойство контроллера добавим экземпляр датахаба "setDataHub(dataHub)", который мы передадим при инициализации "Movie" (этот экземпляр dataHub не будет содержать данных но добавить его нужно), через метод "setUbCentral" добавим экземпляр "protoCentral" (будет содержать все байндинги), который находится в родительском классе "ScaleformMovie", далее с помощью метода "initController()" инициализируем его. Теперь зададим размер сцены элемента вызвав функцию "setStageSize"и передадим ей размеры сцены из оснвного класса Main мода, который мы опишем далее. В функции создадим екземпляр сцены из доступных компонентов "lesta.components.Stage", и зададим атрибуты компонента "width, height, scale и evStageSizeChanged", затем передадим эти размеры контроллеру элемента. И наконец добавим наш элемент на сцену "addChild(unboundElement)". Main.as В оснвном классе мода объявим две переменные - "dataHub:DataHub" и "movie:Movie" (наш обработчик верстки). В главной функции класса создадим экземпляр датахаба и объявим вызов "super();" главной функции родительского класса "ModBase" от которого мы наследуем наш "Main". Переопределим функцию "init()" родительского класса "ModBase" и опишем ее, т.к. она будет выполняться при инициализации (при необходимости можно переопределить другие функции родительского класса). В этой функции нам так же нужно вызвать переопределяемую функцию родительского класса "super.init();", теперь создадим экземпляр обработчика верстки "movie" и передадим ему требуемые параметры "new Movie(dataHub, this.stage, gameAPI)". Далее добавим экземпляр обработчка верстки в контейнер нашего мода "addChild(movie)", добавим обработчику прослушиватель события добавления его на сцену "movie.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);" и добавим ссылку нашего мода на сцену ModAPI "gameAPI.stage.addChild(this)". Опишем последнюю функцию, которая будет вызываться при загрузке обработчика на сцену "onAddedToStage(event:Event)". Чтобы Scaleform принял наш movie, нам нужно создать сущность "entity" с id сцены (id - ComponentClass.stage), компонент сцены "stageComponent" с этим же id, добавить в сущность компонент сцены, получить коллекцию сущностей с компонентами сцен и в эту коллекуию добавить нашу сущность "collection.add(entity)". Теперь мы можем использовать метод нашего обработчика для вывода результата на сцену "movie.buildUnboundApplication();" и удалим прослушиватель, т.к. он нам больше не нужен, наш элемент теперь на сцене ModAPI. Mod on unbound Скомпилируем наш проект и получившийся файл Main.swf (название конечного файла проекта можно задать в свойствах проекта) положим в папку мода. Добавим туда файл Main.py в котором напишем одну строчку "API_VERSION = 'API_v1.0'", т.к. без нее мод работать не будет. В папку с модом добавим наш подготовленный XML файл с версткой, а скомпилированный SWF файл из XML-ки положим в "gui\unbound\flash" и добавим к ней путь в "gui\flash\USSExpressionsLoader.xml". Запустим клиент игры и убедимся что наш мод обработал файл с версткой и отобразил в углу окна игры квадратик белого цвета. Добавляем данные в скоуп Разберем использование такого инструмента как контроллер, который позволяет добавлять данные в скоуп и оперировать ими, и для этого нам понадобится написать свой контроллер. Итак, создадим в проекте новый *.as файл и назавем его "MyUbController", он будет наследовать от класса "UbController". В контроллере переопределим метод "override public function init(param1:Vector.<IUbExpression>):void" чтобы в него можно было передавать вычисленые аргументы. Передадим аргументы в родительский класс "super.init(param1);" и запишем в скоуп строку, которую потом отобразим "scope.myText = "Text";". Наш контроллер готов. Добавим в основной файл "Main.as" контроллер через "import" если файл лежит в подкаталоге, или как в нашем случае контроллер лежит в одном каталоге с другими файлами проекта, тогда просто объявим контроллер "MyUbController;" чтобы инициализировать его и данные контроллера можно было использовать (если ваш контроллер находится в томже каталоге что и Main.as, то импортировать его не требуется), либо настроить ваш редактор таким образом, чтобы при сборке SWF файла он включал так же не используемые файлы проекта. Теперь добавим полученный контроллер в XML файл, добавим текстовый блок и используем данные из скоупа для отображения. Не забываем что полсле изменения верстки необходимо пересобрать ее SWF-ку, в противном случае изменения мы не увидим. Запустим игру и посмотрим на результат. Наш простенький мод готов. PS Для того чтобы перетаскивать наш отрисованный элемент и при этом не ломалась верстка, необходимо создать файл настроек "UserPrefs" в котором они будут храниться и обновляться, и соответственно написать соответствующую логику.
  10. MatroseFuchs

    💬 Обсуждение ModAPI

    Добрый день! С версии 0.8.5 функция "print" больше не выводит информацию в "python.log", но мы добавим метод для ее замены, описание в документации будет добавлено позже.
  11. CSS Tips and Tricks Использование объекта стилей (аналог css-классов) Создание объекта стилей: (def css SomeStyleObject() (position = "absolute") (width = 100%) (height = 100%) ) Вызов: (block (class SomeStyleObject) ) Пример реализации псевдокласса hover Срабарывание ховера при наведении на конкретную область, а не на весь блок Если нужно задать определенныую область в качестве hitArea, то добавьте block с name='hoverArea' и передайте имя блока в свойство hitArea элемента parentElement с помощью объекта $target. Изменение стилей в зависимости от ширины/высоты экрана (аналог медаизапросов)
  12. Styles and CSS Общее описание Блоки поддерживают настройку параметров layout'а через style. Каждый блок обладает своим набором параметров стиля. Настройка стиля у блока tf: (tf (style (fontSize = 32) (textColor = 0xFFFFFFFF) ) (text = 'Hello world!!!') ) Настройка стиля у блока block: (block (style (backgroundColor = 0xffff0000) (width = 100px) (height = 100px) ) ) Настройка стиля у блока mc: Стили можно описывать в отдельном определении. И передавать как параметр в блок в свойство class. (def element TestView() layout = true (block (class BlockStyle) ) ) (def css BlockStyle() (backgroundColor = 0xffff0000) (width = 100px) (height = 100px) ) Значение для свойства class может быть вычислено в выражении, таким образом можно стилизовать блоки в зависимости от условий. Если к блоку будет применено несколько стилей с одинаковыми свойствами, то последующие будут перезаписывать значения предыдущих. Важен порядок применения. (block (class BlockStyle_1) (class BlockStyle_2) ) Примечание: Но если изменить свойство стиля непосредственно в style и передать css как параметр с тем же свойством. То порядок расположения применения стилей не важен. Блок style выполнится последним. Таблица стилей Виды блоков: базовые блоки: tf, mc, image, text_input. контейнер-блоки (наследуются от базового блока): block (и все алиасы hblock, vtile, gtile, reverse, hreverse), list, view_holder, slider, scroll_bar, progress. scrollArea. свойство аналог css кто поддерживает свойство принимаемые значения пример возможных значений width width все блоки number, %, px 10px; 10% minWidth min-width все блоки number, %, px 100px; 50% maxWidth max-width все блоки number, %, px 100px; 50% height height все блоки number, %, px 10px; 10% minHeight min-height все блоки number, %, px 100px; 50% maxHeight max-height все блоки number, %, px 100px; 50% position position все блоки absolute, flow absolute left left все блоки number, %, px 10px; 10% right right все блоки number, %, px 10px; 10% top top все блоки number, %, px 10px; 10% bottom bottom все блоки number, %, px 10px; 10% center смещение от центра все блоки number, %, px -170 hcenter смещение от центра по горизонтали все блоки number, %, px 10px; 10% vcenter смещение от центра по вертикали все блоки number, %, px 10px; 10% marginLeft margin-left все блоки number, %, px 10px marginRight margin-right все блоки number, %, px 10px marginTop margin-top все блоки number, %, px 10px marginBottom margin-bottom все блоки number, %, px 10px paddingLeft padding-left контейнер-блоки number, %, px 10px paddingRight padding-right контейнер-блоки number, %, px 10px paddingTop padding-top контейнер-блоки number, %, px 10px paddingBottom padding-bottom контейнер-блоки number, %, px 10px padding padding контейнер-блоки number, %, px 10px backgroundColor background-color контейнер-блоки 0xARGB 0x1000ff00 backgroundImage background-image контейнер-блоки str, 'url: {url}', 'bitmap: {linkage}', 'symbol: {linkage}' backgroundImage = 'url:..\icons\ico.png' backgroundSize background-size background-repeat контейнер-блоки fill; crop; cover; repeat; autosize backgroundSize = "crop" flow flex-direction контейнер-блоки Flow.HORISONTAL, Flow.VERTICAL, Flow.TILE_HORIZONTAL, Flow.TILE_VERTICAL flow = "Flow.HORISONTAL" align justify-content align-items контейнер-блоки left, right, bottom, top, center, middle align = "middle|right" alpha opacity все блоки number от 0 до 1 1; 0; 0.4 fontSize font-size tf number 36 leading междустрочный интервал tf number letterSpacing letter-spacing tf number 2 fontFamily font-family tf str textColor color tf 0xRGB 0xCFC7A8 textAlign text-align tf left; right; center textAlign = "center" multiline white-space tf bool true; false ubScaleX transform: scaleX() все блоки number изменяет scale блока по горизонтали 1.25 ubScaleY transform: scaleY() все блоки number изменяет scale блока по вертикали 1.25 rotation поворот блока если его позиция absolute все блоки с позицией absolute number (значения угла поворота в градусах) (style (rotation = 30) ) pivotX нулевая точка по X используется для поворота, скейла, абсолютной позиции все блоки с позицией absolute number, %, px (style (pivotX = 50%) ) или (style (pivotX = 100px) ) pivotY нулевая точка по Y используется для поворота, скейла, абсолютной позиции все блоки с позицией absolute number, %, px (style (pivotY = 10%) ) или (style (pivotY = 20px) ) scaleX масштаб по оси X может быть отрицательным, применяется к блоку и его чайлдам все блоки double (style (scaleX = 1.2) ) scaleY масштаб по оси Y может быть отрицательным, применяется к блоку и его чайлдам все блоки double (style (scaleY = -1.0) ) visualOffsetX Смещает DisplayObject, но не влияет на рассчет layout'а родителя все блоки number, %, px 100px; 50% visualOffsetY Смещает DisplayObject, но не влияет на рассчет layout'а родителя все блоки number, %, px 100px; 50% visualScaleX Масштаб по оси X Может быть отрицательным, применяется к блоку и его чайлдам Не влияет на расчет layout'а родителя все блоки double (style (visualScaleX = 1.2) ) visualScaleY Масштаб по оси Y может быть отрицательным, применяется к блоку и его чайлдам не влияет на расчет layout'а родителя все блоки double (style (visualScaleX = 1.2) ) borderRadius Cкругляет все углы блока для отрисовки с заданным радиусом. Работает для backgroundColor и backgroundImage. Выдаёт ошибку для scale9grid! Принимает массив значений: topLeft, topRight, bottomLeft, bottomRight left, right value - применится ко всем углам topLeft, right, bottomLeft не влияет на расчет layout'а родителя все блоки number, %, px (style (borderRadius = [10, 20, 30, 40]) (borderRadius = [20, 10]) (borderRadius = [10]) ) borderRadiusTopLeft, borderRadiusTopRight, borderRadiusBottomLeft, borderRadiusBottomRight Скругляет соответствующий угол блока для отрисовки с заданным радиусом. Работает для backgroundColor и backgroundImage. Выдаёт ошибку для scale9grid! не влияет на рассчет layout'а родителя все блоки number, %, px (style (borderRadiusTopLeft=10px) (borderRadiusTopRight=10px) (borderRadiusBottomLeft=10px) (borderRadiusBottomRight=10px) ) BackgroundSize (def element NationFlagsSmall () layout=true (style (bind backgroundImage "'url:../nation_flags/small/flag_USA.png'" init=false) (backgroundSize = "fill") (width = 117) (height = 72) ) ) cover - растягиваем текстуру по размеру контейнера с сохранением пропорций текстуры, чтобы она заполняла всю площадь, с обрезанием текстуры за пределами контейнера. crop - обрезаем изображение по размеру контейнера. fill - растягиваем изображение по размеру контейнера без сохранения пропорций. align - позиционируем изображение по центру контейнера с обрезанием текстуры за пределами контейнера. BackgroundRepeatX и BackgroundRepeatY (block (style (width = 42) (height = 42) (backgroundImage = 'url:../service_kit/icons/icon_warning_red.png') (backgroundRepeatX = true) (backgroundRepeatY = false) ) ) Повторение изображение по горизонтали и/или вертикали. По-умолчанию отключено. substitute substitute - метод textblock'а, который позволяет заменять подстроки на картинки. init=true - обязательный аргумент (tf (class $TextDefault19NM) (bindcall substitute imageOffset="_frameTextCount" substitutionMap={'[test_icon]' : 'icon_ground_radar_ally' } sourceText='radar: [test_icon] mouse: [KEY_LEFTMOUSE]' postfix='_bg' init=true ) ) Outline Возможность задать стиль обводки для текста. Внимание! Нельзя использовать для большого числа разнообразного по размеру текста - быстро заполняется текстура с глифами и будет влиять на производительность. Нежелательно применять анимацию со scale к такому тексту - могут быть артефакты и др. (tf (class $TextDefault) (style (outlineColor = 0x08222A) #цвет обводки (outlineAlpha = 0.4) #прозрачность обводки (outlineThickness = 1) #толщина обводки (outlineScaled = false) #влияет ли скейл на толщину обводки. При анимации скейла текста всегда выставлять в false ) (text = 'The quick brown fox jumps over the lazy dog. 1234567890?!-+') ) scale9grid набор параметров идентичен background9Slice в unbound1 (def element TestElement() layout=true (mc wows_logo (style (width = "500") (height = "500") (scale9grid = "rect(30)") ) ) )
  13. UI Widgets Symbol Добавление на сцену MovieClip по его имени (linkage). Используется в объявлениях элемента с параметром layout=false. Т.е. создается display object без layout system'ы. Пример использования: (def element TestView() layout=false (symbol 'linkageName') ) (symbol " 'torpedo_markers_ally_c' ") Sprite Добавление на сцену экземпляра класса Sprite. Используется в объявлениях элемента с параметром layout=false. Пример использования: MC Добавление на сцену экземпляра класса MovieClip по его имени (linkage). Используется в объявлениях элемента с параметром layout=true. (т.е. поддержка layout system и styles) Пример использования: (def element TestView() layout=true (mc 'FWCloseButtonSlimMC' (name = 'closeBtnCrossAnim') (bindcall gotoAndPlay "stateFrame") ) ) TextField Добавление на сцену экземпляра класса TextField. Поддерживается во всех элементов с layout=true|false. Для задания текста используется свойство text или htmlText. Если будет задан text и htmlText, применится только последнее действие. Пример использования: (tf (text = 'Hello world!') ) Для случая когда текст слишком большой и не влазит в текстовое поле, существует свойство elideMode. Если elideMode=true, то текст обрезается под размер всего блока и последние 3 символа заменяются на ".". При каждом обрезании текста генерируются event textElideStatus в аргументе передается статус: обрезан текст или нет. substitute substitute - метод textblock'а, который позволяет заменять подстроки на картинки. init=true - обязательный аргумент (tf (class $TextDefault19NM) (bindcall substitute imageOffset="_frameTextCount" substitutionMap={'[test_icon]' : 'icon_ground_radar_ally' } sourceText='radar: [test_icon] mouse: [KEY_LEFTMOUSE]' postfix='_bg' init=true ) ) Element Block Добавляет на сцену контейнер-экземпляр класса Sprite, Все вложенные блоки будут добавляться в этот контейнер и позиционироваться друг за другом взависимости от значения свойства стиля flow. Для block существуют aliases: block - вертикальный блок, дочерние элементы расположены сверху вниз hblock - горизонтальный блок, дочерние элементы расположены слева направо vtile - вертикальный tile блок, дочерние элементы расположены сверху вниз, оборачиваются на нижней границе родителя htile - горизонтальный tile блок, дочерние элементы расположены слева направо, оборачиваются на правой границе родителя reverse - вертикальный блок с обратным порядком элементов в блоке, дочерние элементы расположены снизу вверх hreverse - горизонтальный блок с обратным порядком элементов в блоке, дочерние элементы расположены справа налево Пример: backgroundImage Добавляет на сцену экземпляр класса Bitmap. передать путь до файла (для этого используется R-class - ресурсный менеджер) передать текстуру из атласа - экземпляр класса BitmapData url адрес до изображения в сети Если блоку не заданы размеры в style, то после загрузки изображения размеры блока станут такими же как размеры изображения. (bind backgroundImage "markerIcon") ---------------- (style (bind backgroundImage "'bitmap:' + toLower(markerIcon)") ) ---------------- (block (style (backgroundImage = 'url:../aircraft/icon_lock.png') ) ) Slider Компонент, предоставляющий собой обычный Slider. Имеет ряд переменных скоупа для настройки: value (number) - текущее значение слайдера в единицах (не процент); minimum (number) - минимальное значение; maximum (number) - максимальное значение. enabled (true/false) - доступен ли слайдер. Может отправлять событие: evValueChanged - изменилось значение слайдера. Значения параметров по умолчанию указаны в примере ниже:
  14. Debug Выводит в лог сообщение об ошибке. Активация: Перед запуском клиента в редакторе открыть актуальный файл "Мир Кораблей\bin\<current_build_number>\res\ engine_config.xml" Добавить ключ "engine_config.xml/debug/enableUbPlayerViewLogger = true" <enableUbPlayerViewLogger>true</enableUbPlayerViewLogger> Логирование: лог файл находится в каталоге "Мир Кораблей\profile\ub_player_errors.log"
  15. datahub Datahub - это среда для передачи данных из Game Logic в Unbound. $datahub object Объект $datahub - это точка входа для использования datahub в разметке. Для доступа к datahub в *.unbound используйте ключевое слово "$datahub" внутри eval-выражения: (scope) (var myEntity:cpp = "$datahub.getEntity(123)") (scope) Entity object Сущности (Entities) хранятся в коллекциях (Collections), а также могут быть получены по идентификатору из объекта $datahub. Вы можете получить доступ к компонентам объекта с синтаксисом .dot, то есть: (scope (var myEntity:cpp = "$datahub.getEntity(123)") (var goodComponent:cpp = "myEntity.goodComponent") ) Component object Компоненты - это объекты, содержащие реальные данные. Вы можете получить доступ к свойствам компонента с помощью синтаксиса .dot, то есть: (scope (var myEntity:cpp = "$datahub.getEntity(123)") (var goodComponent:cpp = "myEntity.goodComponent") (var propertyOfGoodComponent:int = "goodComponent.someProperty") )
  16. toplevel def (def) или Definition Конструкция (def object Name) позволяет объявить глобальный объект, доступный для вызова из всей области в рамках рабочих каталогов. Внимание! Имя объекта должно быть уникальным. Не важно в одном или разных файлах эти объявления сделаны. Иначе будет ошибка и только первый объект будет создан (def element TestView()) (def element TestView()) ERROR: Duplicate element definition: 'TestView'
  17. Scope Scope - это хранилище данных, находящихся в распоряжении элемента. Не наследуетcя от родительских элементов. В разметке используется строгая типизация - все используемые переменные и их типы, а также events должны быть объявлены до момента использования в вычисляемом выражении, либо переданы из внешнего scope при вызове элемента. Может содержать переменные (var) объявление события вызов bind dispatch события $Animation контроллер для анимации переменных в scope Примечание: если вы отправляли переменные без имени - список отправки и список получения должны быть согласованными, т.е. первая отправляемая переменная попадает в первую объявленную переменную. Пример: Scope можно описывать в разных частях элемента (пример: переменная level). В итоге при исполнении все части объединятся в один scope. Отображение содержимого scope: (trace "$scope") UBTRACE: Scope: Events: __onParamChange Vars: color : 1.67738e+07 level : 0 radius : 13 Примечание: Переменные, переданные в элемент как аргументы определения, НЕ попадают в scope. В примере выше переменной textStyle нет в scope. При создании экземпляра элемента можно изменять его значения переменных scope: Создание экземляра элемента (element LevelView 'PromoTitleTextStyle' (scope (level = 10) (radius = 40) ) ) Переменные scope при вызове элемента можно синхронизировать с переменными родительского scope Создание экземляра элемента (scope (var parentLevel:number = 15) ) (element LevelView 'PromoTitleTextStyle' (scope (bind level "parentLevel") ) ) Переменным при прямом вызове можно давать имена, поэтому нет необходимости устанавливать их последовательно. (element MinimapBG _boolEnter="boolEnterParent" _scaleRatio="scaleRatioParent) ... (def element MinimapBG (_scaleRatio:number, _boolEnter:bool)) или через контроллер $ Instance: В примерах выше переменные попадают в область видимости элемента только один раз, по вызову. Для дальнейшего обновления переменных во время выполнения вы можете применить эту конструкцию: или через контроллер $ Instance:
  18. Macro Макрос - именованный параметризированный фрагмент верстки, который место вызова заменяет на содержимое макроса на этапе разбора. Тем не менее не может работать со скоупом родителя и переменные для работы нужно передавать как при вызове элемента. Позволяет переиспользовать одинаковые блоки кода несколько раз. Вот одно из самых распространенных использований: Пример использования: После того как макрос был определен, его можно вызывать в любом месте. Пример: # Вызов макроса (macro trace expr="variable") Этот механизм используется для автогенерации scope, который будет связан с python. Пример:
  19. Layout Unbound имеет layout system, которая занимается позиционированием блоков, расположенных в одном контейнере по определенным параметрам. Для включения layout system используется атрибут layout=true|false определения element'a. Описание element c атрибутом layout=true эквивалентно def layout Атрибут объекта «элемент». Используется чаще всего для разметки несокльких элементов друг относительно друга. Т.е. второй дочерний элемент будет построен следом за первым и т.д. Координаты всех дочерних элементов относительны друг друга, т.е. все DisplayObject знаю о размерах друг друга и выстраиваются соответственно. Удобно применять для проектирования сложных объектов, состоящих из нескольких объектов. Так же позволяет использовать атрибут style для изменения внешнего вида и динамического изменения параметров блоков. Пример: Позиционирование блоков Layout system'a позиционирует блоки согласно значения свойства position. Position может принимать следующие значения: flow - layout system'а позиционирует вложенные блоки один за другим (положение одного блока зависит от положения предыдущего), по умолчанию position="flow" absolute - layout system'а исключает блок из потока (списка позиционирования). Для позиционирования блоков относительно друг друга при position="flow" можно использовать следующие свойства стиля: paddingLeft / paddingRight / paddingTop / paddingBottom - отступ слева / справа / сверху/ снизу для вложенных блоков. Если нужно задать сразу все 4 параметра можно использовать следующую конструкцию: (style (padding = [5, 10, 15, 20]) # [paddingLeft, paddingTop, paddingRight, paddingBottom] ) marginLeft / marginRight / marginTop / marginBottom - отступ слева / справа / сверху/ снизу для текущего блока Если нужно задать сразу все 4 параметра можно использовать следующую конструкцию (style (margin = [5, 10, 15, 20]) # [marginLeft, marginTop, marginright, bottom] ) Примечание: Главное отличие margins от paddings в том, что параметры paddings устанавливаются в родительском блоке и влияют на позиционирование вложенных блоков. Margins же влияют на позиционирование текущего блока. gap, hgap, vgap - отступ по горизонтали / вертикали между каждым вложенным блоком Если отступ между блоками по горизонтали и вертикали одинаковый, то можно использовать параметр gap. Пример использования: В результате получим: align - позиционирование всех вложенных блоков как единого блока. Может принимать следующие значения: left - выравнивание контента по левому краю right - выравнивание контента по правому краю top - выравнивание контента по верхнему краю bottom - выравнивание контента по нижнему краю center - выравнивание контента по центру по горизонтали middle - выравнивание контента по центру по вертикали Пример выравнивания блока по левому краю: Можно использовать несколько значений одновременно разделенных "|". Например если требуется выровнять по центру и по вертикали и по горизонтали. Пример: (align = "center | middle") Для позиционирования блоков при position="absolute" вышеперечисленные свойства не применяются, нужно использовать следющие: left / right / top / bottom - отступ от левого / правого / верхнего / нижнего края контейнера, в котором находится блок Пример использования: В результате получим hcenter / vcenter- отступ от центра по горизонтали / по вертикали В результате получим Примечание: Размер блока у которого параметр position="flow" равны размерам вложенных в него блоков. Размер блока у которого параметр position="absolute" по умолчанию равны 0.
  20. Функции для вычисляемых выражений Список глобальных функцией представлен в таблице. Функция Описание Пример abs(number) Математический модуль ceil(number) Наибольшее цело число от данного countdownFormat(numberSeconds, numberOfDigits, isShowMinutes) Форматирует переданное число секунд в формат min:secongs Если минут 0, отображается 00 "countdownFormat(125, 0, true)" floor(number) Наименьшее цело число от данного formatFloatingPoint(number, numberOfDigits=1) Округление дробной части до numberOfDigits знака после запятой. По умолчанию numberOfDigits = 1 Не учитывает региональные настройки формата. Нет разделителя разрядов. "formatFloatingPoint(1.193454334123)" # result 1.2 "formatFloatingPoint(0.423456, 3)" # result 0.423 formatSeparator(number) Группировка целочисленной части на группы по 3 цифры, разделенных пробелами. Округление дробной части до второго знака. Не учитывает региональные настройки формата. Целые числа отображаются без дробной части, а дробные - с 2 знаками после запятой. "formatSeparator(1103569353.789254232)" # result 110 123 123 123.79 Примеры: 999.595 => "999.60" 999.59 => "999.59" 1000.5 => "1 000.50" 999 => "999" 1 999.0 => "1 999" 999.001 => "999.00" max(x, y) Максимальное из двух чисел. return x > y ? x : y (var test: number = "max(smth, smth2)") min(x, y) Минимальное из двух чисел. return x < y ? x : y (var test:number = "min(smth, smth2)") pow(basis, exponent) Возведение числа basis в степень exponent radToGrad(radNumber) Перевод из радиан в градусы gradToRad(gradNumber) Перевод из градусов в радианы round(number) Математическое округление до целого числа "round(0.423456)" # 0 roundToDecimal(number, знаков_после_запятой) Математическое округление до заданного числа знаков после запятой. roundToDecimal(12.1645, 1) # result 12.2 subst(str, array_values, dict_values) Подстановка переданных аргументов в плейсхолдеры "subst('first number is %d, second is %d', [50, 51])" subst('%(min)d - %(max)d', [], {min:1, max:2}) sin(radNumber) Синус угла в радианах cos(radNumber) Косинус угла в радианах tan(radNumber) Тангенс угла в радианах atan2(y, x) Арктангенс от y/x, в радианах. toLower(str) Преобразует прописные символы в строчные toUpper(str) Преобразует строчные символы в прописные tr Локализация строк по IDS isMatch(строка, регулярное_выражение) Подходит ли строка под регулярное_выражение. indexOf(значение, массив) В каком индексе значение находится в массиве (-1 если его там нет). isIn(значение, массив) Есть ли значение в массиве. isStr(значение) isNumber(значение) isBool(значение) Проверка типа значения. toNumber(значение) Приведение значения к числу toNumber('5') → 5 toString(значение) Приведение значения к строке, без каких-либо настроек. Умеет печатать не только числа, но и массивы и словари. toBool(значение) Приведение значения к логическому значению Boolean. toBool(null) → false toBool(5) → true toBool(0) → false toBool('hi') → true toBool('') → false toBool(['hi']) → true toBool([]) → false toBool({'key': 'val'}) → true toBool({}) → false toHex(число, ширина) Печатает шестнадцатеричное целое в строку, с заданной шириной. Если получившееся число короче, чем заданная ширина, то дополняется слева нулями; если длиннее, то старшие биты обрезаются (полезно, чтобы отрезать альфа-канал при печати цвета). shipLevelsToRoman(уровни, супер_корабль=false) Печатает уровни кораблей (массив целых чисел) римскими цифрами, собирает по диапазонам (т.е. массив [1, 2, 4, 5, 6, 7] будет напечатан как "I, II, IV-VII"). Если "супер_корабль"=true, то уровень 11 исключается из диапазона, и добавляется в конце как "★". shipLevelsToRoman([8, 9,10,11], false) # result VIII, IX, X, XI shipLevelsToRoman([8, 9,10,11], true) # result VIII, IX, X, ★ callExternal(имя_команды, массив_аргументов) Вызывает заданную команду Питона с заданными аргументами. log(сообщение) Вызывает команду "inputMapping.onMsg" с заданным сообщением; одновременно – печатает сообщение и отладочную информацию в строку. bind text "log('message')" clamp(число, нижняя_граница, верхняя_граница) Приводит число к диапазону от нижней_границы до верхней_границы. Принцип работы аналогичен функции clamp() в css sqrt(number) Квадратный корень. random() Случайное действительное число от 0 до 1 (включительно) randomFloor(max) Случайное целое число от 0 до макс (включительно) currentServerSeconds() Время на сервере, в секундах и долях секунд. currentClientSeconds() Время, прошедшее после запуска клиента игры, в секундах. formatTime(секунды, формат, локализация, локальное_время) Форматирует время (в секундах), в зависимости от "формата". Варианты следующие: yyyy.MM.dd hh:mm:ss yyyy – полный год yy – год, 2 цифры M, MM – месяц в году, 1 или 2 цифры d, dd – день в месяце H, HH – общее количество часов (включая дни) h, hh – часы (с начала суток) m, mm – минуты (с начала часа) s, ss – секунды (с начала минуты), 1 или 2 цифры HIGHEST – старший ненулевой элемент даты-времени, начиная с месяца: если интервал больше месяца – печатает месяцы, если больше дня – печатает дни, и так до секунд. HIGHESTDAYS - старший ненулевой элемент даты-времени, начиная с дней (т.е. напечатает не "2 месяца", а "63 дня"). HIGHEST,WITH_DAYS - старший ненулевой элемент даты-времени, начиная с месяцев И дней (т.е. напечатает не "2 месяца", а "2 месяца 3 дня"). "Локализация" – суффикс локализации, добавляется после IDS_PL_HOUR_FULL в режимах HIGHEST*. Особое значение "ABB": тогда используются сокращённые локализации, IDS_PL_HOUR. По умолчанию пустой. "Локальное время" – если "true", то дата в режиме "yyyy.MM.dd hh:mm:ss", печатается в клиентском локальном времени, если "false" – то в UTC. В режимах HIGHEST* игнорируется. По умолчанию "false" ("печатать в UTC"). "formatTime(time, 'dd.MM.yy', '', true)" "formatTime(time, 'dd.MM.yyyy hh:mm', '', true)" "formatTime(time,'HIGHEST,WITH_DAYS')" Оператор "in" Оператор in ищет подстроку в строке, элемент в массиве, ключ в ключах (не элементах!) словаря, подмассив или набор ключей в массиве или ключах словаря. 'abc' in 'dfgabc1tyu' 8 in [7, 8, 9] 'szh' in {'bbb':1, 'szh':2, 'vvv':3} ['8', '7'] in {'7':6, '8':0, '9':'aa'}
×