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

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

Содержание:
TEXT - это тип фрейма, который имеет несколько применений: он отображает текст на экране или стилизует текст более сложного фрейма. В отличие от String для SimpleFrames, TEXT обладает невидимой прямоугольной рамкой, и расширяется в зависимости от объема текста. Но если задать строгие размеры (можно задать ширину и высоту фрейма), то текст весь влезает только в пределах размеров, а тот что не влез, отсекается.
Также размеры можно обнулить. Пример tooltips, там подсказка расширяется в зависимости от объема текста. Как такое реализовать? ну например, можно зафиксировать размеры: указываем ширину, а высоту обнуляют специально. Чтобы динамично менялся размер высоты TEXT в зависимости от объема текста в нем. Главно зафиксировать на экране. Это то что я понял. высоту обнуляют специально. Чтобы текст расширялся вверх или вниз, а ширина останется такой же. Если привязать нижнюю точку FRAMEPOINT_BOTTOM какому-нибудь другому фрейму, то текст будет вверх расширяться. Иначе, если привязать FRAMEPOINT_TOP наверху, то текст будет вниз опускать. Можно и ширину обнулить. тогда у текста не будет ограничении. Что за ограничения? если размеры есть. То текст должен влез в эти границы. то что не влезает, то та часть отсекается, что не влезла
TEXT может иметь различные Frameevents и будет контролировать пространство экрана, занимаемое его размером или отображаемым текстом (короче в этой прямоугольной области никак нельзя кликнуть по кнопке или по другим объектам за TEXT). Если кто-то этого не хочет, можно отключить TEXT-Frame с помощью BlzFrameSetEnable(frame, false)
Когда он используется как стиль, он определяется как функциональный дочерний фрейм для кнопки в fdf. Как показано ниже, текст является потомком кнопки. Этот код добавляет кнопке текст.
ButtonText "HelpButtonText",
Frame "TEXT" "HelpButtonText" INHERITS "EscMenuButtonTextTemplate" {
    Text "KEY_HELP",
}
У кнопки есть разные состояния: нормальный, выключенный, зажата кнопка, наведена на нее мышь. И в разных ситуациях также может и текст менять шрифт и цвет. У текста такой же список состояния. Эти состояния задают в fdf-files. Щас будем рассматривать fdf функции текста

функции Text fdf

