Добавлен , опубликован

Основы Интерфейса

Содержание:
UI: Reading a FDF
кратко: здесь мы знакомимся с fdf-файлом, и учимся читать и понимать его. Может быть не сразу у вас возникнуть понимание fdf-file, как у вашего переводчика. Я даже в хайве прочел статью как читать fdf, и сам ничего не понял, информации было мало. Тут общая информация. Когда я изучал различные типы фреймов, я также изучал различные функции, разгадывая их. Со временем разгаданных fdf-функции стало больше, я начал кое-что понимать. Возможно вам тоже также нужно.
Краткое пояснение fdf file: все эти фреймы в fdf-file это просто шаблоны. Когда в игре создаете фрейм, вы обязательно указываете шаблон. Что может быть в шаблонах? Ну размеры, параметры типа фрейма, картинка, шрифт, различные типы поведения - такого не задать триггерами. Даже вам могут сказать: "а я вот чисто кодом пишу, мне это не нужно". Эти ребята все равно используют готовые шаблоны blizzard, как ни крути задом.

Вступление

Fdf - это тип файла, используемый в warcraft 3 для определения информации, и поведения по умолчанию UI-фрейма. В этом уроке я хочу рассказать вам, как получить фреймы, читая fdf.
Щас будем изучим синтаксис fdf-file. У fdf-file есть свой синтаксис, и свои функции. Щас мы и рассмотрим их.

Комментирование

Строковое комментирование как и в jass внутри fdf-file начинается с двойного слэша «//», а текст после в той же строке после «//» игнорируется. Тут можете свободно писать и комментировать свои мысли и пр.
Также можно создавать многострочные комментарии, как показано в _locales / <language> / ui / framedef / globalstrings. Короче, они создаются для разных языков комментарии
/* Opens the multi line Comment
*
*
*/ End the MultiLine Comment

Основы файла

Синтаксис тут довольно простой. Щас покажу как устроен fdf файл. Часто состоит из многочисленных блоков.
это пример создания простого фрейма. указывают в кавычках тип фрейма, и название.
Frame "BACKDROP" "MyBackdropTemplate" { //заголовок фрейма: тип фрейма, название
    //тело фрейма
}
зная название фрейма, можно обратиться к нему. узнать имя, или обратиться можно с помощью этих нативок
---@param name string
---@param createContext integer
---@return framehandle
function BlzGetFrameByName(name, createContext) end	-- (native)

---@param frame framehandle
---@return string
function BlzFrameGetName(frame) end	-- (native)
пойдем дальше. нужно внутри этого фрейма добавить какие характеристики. Часто туда прописывают параметры типа фрейма. Рассмотреть их можно тут. Когда-то смотрел на дефолтные фреймы, и сравнивал их. Можно скопировать к себе в блокнот. Пример можно в поиск блокнота ввести BACKDROP, и посмотреть какие параметры указаны у BACKDROP. Но разбираться с каждым типом и функции будем в след уроках. Щас я вам объясняю устройство fdf-file.
Не только различные параметры добавить можно, но внутри можно расположить потомка.
Frame "BACKDROP" "MyBackdropTemplate" { //главный фрейм
    Frame "TEXT" "MyTEXT" { //потомок главного фрейма
		//тело фрейма-потомка
    }
}
к потомку можно обратиться этими функциями
---@param frame framehandle
---@param index integer
---@return framehandle
function BlzFrameGetChild(frame, index) end	-- (native)

---@param frame framehandle
---@return integer
function BlzFrameGetChildrenCount(frame) end	-- (native)
есть другой способ
Кратко: у вам могут быть созданы очень много фреймов с одного шаблона. Но доступ к нему можно получить один раз - при создании. Обычно мы указываем в нативках создания имя шаблона. О чем я говорю? О том, что BlzGetFrameByName получает фрейм только в момент создания.
local backdrop = BlzCreateFrame("MyBackdropTemplate", gameUI, 0, 0)
local my_text = BlzGetFrameByName("MyTEXT") //потомок
обратиться к MyTEXT не просто. Поэтому нужно записывать все фреймы в переменные.
если вам удаться получить доступ к потомкам, можно и наоборот, родителя узнать.
---@param frame framehandle
---@param parent framehandle
---@return nothing
function BlzFrameSetParent(frame, parent) end	-- (native)

---@param frame framehandle
---@return framehandle
function BlzFrameGetParent(frame) end	-- (native)
Ну основы синтаксиса вы уже должны сами.

Подключение fdf-file с IncludeFile, и наследование данных фрейма

IncludeFile

Если вкратце, IncludeFile прописывают в самом верху. И подключают другой fdf-file к себе. Многие фреймы могут копировать или точнее наследовать параметры шаблона, поэтому указывают в fdf-функции им название шаблона. Пример, мне нужно взять какой-то шаблон. А если мне нужно из другого fdf-file? Если fdf файл не подключен, я никак не смогу получить доступ

Наследование файлов

Чтобы разобраться зачем нам нужна такая замечательная функция как IncludeFile, мы должны сначала разобраться что же такое наследование файлов. Inherits - наследование / копирование данных одного фрейма при создании другого. В игре мы можем создавать сотню фреймов, наследуя данные одного шаблона-фрейма. Например, кнопка с текстом имеет backdrop (фон), или какое-нибудь такое же меню может иметь точно такой же backdrop, чтобы не писать один и тот же код, наследуют данные шаблона.
Пример, мы создали MyBackdrop, наследуя данные MyBackdropTemlpate
Frame "BACKDROP" "MyBackdropTemplate" {
    BackdropTileBackground,
    BackdropBackground  "UI\Widgets\HeavyBorderBackGround.blp",
    BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
    BackdropEdgeFile    "UI\Widgets\HeavyBorderCorners.blp",
}

