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

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

Содержание:
Когда несколько фреймов находятся в одном месте, существует правило, которое указывает, какой фрейм будет принимать событие мыши, какой фрейм отображается сверху, а какой фрейм будет располагаться снизу.
Короче, когда вы наводите мышью на фрейм, у вас подсвечивается кнопка, уровнем выше, или изображение картинки будет выше из-за высокого уровня. За все отвечает уровень фрейма.
FrameLevel, установленный с помощью BlzFrameSetLevel, управляет этим, это имеет значение только тогда, когда фреймы совпадают / перекрываются на экране. Только видимые фреймы имеют значение для порядка FrameLevel, если фреймы скрыты, то это правило для них не работает.
FrameLevel работает по-разному для SimpleFrames и Frames.
функциональные фреймы
Для функциональных фреймов (древовидная зависимость):
FrameLevel определяет порядок, в котором дочерние фреймы находятся над своим родителем. Чаще всего родитель находится внизу, а потомки сверху. Возьмем, ту же CommandBarFrame или EscMenuBackdrop - обычно фон находится снизу, а сверху фреймы кнопок лежат. Потомки соревнуются только со своими братьями и сестрами. Они упорядочены по убыванию. ChildFrame с наивысшим уровнем - расположен на самом верху. А фрейм, у которого самый низкий уровень, находится ниже его братьев и сестер - прямо над родителем.
Кратко: я как переводчик, заметил, что уровни работают по-разному у разных родителей потомков. Короче, когда вы при создании фреймов указываете родителя, они принимают не только параметры этого родителя, но и уровень. Обычно снизу находится родитель, а когда создаются потомки, они поднимаются на уровень выше. Ниже этого родителя они никак не хотят опускаться как был не менял параметр FrameLevel. Если от этих потомков создаются внуки (назовем след поколение так), то внуки никак не могут опуститься ниже на уровень родителей, уровень у обычных фреймов работает между потомками одного фрейма.
Между родителями тоже существуют уровни. Короче, у обычных фреймов существуют такие же уровни, а у их потомков подуровни - уровни потомков. Могут родители вместе с потомками и внуками опускаться/подниматься, вот такая у обычных фреймов зависимость ветки. Кроме того, потомки или внуки не могут быть выше какого-нибудь чужого родителя, или деда-родителя, как бы вы не задавали уровни, тут нужно изменять уровень родителю, чтобы выше родителя, или деду изменить, чтобы быть выше всех со всем своим потомством против остальных.
Для SimpleFrames
Тот, у кого самый высокий уровень, находится наверху, такие фреймы не зависят от родителя. Когда создается SimpleFrame, он копирует текущий уровень родительского элемента, поэтому он находится над ним. Но можно изменить уровни, чтобы родитель был наверху, это также означает, что последующие изменения уровня родительского элемента не принимаются дочерними SimpleFrames, за исключением текстуры / строк, которые они делают.
Кратко: SimpleFrame при создании копирует уровень родителя, и находится над ним уровнем. Давайте сравним, у обычных фреймов нельзя было опускать ниже уровня родителя, порядок уровня наследовался между потомками родителя. Между родителями тоже существуют уровни. Короче, у обычных фреймов существуют такие же уровни, а у их потомков подуровни. Могут родители вместе с потомками и внуками опускаться/подниматься, вот такая у обычных фреймов зависимость ветки. Кроме того, потомки или внуки не могут быть выше какого-нибудь чужого деда-родителя.
SimpleFrames нет такой зависимости от родителя, от родителя не зависит, и может опуститься вниз, вверх. Не забывайте, что весь игровой интерфейс состоит из этих SimpleFrames. Там можно практически перекрыть этими SimpleFrame если поднять повыше. По сути у них общий уровень.
Можно сказать, что оба используют одно и то же правило, за исключением того, что функциональные фреймы запускают новые слои, в которые помещаются дочерние элементы фрейма, в то время как SimpleFrames имеет только один слой, созданный SimpleFrame Ancient.
Хочу отметить, что у SimpleFrame тоже могут помещать потомков в специальные слои, как и функциональные фреймы. Только работает это в fdf-files. Потомков нужно указывать внутри фрейма fdf-file. Однако, триггером никак нельзя менять у children of SimpleFrame уровень слоя, это работает только с родителем
Но специальные дочерние элементы SimpleFrame - Текстура / Строка - находятся в Слоях, запускаемых их родительским SimpleFrame. Текстура / Строка не может иметь дочерних элементов, поэтому механизм создания слоев для этой группы довольно прост.
Пример:
ButtonA child of GAMEUI Level 2
ButtonB child of GAMEUI Level 3
ButtonC child of GAMEUI Level 1
ButtonAA child of ButtonA Level 1
ButtonAB child of ButtonA Level 5
ButtonBA child of ButtonB Level 3
ButtonBB child of ButtonB Level 1
ButtonBBA child of ButtonBB Level 6
ButtonCA child of ButtonC Level 8
ButtonCB child of ButtonC Level 7
Фрейм наверху также берет на себя все управление мышью.
вот код lua, можете запустить и проверить лично:
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
    local parent = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
    --local parent = BlzGetFrameByName("EscMenuMainPanel", 0)
    local buttonA = BlzCreateFrameByType("GLUETEXTBUTTON", "A", parent, "ScriptDialogButton", 0)
    local buttonB = BlzCreateFrameByType("GLUETEXTBUTTON", "B", parent, "ScriptDialogButton", 0)
    local buttonC = BlzCreateFrameByType("GLUETEXTBUTTON", "C", parent, "ScriptDialogButton", 0)
    local buttonAA = BlzCreateFrameByType("GLUETEXTBUTTON", "AA", buttonA, "ScriptDialogButton", 0)
    local buttonAB = BlzCreateFrameByType("GLUETEXTBUTTON", "AB", buttonA, "ScriptDialogButton", 0)
    local buttonBA = BlzCreateFrameByType("GLUETEXTBUTTON", "BA", buttonB, "ScriptDialogButton", 0)
    local buttonBB = BlzCreateFrameByType("GLUETEXTBUTTON", "BB", buttonB, "ScriptDialogButton", 0)
    local buttonBBA = BlzCreateFrameByType("GLUETEXTBUTTON", "BBA", buttonBB, "ScriptDialogButton", 0)
    local buttonCA = BlzCreateFrameByType("GLUETEXTBUTTON", "CA", buttonC, "ScriptDialogButton", 0)
    local buttonCB = BlzCreateFrameByType("GLUETEXTBUTTON", "CB", buttonC, "ScriptDialogButton", 0)
   
   
    BlzFrameSetLevel(buttonA, 2)
    BlzFrameSetLevel(buttonB, 3)
    BlzFrameSetLevel(buttonC, 1)

    BlzFrameSetLevel(buttonAA, 1)
    BlzFrameSetLevel(buttonAB, 5)

    BlzFrameSetLevel(buttonBA, 3)
    BlzFrameSetLevel(buttonBB, 1)
    BlzFrameSetLevel(buttonBBA, 6)

    BlzFrameSetLevel(buttonCB, 8)
    BlzFrameSetLevel(buttonCA, 7)

    BlzFrameSetText(buttonA, "A")
    BlzFrameSetText(buttonB, "B")
    BlzFrameSetText(buttonC, "C")
    BlzFrameSetText(buttonAA, "AA")
    BlzFrameSetText(buttonAB, "AB")
    BlzFrameSetText(buttonBA, "BA")
    BlzFrameSetText(buttonBB, "BB")
    BlzFrameSetText(buttonCA, "CA")
    BlzFrameSetText(buttonCB, "CB")
    BlzFrameSetText(buttonBBA, "BBA")
   
    BlzFrameSetAbsPoint(buttonC, FRAMEPOINT_CENTER, 0.24, 0.34)
    BlzFrameSetAbsPoint(buttonCA, FRAMEPOINT_CENTER, 0.26, 0.36)
    BlzFrameSetAbsPoint(buttonCB, FRAMEPOINT_CENTER, 0.28, 0.38)
    BlzFrameSetAbsPoint(buttonA, FRAMEPOINT_CENTER, 0.3, 0.4)
    BlzFrameSetAbsPoint(buttonAA, FRAMEPOINT_CENTER, 0.32, 0.42)
    BlzFrameSetAbsPoint(buttonAB, FRAMEPOINT_CENTER, 0.34, 0.44)
    BlzFrameSetAbsPoint(buttonB, FRAMEPOINT_CENTER, 0.36, 0.46)
    BlzFrameSetAbsPoint(buttonBB, FRAMEPOINT_CENTER, 0.38, 0.48)
    BlzFrameSetAbsPoint(buttonBBA, FRAMEPOINT_CENTER, 0.4, 0.5)
    BlzFrameSetAbsPoint(buttonBA, FRAMEPOINT_CENTER, 0.42, 0.52)
 end