Некоторые типы фреймов имеют одинаковые функции, пример TEXT и String - разные типы, но они похожи.
Внутри fdf можно настроить цвет String/TEXT с помощью некоторых fdf функции. Но также можно раскрасить текст цветовыми кодами warcraft 3 при установке текста в качестве префикса |cff0021ff.
конвертер цветов
FontColor
FontColor red green blue alpha,
FontColor red green blue,
Пример:
FontColor 1.0 0.201 1.0 1.0,
Цвет текста в включенном состоянии. аналогично как и здесь примерно
Пример:
FontColor 0.0 1.0 0.0 1.0
Пример кнопка UpperButtonBarMenuButton имеет
NormalText "UpperButtonBarButtonTextTemplate" "KEY_MENU",
String "UpperButtonBarButtonTextTemplate" {
    Font "MasterFont",0.01,
    FontColor 1.0 1.0 1.0,
}
В норм состоянии текст кнопки (без текста горячей кнопки) выглядит так:
FontDisabledColor
FontDisabledColor red green blue alpha,
FontDisabledColor red green blue,
Цвет текста меняет цвет, когда фрейм текста выключен. Тут имеется в виду, не то чтобы текст должен выключится, и исчезнуть. Такого не происходит, тк большинство текстов привязаны к родителям.
По большинству blizzard примеров с FontDisabledColor, текст сильно затемняется (r=0.2 g=0.2 b=0.2 - темно-серый).
В качестве примера в fdf выставил фрейму такой цвет:
FontDisabledColor 1.0 0.0 0.0 1.0,
В lua code создал текст, и выключил кодом:
BlzFrameSetEnable(TooltipTextFrame, false)
Пример кнопка UpperButtonBarMenuButton имеет
DisabledText "UpperButtonBarButtonDisabledTextTemplate" "MENU",
String "UpperButtonBarButtonDisabledTextTemplate" INHERITS "UpperButtonBarButtonTextTemplate" {
FontColor 0.4 0.4 0.4,
}
В режиме паузы текст кнопки выглядит так:
FontHighlightColor
FontHighlightColor red green blue alpha,
FontHighlightColor red green blue,
Цвет шрифта меняется, когда на родителя навели мышь, т.е. имеет focus. Пример с кнопкой, когда вы наводите курсор мыши на кнопку, сама кнопка подсвечивается. Одновременно, и цвет текст меняет
Пример кнопка UpperButtonBarMenuButton имеет
HighlightText "UpperButtonBarButtonHighlightTextTemplate" "KEY_MENU",
String "UpperButtonBarButtonHighlightTextTemplate" INHERITS "UpperButtonBarButtonTextTemplate" {
    FontColor 1.0 0.83 0.07,
}
Когда курсор мыши наводите на кнопку, цвет кнопки тоже
FontShadowColor
FontShadowColor red green blue alpha,
FontShadowColor red green blue,
Задает цвет тени для текста
FontShadowColor работает совместно с FontShadowOffset
FontShadowOffset
FontShadowOffset offsetX offsetY
Создает позади текста тень, короче точную копию текста.
Смог создать тень с
FontShadowOffset 0.05 -0.05,
FontShadowColor 0.0 0.0 1.0 0.9,
FontJustificationH, FontJustificationV, FontJustificationOffset
Фрейм TEXT имеет невидимую прямоугольную рамку.
Вы можете задавать размер ширины и высоты рамки фрейма. Даже когда вы создадите фрейм TEXT, вы в этой области не можете кликать по объектам, тк клик идет по нашему TEXT. Это доказанный факт
для этих строчек указывают расположение текста внутри, короче это такое выравнивание текста. TextAlignment важен только тогда, когда текст задан прямоугольником. внутри Fdf разделены горизонтальное и вертикальное выравнивание:
nati
BlzFrameSetTextAlignment takes framehandle frame, textaligntype vert, textaligntype horz
Выравнивание по горизонтали (horizontal). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси X в этом TextJustify:
JUSTIFYRIGHT - по правому краю
JUSTIFYLEFT - по левому краю
JUSTIFYCENTER - в центре
Выравнивание по вертикали (vertical). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси Y в этом TextJustify. :
JUSTIFYTOP - по верхнему краю
JUSTIFYMIDDLE - посередине
JUSTIFYBOTTOM - по нижнему краю
FontJustificationOffset x y,
Отображает текст со смещением относительно положения его фреймов.
Если тексту присвоена только точка, это будет однострочный текст. В таком случае тип используемой точки может определять направление, в котором будет расширяться текст, с большим количеством текстовых символов. С TOP, CENTER и BOTTOM текст будет расширяться одинаково с обеих сторон, данная точка является центром. <|> С TOPLEFT, LEFT и BOTTOMLEFT текст будет расширяться вправо. |> С RIGHT, TOPRIGHT и RIGHT текст будет расширяться влево. <| Это может быть важно, когда текстовый фрейм находится рядом с границей 4:3, когда текст расширяется до области 16:9, часть текста текстового фрейма не отображается.
На изображении BACKDROP имеет больший размер, чем TEXT-Frames, поэтому можно четко видеть границу прямоугольника и текст.
Фрейм TEXT имеет невидимую прямоугольную рамку.
Вы можете задавать размер ширины и высоты рамки фрейма. Даже когда вы создадите фрейм TEXT, вы в этой области не можете кликать по объектам, тк клик идет по нашему TEXT. Это доказанный факт
для этих строчек указывают расположение текста внутри, короче это такое выравнивание текста. TextAlignment важен только тогда, когда текст задан прямоугольником. внутри Fdf разделены горизонтальное и вертикальное выравнивание:
native BlzFrameSetTextAlignment takes framehandle frame, textaligntype vert, textaligntype horz
Выравнивание по горизонтали (horizontal). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси X в этом TextJustify:
JUSTIFYRIGHT - по правому краю
JUSTIFYLEFT - по левому краю
JUSTIFYCENTER - в центре
Выравнивание по вертикали (vertical). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси Y в этом TextJustify:
JUSTIFYTOP - по верхнему краю
JUSTIFYMIDDLE - посередине
JUSTIFYBOTTOM - по нижнему краю
FontJustificationOffset x y,
Отображает текст со смещением относительно положения его фреймов.
Если тексту присвоена только точка, это будет однострочный текст. В таком случае тип используемой точки может определять направление, в котором будет расширяться текст, с большим количеством текстовых символов. С TOP, CENTER и BOTTOM текст будет расширяться одинаково с обеих сторон, данная точка является центром. <|> С TOPLEFT, LEFT и BOTTOMLEFT текст будет расширяться вправо. |> С RIGHT, TOPRIGHT и RIGHT текст будет расширяться влево. <| Это может быть важно, когда текстовый фрейм находится рядом с границей 4:3, когда текст расширяется до области 16:9, часть текста текстового фрейма не отображается.
На изображении BACKDROP имеет больший размер, чем TEXT-Frames, поэтому можно четко видеть границу прямоугольника и текст.
код lua-код пример:
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
--the displayed texts
    local texts = {
        "TOP LEFT",
        "TOP Center",
        "TOP RIGHT",
        "Middle LEFT",
        "Middle Center",
        "Middle RIGHT",
        "Bottom LEFT",
        "Bottom Center",
        "Bottom RIGHT"
    }
    --the text justifiers
    local justify = {
        {TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_LEFT},
        {TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_CENTER},
        {TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_RIGHT},
        {TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_LEFT},
        {TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER},
        {TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_RIGHT},
        {TEXT_JUSTIFY_BOTTOM , TEXT_JUSTIFY_LEFT},
        {TEXT_JUSTIFY_BOTTOM , TEXT_JUSTIFY_CENTER},
        {TEXT_JUSTIFY_BOTTOM , TEXT_JUSTIFY_RIGHT}
    }
 
    local back = BlzCreateFrame("QuestButtonBaseTemplate",BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0, 0)
    BlzFrameSetSize(back, 0.28, 0.28)
    BlzFrameSetAbsPoint(back, FRAMEPOINT_CENTER, 0.4, 0.3)

    for index = 1, 9 do
        local textFrame = BlzCreateFrameByType("TEXT", "", back,"",0)
        BlzFrameSetAbsPoint(textFrame, FRAMEPOINT_CENTER, 0.4, 0.3)
        BlzFrameSetSize(textFrame, 0.25, 0.25)
        BlzFrameSetTextAlignment(textFrame, justify[index][1], justify[index][2])
        BlzFrameSetText(textFrame, texts[index])
    end
 end