//MyBackdrop наследует параметры MyBackDropTemplate, чаще в примерах не телах фреймов не прописываются какие то параметры. Их можно в триггерах добавить. Если и изменяют, то совсем немного
Frame "BACKDROP" "MyBackdrop" INHERITS "MyBackdropTemplate" {
  //тело фрейма
}
Можно прописать так INHERITS frame, так и INHERITS WITHCHILDREN frame.
INHERITS - обычно используют для наследования простого фрейма
INHERITS WITHCHILDREN - если вам нужно наследования не только сам фрейм, но и данные потомков. Пример, кнопка button состоит из нескольких изображении (backdrops), Highlights (подсветок) и пр. Вы можете рассмотреть дефолтные примеры с BUTTON или GLUEBUTTON

IncludeFile

любой fdf-файл может начинаться со списка includeFile. (Если fdf не нужно включать, значит его нет).
Выще мы рассматривали, когда фреймы лежали в одном fdf-file. Теперь нужен другой вариант.
IncludeFile используется, когда фрейм-A в каком-нибудь A.fdf-file хочет скопировать данные какого-нибудь фрейма-B, лежащий в другом B.fdf-file. Это тоже наследование. Для такого копирования A.fdf-file нужно подключить B.fdf-file, тк он не сможет читать данные B-фрейма
обычно есть такие fdf вроде EscMenuTemplates.fdf, где записаны близзардами шаблоны (text, button, slider, backdrop и др элементы интерфейса). И если я хочу создать фрейм button, я могу использовать заготовку. Поэтому я одном fdf файле подключаю файл EscMenuTemplates.fdf
Чтобы наследовать данные из EscMenuTemplates.fdf, нужно подключить его к вашему fdf-file. А как это сделать? с помощью IncludeFile.
пример fdf-кода, где MyBackdrop наследует данные фрейма EscMenuButtonBackdropTemplate из подключенного EscMenuTemplates.fdf
IncludeFile "UI\FrameDef\UI\EscMenuTemplates.fdf",
Frame "BACKDROP" "MyBackdrop" INHERITS "EscMenuButtonBackdropTemplate" {
}
Заметка: Есть еще и другая причина применения этого подключения. не все fdf-file от игры загружаются в игру, поэтому некоторые фреймы недоступны. Обращение к им не вызовет никакой реакции. Но как получить интересные шаблоны из этих файлов? Их тоже придется подключать в игру с IncludeFile.

Ошибки с IncludeFile

кратко: я как переводчик, хочу поговорить об этом. При тестировании часто работаю с импортом, чтобы потестить какую нибудь fdf-функцию. Короче, иногда бывает не работает какой-то шаблон и пр.
Не все дефолтные fdf-file могут быть включены в игре/загружены игрой. Некоторые отключены blizzard. Поэтому вам никак не подключиться с IncludeFile, и наследовать параметры.
Есть несколько вариантов решения:
1. скопировать и перенести шаблон к свой fdf-file
Есть пример, когда нужно вызвать фрейм из не загруженного в игру fdf-file. Пример нужно создать фрейм TextArea с шаблоном EscMenuTextAreaTemplate. Дело в том, что EscMenuTextAreaTemplate содержит готовые данные, можно было использовать его в триггере. Но EscMenuTemplates.fdf не загружается в игру, поэтому надо как-то подключить.
Казалось бы подключи файл, триггером вызывай шаблон EscMenuTextAreaTemplate. и заработает:
IncludeFile "UI\FrameDef\UI\EscMenuTemplates.fdf",
Но так не всегда работает, или совсем не работает. IncludeFile почему то работает только при наследовании. Напрямую я не смог создать с помощью BlzCreateFrame BattleNetTextAreaTemplate и EscMenuTextAreaTemplate, а BlzCreateFrameByType создаются не полностью.
Работает, если я скопирую шаблоны в свой fdf-file, и переименую BattleNetTextAreaTemplate и EscMenuTextAreaTemplate.
Frame "TEXTAREA" "MyTextAreaTemplate1" {
    //DecorateFileNames,
    //FrameFont "MasterFont", 0.011, "",
    TextAreaLineHeight 0.015,
    TextAreaLineGap 0.0,
    TextAreaInset 0.01,

    TextAreaScrollBar "EscMenuTextAreaScrollBarTemplate",
    Frame "SCROLLBAR" "EscMenuTextAreaScrollBarTemplate" INHERITS WITHCHILDREN "EscMenuScrollBarTemplate" {
    }

    ControlBackdrop "EscMenuTextAreaBackdropTemplate",
    Frame "BACKDROP" "EscMenuTextAreaBackdropTemplate" INHERITS "EscMenuControlBackdropTemplate" {
    }
}

Frame "TEXTAREA" "MyTextAreaTemplate2" {
    //DecorateFileNames,
    //FrameFont "MasterFont", 0.011, "",
    TextAreaLineHeight 0.015,
    TextAreaLineGap 0.0,
    TextAreaInset 0.01,

    TextAreaScrollBar "BattleNetTextAreaScrollBarTemplate",
    Frame "SCROLLBAR" "BattleNetTextAreaScrollBarTemplate" INHERITS WITHCHILDREN "BattleNetScrollBarTemplate" {
    }

    ControlBackdrop "BattleNetTextAreaBackdropTemplate",
    Frame "BACKDROP" "BattleNetTextAreaBackdropTemplate" INHERITS "BattleNetControlBackdropTemplate" {
    }
}
2. загрузить с помощью toc-file
нужно использовать file.toc чтобы загрузить fdf-file в игру. И тогда не нужно использовать это то что описал выше. Напомню, многие fdf-files варкрафта 3 изначально могут быть не загружены. Чтобы загрузить их, достаточно прописать эти fdf-files в toc-file. И сам toc-file не забудьте прогрузить в триггере. Только тогда вы сможете триггерно использовать шаблоны из выключенных fdf-files

