Ползунок (Slider) - это фрейм для пользовательского ввода. Это позволяет пользователю выбирать значение между верхним и нижним пределом. Вы можете определить пределы для каждого слайдера по своему усмотрению. Значение Sliders является локальным, и может отличаться для всех игроков.
В fdf по умолчанию существует 2 слайдера mainFrame. EscMenuSliderTemplate и StandardSliderTemplate. Оба файла находятся в формате fdf и не загружаются по умолчанию.
Заглянул я в интернете что пишут про slider. Слайдер — переключатель изображений (или другого контента) работающий автоматически или вручную.
Вы когда-нибудь делали презентацию? там каждая страница - слайд, и на презентации пультом переключали на след страницу. Только здесь в варкрафте ничего такого нет, нет никаких сменяющих изображении (слайдов) наш slider больше напоминает Scrollbar.
Scrollbar (полоса прокрутки) - аналогично как и в Slider. Только вместо ползунка (Slider) используют bar (полосу) для прокрутки значения.
в реальной жизни можно встретить Scrollbars
Чем отличаются Slider и Scrollbar?
В варкрафте существуют два типа фрейма: SLIDER и SCROLLBAR. Если заглянуть в fdf-files, то они используют одни и те же fdf-функции, между ними нет никаких отличии. Да, мы щас будем думать, что в Slider перемещают ползунок (point), в Scrollbar полосу (bar). Но в варкрафте нет никакой полосы или ползунка, это кнопка button. Более того, у них значок кнопки похож на ползунка, полосы в игре я не видел. В кнопке можно изменить размеры backdrop кнопки, и перерисовать текстуру хоть в точку, хоть в полосу. В близзард используют эти типы для определенных моментов поведения: для горизонтальных перемещении используется слайдер, чаще всего для настроек. Для прокрутки описания текста, области используют scrollbar, чаще всего используются в вертикальном положении, но можно и в горизонтальных. То есть явных отличии нет.
fdf - функции Slider/Scrollbar
SliderInitialValue
SliderInitialValue integer,
Пример:
SliderInitialValue 2, слайдер стартует с этим значением при его создании
SliderInitialValue 2, слайдер стартует с этим значением при его создании
Slider начинает именно с этим значением.
SliderMaxValue
SliderMaxValue integer,
Пример:
SliderMaxValue 100,
SliderMaxValue 100,
По умолчанию 100 - максимальное значение. Максимальное количество выбирается
SliderMinValue
SliderStepSize integer,
Пример:
SliderMinValue 0,
SliderMinValue 0,
По умолчанию 0. Минимальное число по выбору.
SliderLayoutHorizontal
SliderLayoutVertical
SliderStepSize
SliderStepSize integer,
Пример:
SliderStepSize 1,
SliderStepSize 1,
Насколько точно пользователь может выбирать значения.
Переводчик: насколько я понимаю, это значение влияет на шаг смещения. Короче, насколько может сместится ползунок на 1 шаг.
SliderThumbButtonFrame
SliderThumbButtonFrame "FrameName",
Фрейм BUTTON, используемый для перемещения значения SLIDER / SCROLLBAR.
Переводчик: эта функция указывает на кнопку. Это кнопочка будет являться ползунком/полосой
Пример:
SliderThumbButtonFrame "EscMenuScrollThumbButton",
SliderThumbButtonFrame "EscMenuScrollThumbButton",
Я нашел фрейм в fdf-file, оказывается вешают на кнопку BUTTON
SliderThumbButtonFrame "EscMenuScrollThumbButton",
Frame "BUTTON" "EscMenuScrollThumbButton" {
Width 0.016,
Height 0.016,
ControlBackdrop "EscMenuScrollThumbButtonBackdrop",
Frame "BACKDROP" "EscMenuScrollThumbButtonBackdrop" {
DecorateFileNames,
BackdropBlendAll,
BackdropBackground "EscMenuSliderThumbButton",
}
}
в ui/war3skins.txt нашел эту переменную
EscMenuSliderThumbButton=UI\Widgets\EscMenu\Orc\orc-slider-knob.blp
видимо этот ползунок, где то в настройках игры используется. Там никогда игра не паузится, и картинка не Disabled. Короче, у нвшей кнопки BUTTON нет второй Disabled
видимо этот ползунок, где то в настройках игры используется. Там никогда игра не паузится, и картинка не Disabled. Короче, у нвшей кнопки BUTTON нет второй Disabled
Возьмем другой пример:
SliderThumbButtonFrame "EscMenuScrollThumbButton",
Взято из fdf-file:
SliderThumbButtonFrame "EscMenuScrollThumbButton",
Взято из fdf-file:
SliderThumbButtonFrame "EscMenuThumbButtonTemplate",
Frame "BUTTON" "EscMenuThumbButtonTemplate" {
Width 0.016,
Height 0.016,
ControlBackdrop "EscMenuThumbButtonBackdropTemplate",
Frame "BACKDROP" "EscMenuThumbButtonBackdropTemplate" {
DecorateFileNames,
BackdropBlendAll,
BackdropBackground "EscMenuSliderThumbButton",
}
ControlDisabledBackdrop "EscMenuThumbButtonDisabledBackdrop",
Frame "BACKDROP" "EscMenuThumbButtonDisabledBackdrop" {
DecorateFileNames,
BackdropBlendAll,
BackdropBackground "EscMenuSliderDisabledThumbButton",
}
}
в ui/war3skins.txt нашел переменные:
EscMenuSliderThumbButton=UI\Widgets\EscMenu\Orc\orc-slider-knob.blp
EscMenuSliderDisabledThumbButton=UI\Widgets\EscMenu\Human\slider-knobdisabled.blp
EscMenuSliderThumbButton=UI\Widgets\EscMenu\Orc\orc-slider-knob.blp
EscMenuSliderDisabledThumbButton=UI\Widgets\EscMenu\Human\slider-knobdisabled.blp
в пути
UI\Widgets\EscMenu\Human\slider-knob.blp
UI\Widgets\EscMenu\Human\slider-knob.blp
ScrollBarDecButtonFrame
ScrollBarDecButtonFrame "FrameName",
боковой фрейм BUTTON для обработки щелчка Dec.
Пример:
ScrollBarDecButtonFrame "EscMenuScrollBarDecButton",
ScrollBarDecButtonFrame "EscMenuScrollBarDecButton",
в fdf-file найден button-фрейм EscMenuScrollBarDecButton:
ScrollBarDecButtonFrame "EscMenuScrollBarDecButton",
Frame "BUTTON" "EscMenuScrollBarDecButton" {
Width 0.015,
Height 0.015,
ControlBackdrop "EscMenuScrollBarDecButtonBackdrop",
Frame "BACKDROP" "EscMenuScrollBarDecButtonBackdrop" {
BackdropBackground "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarDownButton.blp",
BackdropBlendAll,
}
}
под UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarDownButton.blp
ScrollBarIncButtonFrame
ScrollBarIncButtonFrame "FrameName",
боковой фрейм BUTTON для обработки щелчка In.
боковой фрейм BUTTON для обработки щелчка In.
Пример:
ScrollBarIncButtonFrame "StandardScrollBarIncButton",
ScrollBarIncButtonFrame "StandardScrollBarIncButton",
в fdf-file найден button-фрейм EscMenuScrollBarDecButton:
ScrollBarIncButtonFrame "StandardScrollBarIncButton",
Frame "BUTTON" "StandardScrollBarIncButton" {
Width 0.015,
Height 0.015,
ControlBackdrop "StandardScrollBarIncButtonBackdrop",
Frame "BACKDROP" "StandardScrollBarIncButtonBackdrop" {
BackdropBackground "UI\Widgets\Glues\GlueScreen-Scrollbar-UpArrow.blp",
BackdropBlendAll,
}
}
под UI\Widgets\Glues\GlueScreen-Scrollbar-UpArrow.blp
нативки для работы с sliders
---@param frame framehandle
---@param value real
---@return nothing
function BlzFrameSetValue(frame, value) end -- (native)
---@param frame framehandle
---@return real
function BlzFrameGetValue(frame) end -- (native)
---@param frame framehandle
---@param minValue real
---@param maxValue real
---@return nothing
function BlzFrameSetMinMaxValue(frame, minValue, maxValue) end -- (native)
---@param frame framehandle
---@param stepSize real
---@return nothing
function BlzFrameSetStepSize(frame, stepSize) end -- (native)
пример Slider с импортом fdf
Использовал готовый шаблон EscMenuSliderTemplate
код
Frame "SLIDER" "EscMenuSliderTemplate" {
Height 0.012,
Width 0.139,
SliderLayoutHorizontal,
ControlBackdrop "EscMenuScrollBarBackdropTemplate",
Frame "BACKDROP" "EscMenuScrollBarBackdropTemplate" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuSliderBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.006,
BackdropBackgroundSize 0.006,
BackdropBackgroundInsets 0.0025 0.0025 0.0025 0.0025,
BackdropEdgeFile "EscMenuSliderBorder",
BackdropBlendAll,
}
ControlDisabledBackdrop "EscMenuScrollBarDisabledBackdrop",
Frame "BACKDROP" "EscMenuScrollBarDisabledBackdrop" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuSliderBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.006,
BackdropBackgroundSize 0.006,
BackdropBackgroundInsets 0.0025 0.0025 0.0025 0.0025,
BackdropEdgeFile "EscMenuSliderDisabledBorder",
BackdropBlendAll,
}
SliderThumbButtonFrame "EscMenuThumbButtonTemplate",
Frame "BUTTON" "EscMenuThumbButtonTemplate" {
Width 0.016,
Height 0.016,
ControlBackdrop "EscMenuThumbButtonBackdropTemplate",
Frame "BACKDROP" "EscMenuThumbButtonBackdropTemplate" {
DecorateFileNames,
BackdropBlendAll,
BackdropBackground "EscMenuSliderThumbButton",
}
ControlDisabledBackdrop "EscMenuThumbButtonDisabledBackdrop",
Frame "BACKDROP" "EscMenuThumbButtonDisabledBackdrop" {
DecorateFileNames,
BackdropBlendAll,
BackdropBackground "EscMenuSliderDisabledThumbButton",
}
}
}
вызвал кодом jass:
код
local framehandle fh = BlzCreateFrame("EscMenuSliderTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0, 0)
call BlzFrameSetSize(fh, 0.2, 0.03)
call BlzFrameSetAbsPoint(fh, FRAMEPOINT_CENTER, 0.4, 0.3)
Когда зажимаете за ползунок-кнопку и начинаете двигать, срабатывает событие FRAMEEVENT_SLIDER_VALUE_CHANGED о том, что изменилось значение ползунка BlzGetTriggerFrameValue().
Давайте-ка попробуем другой пример. А что если сделать кнопки In/Dec. Теперь у нас три кнопки Button: ползунок и две In/Dec
fdf код
Frame "SCROLLBAR" "BattleNetScrollBarTemplate" {
Width 0.0165,
SliderLayoutVertical,
ControlBackdrop "StandardScrollBarBackdrop",
Frame "BACKDROP" "StandardScrollBarBackdrop" {
BackdropTileBackground,
BackdropBackground "UI\Widgets\Glues\GlueScreen-Scrollbar-BackdropBackground.blp",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.008,
BackdropBackgroundInsets 0.004 0.004 0.004 0.004,
BackdropEdgeFile "UI\Widgets\Glues\GlueScreen-Scrollbar-BackdropBorder.blp",
BackdropBlendAll,
}
ScrollBarIncButtonFrame "BattleNetScrollBarIncButton",
Frame "BUTTON" "BattleNetScrollBarIncButton" {
Width 0.015,
Height 0.015,
ControlBackdrop "BattleNetScrollBarIncButtonBackdrop",
Frame "BACKDROP" "BattleNetScrollBarIncButtonBackdrop" {
BackdropBackground "UI\Widgets\Glues\GlueScreen-Scrollbar-UpArrow.blp",
BackdropBlendAll,
}
}
ScrollBarDecButtonFrame "BattleNetScrollBarDecButton",
Frame "BUTTON" "BattleNetScrollBarDecButton" {
Width 0.015,
Height 0.015,
ControlBackdrop "BattleNetScrollBarDecButtonBackdrop",
Frame "BACKDROP" "BattleNetScrollBarDecButtonBackdrop" {
BackdropBackground "UI\Widgets\Glues\GlueScreen-Scrollbar-DownArrow.blp",
BackdropBlendAll,
}
}
SliderThumbButtonFrame "BattleNetThumbButton",
Frame "BUTTON" "BattleNetThumbButton" {
Width 0.01,
Height 0.01,
ControlBackdrop "BattleNetThumbButtonBackdrop",
Frame "BACKDROP" "BattleNetThumbButtonBackdrop" {
BackdropBackground "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarKnob.blp",
BackdropBlendAll,
}
}
}
Кодом jass вызвали:
код
local framehandle fh = BlzCreateFrame("BattleNetScrollBarTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0, 0)
call BlzFrameSetSize(fh, 0.03, 0.2)
call BlzFrameSetAbsPoint(fh, FRAMEPOINT_CENTER, 0.4, 0.3)
пример Slider без импорта FDF
Ползунок в вертикальном положении с событием изменения значения. Внутри события отображается новое выбранное значение в виде сообщения. Это работает из коробки.
lua код
do
local real = MarkGameStarted
function MarkGameStarted()
real()
-- create a vertical slider by inheriting from a Scrollbar. It will use esc menu textures
local sliderFrame = BlzCreateFrameByType( "SLIDER", "TestSlider", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI,0), "QuestMainListScrollBar", 0 )
-- clear the inherited attachment
BlzFrameClearAllPoints(sliderFrame)
-- set pos and size
BlzFrameSetAbsPoint(sliderFrame, FRAMEPOINT_TOPLEFT, 0.40, 0.30 )
BlzFrameSetSize(sliderFrame, 0.012, 0.06 )
-- define the area the user can choose from
BlzFrameSetMinMaxValue(sliderFrame, 0, 1000)
-- how accurate the user can choose value
BlzFrameSetStepSize(sliderFrame, 1)
local trigger = CreateTrigger()
-- register the Slider Event
BlzTriggerRegisterFrameEvent(trigger, sliderFrame, FRAMEEVENT_SLIDER_VALUE_CHANGED)
-- this happens when the Slider is pushed
TriggerAddAction(trigger, function()
local frame = BlzGetTriggerFrame()
print(BlzFrameGetName(frame), "new Value", BlzGetTriggerFrameValue())
end)
end
end
Ползунок в горизонтальном положении с фреймом TEXT справа, отображающий текущее значение. Пока мышь указывает на ползунок, вращение курсора мыши приводит к измененному значению, для этого необходимо, чтобы на карте был импортирован Templates.toc с EscMenuTemplates.fdf, на котором выполняется этот код Lua. ТОС.
Образцы для sliders/scrollbars
вот шаблоны
Примеры со sliders