end
Text
Сюда вы сможете написать текст
Пример:
Text "Привет мир"
Однако, в fdf-files blizzard предпочитают не использовать тексты, вместо них вставляют названия переменных.
в скобках пишут название переменной
"MESSAGING"
Но сам текст описания MESSAGING не смог найти. Это где то в архивах игры поискать нужно
Описание текстов в fdf записаны в переменные, и их можно просмотреть в редакторе карт WE в GameInterface
Однако, текст вроде "Привет мир" не всегда может отобразиться в игре. На другом компьютере у меня почему-то не отобразился этот текст из fdf-file. Как обойти это? может триггерно обратиться к этому фрейму, и изменить текст. См. ниже пример.
FontFlags
No idea

Пример:
FontFlags "FIXEDSIZE",
FrameFont
FrameFont FontName, size, text,
Пример:
FrameFont "MasterFont", 0.011, "",
FontName - шрифт, чтобы разобраться в fdf какие шрифты действительны, вы обязаны посмотреть в ui\war3skins/txt - именно в этой папке сможете понять что за шрифт MasterFont такой. В ui\war3skins.txt вы сможете указать шрифты из fonts\name.ttf
MasterFont действителен, когда в том же кадре используется DecorateFileNames, в противном случае вы пишете filePath (указываете путь).
size - размер шрифта
text - текст
Font
Font FontName, size,
Пример:
Font "InfoPanelTextFont", 0.009,
Стилизует текст строки как дочерний текстовый фрейм для SIMPLEFRAME.

Fonts (Шрифты)

Warcraft 3 (Reforged V1.32.2) имеет шрифты для всех языков, найденных внутри war3.w3mod: шрифты лежат в игре в папке "Fonts\name":
2002.ttf
2002b.ttf
arheigb_bd.ttf
arheiu20m.ttf
arheiu20_md.ttf
arlishuu20_db.ttf
arlishuu30_md.ttf
bl.ttf
blizzardglobal-v5_4.ttf
blq55.ttf
blq55web.ttf
blq85web.ttf
dffn_b31.ttf
dfheilt.ttf
dfheimd.ttf
dfkgothicmd.ttf
dfst-m3u.ttf
frizqt__.ttf
ghei00b_t.ttf
inconsolata-regular.ttf
nimrodmt.ttf
nim_____.ttf
thowr___.ttf
tt5500m_.ttf
ulei00m.ttf
Внутри fdf-файлов не указывают путь к этим ttf, и никак не используется. вы можете заменить в папке ui \ war3skins.txt шрифты или создать свои собственные. Если вы хотите использовать такой шрифт в фрейме потребуется прописать в fdf-файле fdf-действие: "DecorateFileNames," (это действие ищет данные, данное действие доступно в warcraft 3 версии 1.32).
Эти шрифты также могут использоваться в коде при использовании функции SkinManagerGetLocalPath. Например: SkinManagerGetLocalPath ("MasterFont"), чтобы получить путь к файлу "Fonts\BLQ55Web.ttf" из этого файла (из Warcraft 3 V1.32.2)
// шрифты могут быть опционально переопределены локализацией
// Каждое свойство шрифта сначала будет запрошено с помощью <property> _ <locale>, и игра будет использовать эту версию, если она существует. 
// Если свойство, специфичное для локализации, или не существует, оно будет возврат к имени свойства без тега <locale>. 
// Например, чтобы переопределить основной шрифт для корейского языка, вы должны добавить новую запись // MasterFont: koKR = Fonts \ DFHeiMd.ttf // 
// MasterFont:koKR=Fonts\DFHeiMd.ttf
//
// fonts - default
MasterFont=Fonts\BLQ55Web.ttf
MasterFontBold=Fonts\BLQ85Web.ttf
MessageFont=Fonts\BLQ55Web.ttf
ChatFont=Fonts\BLQ55Web.ttf
EscMenuTextFont=Fonts\BLQ55Web.ttf
InfoPanelTextFont=Fonts\BLQ55Web.ttf
TextTagFont=Fonts\BLQ55Web.ttf 