нельзя указывать одинаковые имена в fdf-files

часто копировал раньше шаблоны. и любил задавать имена. от этого варкрафт вылетал. Даже, если у вас одноименные фреймы находятся в разных fdf-files. Когда игра их подзагрушает, она вылетает. Имейте это в виду. Вот почему я не называю ConsoleUI в своем fdf-file, а называю MyConsole.

Fdf Syntax (основные функции)

Эти fdf-функции используются довольно часто, поэтому у них есть список для себя. Остальные относятся к конкретным типам и упоминаются в их типах фреймов (если они упоминаются).
Frame
создает фрейм
Frame "FRAMETYPE" "FrameName" {
}

Пример:
Frame "FRAMETYPE" "FrameName" INHERITS "FrameNameInherited" {
}

Frame "FRAMETYPE" "FrameName" INHERITS WITHCHILDREN "FrameNameInherited" {
}
Width и Height
Размеры фрейма. Понятное дело, изображение всегда в прямоугольной форме. Width - ширина, Height - высота. Обычно он задается тем фреймам, у которых будет изображение.
Изображение можно подкорректировать триггерной нативкой BlzFrameSetSize(frame, width, height). Без размеров у вас не будет показана изображение.
Width real,
Height real,

Пример:
Width 0.362,
Height 0.037,
Еще есть невидимые фреймы. У них не указано никакое изображение, и им это не нужно. Размер важен, если нужно связать родителя и потомков в одну группу с помощью FRAMEPOINTS. FRAMEPOINTS - точки прямоугольника-фрейма. Если вы перемещаете родителя. То вместе с ним и потомки двигаются.
Однако, размеры мб важны и для кое-чего другого. Пример, кнопка тоже имеет размеры, ей нужны не только для задания размеров иконки, но и для событии. Примеры нажатие/отпускание, ввод/выход курсора мыши и многое другое. Реакция событии важно чтобы курсор лежат внутри кнопки, клик происходил внутри кнопки и пр.
Для того чтобы триггерно изменять размеры фрейма, нужно в fdf файликах тоже задать размеры width height. Иначе, вы не сможете задать размеры в триггерах. Когда тестировал кнопки, часто наблюдал, что если у вас не заданы размеры, то фрейм невидим, тк он фрейм не имеет изначальных размеров Но так бывает не всегда.
Даже для того, чтобы триггерно переместить фрейм в нужную часть экрана, у него должен быть хотя бы размер, тк используем framepoint. framepoints сильно зависят от прямоугольных размеров.
Пример Sprite
Frame "SPRITE" "MySprite" {
//размеры спрайту задал от балды, тк модели mdx размер не изменишь. Но он нужен, чтобы двигать  фрейм
    Width 0.362,
    Height 0.037,

    BackgroundArt "UI\Minimap\Minimap-Waypoint.mdl",
}
<= в данном случае размеры спрайту указывать не нужно было
Если размер не указан, то фрейм-прямоугольник принимает фрейм-точку framepoint_center, конечно, с такими параметрами не увидишь изображение, фрейм становится невидимым. Но можно привязать к этой точке потомков или других фреймов. они будут двигаться за этой точкой. В таком случае, вы не сможете использовать остальные framepoints, кроме одной - framepoint_center. Вы можете двигать центр фрейма, а за ним двигаются связанные фреймы. Это так работает. Однако так не всегда может работать, в зависимости от фреймов, варкрафт это очень странный
Примечание: несмотря на то, что в некоторых fdf-файлах указаны размеры, некоторые фреймы до сих пор не могут отобразиться. Тогда нужно повторно в триггерах задать размеры.
У backdrop к примеру остаются границы-рамки см. рис (границы могут остаться из-за слишком маленьких размеров или при нуле, тогда вам придется убрать границы в fdf):
Чтобы такого не было, нужно в триггерах после создания задать размер:
BlzFrameSetSize(fh, w, h)
Или убрать шаблоны, с которых они сделаны. У фреймов-шаблонов backdrop могут быть указаны границы. Часто фреймы копируют с шаблонов, поэтому мб в триггерах не стоит указывать эти границы в шаблоне, тогда вас и не будут мучать эти границы
UseActiveContext
UseActiveContext,
Что такое Context? По сути это число. Если заглянуть в нативки. Множество фреймов могут использовать один и тот же шаблон, но у каждого разное содержимое (содержание, или контект)
При создании мы указываем context
BlzCreateFrame(name, owner, priority, createContext)
BlzCreateSimpleFrame(name, owner, createContext)
BlzCreateFrameByType(typeName, name, owner, inherits, createContext)
При обращении к этому фрейму, мы задает не только имя, но и context
BlzGetFrameByName(name, createContext)
Проще сказать, что так можно пронумеровать фреймы и его потомков.
Зачем нужен Context? Это форма обращения к фрейму, выможете обратиться по номеру. Все именные фреймы-шаблоны имеют названия "MyName". Если я создам из этого шаблона 10 фреймов, то одноименный фрейм будет переписываться. Если первый фрейм имеет "MyName", то не смогу обратиться к нему по имени BlzGetFrameByName (name, createContext), тк переменная записана на новый, т.е. последний. Поэтому для этого рекомендуется каждому отдельному фрейму при создании задавать новый номер, нумеровать.
Зачем нужен UseActiveContext? Эта функция fdf-file создана для наследования/копирования номера контекста родителя. Условно говоря, это тоже форма обращения к фреймам, только это для потомков. При создании шаблона из fdf-file можете создавать не как отдельный одиночный фрейм, а как целую группу фреймов, достаточно создать лишь главный фрейм-родитель, который состоит из более мелких элементов. UseActiveContext задает такой contex, как и у родителя. Если родитель имеет context = 0, то и потомки имеют тот же параметр. Это очень удобно, если группы фреймов имеют одинаковые фреймы, но разный контекст.
Если UseActiveContext задавать вне меин фрейм, то это бесполезная функция. Полезна, если шаблон используется для большой похожей группы фреймов, но разного содержания (контента).
Пример шаблон кнопки: один и тот же шаблон кнопки примененим не только для одной кнопки, будут отличия: изображения, размеры, расположения. Внизу есть пример, имеет разные контексты центральной панели. 0-5 - основная группа иконок с текстами, 6 - иконка атрибута героя с доп группой
У этих фреймов есть дочерние фреймы с одинаковыми именами, отличается только createContext.
"InfoPanelIconBackdrop" the image
"InfoPanelIconLevel" the shown techLevel (text)
"InfoPanelIconLabel" Damage/Armor и др..
"InfoPanelIconValue" the amount
вернемся к примерам
пример fdf-кода
    //MyBackdrop - главный фрейм и родитель. Ему тоже могут задать в триггерах CreateContex
	Frame "BACKDROP" "MyBackdrop" {
		//MyText - потомок MyBackdrop
		Frame "TEXT" "MyText" {
            UseActiveContext, //MyText копирует номер Context своего родителя, т.е. MyBackdrop
        }
    }