end
Вот еще один код. Тут создают три кнопки в одном месте. И кнопка с высшим уровнем будет расположена выше. Этот пример показывает, что реакция события наводки мыши и клика на фрейм срабатывает на фрейм с высоким уровнем. Можете менять уровни и сами потестить:
do
    local real = MarkGameStarted
  function MarkGameStarted()
        real()
    local frameA = BlzCreateFrame("DebugButton", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
    local frameAChild = BlzCreateFrame("DebugButton", frameA, 0, 0)
    local frameB = BlzCreateFrame("DebugButton", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
    BlzFrameSetAbsPoint(frameA, FRAMEPOINT_CENTER, 0.4, 0.3)
    BlzFrameSetAbsPoint(frameAChild, FRAMEPOINT_CENTER, 0.4, 0.3)
    BlzFrameSetAbsPoint(frameB, FRAMEPOINT_CENTER, 0.4, 0.3)
    BlzFrameSetLevel(frameA, 0)
    BlzFrameSetLevel(frameB, 0)
    BlzFrameSetLevel(frameAChild, 0)
    for index = 1, 16, 1 do
        local trigger = CreateTrigger()
        BlzTriggerRegisterFrameEvent(trigger, frameA, ConvertFrameEventType(index))
        BlzTriggerRegisterFrameEvent(trigger, frameAChild, ConvertFrameEventType(index))
        BlzTriggerRegisterFrameEvent(trigger, frameB, ConvertFrameEventType(index))
        TriggerAddAction(trigger, function()
            if BlzGetTriggerFrame() == frameA then
                print("frameA")
            elseif BlzGetTriggerFrame() == frameB then
                print("frameB")
            else
                print("frameAChild")
            end
            print("Event",index)
            print("TriggerValue",  BlzGetTriggerFrameValue())
            print("TriggerText",  BlzGetTriggerFrameText())
        end)

    end

    BlzFrameSetText(frameA, "frameA")
    BlzFrameSetText(frameB, "frameB")
    BlzFrameSetText(frameAChild, "frameAChild")
  end
end

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