Как создать Text без FDF?

как создать TEXT кодом, не прибегая к импорту fdf?
lua-code
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
    -- create a TEXT Frame
    local frame = BlzCreateFrameByType("TEXT", "MyTextFrame", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
    -- Set the current Text, you can use the Warcraft 3 Color Code
    BlzFrameSetText(frame, "Text on |cffffcc00Screen|r")
    -- pos the frame
    BlzFrameSetAbsPoint(frame, FRAMEPOINT_CENTER, 0.4, 0.3)
    -- stop this frame from taking control of the mouse input, Might have sideeffects if the TEXT-Frame has an enable Color (but this does not have such).
    BlzFrameSetEnable(frame, false)
    -- the text is kinda small, but one can not use the FontNative onto TEXT-Frames (nether in V1.31 nor V1.32). Therefore one could scale it.
    BlzFrameSetScale(frame, 2)
 end
end

как создать TEXT c помощью fdf-импорта?

Можно попробовать использовать backdrop, и к нему привязать текст
fdf-код связки backdrop + text
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 "Привет мир",
   }
}
lua-code
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

Переделка кода

Заметка: в файле fdf Text ”Привет мир”, может не всегда отобразиться этот текст. Не знаю причины. Но на другом компьютере этот текст не отображается. Пришлось подкорректировать jass-код:
lua-code
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)
	local text = BlzGetFrameByName("MyText",0) --получаем text-children

	BlzFrameSetSize(backdrop, 0.1, 0.1)
	BlzFrameSetAbsPoint(backdrop, FRAMEPOINT_CENTER, 0.4, 0.3)
	BlzFrameSetText(text, "всем привет") --привычный “привет мир” изменил на “всем привет”
 end
end

Как создать только текст

fdf-file
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,    
}

//Создаем текст MyText с помощью шаблона MyTextTemplate
Frame "TEXT" "MyText" INHERITS "MyTextTemplate" {
       Text "Привет мир",
}
lua-code
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
	BlzLoadTOCFile("war3mapimported\\templates.toc")  --не забудьте toc-file загрузить

	local text = BlzCreateFrame("MyText", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0, 0)
	BlzFrameSetSize(text, 0.1, 0.1)
	BlzFrameSetAbsPoint(text, FRAMEPOINT_CENTER, 0.4, 0.3)
 end
end

Образцы текста из fdf

Используйте готовые шаблоны текстов TEXT, вы можете не утруждать себя с размерами, шрифтами, подсветкой и пр.
Используйте образцы текстов

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
23
2 года назад
0
А для чего в луа функция BlzFrameSetFont? Звучит вкусно, но у меня почему-то ничего не делает.
0
27
2 года назад
Отредактирован MpW
0
poisoNDealer, для задания шрифта и его размеров. должен работать.
xgm.guru/p/wc3/UI---Simpleframes-uuw <= пример со String правильно ли ты изменяешь, надо со двойными слэшами путь <//>
можно изменять у String, у Text должно быть можно изменять. если никак, попробуй с пустышками. надо смотреть в параметры шаблона Text
что за флаг FontFlags "FIXEDSIZE", <= мб стоит убрать

эта функция BlzFrameSetFont мб для String. Т.е. для simpleframes. Это как например у Texture с BlzFrameSetVertexColor. Никак нельзя изменить
3
23
2 года назад
3
МрачныйВорон, блин, опять эти ваши токи и эфдиэфы 😩
0
17
2 года назад
0
Может быть, флаг FIXEDSIZE (фикс размер) это для того, чтобы размер букв не менялся, при изменении размера окна игры, в запущенном оконном режиме?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.