код при создании срздает 10 фреймов с одинаковым шиблоном, но с разными CreateContex
gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local backdrop
for a=1, 10 do
	--в аргументах функции задаем номер контекста
	backdrop  = BlzCreateFrame("MyBackdrop",gameUI, 0, a)
end
Если я хочу обратиться к 5 фрейму. Достаточно вызвать имя фрейма
BlzGetFrameByName ("MyBackdrop", 5)
Аналогично, можно вызвать и потомка
BlzGetFrameByName ("MyText", 5)
Таким образом, UseActiveContext позволяет группировать группы фреймов. Пример, кнопка состоит из отдельных элементов: текстуры, hightlight (свечения), зарядов, подсказки и много чего. Удобнее обращаться именно так. Хотя на луа не составление проблем написать лишние переменные, кто как привык. Но это знание может пригодиться
IncludeFile
ncludeFile "FilePath",
В вашем fdf-файле можно подключить другой fdf-file, чтобы использовать фреймы из последнего файла.
Короче, в варкрафте очень много fdf-files, даже вы можете собственный fdf-files создать. Там указаны типы фреймов, характеристики, расставлены размеры фреймов, позиции фреймов. Проще говоря очень много шаблонов. Чтобы не делать их с нуля или переписывать, можно подгрузить их из другого файла.
Пример в Templates.fdf есть шаблон MyButton. И я хочу использовать ее, чтобы ее использовать в моем fdf-files мне необходимо сначало подключить IncludeFile <путь>/Templates.fdf. А потом ваша кнопка можно наследовать параметры MyButton
Фреймы из включенного Fdf могут быть унаследованы в этом fdf. Следует использовать вне рамок. В одном fdf можно использовать несколько действий IncludeFile.
DecorateFileNames
Этот флаг подключает поиск имен.
В этом фрейме все FdfActions, запрашивающие FilePaths, будут использовать вместо них variableNames, которые берутся из StringList или некоторого Txt-файла, такого как GameInterface.
DecorateFileNames,
Поиск имен файлов в некоторой таблице строк (например, в игровом интерфейсе)
Примечание переводчика: сначала мне тоже был непонятна эта функция. Позже я разгадал ее назначение. Короче, некоторым фреймам можно задать файл
в виде полного пути
BackdropBackground "UI\Widgets\Glues\GlueScreen-Button1-SmallBorder.blp",
здесь не нужно прописывать DecorateFileNames. Посмотрите в fdf-files и проверьте сами.
или в виде переменной
DecorateFileNames,
BackdropBackground  "EscMenuEditBoxBackground",
Без DecorateFileNames будет вот так:
а все потому что игра не стала искать переменную
DecorateFileNames применима не только к BackdropBackground, но и к другим функциям и даже типам фреймов. Короче, используется для всех фреймов. Данные можно посмотреть в ui/war3skins.txt или в электронных таблицах
EscMenuEditBoxBackground=UI\Widgets\EscMenu\Human\editbox-background.blp
Примечание:
в некоторых типах фреймов может не работать из-за этого флага. К примеру, если указать путь и файл, и одновременно оставить включенным флаг, то при попытке показать в игре у вас будет все изображение зеленым. пп: Из-за этого флага я не мог понять почему не отображается импортированное изображение
Примеры:
здесь используем строковую переменную или проще название
Frame "HIGHLIGHT" "CommandButtonActiveHighlight" {
    DecorateFileNames,
    HighlightType "FILETEXTURE",
    HighlightAlphaFile "CommandButtonActiveHighlight",
    HighlightAlphaMode "ADD",
}
здесь не нужно использовать флаг DecorateFileNames, иначе у вас не отобразиться.
Frame "HIGHLIGHT" "CommandButtonNoActiveHighlight" {
    HighlightType "FILETEXTURE",
    HighlightAlphaFile "ReplaceableTextures\CommandButtons\Nonactivebutton.blp",
    HighlightAlphaMode "ADD",
}
LayerStyle
LayerStyle "IGNORETRACKEVENTS",

LayerStyle "NOSHADING",

LayerStyle "NOSHADING|IGNORETRACKEVENTS"
IGNORETRACKEVENTS - Не запускает события Frame Mouse и не может быть нажат. TEXT и FRAME могут найти хорошее применение для этого.
NOSHADING - не работает
Texture
Texture {
}

Texture "FrameName" {
}

Texture "FrameName" INHERITS "FrameNameInherited" {
}
Определяет текстуру-фрейм, используется только для простых фреймов. Изображение. Подробнее об этом В категории SimpleFrames.
String
String {
}

String "FrameName" {
}

String "FrameName" INHERITS "FrameNameInherited" {
}
Определяет String-Frame, используется только для SimpleFrames. Текст. Подробнее об этом В категории SimpleFrames.

