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

Содержание:
кратко: в своей системе строительства у меня искусственный прицел. То есть при нажатии на фрейм, мы вызываем прицел. А по факту прячем курсор, на его месте создается спецэффект, который двигается за невидимым курсором. Если у вас рассчитан таргет на точку, то невидимый курсор выделяет некоторые объекты на карте вроде юнитов, декор, итемы - а это не нужно. А еще нужно, контролировать процесс нажатия, если можно тут строить -- строим, нельзя - не даем таргету закрыться. Обычно абилками никак не запретить закрыться. На все эти две вещи решает это способ, описанный ниже
Предыстория: заметил, что моя мышь выделяет других юнитов, другие объекты. Этого нам не нужно. В итоге в одном из тестов я случайно создал поверх всего экрана невидимый фрейм, и никак не мог выделить юнитов, нажать. Решил записать это. И не думал, что оно пригодиться так скоро. Короче, нам нужно чтобы в игровой области во время таргет не выделялась? вот и решение. Однако, он еще и покрывал мини-карту и другие объекты. Когда таргет прицел включается, все объекты на экране невыделяемы из-за фрейма. Но я хотел чтобы кнопка была ниже всего интерфейса. Не мог родителя подобрать. Ниже интерфейса находится фрейм BlzGetOriginFrame ( ORIGIN_FRAME_WORLD_FRAME , 0 ). Мировой экран короче. Я раньше сколько не пробовал этот фрейм в качестве родителя использовать,при создании все время вылетало или работало не так как нужно, или не нужные дурацкие эффекты вроде кнопка снизу или еще чего.
Самый идеальный способ - использовать не обычных фреймов, а simpleframe вроде simplebutton. тк simplebutton не зависят от подуровней родителей, и параметров. И могут создаться ниже, над BlzGetOriginFrame ( ORIGIN_FRAME_WORLD_FRAME , 0 ) . чем обычные фреймы. И еще Button, GlueButton вызывают залипание, чего хотелось избежать
//ДЛЯ ДИНАМИЧНОЙ РАБОТЫ С sIMpLEbUTTON
Frame "SIMPLEBUTTON" "DynamicSimpleButton" {
    Width 0.039,
    Height 0.039,

    Texture "MySimpleButtonTexture" {
    }
}
lua-code
local parent = BlzGetOriginFrame ( ORIGIN_FRAME_WORLD_FRAME , 0 )  
    local button = BlzCreateSimpleFrame("DynamicSimpleButton", parent , 0)
    BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.3)
    --если хотите проверить видимость, то текстурой чекаем
    --BlzFrameSetTexture(BlzGetFrameByName("MySimpleButtonTexture", 0), "ReplaceableTextures\\CommandButtons\\BTNHeroPaladin", 0, true)
    BlzFrameSetSize(button, 0.544*2, 0.6)
Отследить в какой области находится курсор просто, и выделение юнита можно отслеживать нативкой BlzGetMouseFocusUnit(). Однако, у reforget нет нативок отслеживания положения координат курсора на экране. Поэтому мы просто таймером чекаем можно ли тут таргет нажимать, или нельзя. Если объект или точка невыделяема, то просто на весь экран накидываем маску, или снимаем. Если таргет можно закрылся -снимаем. Т.е прячем маску.
вот этот фрейм, который будет ниже всего интерфейса. вот на него можно повесить события клика/входа и выхода и пр. Идеал. Вы теперь можете знать в игровой карте или нет лежит. Просто координаты мыши сверять не удобно, тк он не везде 0.0 выдает. только наверху. Хотя сейчас норм, что объекты не выделяются мышью, войска не выделить и пр. И это мб недостатком
Самый идеальный родитель - ConsoleUIBackdrop.

