Эту подстатью создал лично сам переводчик
1. эффект продавливания
этот эффект наблюдается в промежутке нажатия down и отпускания up. Вы можете зажать кнопку, и не отпускать ее, вы можете заметить этот эффект. Что происходит? меняется иконка на другую. Есть образцы близзард, где иконка сплющивается размерами, т.е. становится меньше размерами. Точно также можно заметить у checkbox иконка фона подсвечивается, т.е. обычный фон меняется фон со свечением (короче картинка меняется).
CommandButton - это кнопка на панеле. У нее не наблюдаются эффекты свечении при наводке мышью, нету фокуса. Эффекты свечения при наводке мыши - это все образцы взяты от текстовых кнопок главного меню. И фокус мыши применяется для определенных кнопок интерфейса, тоже образец. Нам не нужны эти эффекты свечения и фокуса. Нам нужно повторить похожий эффект продавливания.
SimpleButton
Есть похожий пример с simplebutton там я искусственно вызвал эффект. когда вы кликаете, кнопка становится меньше. здесь только динамично нельзя менять текстуры в игре, приходится писать в fdf-файл.
пример fdf-кода для SimpleButton:
Texture "MyNormalTexture" {
File "ReplaceableTextures\CommandButtons\BTNSelectHeroOn.blp",
}
Texture "MyPushedTexture" {
//0.008-0.0010 если размер MyPushedTexture меньше от реального 0.039x0.039, то получается эффект продавливания. Только учтите, если триггерно задать размер кнопки MySimpleButton, то будет очень сильное продавливаться, что не очень хорошо. Триггерно размеры MyPushedTexture изменить нельзя
Width 0.039,
Height 0.039,
File "ReplaceableTextures\CommandButtons\BTNSelectHeroOn.blp",
}
Texture "MyDisabledTexture" {
File "ReplaceableTextures\CommandButtonsDisabled\DISBTNSelectHeroOn.blp",
}
Texture "MyButtonHighlight" {
File "UI\Widgets\EscMenu\Orc\orc-options-button-highlight.blp",
AlphaMode "ADD",
//File "UI\Glues\ScoreScreen\scorescreen-tab-hilight.blp",
//AlphaMode "ADD",
}
Frame "SIMPLEBUTTON" "MySimpleButton" {
Width 0.039,
Height 0.039,
//ButtonPushedTextOffset 0.001 -0.001, //<- эта строчка для текста, а не для иконок
NormalTexture "MyNormalTexture",
PushedTexture "MyPushedTexture",
DisabledTexture "MyDisabledTexture",
UseHighlight "MyButtonHighlight",
}
и lua-код:
do
local real = MarkGameStarted
function MarkGameStarted()
real()
LoadToc("templates.toc")
local trigger = CreateTrigger()
TriggerAddAction(trigger, function()
print("Button Click")
-- SimpleButton does not keep the focus.
end)
local button = BlzCreateSimpleFrame("MySimpleButton", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.9, 0.3)
BlzTriggerRegisterFrameEvent(trigger, button, FRAMEEVENT_CONTROL_CLICK)
end
end
Вот текущая остается без изменения, жму-жму и ничего не происходит с SimpleButton, тк размеры соответствуют (свечение при наводке мыши можно убрать в fdf-file, можете не обращать внимание):
Заходим в fdf-file изменяем размеры текстуры MyPushedTexture на :
Width 0.038,
Height 0.038,
Width 0.038,
Height 0.038,
Если нужно убедиться в этом, можете еще уменьшить размер текстуры MyPushedTexture на:
Width 0.037,
Height 0.037,
Width 0.037,
Height 0.037,
Width 0.034,
Height 0.034,
Height 0.034,
Вывод с SimpleButton: как я говорил динамично менять триггерами текстуры не выходит (есть обходной вариант, но об этом в след уроках). Мне придеться тогда в fdf-file писать на каждую иконку кнопку с заданным изображением. Плюс еще и подсказки tooltip как то присобачить нужно будет. опыт интересен, мб как то пригодится.
GlueButton
кратко: лично я,ваш переводчик, по молодости юной только переводил и сам пытался понять как запускать разные эффекты и сравнивал различные fdf-шаблоны. Оказывалось проще на готовом все, и все работало. У меня не было времени все разбирать до винтиков. Когда было необходимо заменить CommandButton как “меню строительства” - это SimpleButton. Как simplebutton функционал не богат, и динамично не получится менять изображение, поэтому я решил не заморачиваться с simpleframe, и попробовать GlueButton. Взял примеры с хайва и код, и попытался потестить. Но тут работают некоторые эффекты, которые мне не нравятся. К примеру, когда наводите мышкой на кнопку - она подсвечивается. Свечение необходимо было убрать. За это отвечает ControlStyle "HIGHLIGHTONMOUSEOVER" - ее надо убрать
Все это мы разбирали ранее. Смотрели какие Control и ControlStyle необходимо было прописывать. Понятное дело, что нужно:
- ставим ControlStyle "AUTOTRACK",
- изображение иконки ControlBackdrop "CommandButtonBackdrop",
- изображение иконки при продавливании ControlPushedBackdrop "CommandButtonPushedBackdrop",
fdf код
Frame "GLUEBUTTON" "CommandButtonTemplate" {
Width 0.039,
Height 0.039,
ControlStyle "AUTOTRACK",
//включенный backdrop (активный фон)
ControlBackdrop "CommandButtonBackdrop",
Frame "BACKDROP" "CommandButtonBackdrop" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuButtonBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.0125,
BackdropBackgroundSize 0.256,
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
BackdropEdgeFile "EscMenuButtonBorder",
}
//backdrop при нажатии/клике кнопки
ControlPushedBackdrop "CommandButtonPushedBackdrop",
Frame "BACKDROP" "CommandButtonPushedBackdrop" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuButtonPushedBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.0125,
BackdropBackgroundSize 0.256,
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
BackdropEdgeFile "EscMenuButtonPushedBorder",
}
//выключенный backdrop такое происходит во время паузы
ControlDisabledBackdrop "CommandButtonDisabledBackdrop",
Frame "BACKDROP" "CommandButtonDisabledBackdrop" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuButtonDisabledBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.0125,
BackdropBackgroundSize 0.256,
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
BackdropEdgeFile "EscMenuButtonDisabledBorder",
}
//выключенный backdrop при нажатии кнопки
ControlDisabledPushedBackdrop "CommandButtonDisabledPushedBackdrop",
Frame "BACKDROP" "CommandButtonDisabledPushedBackdrop" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuButtonDisabledPushedBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.0125,
BackdropBackgroundSize 0.256,
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
BackdropEdgeFile "EscMenuButtonDisabledPushedBorder",
}
}
Обычно при клике не получается эффекта продавливания:
Нужно не только изображение CommandButtonBackdrop менять, но и иконку клика CommandButtonPushedBackdrop менять. Нужно проверить меняется ли при клике ваше изображение.
вызвал Lua-код:
вызвал Lua-код:
код
LoadToc("templates.toc")
--создаем кнопку
local buttonFrame = BlzCreateFrame("CommandButtonTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
--иконка
local buttonIconFrame1 = BlzGetFrameByName("CommandButtonBackdrop", 0)
BlzFrameSetTexture(buttonIconFrame1, "ReplaceableTextures\\CommandButtons\\BTNHumanBuild", 0, true)
--иконка клика
local buttonIconFrame2 = BlzGetFrameByName("CommandButtonPushedBackdrop", 0)
BlzFrameSetTexture(buttonIconFrame2, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, true)
-- Place the buttonFrame to the center of the screen
BlzFrameSetAbsPoint(buttonFrame, FRAMEPOINT_CENTER, 0.4, 0.3)
-- Give that buttonFrame a size
BlzFrameSetSize(buttonFrame, 0.05, 0.05)
-- create the trigger handling the Button Clicking
local trigger = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger, buttonFrame, FRAMEEVENT_CONTROL_CLICK)
-- this happens when the button is clicked
TriggerAddAction(trigger, function()
local frame = BlzGetTriggerFrame()
print(BlzFrameGetName(frame),"was Clicked")
end)
выше изменение размера кнопки BlzFrameSetSize(buttonFrame, 0.05, 0.05) никак не повлияло на размеры изображения backdrops, сколько не изменяй. Обычно размеры Width Height изображения backdrops принимают точки и размеры с помощью это нативки BlzFrameSetAllPoints(buttonIconFrame, button) . И после этого дочерний элемент buttonIconFrame принимает размеры родителя.
Дочерним фреймам никак нельзя изменить размеры Width Height из-за родителя. И еще текстуры backdrop могут быть не заданы, поэтому они принимают станд размеры => иконки становятся очень маленькие. Тут надо смотреть как задано внутри fdf-file, пример:
fdf код
Frame "GLUEBUTTON" "CommandButtonTemplate" {
Width 0.039,
Height 0.039,
ControlStyle "AUTOTRACK",
ControlBackdrop "CommandButtonBackdrop",
Frame "BACKDROP" "CommandButtonBackdrop" {
}
ControlPushedBackdrop "CommandButtonPushedBackdrop",
Frame "BACKDROP" "CommandButtonPushedBackdrop" {
}
ControlDisabledBackdrop "CommandButtonDisabledBackdrop",
Frame "BACKDROP" "CommandButtonDisabledBackdrop" {
}
ControlDisabledPushedBackdrop "CommandButtonDisabledPushedBackdrop",
Frame "BACKDROP" "CommandButtonDisabledPushedBackdrop" {
}
}
Короче, было много тестов, я их не стал выводить сюда. Вывод такой: у потомков кнопки не указан размер, поэтому она так тупит. изображения backdrops берут в fdf-шаблонах, если и менять то только там. Однако, я не смог там тоже изменить размеры Width Height, как это было в SimpleButton (триггерно тоже не хочет изменять размеры). размеры Width Height задают только родителю, внутри тела родителя нельзя писать размеры потомкам. Пробовал внутри тела фрейма GLUEBUTTON прописывать, не получается. для этого используют шаблоны, в mainframes можно тк они не являются чьи-либо потомками. используем шаблоны CommandButtonBackdropTemplate и CommandButtonPushedBackdropTemplate, чтобы записать хотя бы размеры. А то у меня без этого не хочет работать, текстура иконки кнопки маленькая получается. Пришлось потомкам наследовать параметры шаблонов через INHERITS:
fdf код
Frame "BACKDROP" "CommandButtonBackdropTemplate" {
Width 0.039,
Height 0.039,
}
Frame "BACKDROP" "CommandButtonPushedBackdropTemplate" {
Width 0.034,
Height 0.034,
}
Frame "GLUEBUTTON" "CommandButtonTemplate" {
Width 0.039,
Height 0.039,
ControlStyle "AUTOTRACK",
ControlBackdrop "CommandButtonBackdrop",
Frame "BACKDROP" "CommandButtonBackdrop" INHERITS "CommandButtonBackdropTemplate" {
}
ControlPushedBackdrop "CommandButtonPushedBackdrop",
Frame "BACKDROP" "CommandButtonPushedBackdrop" INHERITS "CommandButtonPushedBackdropTemplate" {
}
ControlDisabledBackdrop "CommandButtonDisabledBackdrop",
Frame "BACKDROP" "CommandButtonDisabledBackdrop" INHERITS "CommandButtonBackdropTemplate" {
}
ControlDisabledPushedBackdrop "CommandButtonDisabledPushedBackdrop",
Frame "BACKDROP" "CommandButtonDisabledPushedBackdrop" INHERITS "CommandButtonPushedBackdropTemplate" {
}
}
Fdf-files указаны разные размеры, но приняли размеры кнопки. Триггерно размеры тоже не изменить. Единственное, что можно посмотреть какие есть еще инструменты в fdf-file?
Друзья, я забыл что можно изменить размеры backdrop с помощью BackdropBackgroundInsets
CommandButtonPushedBackdrop задаю размер BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
пример:
пример:
fdf код
Frame "GLUEBUTTON" "CommandButtonTemplate" {
ControlStyle "AUTOTRACK",
ControlBackdrop "CommandButtonBackdrop",
Frame "BACKDROP" "CommandButtonBackdrop" {
}
ControlPushedBackdrop "CommandButtonPushedBackdrop",
Frame "BACKDROP" "CommandButtonPushedBackdrop" {
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
}
ControlDisabledBackdrop "CommandButtonDisabledBackdrop",
Frame "BACKDROP" "CommandButtonDisabledBackdrop" {
}
ControlDisabledPushedBackdrop "CommandButtonDisabledPushedBackdrop",
Frame "BACKDROP" "CommandButtonDisabledPushedBackdrop" {
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
}
}
На экране слишком сильно сплющилось. Надо будет потом увеличить немного.. Вы теперь знаете как уменьшать размеры.
Триггерный способ
Есть другой вариант:
Менять размеры триггерами, у нас есть события: клика ЛКМ FRAMEEVENT_CONTROL_CLICK нажатия
Менять размеры триггерами, у нас есть события: клика ЛКМ FRAMEEVENT_CONTROL_CLICK нажатия
FRAMEEVENT_MOUSE_DOWN и отпускания FRAMEEVENT_MOUSE_UP . Однако, работает не идеально, дело в том, что событие нажатия FRAMEEVENT_MOUSE_DOWN не работает, и отследить никак. Еще событие отпускания ЛКМ FRAMEEVENT_MOUSE_UP происходит, если курсор мыши все еще находится внутри фрейма. Если не отпуская ЛКМ, и курсор мыши переместить за пределы фрейма, и отпустить кнопку, то триггер не засекает за пределами фрейма.
Сравнивал обычные стандартные кнопки варкрафта, там отслеживают клик и отпускание. С самодельными фреймами такое не повторить. вот пример с станд кнопками:
Какой же вывод можно сделать? И как же мне отслеживать отпускание кнопок вне фрейма?
Вывод:
можно отследить начала клика, изменив размер иконки кнопки нативкой BlzFrameSetSize(frame, width, height)
отследить отпускание кнопки внутри фрейма <= значит успех. Однако, он не работает за пределами. Короче, событие триггера не очень хорошее
отследить отпускание кнопки за пределами фрейма можно с помощью
кнопки мыши
есть два события отслеживания нажатия кнопки:
событие нажатия/продавливания клавиши
TriggerRegisterPlayerMouseEventBJ( trigger, player, bj_MOUSEEVENTTYPE_DOWN )
события отпускания клавиши
TriggerRegisterPlayerMouseEventBJ( trigger, player, bj_MOUSEEVENTTYPE_UP )
Вывод:
можно отследить начала клика, изменив размер иконки кнопки нативкой BlzFrameSetSize(frame, width, height)
отследить отпускание кнопки внутри фрейма <= значит успех. Однако, он не работает за пределами. Короче, событие триггера не очень хорошее
отследить отпускание кнопки за пределами фрейма можно с помощью
кнопки мыши
есть два события отслеживания нажатия кнопки:
событие нажатия/продавливания клавиши
TriggerRegisterPlayerMouseEventBJ( trigger, player, bj_MOUSEEVENTTYPE_DOWN )
события отпускания клавиши
TriggerRegisterPlayerMouseEventBJ( trigger, player, bj_MOUSEEVENTTYPE_UP )
проблема вот в чем, эти два события отслеживают нажатие и отпускание ЛКМ и ПКМ. Короче, точно нельзя сказать какая кнопка будет нажата: правая или левая. Это решается проверкой условием
Можно отслеживать вход курсора мышь внутрь фрейма или выход курсора мыши из фрейма с помощью MOUSE_ENTER, MOUSE_LEAVE. А нажатие и отпускание ЛКМ отслеживать событием мыши
lua код
do
local real = MarkGameStarted
function MarkGameStarted()
real()
--загрузка toc-file
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
--загружаем toc-file
LoadToc("templates.toc")
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
--Вариант с продавленной кнопкой
local button = BlzCreateFrameByType("GLUEBUTTON", "", gameUI, "", 0)
--создаем обычную текстуру
local buttonIconFrame = BlzCreateFrameByType("BACKDROP", "MyIconButtonIcon", button, "", 0)
BlzFrameSetAllPoints(buttonIconFrame, button)
BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.3)
BlzFrameSetSize(button, 0.039, 0.039)
BlzFrameSetTexture(buttonIconFrame, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, false)
--фейковая невидимая подсказка, которую привязываем к кнопке. При наведении курсора мыши на кнопку она видима игрой. Определяет лежит ли мышь на кнопке. Тк нажатие фрейма никак не зафиксировать обычными событиями вроде FRAMEEVENT_MOUSE_DOWN
local tooltip = BlzCreateFrameByType("FRAME", "", button, "", 0)
BlzFrameSetTooltip(button, tooltip)
BlzFrameSetVisible(tooltip, false)
local cursor_on_the_button = false
local left_button_pressed = false
local count = 0
local timer = CreateTimer()
--периодически таймером с помощью подсказки проверяем лежит ли курсор мыши на кнопке
TimerStart(CreateTimer(), 1.0/32, true, function()
if BlzFrameIsVisible(tooltip) then
cursor_on_the_button = true
--print("курсор на кнопке")
else
cursor_on_the_button = false
end
end)
--прожимание кнопки-фрейма (down button) не отслеживается, только отпускание (up button) или клик (click button). Поэтому решаем другим способом, через мышь
local trigger_click_mouse = CreateTrigger()
TriggerRegisterPlayerMouseEventBJ( trigger_click_mouse, GetLocalPlayer(), bj_MOUSEEVENTTYPE_DOWN )
TriggerRegisterPlayerMouseEventBJ( trigger_click_mouse, GetLocalPlayer(), bj_MOUSEEVENTTYPE_UP )
TriggerAddAction(trigger_click_mouse, function()
count = count + 1
if not left_button_pressed then
if ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT )and cursor_on_the_button then
BlzFrameSetEnable(button, false)
BlzFrameSetEnable(button, true)
print(count..") ".."DOWN")
--print(count..") "..GetPlayerName(GetTriggerPlayer()).." down left button mouse on the: "..BlzFrameGetName(button))
left_button_pressed = true
PauseTimer(timer)
BlzFrameSetSize(button, 0.039, 0.039)
TimerStart(timer, 1.0/32, FALSE, function()
BlzFrameSetSize(button, 0.037, 0.037)
--если в этом момент уже отпущена кнопка, то отпускаем размер
if not left_button_pressed then
--но отпускаем не сразу, нам нужно показать 0.037. А потом отпустить
TimerStart(timer, 1.0/32, FALSE, function()
BlzFrameSetSize(button, 0.039, 0.039)
end)
end
end)
end
else
BlzFrameSetEnable(button, false)
BlzFrameSetEnable(button, true)
left_button_pressed = false
--если кнопка нажата (размер 0.037), то отпускаем размер
if BlzFrameGetHeight(button)~=0.039 and BlzFrameGetWidth(button)~=0.039 then
BlzFrameSetSize(button, 0.039, 0.039)
end
print(count..") ".."UP")
--print(count..") "..GetPlayerName(GetTriggerPlayer()).." up left button mouse on the: "..BlzFrameGetName(button))
end
end)
local trigger_down_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_down_button, button, FRAMEEVENT_MOUSE_DOWN)
--BlzTriggerRegisterFrameEvent(trigger_down_button, ChargeContent, FRAMEEVENT_MOUSE_DOWN)
TriggerAddAction(trigger_down_button, function()
--print(GetPlayerName(GetTriggerPlayer()).." down button: "..BlzFrameGetName(BlzGetTriggerFrame()))
end)
local trigger_click_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_click_button, button, FRAMEEVENT_CONTROL_CLICK )
BlzTriggerRegisterFrameEvent(trigger_click_button, ChargeContent, FRAMEEVENT_CONTROL_CLICK )
TriggerAddAction(trigger_click_button, function()
--print(GetPlayerName(GetTriggerPlayer()).." pressed: "..BlzFrameGetName(BlzGetTriggerFrame()))
end)
local trigger_up_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_up_button, button, FRAMEEVENT_MOUSE_UP )
BlzTriggerRegisterFrameEvent(trigger_up_button, ChargeContent, FRAMEEVENT_MOUSE_UP )
TriggerAddAction(trigger_up_button, function()
--print(GetPlayerName(GetTriggerPlayer()).." up button: "..BlzFrameGetName(BlzGetTriggerFrame()))
--BlzFrameSetEnable(button, false)
--BlzFrameSetEnable(button, true)
end)
print("init command button")
end
end
Недостатки:
Залипание клавиатуры. Попробуйте быстро прокликать по кнопке, и поймете, что при быстрых кликах клавиатура перестает работать..
Залипание клавиатуры. Попробуйте быстро прокликать по кнопке, и поймете, что при быстрых кликах клавиатура перестает работать..
2. эффект отключения иконки
отключенный эффект кнопки - DisabledTexture. Во время паузы у вас текстуры отключаются. Примерно вот такие прописываем в fdf-file мы для отключенных текстур настройки кнопок:
fdf код
ControlDisabledBackdrop "CommandButtonDisabledBackdrop",
Frame "BACKDROP" "CommandButtonDisabledBackdrop" INHERITS "CommandButtonBackdropTemplate" {
}
ControlDisabledPushedBackdrop "CommandButtonDisabledPushedBackdrop",
Frame "BACKDROP" "CommandButtonDisabledPushedBackdrop" INHERITS "CommandButtonPushedBackdropTemplate" {
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
}
Дело вот в чем, никак нельзя самодельные текстуры прописать так, чтобы игра их паузила. Они никак не встроены в системные фреймы игры, их никак не встроить в игру. Напомню, что весь интерфейс игровой состоит из SimpleFrames, и у SimpleFrames плохо с передачей параметров наследования ребенок-родитель или наоборот.
Во время паузы все меню эффектно будет отключено, но наши фреймы к сожалению не меняются. Пробовал задать нужного родителя, менял на SimpleButton, пробовал все. Короче, никак она не встраивается под родителя, и не наследует его параметры. Когда родитель скрыт, то потомки тоже. Но с нашим фреймом такое не происходит, а это значит где то уже в игре задано так. Смотрится не красиво, но думаю это не столь важно, но все равно решил попробовать решить проблему. Когда я смотрю на кнопки абилок, я думаю, а почему же у них текстуры вот меняют на DisabledTexture, но так ответа и не нашел.
Напомню: если ваш фрейм отключить BlzFrameSetEnable(frame, enabled) то текстура меняется на заданный DisabledTexture в fdf-файле в ControlDisabledBackdrop, ControlDisabledPushedBackdrop. Это работает. Мне иногда надо было отключать фреймы
Есть другой вариант - отследить паузу. Можно отслеживать по систематическому фрейму - пример BlzFrameGetEnable(frame), проверяя отключен ли он. К сожалению, пауза в сингл-плеере паузит работу триггеров, а что уж говорить про мультиплеер - я не знаю как в сетевой игре, тк тестить было лень. Я думать забить на это, нафиг мне это надо. Эффекты отключения незначительны ради такого делать, не заметны, главное что текстура в зеленую иконку не превращается, все хорошо. и поэтому ControlDisabledBackdrop, ControlDisabledPushedBackdrop мб бесполезными, и можно не прописывать в fdf-file.
Позже мне на ум пришла другая идея - заменить кнопки меню интерфейса (ЗАДАНИЯ, МЕНЮ, ЖУРНАЛ, АЛЬЯНС), вызывающие паузу, на самодельные, и так можно отслеживать нажатие. Самим менять, вызывать меню. Недостатки свои тоже существуют
3. Создание кнопки с зарядами
ссылка с xgm <= добавили как сделать кнопку с зарядами. мне не понравилось чего-то
Кратко: Как создавать кнопку мы уже знаем. Нам нужно показать заряды, т.е. добавить рамку и текст в правый нижний уголок кнопки. Оказывается в том месте проще создать вторую кнопку
Возможно вы думали, что смогли бы создать фон-рамки с помощью BACKDROP и добавить текста TEXT. Я тоже так думал. Но оказывается, что не все так просто. Дело в том, что фреймы наслаиваются друг на друга, и самый верхний фрейм не даст кликнуть по нижнему фрейму. Реакция события работает только по самым верхним фреймам
BACKDROP легко дает через себя кликнуть по кнопке-1 и другим объектам. BACKDROP нельзя нацепить никаких событии, подсказок и пр. Раньше думал, что он мешать будет.
Разве, что мешает TEXT, у фрейма типа текст существует невидимая рамка, задающая размер. Кликать в эту область по кнопке-1 будет мешать текст.
Решение пришло простое из хгм - создать вторую кнопку. Кнопку можно создать текстовую, и в ней прописывать кол-во зарядов.
Первый вариант - создадим вторую кнопку
Давай-те как создадим fdf-file для рамки с текста без свечения и пр:
fdf код
// -- INCLUDE FILES ---------------------------------------------
IncludeFile "UI\FrameDef\Glue\StandardTemplates.fdf",
// -- LOCAL TEMPLATES -------------------------------------------
Frame "TEXT" "ChargesBoxTextTemplate" {
DecorateFileNames,
FrameFont "MasterFont", 0.013, "",
FontJustificationH JUSTIFYCENTER,
FontJustificationV JUSTIFYMIDDLE,
FontFlags "FIXEDSIZE",
FontColor 1.0 1.0 1.0 1.0,
//FontHighlightColor 1.0 1.0 1.0 1.0,
//FontDisabledColor 0.5 0.5 0.5 1.0,
FontShadowColor 0.0 0.0 0.0 0.9,
FontShadowOffset 0.001 -0.001,
}
Frame "GLUETEXTBUTTON" "ChargesBox" {
//Width 0.032,
//Height 0.032,
// По умолчание текстура рамки
ControlBackdrop "ChargesBoxBackdrop",
Frame "BACKDROP" "ChargesBoxBackdrop" {
}
// Текст привязываем к кнопке
ButtonText "ChargesBoxText",
Frame "TEXT" "ChargesBoxText" INHERITS "ChargesBoxTextTemplate" {
}
}
lua-код создаем кнопке button вторую кнопку
код
local ChargeContent=BlzCreateFrame("GlueWText", button, 0, 0)
local chargesBox=BlzFrameGetChild(ChargeContent, 0)-- рамка
local chargesText=BlzFrameGetChild(ChargeContent, 1)-- текст заряда
local NextPoint = 0.039 --размер button
BlzFrameSetText(chargesText, “99”) --указываем кол-во
BlzFrameSetTexture(chargesBox, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
BlzFrameSetSize(ChargeContent,NextPoint/1.5,NextPoint/3)
BlzFrameSetScale(chargesText,0.6)
BlzFrameSetPoint(ChargeContent, FRAMEPOINT_BOTTOMRIGHT, button, FRAMEPOINT_BOTTOMRIGHT, 0.001,0.)
Главное, что события реакции у обоих была общая. т.е. нужно обоим кнопкам вешать регистром события.
Полный код
lua код
do
local real = MarkGameStarted
function MarkGameStarted()
real()
--загрузка toc-file
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
--загружаем toc-file
LoadToc("templates.toc")
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
----------Вариант с обычной кнопкой--------------------------------------
--создаем кнопку
local button = BlzCreateFrameByType("BUTTON", "MyIconButton", gameUI, "ScoreScreenTabButtonTemplate", 0)
--создаем обычную текстуру
local buttonIconFrame = BlzCreateFrameByType("BACKDROP", "MyIconButtonIcon", button, "", 0)
BlzFrameSetAllPoints(buttonIconFrame, button)
BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.3)
BlzFrameSetSize(button, 0.039, 0.039)
BlzFrameSetTexture(buttonIconFrame, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, false)
----------Вариант с продавленной кнопкой----------------------------------
--local button = BlzCreateFrame("MyButton", gameUI, 0, 0)
--создаем обычную текстуру
--local button_texture = BlzGetFrameByName("CommandButtonBackdrop", 0)
--BlzFrameSetTexture(button_texture, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, false)
--создаем продавленную текстуру
--local button_pressedTexture = BlzGetFrameByName("CommandButtonPushedBackdrop", 0)
--BlzFrameSetTexture(button_pressedTexture, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, false)
--BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER,0.4,0.3)
--BlzFrameSetSize(button, 0.039, 0.039)
local ChargeContent=BlzCreateFrame("ChargesBox", button, 0, 0)
local chargesBox=BlzFrameGetChild(ChargeContent, 0)-- рамка
local chargesText=BlzFrameGetChild(ChargeContent, 1)-- текст заряда
BlzFrameSetText(chargesText, "99")
BlzFrameSetTexture(chargesBox, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
BlzFrameSetSize(ChargeContent,0.039/1.5,0.039/3)
BlzFrameSetScale(chargesText,0.6)
BlzFrameSetPoint(ChargeContent, FRAMEPOINT_BOTTOMRIGHT, button, FRAMEPOINT_BOTTOMRIGHT, 0.001,0.)
local trigger_click_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_click_button, button, FRAMEEVENT_CONTROL_CLICK )
BlzTriggerRegisterFrameEvent(trigger_click_button, ChargeContent, FRAMEEVENT_CONTROL_CLICK )
TriggerAddAction(trigger_click_button, function()
print(GetPlayerName(GetTriggerPlayer()).." pressed: "..BlzFrameGetName(BlzGetTriggerFrame()))
end)
print("init command button")
end
end
Второй вариант - можно просто отключить TEXT-frame
кодом отключаем, и теперь можете кликать по кнопке, что не ранее не давал TEXT.
BlzFrameSetEnable(TEXT, false)
BlzFrameSetEnable(TEXT, false)
У Simple frames можно использовать Textures, однако, там придеться повозиться с fdf-кодом.
как создать кнопку с зарядами без импорта fdf (lua)
это примерный код для создания кнопки с зарядом. Просто надоело смотреть постоянно в различные источники. Пусть будет пример. Однако, требует тщательной настройки оффсетов и размеров, и фиксации размера рамки с текстом (если желаете). Так приблизительно создал, возможно в будущем подкорректирую
do
local real = MarkGameStarted
function MarkGameStarted()
real()
--если нужно прогрузить toc, то пропишите
--LoadToc(s)
TimerStart(CreateTimer(), 1, false, function()
CreateAbilityFrame(Player(0),0.4,0.3,0.039,nil,999)
end)
print("done")
end
end
--в качестве colortext можно прописать
--значения a,r,g,b (0-255). пример r=255,b=255,g=255 => 'ffffff'
function rgba2hex(r, g, b, a)
return string.format('%02x%02x%02x%02x', a or 255, r, g, b)
end
function CreateAbilityFrame(player,posX,PosY,sizebutton,texture,chargesCount,text,colortext)
if not texture then
texture="ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn"
end
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateFrameByType("GLUEBUTTON","",gameUI,"",0)
BlzFrameSetVisible(button,false)
BlzFrameSetVisible(button,GetLocalPlayer()==player)
BlzFrameSetLevel(button,1)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,posX,PosY)
BlzFrameSetSize(button,sizebutton,sizebutton)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",button,"",0)
BlzFrameSetTexture(buttonIcon, texture, 0, true)
BlzFrameSetAllPoints(buttonIcon,button)
BlzFrameSetLevel(buttonIcon,2)
if text then
local ButtonText = BlzCreateFrameByType("TEXT","",button,"",0)
BlzFrameSetEnable(ButtonText, false)
if not colortext then
colortext = 'ffffcc00'
end
BlzFrameSetText(ButtonText, 'Text on |c'..colortext..text..'|r')
--BlzFrameSetLevel(ButtonText,5)
-- 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(ButtonText, 2)
BlzFrameSetAllPoints(ButtonText,button)
end
if chargesCount then
local chargesBox=BlzCreateFrameByType("BACKDROP","",button,"",0)
local chargesText= BlzCreateFrameByType("TEXT","",chargesBox,"",0) --BlzCreateFrame("ChargesBoxTextTemplate", button, 0, 0)--
BlzFrameSetEnable(chargesText, false)
BlzFrameSetText(chargesText,chargesCount)
BlzFrameSetScale(chargesText,0.9)
BlzFrameSetSize(chargesText,sizebutton/1.5,sizebutton/3)
BlzFrameSetPoint(chargesText, FRAMEPOINT_BOTTOMRIGHT, button, FRAMEPOINT_BOTTOMRIGHT, -0.0009,0.)
BlzFrameSetTextAlignment(chargesText,TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
BlzFrameSetFont(chargesText, "Fonts\\BLQ55Web.ttf", 0.013, 0)
BlzFrameSetTexture(chargesBox, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
BlzFrameSetSize(chargesBox,sizebutton/1.5,sizebutton/3)
BlzFrameSetLevel(chargesBox,3)
--BlzFrameSetLevel(chargesText,4)
BlzFrameSetPoint(chargesBox, FRAMEPOINT_BOTTOMRIGHT, chargesText, FRAMEPOINT_BOTTOMRIGHT, 0.001,0.)
BlzFrameSetPoint(chargesBox, FRAMEPOINT_TOPLEFT, chargesText, FRAMEPOINT_TOPLEFT, 0.001,0.)
end
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
BlzFrameSetEnable(BlzGetTriggerFrame(), false)
BlzFrameSetEnable(BlzGetTriggerFrame(), true)
end)
local TrigMOUSE_ENTER = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_ENTER, button, FRAMEEVENT_MOUSE_ENTER)
TriggerAddAction( TrigMOUSE_ENTER, function ()
print("показать подсказку")
end)
local TrigMOUSE_LEAVE = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_LEAVE, button, FRAMEEVENT_MOUSE_LEAVE)
TriggerAddAction( TrigMOUSE_LEAVE, function ()
print("убрать подсказку")
end)
return button
end
как создать simplebutton с зарядами
Simpleframes всегда находятся ниже обычных фреймов. Иногда это мешает. Но Simplebutton не вызывает залипания клавиатуры (фокус). Некоторые фреймы всегда выше находят, тк это функциональные фреймы - фреймы меню. При вызове меню фреймы всегда отображаются выше simpleframes. и поднять выше обычных никак нельзя, так что кнопку можно не увидеть. Возможно нам нужна просто взять simple button как пустышку без изображения. Сверху накидываем backdrops (мзображение кнопки), и text (тексты). Однако, нельзя связывать их точками, тк simpleframes и функциональные фреймы, как мы поняли, находятся на разных уровнях. Не получается никак привязать, и не наследует никаких параметров.
fdf-file
без fdf-file размеры simplebutton не правильные. Ниже строчка кода не может создать код. Нужен какой-то шаблон. Но даже найти в варкрафте какой-то шаблон труднее
BlzCreateFrameByType("SIMPLEBUTTON","",gameUI,"",0)
Пришлось через импорт.
//Texture "MySimpleButtonButtonHighlight" {
// File "UI\Glues\ScoreScreen\scorescreen-tab-hilight.blp",
// AlphaMode "ADD",
//}
Frame "SIMPLEBUTTON" "MySimpleButton" {
Width 0.039,
Height 0.039,
}
lua код
do
local real = MarkGameStarted
function MarkGameStarted()
real()
--если нужно прогрузить toc, то пропишите
LoadToc("war3mapImported\\MySimpleButton.toc")
checkframe = {}
WorldFrame = BlzGetOriginFrame ( ORIGIN_FRAME_WORLD_FRAME , 0 )
w_tooltip = BlzCreateFrameByType("FRAME", "", gameUI, "", 0)
BlzFrameSetTooltip(WorldFrame, w_tooltip)
BlzFrameSetVisible(w_tooltip, false)
TimerStart(CreateTimer(), 1, false, function()
CreateAbilityFrame(Player(0),0.4,0.3,0.039,nil,999)
end)
print("done")
end
end
--в качестве colortext можно прописать
--значения a,r,g,b (0-255). пример r=255,b=255,g=255 => 'ffffff'
function rgba2hex(r, g, b, a)
return string.format('%02x%02x%02x%02x', a or 255, r, g, b)
end
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
function CreateAbilityFrame(player,posX,PosY,sizebutton,texture,chargesCount,text,colortext) -- позиция 1 - 12
local NextPoint=0.039
if not texture then
texture="ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn"
end
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateSimpleFrame("MySimpleButton",gameUI,0)--
BlzFrameSetVisible(button,false)
BlzFrameSetVisible(button,GetLocalPlayer()==player)
BlzFrameSetLevel(button,1)
--BlzFrameSetSize(button,sizebutton,sizebutton)
BlzFrameSetScale(button,1.00)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,posX,PosY)
local tooltip = BlzCreateFrameByType("SIMPLEFRAME","",gameUI,"",0)
BlzFrameSetTooltip(button,tooltip)
BlzFrameSetVisible(tooltip,false)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
BlzFrameSetTexture(buttonIcon, texture, 0, true)
BlzFrameSetAbsPoint(buttonIcon,FRAMEPOINT_CENTER,posX,PosY)
BlzFrameSetSize(buttonIcon,sizebutton,sizebutton)
BlzFrameSetLevel(buttonIcon,2)
if text then
local ButtonText = BlzCreateFrameByType("TEXT","",buttonIcon,"",0)
BlzFrameSetEnable(ButtonText, false)
if not colortext then
colortext = 'ffffcc00'
end
BlzFrameSetText(ButtonText, 'Text on |c'..colortext..text..'|r')
--BlzFrameSetLevel(ButtonText,5)
-- 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(ButtonText, 2)
BlzFrameSetAllPoints(ButtonText,buttonIcon)
end
if chargesCount then
local chargesBox=BlzCreateFrameByType("BACKDROP","",buttonIcon,"",0)
local chargesText= BlzCreateFrameByType("TEXT","",chargesBox,"",0) --BlzCreateFrame("ChargesBoxTextTemplate", button, 0, 0)--
BlzFrameSetEnable(chargesText, false)
BlzFrameSetText(chargesText,chargesCount)
BlzFrameSetScale(chargesText,0.9)
BlzFrameSetSize(chargesText,sizebutton/1.5,sizebutton/3)
BlzFrameSetPoint(chargesText, FRAMEPOINT_BOTTOMRIGHT, buttonIcon, FRAMEPOINT_BOTTOMRIGHT, -0.0009,0.)
BlzFrameSetTextAlignment(chargesText,TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
BlzFrameSetFont(chargesText, "Fonts\\BLQ55Web.ttf", 0.013, 0)
BlzFrameSetTexture(chargesBox, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
BlzFrameSetSize(chargesBox,sizebutton/1.5,sizebutton/3)
BlzFrameSetLevel(chargesBox,3)
--BlzFrameSetLevel(chargesText,4)
BlzFrameSetPoint(chargesBox, FRAMEPOINT_BOTTOMRIGHT, chargesText, FRAMEPOINT_BOTTOMRIGHT, 0.001,0.)
BlzFrameSetPoint(chargesBox, FRAMEPOINT_TOPLEFT, chargesText, FRAMEPOINT_TOPLEFT, 0.001,0.)
end
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
end)
TimerStart(CreateTimer(), 0.03, true, function()
local n = GetPlayerId(GetLocalPlayer())
if BlzFrameIsVisible(tooltip) and checkframe[n]~=tooltip then
checkframe[n]=tooltip
print('видима подсказка')
elseif (not BlzFrameIsVisible(tooltip)) and checkframe[n]==tooltip then
--and checkframe[n]==tooltip
checkframe[n]=nil
print('не видна подсказка')
end
end)
return button
end
4. Кнопки прокрутки
Хотел сделать кнопки прокрутки счетчика - вверх, вниз. Обычно кнопки-фреймы фиксируют только отпускание. Поэтому пришлось придумывать как фиксировать нажатие/отпускание
fdf file
IncludeFile "UI\FrameDef\UI\EscMenuTemplates.fdf", //подключаем файл
IncludeFile "UI\FrameDef\Glue\StandardTemplates.fdf",
Texture "UpNormalTexture" {
File "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarUpButton.blp",
}
Texture "UpPushedTexture" {
Width 0.005,
Height 0.005,
File "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarUpButton.blp",
}
Texture "DownNormalTexture" {
File "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarDownButton.blp",
}
Texture "DownPushedTexture" {
Width 0.005,
Height 0.005,
File "UI\Widgets\Glues\SinglePlayerSkirmish-ScrollBarDownButton.blp",
}
Texture "RefreshNormalTexture" {
File "UI\Widgets\BattleNet\bnet-refresh-up.blp",
}
Texture "RefreshPushedTexture" {
Width 0.005,
Height 0.005,
File "UI\Widgets\BattleNet\bnet-refresh-up.blp",
}
Texture "UpButtonHighlight" {
File "UI\Widgets\EscMenu\Orc\orc-options-button-highlight.blp",
AlphaMode "ADD",
}
Texture "DownButtonHighlight" {
File "UI\Widgets\EscMenu\Orc\orc-options-button-highlight.blp",
AlphaMode "ADD",
}
Texture "RefreshButtonHighlight" {
File "UI\Widgets\EscMenu\Orc\orc-options-button-highlight.blp",
AlphaMode "ADD",
}
Frame "SIMPLEBUTTON" "UpSimpleButton" {
Width 0.01,
Height 0.01,
NormalTexture "UpNormalTexture",
PushedTexture "UpPushedTexture",
UseHighlight "UpButtonHighlight",
}
Frame "SIMPLEBUTTON" "DownSimpleButton" {
Width 0.01,
Height 0.01,
NormalTexture "DownNormalTexture",
PushedTexture "DownPushedTexture",
UseHighlight "DownButtonHighlight",
}
Frame "SIMPLEBUTTON" "RefreshSimpleButton" {
Width 0.01,
Height 0.01,
NormalTexture "RefreshNormalTexture",
PushedTexture "RefreshPushedTexture",
UseHighlight "RefreshButtonHighlight",
}
lua код
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
do
local real = MarkGameStarted
function MarkGameStarted()
real()
LoadToc("templates.toc")
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local gold = 0
local Backdrop = BlzCreateFrameByType("BACKDROP", "Backdrop", gameUI, "", 0)
BlzFrameSetSize(Backdrop, 0.4, 0.4)
BlzFrameSetTexture(Backdrop, "UI\\Widgets\\Glues\\GlueScreen-Button1-Border.blp",0, true) --Textures\\Black32.blp
local TEXT = BlzCreateFrameByType("TEXT", "HelpText", gameUI, "", 0)
BlzFrameSetSize(TEXT, 0, 0)
BlzFrameSetAbsPoint(TEXT, FRAMEPOINT_CENTER, 0.2, 0.3)
BlzFrameSetText(TEXT,gold)
BlzFrameSetPoint(Backdrop, FRAMEPOINT_TOPLEFT, TEXT, FRAMEPOINT_TOPLEFT, -0.012, 0.012)
BlzFrameSetPoint(Backdrop, FRAMEPOINT_BOTTOMRIGHT, TEXT, FRAMEPOINT_BOTTOMRIGHT, 0.012, -0.012)
local up_button = BlzCreateSimpleFrame("UpSimpleButton",gameUI,0)
local up_frame = BlzCreateFrameByType("SIMPLEFRAME", "", gameUI, "", 0)
BlzFrameSetPoint(up_button, FRAMEPOINT_BOTTOMLEFT, Backdrop, FRAMEPOINT_RIGHT, 0.003,0)
BlzFrameSetLevel(up_button, 6)
BlzFrameSetVisible(up_frame,false)
BlzFrameSetTooltip(up_button,up_frame)
local down_button = BlzCreateSimpleFrame("DownSimpleButton",gameUI,0)
local down_frame = BlzCreateFrameByType("SIMPLEFRAME", "", gameUI, "", 0)
BlzFrameSetPoint(down_button, FRAMEPOINT_TOP, up_button, FRAMEPOINT_BOTTOM, 0,0)
BlzFrameSetLevel(down_button, 6)
BlzFrameSetVisible(down_frame,false)
BlzFrameSetTooltip(down_button,down_frame)
local refresh_button = BlzCreateSimpleFrame("RefreshSimpleButton",gameUI,0)
BlzFrameSetPoint(refresh_button, FRAMEPOINT_LEFT, up_button, FRAMEPOINT_RIGHT, 0.003,0)
BlzFrameSetLevel(refresh_button, 6)
local button_click = {}
local trigger_down_button = CreateTrigger()
TriggerRegisterPlayerEvent(trigger_down_button, Player(0), EVENT_PLAYER_MOUSE_DOWN)
TriggerAddAction(trigger_down_button, function()
if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT then
if BlzFrameIsVisible(up_frame) then
button_click[GetPlayerId(GetTriggerPlayer())]=up_button
print('зажата верхняя')
elseif BlzFrameIsVisible(down_frame) then
button_click[GetPlayerId(GetTriggerPlayer())]=down_button
print('зажата нижняя')
else
button_click[GetPlayerId(GetTriggerPlayer())]=nil
print('нажатие ЛКМ')
end
end
end)
local trigger_up_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_up_button, up_button, FRAMEEVENT_CONTROL_CLICK)
BlzTriggerRegisterFrameEvent(trigger_up_button, down_button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(trigger_up_button, function()
button_click[GetPlayerId(GetTriggerPlayer())]=nil
print('кнопка отпущена')
end)
local trigger_refresh_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_refresh_button, refresh_button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(trigger_refresh_button, function()
gold = 0
BlzFrameSetText(TEXT,gold)
print('обнуление')
end)
TimerStart(CreateTimer(),1/32,true,function()
if BlzFrameIsVisible(up_frame) and button_click[GetPlayerId(GetLocalPlayer())] == up_button then
gold = gold + 1
BlzFrameSetText(TEXT,gold)
elseif BlzFrameIsVisible(down_frame) and button_click[GetPlayerId(GetLocalPlayer())] == down_button then
gold = gold - 1
BlzFrameSetText(TEXT,gold)
elseif button_click[GetPlayerId(GetLocalPlayer())] ~= nil then
button_click[GetPlayerId(GetLocalPlayer())]=nil
print('кнопка отпущена')
end
end)
end
end
эффект свечения (при наведении мыши на фрейм)
Не обязательно фрейму быть кнопкой. Вы можете использовать вместо кнопки другие фреймы (если они конечно могут это делать. Не все типы фреймов имеют события входа/выхода, и могут иметь подсказки).
можно лично сделать пример триггером наведения на кнопку. Пример, при наведении на кнопку меняется изображение текстуры, а при выводе из фрейма мыши текстура возвращается на место.
гиф
гиф
примеры замены иконки при наведении
Представьте, если навести мышью на кнопку, и лицо Утера вдруг откроет рот, нахмурит глаза, и из глаз пойдут свечения
через события (пример с button)
do
local real = MarkGameStarted
function MarkGameStarted()
real()
TimerStart(CreateTimer(), 1, false, function()
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateFrameByType("GLUEBUTTON","",gameUI,"",0)
BlzFrameSetLevel(button,1)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(button,0.05,0.039)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
BlzFrameSetTexture(buttonIcon, "war3mapImported\\01.tga", 0, true)
BlzFrameSetAllPoints(buttonIcon,button)
BlzFrameSetLevel(buttonIcon,2)
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
BlzFrameSetEnable(BlzGetTriggerFrame(), false)
BlzFrameSetEnable(BlzGetTriggerFrame(), true)
end)
local TrigMOUSE_ENTER = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_ENTER, button, FRAMEEVENT_MOUSE_ENTER)
TriggerAddAction( TrigMOUSE_ENTER, function ()
print("показать подсказку")
BlzFrameSetTexture(buttonIcon, "war3mapImported\\02.tga", 0, true)
end)
local TrigMOUSE_LEAVE = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_LEAVE, button, FRAMEEVENT_MOUSE_LEAVE)
TriggerAddAction( TrigMOUSE_LEAVE, function ()
print("убрать подсказку")
BlzFrameSetTexture(buttonIcon, "war3mapImported\\01.tga", 0, true)
end)
end)
print("done")
end
end
через таймер и tooltip (пример с simplebutton)
Можно не только с simplebutton, но и с обычными кнопками, только в качестве подсказки выбирайте не SIMPLEFRAME, а FRAME.
На кнопку нацепляют невидимую для игрока фейковую подсказку SIMPLEFRAME. каждую 0.03 секунду тикает таймер. И проверяет видимость подсказки. Как вы понимаете, если игрок наводит на фрейм, то выскакивает подсказка. Таким образом и работает. Но нужно фиксировать один раз
do
local real = MarkGameStarted
function MarkGameStarted()
real()
LoadToc("war3mapImported\\MySimpleButton.toc")
checkframe = {}
TimerStart(CreateTimer(), 1, false, function()
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateSimpleFrame("MySimpleButton",gameUI,0)
BlzFrameSetLevel(button,1)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(button,0.05,0.039)
local tooltip = BlzCreateFrameByType("SIMPLEFRAME","",gameUI,"",0)
BlzFrameSetTooltip(button,tooltip)
BlzFrameSetVisible(tooltip,false)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
BlzFrameSetTexture(buttonIcon, "war3mapImported\\01.tga", 0, true)
BlzFrameSetAbsPoint(buttonIcon,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(buttonIcon,0.05,0.039)
BlzFrameSetLevel(buttonIcon,2)
TimerStart(CreateTimer(), 0.03, true, function()
local n = GetPlayerId(GetLocalPlayer())
if BlzFrameIsVisible(tooltip) and checkframe[n]~=tooltip then
checkframe[n]=tooltip
print('видима подсказка')
BlzFrameSetTexture(buttonIcon, "war3mapImported\\02.tga", 0, true)
elseif (not BlzFrameIsVisible(tooltip)) and checkframe[n]==tooltip then
--and checkframe[n]==tooltip
checkframe[n]=nil
print('не видна подсказка')
BlzFrameSetTexture(buttonIcon, "war3mapImported\\01.tga", 0, true)
end
end)
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
BlzFrameSetEnable(BlzGetTriggerFrame(), false)
BlzFrameSetEnable(BlzGetTriggerFrame(), true)
end)
end)
print("done")
end
end
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
fdf file
шаблон MySimpleButton, без которого Simplebutton не может установить правильные размеры
Frame "SIMPLEBUTTON" "MySimpleButton" {
Width 0.039,
Height 0.039,
}
Аналогичное действие делает у кнопки Control в fdf-file
//backdrop при нажатии/клике кнопки
ControlPushedBackdrop "ButtonPushedBackdropTemplate",
Правда заменяет текстуру при нажатии. И возвращает, если вернешь в норму.
Теперь, осуществить эффект свечения 4 способами:
стандарт: задать кнопке HightLight
Эта чаще всего полупрозрачная текстура, накладываемая сверху на кнопку. У этого типа фрейма есть два мода прозрачности (рекомендую изучить HightLight). И нельзя динамично менять изображение, т.е. какая текстура указана в fdf в шаблоне, такая и будет.
fdf-file (пример шаблона)
Все шаблоны прописаны в игре. Их можно найти тут по ссылке Прямо в браузере можно найти нужную информацию. Жмете "Ctrl + F", и набираете "HIGHLIGHT" вместе с кавычками. Однако, HightLight находит чаще для фокуса, а не свечения. Попробуйте искать по ControlMouseOverHighlight. И там можно найти текстуры.
Можно на кнопку нацепить HightLight стандартным Control. И потом достаточно будет вызвать шаблон кнопки
для шаблона вроде кнопки достаточно лишь изображения кнопки, и подсветки при наведении (для примера). Остальное нас мало интересует. Триггером создаем данный шаблон
IncludeFile "UI\FrameDef\UI\EscMenuTemplates.fdf", //подключаем файл
Frame "GLUETEXTBUTTON" "MyButtonTemplate" {
Width 0.228,
Height 0.035,
ControlStyle "HIGHLIGHTONMOUSEOVER",
//включенный backdrop (активный фон)
ControlBackdrop "MyButtonBackdropTemplate",
Frame "BACKDROP" "MyButtonBackdropTemplate" {
DecorateFileNames,
BackdropTileBackground,
BackdropBackground "EscMenuButtonBackground",
BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
BackdropCornerSize 0.0125,
BackdropBackgroundSize 0.256,
BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
BackdropEdgeFile "EscMenuButtonBorder",
}
//когда наводят мышью на кнопку, она подсвечивается
ControlMouseOverHighlight "MyButtonMouseOverHighlightTemplate",
Frame "HIGHLIGHT" "MyButtonMouseOverHighlightTemplate" {
DecorateFileNames,
HighlightType "FILETEXTURE",
HighlightAlphaFile "EscMenuButtonMouseOverHighlight",
HighlightAlphaMode "ADD",
}
}
У simple button просто указываем текстуру
NormalTexture <активная текстура>
UseHighlight <текстура при наводке курсора>
NormalTexture <активная текстура>
UseHighlight <текстура при наводке курсора>
привязать SetAllPoints к button. И отображать при наведении, и убирать при отводе
событиями входа/выхода
fdf-file
без импорта к сожалению никак не обойтись. Если вы желаете не стандартное импортное свечение прикрепить, то нужно указать как новый шаблон. Когда вы HightLight в строке HighlightAlphaFile указываете путь, то все в триггерно изменить изображение не получается.
Преимущество: можно задать различныве модификации прозрачности. По правде их всего две у HightLight =>
HighlightAlphaMode "ADD", => задает прозрачность темным цветам, абсолютная прозначность у темных изображение
HighlightAlphaMode "BLEND", => как обычное изображение
HighlightAlphaMode "ADD", => задает прозрачность темным цветам, абсолютная прозначность у темных изображение
HighlightAlphaMode "BLEND", => как обычное изображение
Если желаете изменять изображение, тогда лучше заменить HightLight на Backdrop. Backdrop может менять иконку на ходу, и прозрачность принимает также.
два образца
Frame "HIGHLIGHT" "ButtonHightLight" {
HighlightType "FILETEXTURE",
HighlightAlphaFile "UI\Glues\ScoreScreen\scorescreen-tab-hilight.blp",
HighlightAlphaMode "ADD",
}
Frame "HIGHLIGHT" "CommandButtonActiveHighlight" {
DecorateFileNames,
HighlightType "FILETEXTURE",
HighlightAlphaFile "CommandButtonActiveHighlight",
HighlightAlphaMode "ADD",
}
lua код
HightLight крепят к кнопке и прячут изначально. А когда мышь наводят на кнопку, мы включаем видимость. И обратно, когда мышь уводят из кнопки.
do
local real = MarkGameStarted
function MarkGameStarted()
real()
LoadToc("war3mapImported\\MySimpleButton.toc")
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateFrameByType("GLUEBUTTON","",gameUI,"",0)
BlzFrameSetLevel(button,1)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(button,.039,0.039)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
BlzFrameSetTexture(buttonIcon, "ReplaceableTextures\\CommandButtons\\BTNHeroBlademaster", 0, true)
BlzFrameSetAllPoints(buttonIcon,button)
BlzFrameSetLevel(buttonIcon,2)
local buttonHightLight = BlzCreateFrameByType("HIGHLIGHT","", gameUI, "ButtonHightLight", 0)
BlzFrameSetAllPoints(buttonHightLight,button)
BlzFrameSetVisible(buttonHightLight,false)
BlzFrameSetLevel(buttonHightLight,3)
--BlzFrameSetAbsPoint(buttonHightLight,FRAMEPOINT_CENTER,0.4,0.3)
--BlzFrameSetSize(buttonHightLight,0.039,0.039)
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
BlzFrameSetEnable(BlzGetTriggerFrame(), false)
BlzFrameSetEnable(BlzGetTriggerFrame(), true)
end)
local TrigMOUSE_ENTER = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_ENTER, button, FRAMEEVENT_MOUSE_ENTER)
TriggerAddAction( TrigMOUSE_ENTER, function ()
print("показать подсказку")
BlzFrameSetVisible(buttonHightLight,true)
end)
local TrigMOUSE_LEAVE = CreateTrigger()
BlzTriggerRegisterFrameEvent( TrigMOUSE_LEAVE, button, FRAMEEVENT_MOUSE_LEAVE)
TriggerAddAction( TrigMOUSE_LEAVE, function ()
print("убрать подсказку")
BlzFrameSetVisible(buttonHightLight,false)
end)
print("done")
end
end
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
таймером + tooltip
здесь точно также как и с примером выше используют импорт
fdf-file
два образца и плюс еще simlpe button
Frame "SIMPLEBUTTON" "MySimpleButton" {
Width 0.039,
Height 0.039,
}
Frame "HIGHLIGHT" "ButtonHightLight" {
HighlightType "FILETEXTURE",
HighlightAlphaFile "UI\Glues\ScoreScreen\scorescreen-tab-hilight.blp",
HighlightAlphaMode "ADD",
}
Frame "HIGHLIGHT" "CommandButtonActiveHighlight" {
DecorateFileNames,
HighlightType "FILETEXTURE",
HighlightAlphaFile "CommandButtonActiveHighlight",
HighlightAlphaMode "ADD",
}
lua код
здесь таймером чекаем видимость подсказки, и потом отображаем HightLight. И еще HightLight лучше крепить не SimpleButton, тк не получится. А крепить к иконке Backdrop.
do
local real = MarkGameStarted
function MarkGameStarted()
real()
LoadToc("war3mapImported\\MySimpleButton.toc")
checkframe = {}
local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
local button = BlzCreateFrameByType("SIMPLEBUTTON","",gameUI,"MySimpleButton",0)
BlzFrameSetLevel(button,1)
BlzFrameSetAbsPoint(button,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(button,.039,0.039)
local tooltip = BlzCreateFrameByType("SIMPLEFRAME","",gameUI,"",0)
BlzFrameSetTooltip(button,tooltip)
BlzFrameSetVisible(tooltip,false)
local buttonIcon = BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
BlzFrameSetTexture(buttonIcon, "ReplaceableTextures\\CommandButtons\\BTNHeroBlademaster", 0, true)
--BlzFrameSetAllPoints(buttonIcon,button)
BlzFrameSetLevel(buttonIcon,2)
BlzFrameSetAbsPoint(buttonIcon,FRAMEPOINT_CENTER,0.2,0.3)
BlzFrameSetSize(buttonIcon,.039,0.039)
local buttonHightLight = BlzCreateFrameByType("HIGHLIGHT","", gameUI, "ButtonHightLight", 0)
BlzFrameSetAllPoints(buttonHightLight,buttonIcon)
BlzFrameSetVisible(buttonHightLight,false)
BlzFrameSetLevel(buttonHightLight,3)
--BlzFrameSetAbsPoint(buttonHightLight,FRAMEPOINT_CENTER,0.4,0.3)
--BlzFrameSetSize(buttonHightLight,0.039,0.039)
local ClickTrig = CreateTrigger()
BlzTriggerRegisterFrameEvent(ClickTrig, button, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(ClickTrig, function ()
print("Нажата кнопка ")
end)
TimerStart(CreateTimer(), 0.03, true, function()
local n = GetPlayerId(GetLocalPlayer())
if BlzFrameIsVisible(tooltip) and checkframe[n]~=tooltip then
checkframe[n]=tooltip
print('видима подсказка')
BlzFrameSetVisible(buttonHightLight,true)
elseif (not BlzFrameIsVisible(tooltip)) and checkframe[n]==tooltip then
--and checkframe[n]==tooltip
checkframe[n]=nil
print('не видна подсказка')
BlzFrameSetVisible(buttonHightLight,false)
end
end)
print("done")
end
end
function LoadToc(s)
if BlzLoadTOCFile(s) then
print("Loaded: "..s)
else
print("Failed to Load: "..s)
end
end
Автокаст
Здесь создается эффект анимации рамки для автокастовой способности. Придуман способ как включать и выключать автокастовую способность. Однако, мне не удалось никак прервать зацикленную анимацию, поэтому проще спрятать спрайт, и показать изображение рамок (здесь я не стал статичные рамки добавлять, кому надо можно стырить из button manager рамки).
код создания спрайта для кнопки
источник <= немного доработал.
В этом примере создается кнопка "ScriptDialogButto"n в центре экрана, и поверх него размещается анимированная модель (спрайт) AutoCast.
Параметр FrameSize никак не влияет на размер модели, размер модели масштабируют с помощью BlzFrameSetScale. Размер CommandButton по умолчанию равен 0,039, поэтому Buttonsize/0,039 соответствует размеру вашей кнопки.
Параметр FrameSize никак не влияет на размер модели, размер модели масштабируют с помощью BlzFrameSetScale. Размер CommandButton по умолчанию равен 0,039, поэтому Buttonsize/0,039 соответствует размеру вашей кнопки.
do
local real = MarkGameStarted
function MarkGameStarted()
real()
-- create the button and place it onto the center of the screen
local button = BlzCreateFrame("ScriptDialogButton", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.3)
BlzFrameSetSize(button, 0.039, 0.039)
-- create a Sprite copy the button's positions
local model = BlzCreateFrameByType("SPRITE", "SpriteName", button, "", 0)
BlzFrameSetAllPoints(model, button)
-- apply the model
BlzFrameSetModel(model, "UI\\Feedback\\Autocast\\UI-ModalButtonOn.mdl", 0)
-- Models don't care about Frame Size, to resize them one needs to scale them. The default CommandButton has a Size of 0.039.
BlzFrameSetScale(model, BlzFrameGetWidth(button)/0.039)
local CursorInFrame = false
local AutoCastOn = true
local triggerEnter = CreateTrigger()
BlzTriggerRegisterFrameEvent(triggerEnter, button, FRAMEEVENT_MOUSE_ENTER)
TriggerAddAction(triggerEnter,function()
CursorInFrame = true
end)
local triggerLeave = CreateTrigger()
BlzTriggerRegisterFrameEvent(triggerLeave, button, FRAMEEVENT_MOUSE_LEAVE)
TriggerAddAction(triggerLeave,function()
CursorInFrame = false
end)
local TriggerRightClick = CreateTrigger()
TriggerRegisterPlayerMouseEventBJ( TriggerRightClick, Player(0), bj_MOUSEEVENTTYPE_UP )
TriggerAddAction(TriggerRightClick,function()
if CursorInFrame then
AutoCastOn = not AutoCastOn
if AutoCastOn then
print('auto cast on')
--BlzFrameSetSpriteAnimate(model, 2, 0)
BlzFrameSetVisible(model,AutoCastOn)
else
print('auto cast off')
BlzFrameSetVisible(model,AutoCastOn)
--BlzFrameSetSpriteAnimate(model, 4, 0)
end
end
end)
Test()
print("done")
end
end
Остальное
С этими может быть когда-нибудь разберусь, если руки до этого дойдут.
- Эффект фокуса