FDF-Keywords

Список ключевых слов, используемых в fdf. Это не типы фреймов, это действия внутри тел фреймов. В этом списке перечислены только названия действий, для реального использования посмотрите список под ним.
список (подробнее изучать их будет в след уроках на типах фрейм)
------- основные функции -------------
IncludeFile
DecorateFileNames
UseActiveContext
StringList список строк пример горячие клавиши
LayerStyle
------- Размеры фрейма --------------------
Height
Width
------- Positionate Frames -----------
Anchor
SetAllPoints
SetPoint
------- Texture ----------------------
Texture
File
AlphaMode
TexCoord
NormalTexture file-texture активная картинка
DisabledTexture file-texture выключенная картинка (пример во время паузы)
PushedTexture file-texture картинка при прожатии
CheckedTexture file-texture галочка при SimpleCheckBox
UseHighlight file-texture
------------- String ---------------
NormalText
DisabledText
HighlightText
TextLength
String
------- Backdrop ---------------------
BackdropBackground file-texture основное изображение
BackdropBackgroundInsets real Right, real TOP, real Bottom. real Left, сужаем картинку с разных сторон
BackdropTileBackground включает режим Tile mode
BackdropBackgroundSize real размер tile при включении BackdropTileBackground
BackdropBlendAll прозрачность картинки BackdropBackground
либо указываем общий файл рамок
BackdropEdgeFile file-texture
или одиночные файлы рамок
BackdropBottomFile file-texture
BackdropLeftFile file-texture
BackdropRightFile file-texture
BackdropTopFile file-texture
устанавливает границы
BackdropCornerFile file-texture углы границ
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R" какие границы отобразить
BackdropCornerSize real размер границ
BackdropHalfSides not idea
BackdropMirrored зеркально переворачивает изображение
------- Text --------------------
Text string можете написать текст
Font FontName, size,
FrameFont FontName, size, text,
FontColor red green blue alpha цвет шрифта в активном состоянии
FontDisabledColor red green blue alpha цвет шрифта в выключенном состоянии (пример во время паузы)
FontFlags not idea какие то фиксированные значения задает
FontHighlightColor red green blue alpha цвет шрифта меняется, когда на него наводят курсор
FontShadowColor red green blue alpha цвет шрифта тени
FontShadowOffset offsetX offsetY создает позади текста тень. корочек копию текста
выравнивание текста этими функциями
FontJustificationH flagH выравнивание в горизонтальном положении (право, лево, посередине)
FontJustificationV flagV выравнивание текста в вертикальном положении (вверх, низ, центр)
Отображает текст со смещением относительно положения его фреймов.
FontJustificationOffset x,y
------- Sprite --------------------
BackgroundArt file-model
------- TextButton --------------------
ButtonPushedTextOffset real offsex, real offsety смещение текста при нажатии. эффект продавливания кнопки
ButtonText frame-TextButton указываем текст, где настройки
------- Simple bar --------------------
BarTexture
------- ChatDisplay --------------------
ChatDisplayBorderSize
ChatDisplayEditBox
ChatDisplayLineHeight
ChatDisplayScrollBar
------- Реакция на различные моменты --------------------
Текстуры изображения backdrop
ControlBackdrop file-texture активная картинка
ControlDisabledBackdrop file-texture выключенная картинка (пример во время паузы)
ControlStyle "AUTOTRACKHIGHLIGHTONFOCUSHIGHLIGHTONMOUSEOVER" задает реакции
Текстуры изображения backdrop с эффектами свечения и продавливания при AUTOTRACK
ControlPushedBackdrop file-texture активная картинка при клике
ControlDisabledPushedBackdrop file-texture выключенная картинка (пример во время паузы)

ControlFocusHighlight file-texture текстура-эффект свечения при фокусировке при HIGHLIGHTONFOCUS
ControlMouseOverHighlight file-texture текстура-эффект свечения при наводки курсора на фрейм при HIGHLIGHTONMOUSEOVER

HighLight - галочка, флаг для checkbox
CheckBoxCheckHighlight file-texture активная картинка checkbox пример галочка, флаг
CheckBoxDisabledCheckHighlight file-texture выключенная картинка checkbox (пример во время паузы)

------- Highlight --------------------
HighlightType "FILETEXTURE" или "SHADE" тип HighLight
HighlightAlphaFile file-texture обычно у всех картинок есть альфа-канал. Работает вместе с HighlightType "FILETEXTURE"
HighlightAlphaMode "ADD" или "BLEND" способ взаимодействия с фреймами ниже
HighlightColor red green blue alpha изменяет цвет текстуры. Работает вместе с HighlightType "SHADE"
------- Slider / Scrollbar --------------------
SliderLayoutHorizontal разместить слайдер в горизонтальном положении
SliderLayoutVertical разместить в вертикальном положении
SliderInitialValue integer начинаем именно с этого значения
SliderMaxValue integer макс значение
SliderMinValue integer мин значение
SliderStepSize integer шаг смещения ползунка/полосы
SliderThumbButtonFrame button ползунок или полоса
две кнопки по краям слайдера, одна в одну сторону перемещает, другая в другую
ScrollBarDecButtonFrame button
ScrollBarIncButtonFrame button
------- TextArea --------------------
TextAreaInset
TextAreaLineGap
TextAreaLineHeight
TextAreaMaxLines
TextAreaScrollBar
связаны с фокусом клавиатуры
TabFocusDefault
TabFocusNext
TabFocusPush
ControlShortcutKey
------------ EditBox ----------------
EditBorderSize
EditCursorColor
EditTextFrame
---------- Frame ---------------
Frame
--------- DIALOG ----------------
DialogBackdrop file-texture фон диалога
----------- Layer ----------------
Layer
----------- LISTBOX --------------
ListBoxBorder
ListBoxScrollBar
---------- MENU ---------------
MenuBorder
MenuItem
MenuItemHeight
MenuTextHighlightColor
--------- POPUP MENU ---------------
PopupArrowFrame
PopupButtonInset
PopupMenuFrame
PopupTitleFrame