Пример маски

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()


    BlzLoadTOCFile("war3mapImported\\MySimpleButton.toc")
	local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
    
    local path_active_icon = "ReplaceableTextures\\CommandButtons\\BTN"
    local path_disabled_icon = "eplaceableTextures\\CommandButtonsDisabled\\DISBTN"
    local path_icon_cancel = "Cancel"
    local cancel_text_tip = "Добавить маску"
    local cancel_text_ubertip = "Выделенные объекты на карте перестают быть выделенными"
    local size_button = 0.039
    
    
    --маска экрана (не дает выделять и выбирать объекты на карте во время выбора участка)  
    local Mask=BlzCreateFrameByType("SLIDER","Mask",BlzGetFrameByName("ConsoleUIBackdrop",0),"",0)
    BlzFrameSetLevel(Mask, 1)
    BlzFrameSetSize(Mask, 0.6*2, 0.6*2)
    BlzFrameSetEnable(Mask, false)
    BlzFrameSetAbsPoint(Mask, FRAMEPOINT_CENTER, 0.4, 0.3)
    
    local button_cancel = BlzCreateFrameByType("SLIDER","button cancel",gameUI,"",0)
    local icon_button_cancel = BlzCreateFrameByType("BACKDROP","IconTexture",button_cancel,"",0)
    BlzFrameSetAbsPoint(button_cancel, FRAMEPOINT_CENTER, 0.4, 0.3)
    BlzFrameSetAllPoints(icon_button_cancel,button_cancel)
    BlzFrameSetTexture(icon_button_cancel, path_active_icon .. path_icon_cancel, 0, true)
    BlzFrameSetSize(button_cancel, size_button, size_button)
    --BlzFrameSetVisible(button_cancel, false)

    local tooltip_button_cancel = BlzCreateFrameByType("FRAME","tooltip",button_cancel,"",0)
    BlzFrameSetVisible(tooltip_button_cancel, false)
    
    local backdrop_tooltip_button_cancel = BlzCreateFrameByType("BACKDROP","",tooltip_button_cancel,"BoxedTextBackgroundTemplate",0)
    local description_tooltip_button_cancel = BlzCreateFrameByType("TEXT","",tooltip_button_cancel,"BoxedTextValue",0)
    local title_tooltip_button_cancel = BlzCreateFrameByType("TEXT","",tooltip_button_cancel,"BoxedTextTitle",0)
    local separator = BlzCreateFrameByType("BACKDROP","",tooltip_button_cancel,"",0)

    BlzFrameSetAbsPoint(description_tooltip_button_cancel, FRAMEPOINT_BOTTOMLEFT, 0.55, 0.19)
    BlzFrameSetSize(description_tooltip_button_cancel, 0.25, 0)
    BlzFrameSetEnable(description_tooltip_button_cancel, false)
    BlzFrameSetText(description_tooltip_button_cancel,cancel_text_ubertip)

    BlzFrameSetPoint(separator, FRAMEPOINT_BOTTOMLEFT, description_tooltip_button_cancel, FRAMEPOINT_TOPLEFT, 0.0025, 0.0025)
    BlzFrameSetPoint(separator, FRAMEPOINT_BOTTOMRIGHT, description_tooltip_button_cancel, FRAMEPOINT_TOPRIGHT, 0.0025, 0.0025)
    BlzFrameSetSize(separator, 0, 0.0015)
    BlzFrameSetTexture(separator, "UI\\Widgets\\ToolTips\\Human\\HorizontalSeparator",0, true) 

    BlzFrameSetPoint(title_tooltip_button_cancel, FRAMEPOINT_BOTTOMLEFT, separator, FRAMEPOINT_TOPLEFT, -0.005, 0.005)
    BlzFrameSetSize(title_tooltip_button_cancel, 0.25, 0)
    BlzFrameSetEnable(title_tooltip_button_cancel, false)
    BlzFrameSetText(title_tooltip_button_cancel,cancel_text_tip)

    BlzFrameSetPoint(backdrop_tooltip_button_cancel, FRAMEPOINT_BOTTOMLEFT, description_tooltip_button_cancel, FRAMEPOINT_BOTTOMLEFT, -0.005, -0.005)
    BlzFrameSetPoint(backdrop_tooltip_button_cancel, FRAMEPOINT_TOPRIGHT, title_tooltip_button_cancel, FRAMEPOINT_TOPRIGHT, 0.005, 0.005)
    BlzFrameSetTooltip(button_cancel, tooltip_button_cancel)

    local flag_enable_mask= false

    local trigger_button_cancel_click=CreateTrigger()
    BlzTriggerRegisterFrameEvent(trigger_button_cancel_click, button_cancel, FRAMEEVENT_MOUSE_UP)
    TriggerAddAction(trigger_button_cancel_click,function()
        print('click button "cancel"')
        flag_enable_mask = not flag_enable_mask
        BlzFrameSetEnable(Mask, flag_enable_mask)
        if flag_enable_mask then
            print('добавляем маску')
            BlzFrameSetText(description_tooltip_button_cancel,cancel_text_ubertip)
            BlzFrameSetText(title_tooltip_button_cancel,cancel_text_tip)
        else
            print('убираем маску')
            BlzFrameSetText(description_tooltip_button_cancel,"Выделенные объекты мышкой снова становятся выделяемы")
            BlzFrameSetText(title_tooltip_button_cancel,"Убирает маску")
        end
    end)
    
    unitmouse = nil
    tr_mouse_move = CreateTrigger()
    TriggerRegisterPlayerEvent(tr_mouse_move, Player(0), EVENT_PLAYER_MOUSE_MOVE )
    TriggerAddAction(tr_mouse_move, function()
        print(BlzGetTriggerPlayerMouseX(),BlzGetTriggerPlayerMouseY())   
        if BlzGetMouseFocusUnit() ~= unitmouse then 
            unitmouse=BlzGetMouseFocusUnit()
            if unitmouse~= nil then
                print('выделен юнит: '..GetUnitName(unitmouse))
            else
                print('юнит не выделен')
            end
        end
    end)
    
    end
