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

Содержание:
Эту подстатью создал лично сам переводчик

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,
Если нужно убедиться в этом, можете еще уменьшить размер текстуры MyPushedTexture на:
Width 0.037,
Height 0.037,
Width 0.034,
Height 0.034,
Вывод с SimpleButton: как я говорил динамично менять триггерами текстуры не выходит (есть обходной вариант, но об этом в след уроках). Мне придеться тогда в fdf-file писать на каждую иконку кнопку с заданным изображением. Плюс еще и подсказки tooltip как то присобачить нужно будет. опыт интересен, мб как то пригодится.

GlueButton

кратко: лично я,ваш переводчик, по молодости юной только переводил и сам пытался понять как запускать разные эффекты и сравнивал различные fdf-шаблоны. Оказывалось проще на готовом все, и все работало. У меня не было времени все разбирать до винтиков. Когда было необходимо заменить CommandButton как “меню строительства” - это SimpleButton. Как simplebutton функционал не богат, и динамично не получится менять изображение, поэтому я решил не заморачиваться с simpleframe, и попробовать GlueButton. Взял примеры с хайва и код, и попытался потестить. Но тут работают некоторые эффекты, которые мне не нравятся. К примеру, когда наводите мышкой на кнопку - она подсвечивается. Свечение необходимо было убрать. За это отвечает ControlStyle "HIGHLIGHTONMOUSEOVER" - ее надо убрать
Все это мы разбирали ранее. Смотрели какие Control и ControlStyle необходимо было прописывать. Понятное дело, что нужно:
  1. ставим ControlStyle "AUTOTRACK",
  2. изображение иконки ControlBackdrop "CommandButtonBackdrop",
  3. изображение иконки при продавливании ControlPushedBackdrop "CommandButtonPushedBackdrop",
получается такой fdf-код или можете готовый шаблон найти типа QuestButtonTemplate
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-код:
код
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_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 )
проблема вот в чем, эти два события отслеживают нажатие и отпускание ЛКМ и ПКМ. Короче, точно нельзя сказать какая кнопка будет нажата: правая или левая. Это решается проверкой условием
Можно отслеживать вход курсора мышь внутрь фрейма или выход курсора мыши из фрейма с помощью 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)
У 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 <текстура при наводке курсора>
привязать SetAllPoints к button. И отображать при наведении, и убирать при отводе
событиями входа/выхода
fdf-file
без импорта к сожалению никак не обойтись. Если вы желаете не стандартное импортное свечение прикрепить, то нужно указать как новый шаблон. Когда вы HightLight в строке HighlightAlphaFile указываете путь, то все в триггерно изменить изображение не получается.
Преимущество: можно задать различныве модификации прозрачности. По правде их всего две у HightLight =>
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 соответствует размеру вашей кнопки.
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

Остальное

С этими может быть когда-нибудь разберусь, если руки до этого дойдут.
  1. Эффект фокуса

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