UI: toc-File

кратко: toc-file немного отличается от fdf-file. В fdf-files лежат шаблоны-фреймы. В toc-file прописывают списки fdf-files. А зачем он нужен toc-file? Он просто включает / загружает в игру fdf-files. Думаете, что взял и просто положил fdf-file в карту, и у вас все заработает? Игра все равно этот файл не будет видеть. Также хочу напомнить, что в игре некоторые дефолтные fdf-files отключены. Вы можете включить это с помощью toc-file.
Файл TOC - это файл со списком одного или нескольких файлов fdf (расширение toc-file, можете блокнотом открыть). Каждая строка - это путь к одному файлу fdf. Каждый fdf - это отдельный файл. В Warcraft 3 эти TOC-файлы используются для загрузки перечисленных файлов fdfs.
После того, как fdf был загружен в игру с использованием TOC, прослушивающего его, можно создать основные фреймы, определенные в fdf. Главные фреймы находятся вне блоков внутри фреймов {}
TOC-файл не чувствителен к регистру.
Можно загрузить файл TOC-file, используя встроенную в Warcraft 3 1.31 native.
native BlzLoadTOCFile takes string TOCFile returns boolean
Функция BlzLoadTOCFile возвращает истину, если TOC-файл был загружен успешно. Было бы разумно создать новую функцию, сообщающую вам, если загрузка TOC завершилась неудачно / успешно.
По умолчанию загружается "ui / framedef / framedef.toc", он содержит большинство файлов fdf по умолчанию для warcraft 3.
UI\FrameDef\GlobalStrings.fdf
UI\FrameDef\InfoPanelStrings.fdf
UI\FrameDef\NetworkStrings.fdf
UI\FrameDef\DateStrings.fdf
UI\FrameDef\Glue\DialogWar3.fdf
UI\FrameDef\Glue\MapInfoPane.fdf
UI\FrameDef\Glue\AdvancedOptionsDisplay.fdf
UI\FrameDef\Glue\AdvancedOptionsPane.fdf
UI\FrameDef\Glue\ListBoxWar3.fdf
UI\FrameDef\Glue\MapListBox.fdf
UI\FrameDef\Glue\DecoratedMapListBox.fdf
UI\FrameDef\Glue\MapPreferenceBox.fdf
UI\FrameDef\Glue\CheckListBox.fdf
UI\FrameDef\Glue\MainMenu.fdf
UI\FrameDef\Glue\MovieScreen.fdf
UI\FrameDef\Glue\Loading.fdf
UI\FrameDef\Glue\LoadSavedGameScreen.fdf
UI\FrameDef\Glue\OptionsMenu.fdf
UI\FrameDef\Glue\SinglePlayerMenu.fdf
UI\FrameDef\Glue\ViewReplayScreen.fdf
UI\FrameDef\Glue\CustomCampaignMenu.fdf
UI\FrameDef\Glue\CampaignMenu.fdf
UI\FrameDef\Glue\TeamSetup.fdf
UI\FrameDef\Glue\PlayerSlot.fdf
UI\FrameDef\Glue\Skirmish.fdf
UI\FrameDef\Glue\ScoreScreen.fdf
UI\FrameDef\Glue\LocalMultiplayerJoin.fdf
UI\FrameDef\Glue\LocalMultiplayerCreate.fdf
UI\FrameDef\Glue\LocalMultiplayerLoad.fdf
UI\FrameDef\Glue\GameChatroom.fdf
UI\FrameDef\Glue\CampaignListBox.fdf
UI\FrameDef\Glue\BattleNetMain.fdf
UI\FrameDef\Glue\BattleNetMatchmakerPanel.fdf
UI\FrameDef\Glue\BattleNetNewsBox.fdf
UI\FrameDef\Glue\BattleNetUserListBox.fdf
UI\FrameDef\Glue\BattleNetChatPanel.fdf
UI\FrameDef\Glue\BattleNetChatActionMenu.fdf
UI\FrameDef\Glue\BattleNetStandardPanel.fdf
UI\FrameDef\Glue\BattleNetTeamPanel.fdf
UI\FrameDef\Glue\BattleNetTeamInvitation.fdf
UI\FrameDef\Glue\BattleNetProfilePanel.fdf
UI\FrameDef\Glue\BattleNetCustomJoinPanel.fdf
UI\FrameDef\Glue\BattleNetCustomCreatePanel.fdf
UI\FrameDef\Glue\BattleNetCustomLoadPanel.fdf
UI\FrameDef\Glue\BattleNetScheduledGame.fdf
UI\FrameDef\Glue\BattleNetChatroom.fdf
UI\FrameDef\Glue\BattleNetFriendsListBox.fdf
UI\FrameDef\Glue\BattleNetFriendsPane.fdf
UI\FrameDef\Glue\BattleNetClanMateListBox.fdf
UI\FrameDef\Glue\BattleNetClanPane.fdf
UI\FrameDef\Glue\BattleNetClanInvitation.fdf
UI\FrameDef\Glue\BattleNetStatusBox.fdf
UI\FrameDef\Glue\BattleNetIconSelectBox.fdf
UI\FrameDef\UI\ConsoleUI.fdf
UI\FrameDef\UI\AllianceSlot.fdf
UI\FrameDef\UI\AllianceDialog.fdf
UI\FrameDef\UI\ChatDialog.fdf
UI\FrameDef\UI\LogDialog.fdf
UI\FrameDef\UI\EscMenuMainPanel.fdf
UI\FrameDef\UI\EscMenuOptionsPanel.fdf
UI\FrameDef\UI\EscMenuSaveGamePanel.fdf
UI\FrameDef\UI\GameResultDialog.fdf
UI\FrameDef\UI\UpperButtonBar.fdf
UI\FrameDef\UI\ResourceBar.fdf
UI\FrameDef\UI\SimpleInfoPanel.fdf
UI\FrameDef\UI\SuspendDialog.fdf
UI\FrameDef\UI\UnresponsiveDialog.fdf
UI\FrameDef\UI\ReplayPanel.fdf
UI\FrameDef\UI\ObserverPanel.fdf
UI\FrameDef\UI\QuestDialog.fdf
UI\FrameDef\UI\TimerDialog.fdf
UI\FrameDef\UI\Leaderboard.fdf
UI\FrameDef\UI\Multiboard.fdf
UI\FrameDef\UI\CinematicPanel.fdf
UI\FrameDef\UI\ScriptDialog.fdf
UI\FrameDef\UI\GameSaveSplashDialog.fdf
UI\FrameDef\UI\BrowserFrame.fdf