end
как мы видим объекты перестают выделяться, а все клики идут по фрейму-маски. мы можем отследить идет ли клик по юниту, или по точке.
еще можно некоторые параметры селекта отключить, правда, таргет, неизвестно, можно ли отключить
глобальные параметры селекта (выделения, выбора)
Вы можете отключать и включать выбор игроку. Пример, заклинание наведения на точку не при нацеливании не может выделять объектов, это как один из примеров управления интерфейс-функциями. Отключить еще можно визуальные составляющие
объекты могут быть выделены/не выделены, круг выбора отображается/не отображается
native EnableSelect takes boolean state, boolean ui returns nothing
при наведении объекты могут быть выделены/не выделены, визуальные части вроде круга, полоски жизни мана и хп, и подсказки-фреймы над головой
native EnablePreSelect takes boolean state, boolean ui returns nothing
при drag-select перетаскивании, а точнее выделение юнитов прямоугольной рамкой drag selection. выделяются/не выделяются объекты, включает/отключает визуальную рамку выделения drag selection box
native EnableDragSelect takes boolean state, boolean ui returns nothing
включить/отключить выделение юнита и круг выбора
function BlzIsSelectionEnabled takes nothing returns boolean
function BlzIsSelectionCircleEnabled takes nothing returns boolean
function BlzEnableSelections takes boolean enableSelection, boolean enableSelectionCircle returns nothing
функции таргет индикатора
есть функции таргета, правда неизвестно за что они отвечают. может быть за смену индикатора?
---@param enable boolean
---@return nothing
function BlzEnableTargetIndicator(enable) end    -- (native)

---@return boolean
function BlzIsTargetIndicatorEnabled() end    -- (native)

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
11 месяцев назад
0
Вот одна из идеи применения маски ссылка
Правда там решается своя задача
0
23
11 месяцев назад
0
МрачныйВорон, ну да, я у тебя это и подглядел, что через text frame не прокликивает, и уже потом как-то почти случайно проверил влияет ли запрет клика на залипание, оказалось, что влияет
Чтобы оставить комментарий, пожалуйста, войдите на сайт.