Хотя есть еще 3 fdf по умолчанию, предоставляющие довольно полезные базовые шаблоны фреймов, которые может быть полезно иметь на вашей карте, если вы не создаете собственный пользовательский fdf.
ui\framedef\ui\escmenutemplates.fdf
ui\framedef\glue\standardtemplates.fdf
ui\framedef\glue\battlenettemplates.fdf
Путь, записанный в файле TOC, - это файл, который будет загружать игра. Для импортированного fdf укажите путь, который вы импортировали на карту.
Рекомендуется добавить пустую строку в конец текста TOC-файлов. Ошибка на ptr без пустой конечной строки.
Example (Пример)
"myStatusBar.toc" imported to "war3mapImported\myStatusBar.toc"
"myStatusbar.fdf" imported to "war3mapImported\myStatusBar.fdf"
TOC-Content
    war3mapImported\myStatusBar.fdf
В этом примере эта строка кода загрузит импортированный TOC-файл.
call BlzLoadTOCFile("war3mapimported\\mystatusbar.toc")
TOC-файлы важны, когда вы хотите создать новые фреймы или загрузить дополнительную fdf.
Статья взята с хайва, и там же есть пример как этим пользоваться. ССЫЛКА

Как проверить создан ли фрейм?

кратко: этот краткий абзац посвящен дебагу. И к нашем предыдущим урокам по импорту с fdf-file и toc. Когда вы создаете какой-то объект, например кнопка. А эта кнопка загружает шаблон из fdf-file. Часто вы будете сами создавать и пробовать в fdf-file. В этих файлах нужно постоянно химичить, тестить и проверять, и находить какой-то идеальный вариант. А то варик такой, что-то работает, а что-то не работает как надо. Бывает напишешь большой fdf-file, а он не работает. И уже не знаешь, где не работает.
проверять по хэндлу
print(GetHandleId(button)) - вернет 0, если не создан. Значит смотрим этот FRAME, и пробуем исправить.
проверка кол-ва потомков, если они указаны в fdf-file:
print(BlzFrameGetChildrenCount(button))
Проверяйте нет ли в вашем файле одинаковых имен у главных фреймов. fdf-file не любят одноименные фреймы, и ваш fdf-file он полностью может не загрузиться, и обрывает поток данных внизу. Это может привести к тому, что часть данных из fdf-file не загрузится, и скажем button она не создается в игре, тк шаблон не существует, не загружен. Если у вас фрейм невидимый, не имеет текстуры или текста, типа FRAME можно проверить дебагом выше.
Еще смотрите какие ошибки прописали до и после в fdf-file. Если у вас до этого норм работало, и вы внесли изменения. Может неправильное имя шаблона скопировали. Может какая-то неверная строчка не дает и обрывает игру. Даже к вылетам приводит, если вы дико не то делаете (я вот тестил, мне было интересно). Пример, у каждого типа фрейма есть свои fdf-функции. Если внести ненужные действия, то приводит к вылету или шаблон не загружается. Отключайте строчку за строчкой, и тогда вам станет ясно, где не работает.

не все шаблоны в fdf-file прогружаются до конца

Это одна эта одна из причин, почему у вас не создается фрейм. Где-то в fdf-file вы допустили ошибку, и поток обрывается. Видимо там какая то потоковая прогрузка. нижние фреймы, если они там были, могут никогда не прогрузиться в игру. И аы не сможете создать.
пример, я специально допустил ошибку. достаточно символ не тот прописать (хотя хз, в некоторых случаях может и вылететь). ранее хотел прописать вместо BarTexture path_texture, хотел поставить модель BackgroundArt "UI\Minimap\Minimap-Waypoint.mdx". Мне подсказали, что можно статус-бар анимировать моделькой. В результате чего, у меня не создаётся фрейм полностью. См пример ниже, фрейм MyBar создаётся частично, а вот потомку "MyBarBackground" я не мог задать текстуру. Еще ниже в этом же fdf-file указаг спрайт "MinimapWaypoint", его я тоже не смог создать. При том, что ранее спрайт создавался, отображался правильно. Мучения, брр.
Frame "SIMPLESTATUSBAR" "MyBar" {
   Width 0.07,
   Height 0.012,
   //ниже строчка - ошибка
   BarTexture BackgroundArt "UI\Minimap\Minimap-Waypoint.mdx",
   
   //далее норм
   Layer "BACKGROUND" {
       Texture "MyBarBackground" {
           File "Replaceabletextures\Teamcolor\Teamcolor27.blp",
       }
   }
}

Frame "SPRITE" "MinimapWaypoint" {
    BackgroundArt "UI\Minimap\Minimap-Waypoint.mdx",
}
автор хайва:
Последняя версия Warcraft 3 сообщает вам о синтаксических ошибках пользовательского fdf. Когда они загружаются поверх файла toc на вашей карте. Чтобы проверить такой журнал ошибок, запустите карту с помощью файлов fdf и toc, затем закройте игру и проверьте Users (Пользователи) \ User (ваше имя на windows) \ Documents \ Warcraft III \ Logs \ War3Log.txt.
Такая строка Fdf-ошибки в этом лог-файле может выглядеть так:
11/8 15:44:54.356 Error (war3mapImported\Test.fdf:4): Expected ",", but found "Height"
где 11/8 15:44:54 - дата и время
Error (war3mapImported\Test.fdf:4) - означает в каком файле ошибка, и 4 - номер строки, где произошла ошибка. Очень удобный дебаггер.
Expected ",", but found "Height" - после пишут какая ошибка произошла. Здесь написано, что не найдена высота, короче не указана.
5/8 10:05:40.910 MyTemplates.fdf: Error opening file - а здесь пишут, что такой файл не может открыть. Это происходит из-за повреждения или его отсутствия файла. Проверьте также правильно ли назван файл. Название fdf-file должно соответствовать тому, что указано в toc
К сожалению, похоже, что он сообщает вам только о первой обнаруженной ошибке и не сообщает о какой-либо ошибке, если в toc нет необходимой пустой конечной строки. Если у вас несколько ошибок: может быть последовательно придеться искать: исправляешь одну, появляется другая. дебаг только сверх вниз чекает, и приостанавливается проверку, если обнаружена ошибка. Если ошибок нет, вам ничего не напишут в логе, он находится в самом низу War3Log.txt.

Примеры создания toc-file и fdf-file

Если я желаю создать какой-либо файл, что я должен делать. Сначала, вы можете попытаться создать чисто кодом фреймы. Если фреймы не создаются с нужными нам характеристикам или такое нельзя осуществить без изменения/задания характеристик - тогда придеться браться за ковырянием импорта.
Сейчас мы просто учимся создавать файлы. Поэтому этот абзац посвящен этому.
  1. составить макет. Пример, хочу создать простое окно с текстом. вы можете использовать либо импортные текстуры или готовые вариковские текстуры (для вторых нужно поискать информацию, полазав в архивах игры: путь текстуры, название).
  1. Создаем fdf-file. Открываете блокнот, и запихиваете туда инфу. Часто, я копирую из оригинала шаблоны. Зачем мне с нуля там писать? берем похожее. Пример, мне нужны шаблоны BACKDROP и TEXT. Берем и ищем шаблоны. Я вот в архивах беру любой, и потом подправляю слегка. Хотя бывает много не нужных данных.
fdf код
Frame "TEXT" "MyTextTemplate" { //Шаблон текста
    DecorateFileNames,
    FrameFont "EscMenuTextFont", 0.011, "",
    FontJustificationH JUSTIFYLEFT,
    FontJustificationV JUSTIFYMIDDLE,    
    FontFlags "FIXEDSIZE",
    FontColor 0.99 0.827 0.0705 1.0,
    FontHighlightColor 1.0 1.0 1.0 1.0,
    FontDisabledColor 0.2 0.2 0.2 1.0,
    FontShadowColor 0.0 0.0 0.0 0.9,    
    FontShadowOffset 0.002 -0.002,    
}

Frame "BACKDROP" "MyBackdrop" {
    DecorateFileNames,
    BackdropTileBackground,
    BackdropBackground  "QuestDialogNormalBackground",
    BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
    BackdropCornerSize          0.0125,
    BackdropBackgroundSize      0.128,
    BackdropBackgroundInsets    0.005 0.005 0.005 0.005,
    BackdropEdgeFile  "QuestDialogNormalBorder",

    //Создаем текст MyText с помощью шаблона MyTextTemplate
   Frame "TEXT" "MyText" INHERITS "MyTextTemplate" {
    SetPoint LEFT,  "MyBackdrop", LEFT, 0.01, 0.0,
        FontJustificationH JUSTIFYLEFT,
       Text "Привет мир",
   }
}
заметка: BACKDROP - фон или рисунок с границами, и TEXT - строка со шрифтом и размером, цветом. Об этих типах позже поговорим. BACKDROP - это наше окно. К нему привязан TEXT. В триггерах достаточно создать родителя BACKDROP.
иногда можно подключать другие fdf-files, чтобы из них получать доступ к шаблонам
  1. Создаем toc-file. Тоже открываем блокнот, прописываем туда путь. toc-file загружает эти fdf-file в игру.
это три fdf-files являются дефолтными, которые лежат в архиве. Они в игре отключены/не загружены.
UI\FrameDef\Glue\standardtemplates.fdf
UI\FrameDef\UI\escmenutemplates.fdf
UI\FrameDef\Glue\battlenettemplates.fdf
  1. импортируем
  1. В триггерах загружаем toc-file. чтобы потом работать с шаблонами
кусок кода
function LoadToc takes string s returns nothing
    if BlzLoadTOCFile(s) then
        call BJDebugMsg("Loaded: "+s)
    else
        call BJDebugMsg("Failed to Load: "+s)
    endif    
endfunction

call LoadToc("war3mapimported\\mybackdrop.toc") //Loads the custom toc file
  1. создаем в триггерах фрейм
код
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
	BlzLoadTOCFile("war3mapimported\\templates.toc")  --не забудьте toc-file загрузить

	local backdrop = BlzCreateFrame("MyBackdrop", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0, 0)
	BlzFrameSetSize(backdrop, 0.1, 0.1)
	BlzFrameSetAbsPoint(backdrop, FRAMEPOINT_CENTER, 0.4, 0.3)
 end
end
пример с backdrop
пример с камерой
выше ссылки, в которых объясняют работу. Мб и не полностью показывают устройство. Лучше перейти по ссылкам на хайв, и там посмотреть карты. ваш переводчик сначала учился по ним. Часто я просто открывал карту с backdrop. тк backdrop самый простой пример

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...