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

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

Содержание:
кратко: это статья посвещена созданию подсказки для SIMPLEBUTTON
Ранее ваш переводчик использовал кнопки типа BUTTON GLUEBUTTON. К сожалению, хорошего примера на момент написания этой статьи не осталось. А те, что остались не очень хороши.
Причина отказа от BUTTON и GLUEBUTTON просто - у этих функциональных кнопок существует залипание. Да, существует решение отключить и сразу же включить фрейм. Однако, это работает, если вы жмете один раз или несколько с задержкой.
Недостаток: залипание клавиши у обычных кнопок, особенно, когда дико много кликаем по кнопке, и фокус клавы смещается к кнопке-фрейму. еще смещение камеры не отпускает, ксли вы стрелочками двигали камеру. игра думает теперь, что кнопка-фрейм удерживается/зажата. и вручную не получается вернуть по времени. поэтому искал решение - и нашел - использовать SIMPLEBUTTON, у которых не бывает залипания кнопки. От этих обычных кнопок пришлось отказаться. Развивать систему с обычными кнопками решил не продолжать, поэтому она не доработана.

Tooltip для SimpleButton

Есть проблемы с созданием Tooltip для SimpleButton. Кнопкам button, gluebutton это сделать проще. Почему объясню сейчас. Есть даже специальное действие BlzFrameSetTooltip(frame, tooltip). Оно подходит и для обычных кнопок, и для SimpleButton. Только вот у обычных подсказка работает с обычными фреймами, а у Simple frames работает с Simple frames. Короче, для SimpleButton требуется Simple frame указать в качестве Tooltip. Иначе просто не работает. Предлагается для SimpleButton создать fdf-шаблон SIMPLEFRAME с нужными потомками, и ловить вход курсора. Проблемы вот в чем.
1. Параметры родителя у SimpleFrames не наследуются
Все текст и фон можно завязать на один Simpleframe, и когда курсор входит в кнопку/покидает кнопку, должны появится/исчезнуть потомки. Этого не происходит, надо делать вручную таймером, чекая видимость Simpleframe. Поэтому я и пишу: создайте общий SIMPLEFRAME в fdf-file, и впишите сюда всех потомков (фон, текст). SIMPLEFRAME будет исчезать и появляться вместе с потомками.
2. границы Tooltip
Вторая проблема - изображение фона, backdrop состоит из background (фона) и borders (границ). Мне пришлось как-то взаимодействовать с 2 изображения - просто сложно. Основная сложность - borders (границы), эти текстуры borders работают и собираются только в backdrop. Пример текстура границ:
Вот как эту текстуру собрать то? Проще было бы самим нарисовать фон с границами. В обычных фреймах они поделены на части: фон, границы. Однако и тут проблемы с нарисованной текстурой (взял фон и границы и слепил из них текстуру), при изменении размеров, например, при расширении у вас границы растягиваются до неприличия уродливо. Пример:
fdf код
//Для ДИНАМИЧНОЙ РАБОТЫ С STRING
Frame "SIMPLEFRAME" "ParentString" {
    Width 0.0001,
    Height 0.0001,
    DecorateFileNames,   
    String "TestStringValue" {
       Anchor BOTTOMRIGHT, 0, 0,
       //Font "InfoPanelTextFont", 0.01,
       Font "MasterFont",0.01,
       FontColor 1.0 1.0 1.0,
    }
}

//ДЛЯ ДИНАМИЧЕСКОЙ РАБОТЫ С ТЕКСТУРОЙ
Frame "SIMPLEFRAME" "ParentTexture" {
    Width 0.0001,
    Height 0.0001,
    DecorateFileNames,
    Texture "TestTexture" {
        BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
        BackdropCornerSize  0.0125,
        BackdropBackgroundSize  0.02, //in tile mode, size of each tile
        BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
        BackdropEdgeFile  "UI\Widgets\ToolTips\Human\human-tooltip-border.blp",
    }
}

//ДЛЯ ДИНАМИЧНОЙ РАБОТЫ С TOOLTIP
Frame "SIMPLEFRAME" "Tooltip" {
    Width 0.0001,
    Height 0.0001,
    DecorateFileNames,   
    String "TooltipString" {
          Anchor BOTTOMRIGHT, 0, 0,
          //Font "InfoPanelTextFont", 0.01,
          Font "MasterFont",0.01,
          FontColor 1.0 1.0 1.0,
    }

    Texture "TooltipTexture" {
    }
}
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 = BlzCreateSimpleFrame("DynamicSimpleButton", gameUI, 0)
    local texture = BlzGetFrameByName("MySimpleButtonTexture", 0)
    BlzFrameSetAllPoints(texture, button)
    --BlzFrameSetLevel(button, 1)
    
    --без родителя нельзя создать типы фреймов String или Texture.
    
    --текст кнопки
    local StringParentFrame = BlzCreateSimpleFrame("ParentString", gameUI, 0)
    local StringText = BlzGetFrameByName("TestStringValue", 0)
    BlzFrameSetLevel(StringParentFrame, 2)
    BlzFrameSetEnable(StringParentFrame, false) --пока нам текст не нужен  
       
    --текстура рамки зарядов кнопки
    --потомков Texture нельзя привязать через BlzFrameSetPoint к другим фреймам, тк изображение пропадает. проще привязывать родителей
    local TextureChargesParentFrame = BlzCreateSimpleFrame("ParentTexture", gameUI, 0)
    local TextureCharges = BlzGetFrameByName("TestTexture", 0)
    BlzFrameSetAllPoints(TextureCharges, TextureChargesParentFrame)
    BlzFrameSetLevel(TextureChargesParentFrame, 3)
    
    
    --текст зарядов кнопки
    --String может изменять свои размеры в зависимости от объема текста
    local StringChargesParentFrame = BlzCreateSimpleFrame("ParentString", gameUI, 0)
    local StringCharges = BlzGetFrameByName("TestStringValue", 0)
    BlzFrameSetSize(StringCharges, 0, 0) --размер текста
    BlzFrameSetFont(StringCharges, "Fonts\\BLQ55Web.ttf", 0.008, 0)  --MasterFont=Fonts\BLQ55Web.ttf
    BlzFrameSetLevel(StringChargesParentFrame, 4)

    --отображение всех предков на экране
    BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.3)
    BlzFrameSetAbsPoint(TextureChargesParentFrame, FRAMEPOINT_CENTER, 0.5, 0.3)
    BlzFrameSetAbsPoint(StringChargesParentFrame, FRAMEPOINT_CENTER, 0.65, 0.3)

    
    --прикрепляем всех друг к другу
    BlzFrameSetPoint(StringCharges, FRAMEPOINT_BOTTOMRIGHT, button, FRAMEPOINT_BOTTOMRIGHT, -0.004,0.004)
    --привязываем родителя текстуры к тексту, иначе вылетает.
    --тк текстуру нельзя привязать к другим объектам, привязывается только к родителям
    BlzFrameSetPoint(TextureChargesParentFrame, FRAMEPOINT_BOTTOMRIGHT, StringCharges, FRAMEPOINT_BOTTOMRIGHT, 0.004, -0.004)
    BlzFrameSetPoint(TextureChargesParentFrame, FRAMEPOINT_TOPLEFT, StringCharges, FRAMEPOINT_TOPLEFT, -0.004, 0.004)

    BlzFrameSetTexture(texture, "ReplaceableTextures\\CommandButtons\\BTNHeroPaladin", 0, true)
    BlzFrameSetTexture(TextureCharges, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
    BlzFrameSetText(StringCharges, "9")


    --подсказка
    local Tooltip = BlzCreateSimpleFrame("Tooltip", gameUI, 0)
    local TooltipText = BlzGetFrameByName("TooltipString", 0)
    local TooltipTexture = BlzGetFrameByName("TooltipTexture", 0)
    BlzFrameSetAllPoints(TooltipTexture, Tooltip)
    
    BlzFrameSetText(TooltipText, "Привет мир!")
    BlzFrameSetTexture(TooltipTexture, "background tooltip.blp", 0, true)
    BlzFrameSetSize(TooltipText, 0, 0) --размер текста
    
    --BlzFrameSetLevel(Tooltip, 99)
    BlzFrameSetEnable(Tooltip, false)
    BlzFrameSetEnable(TooltipText, false)
           
    BlzFrameSetPoint(TooltipText, FRAMEPOINT_BOTTOM, button, FRAMEPOINT_TOP, 0,0.04)
    BlzFrameSetPoint(Tooltip, FRAMEPOINT_BOTTOMRIGHT, TooltipText, FRAMEPOINT_BOTTOMRIGHT, 0.005, -0.005)
    BlzFrameSetPoint(Tooltip, FRAMEPOINT_TOPLEFT, TooltipText, FRAMEPOINT_TOPLEFT, -0.015, 0.005)

    BlzFrameSetTooltip(button, Tooltip)
    BlzFrameSetVisible(Tooltip, false)

        TimerStart(CreateTimer(), 1.0/32, true, function()        

            if BlzFrameIsVisible(Tooltip) then
                print("подсказка отображается")
            else
                print("подсказки НЕТ")
            end
        end)
    
    
    local trigger_click_button = CreateTrigger()
    BlzTriggerRegisterFrameEvent(trigger_click_button, button, FRAMEEVENT_CONTROL_CLICK )

    TriggerAddAction(trigger_click_button, function()

       print(GetPlayerName(GetTriggerPlayer()).." pressed: "..BlzFrameGetName(BlzGetTriggerFrame()))

    end)
    
    end

end
Вот что получилось в итоге, фон и границы растягиваются с расширением объема текста. Тут не только проблемы с границами, пришлось бы шаманить с оффсетами и выравниванием текста:
Согласитесь, смотрится не очень. Если текстура фона была бы одноцветная или попроще, нам бы не нужно было заменять. Но тут есть границы - линии, показывающие предел текста. При растяжении во-первых, изображения линии размыто до ужаса, и во-вторых, текст уже лежит на границах / вылезает за эти границы. Просто нет четких разграничении.
Мне пришлось бы отказаться от Simple Button, тк больше решении я не видел (разве что таймером проверять наведена ли мышь на кнопку). Но решение есть. Как ни странно, я не задумывался использовать обычные фреймы в fdf-file, тк часто в связке simple frame + обычный фрейм не работают в функции BlzFrameSetTooltip или при создании нельзя указывать потомка другой группы

РЕШЕНИЕ:

Долго я тыкался, пока не нашел решение. Оказывается в fdf-file внутрь главного фрейма SIMPLEFRAME можно запихать обычные фреймы вроде BACKDROP, TEXT. Когда создаете SIMPLEFRAME, вы можете загрузить и обычные.
TEXT обладает невидимой прямоугольной рамкой, и расширяется в зависимости от объема текста. Но если задать строгие размеры, то текст весь влезает в пределах размеров, а тот что не влез, отсекается. Когда подсказка SIMPLEFRAME скрыта, TEXT тоже скрывается, но область остается некликабельной. тк в том месте, где лежала подсказка область не дает кликнуть. Но странно, что такое не замечается с обычными фреми (не simpleframes). чтобы TEXT не контролировал область (не блокировал клики ), можно отключить его BlzFrameSetEnable(Text, false)
можно изменить fdf-file, изменения произошли в фрейме Tooltip
fdf код
//ДЛЯ ДИНАМИЧНОЙ РАБОТЫ С TOOLTIP
Frame "SIMPLEFRAME" "Tooltip" {
    Width 0.0001,
    Height 0.0001,

    DecorateFileNames,
  //хотел поднять String на уровень выше, но не работает
  //Layer "ARTWORK" {
    Frame "SIMPLEFRAME" "ParentTooltipString" {
        Width 0.0001,
        Height 0.0001,
        DecorateFileNames,
        //хотел использовать String вместо типа TEXT, тк TEXT в местах делает область некликабельной. Но позже оказалось отключать фрейм TEXT 
        String "TooltipStringValue" {
                DecorateFileNames,
               Anchor BOTTOMRIGHT, 0, 0,
               //Font "InfoPanelTextFont", 0.01,
               Font "MasterFont",0.01,
               FontColor 1.0 1.0 1.0,
        }
    //}

    Frame "TEXT" "TooltipTextTitle" {
       
       DecorateFileNames,

       FontFlags "FIXEDSIZE",
       FrameFont "MasterFont", 0.014, "",

       FontColor 1.0 1.0 1.0 1.0, //Red Green Blue Alpha 0.0 to 1.0
       //FontShadowColor 0.0 0.0 0.0 0.9,
       //FontShadowOffset 0.001 -0.001,
    }

    Frame "TEXT" "TooltipTextValue" {
       DecorateFileNames,

       FontFlags "FIXEDSIZE",
       
       FrameFont "MasterFont", 0.011, "",
       FontColor 1.0 1.0 1.0 1.0,
       //FontShadowColor 0.0 0.0 0.0 0.9,
       //FontShadowOffset 0.001 -0.001,
    }

      //пробовал опустить слоем BACKDROP ниже, но не получилось
    //Layer "BACKGROUND" {
        Frame "BACKDROP" "TooltipBox" {
           DecorateFileNames, 
          BackdropTileBackground, //Tile mode enabled
          BackdropBackground  "ToolTipBackground", //BackgroundFile
          BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
           BackdropCornerSize  0.008, //higher numbers make the corners bigger.
           BackdropBackgroundInsets 0.0022 0.0022 0.0022 0.0022, //makes the background smaller, from the outside.
            BackdropEdgeFile  "ToolTipBorder", //the border File
          BackdropBlendAll,
        }
    //}

      //Можно свечение кнопки включать при наведении на кнопку. главное повесить подсказку Tooltip на кнопку. Но пришлось отказаться, тк нашел способ лучше - Texture, которую можно перекрашивать триггером.
    //Frame "HIGHLIGHT" "MouseHighlight" {
    //     HighlightType "FILETEXTURE",
    //     HighlightAlphaFile "UI\Glues\ScoreScreen\scorescreen-tab-hilight.blp",
    //     HighlightAlphaMode "ADD",
    //}

  }

}
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 = BlzCreateSimpleFrame("DynamicSimpleButton", gameUI, 0)
    local texture = BlzGetFrameByName("MySimpleButtonTexture", 0)
    BlzFrameSetAllPoints(texture, button)
    BlzFrameSetLevel(button, 2) --пришлось поднять с 1 уровня на 2, тк текстура кнопки иногда "проваливалась" в тени консольной текстуры, и часть ее можно было не видеть. все остальные фреймы кнопки пришлось поднимать выше на один уровень, чтобы соответствовать
    
    --текст кнопки
    local StringParentFrame = BlzCreateSimpleFrame("ParentString", gameUI, 0)
    local StringText = BlzGetFrameByName("TestStringValue", 0)
    BlzFrameSetLevel(StringParentFrame, 3)
    BlzFrameSetEnable(StringParentFrame, false) --пока нам текст не нужен  
       
    --текстура рамки зарядов кнопки
    --потомков Texture нельзя привязать через BlzFrameSetPoint к другим фреймам, тк изображение пропадает. проще привязывать родителей
    local TextureChargesParentFrame = BlzCreateSimpleFrame("ParentTexture", gameUI, 0)
    local TextureCharges = BlzGetFrameByName("TestTexture", 0)
    BlzFrameSetAllPoints(TextureCharges, TextureChargesParentFrame)
    BlzFrameSetLevel(TextureChargesParentFrame, 3)
    
    
    --текст зарядов кнопки
    --String может изменять свои размеры в зависимости от объема текста
    local StringChargesParentFrame = BlzCreateSimpleFrame("ParentString", gameUI, 0)
    local StringCharges = BlzGetFrameByName("TestStringValue", 0)
    BlzFrameSetSize(StringCharges, 0, 0) --размер текста
    --BlzFrameSetFont(StringCharges, "Fonts\\BLQ55Web.ttf", 0.008, 0)  --MasterFont=Fonts\BLQ55Web.ttf
    BlzFrameSetLevel(StringChargesParentFrame, 4)

    --отображение всех предков на экране
    BlzFrameSetAbsPoint(button, FRAMEPOINT_CENTER, 0.4, 0.2)
    BlzFrameSetAbsPoint(TextureChargesParentFrame, FRAMEPOINT_CENTER, 0.5, 0.3)
    BlzFrameSetAbsPoint(StringChargesParentFrame, FRAMEPOINT_CENTER, 0.65, 0.3)

    
    --прикрепляем всех друг к другу
    BlzFrameSetPoint(StringCharges, FRAMEPOINT_BOTTOMRIGHT, button, FRAMEPOINT_BOTTOMRIGHT, -0.004,0.004)
    BlzFrameSetPoint(TextureChargesParentFrame, FRAMEPOINT_BOTTOMRIGHT, StringCharges, FRAMEPOINT_BOTTOMRIGHT, 0.004, -0.004)
    BlzFrameSetPoint(TextureChargesParentFrame, FRAMEPOINT_TOPLEFT, StringCharges, FRAMEPOINT_TOPLEFT, -0.004, 0.004)

    BlzFrameSetTexture(texture, "ReplaceableTextures\\CommandButtons\\BTNHeroPaladin", 0, true)
    BlzFrameSetTexture(TextureCharges, "UI\\Widgets\\Console\\Human\\CommandButton\\human-button-lvls-overlay", 0, true)
    BlzFrameSetText(StringCharges, "9")


    --подсветка текстуры
    --в качестве основы взял ScoreScreenTabButtonTemplate
    local TextureHightLightParentFrame = BlzCreateSimpleFrame("ParentTextureHightLight", gameUI, 0)
    local TextureHightLight = BlzGetFrameByName("TextureHighLight", 0)
    BlzFrameSetAllPoints(TextureHightLight, TextureHightLightParentFrame)
    BlzFrameSetAllPoints(TextureHightLightParentFrame, button)
    --BlzFrameSetTexture(TextureHightLight, "UI\\Glues\\ScoreScreen\\scorescreen-tab-hilight", 2, false)
    BlzFrameSetLevel(TextureHightLightParentFrame, 4)
    --можно менять цвет подсветке ARGB. Каждый параметр задается 1-255
    BlzFrameSetVertexColor(TextureHightLight, BlzConvertColor(255, 255, 255, 255))
    BlzFrameSetVisible(TextureHightLightParentFrame, false)

    --подсказка
    local Tooltip = BlzCreateSimpleFrame("Tooltip", gameUI, 0)
        
    --создаем рамку подсказки
    local tooltipBox = BlzGetFrameByName("TooltipBox", 0)
    BlzFrameSetLevel(tooltipBox, 1)

    --создаем текст для подсказки
    --имеет ограничения в пределах 4:3 экрана
    local tooltipText = BlzGetFrameByName("TooltipTextValue", 0)
    --поднимаем текст выше рамки подсказки
    BlzFrameSetLevel(tooltipText, 2)
    --выключаем TEXT, тк в этой области не дает кликать
    BlzFrameSetEnable(tooltipText, false)
    BlzFrameSetVisible(tooltipText, false)
    
    
    --Если хотите изменить TEXT на String
    --однако, tooltipText всегда лежит ниже, чем tooltipBox типа BACKDROP.
    --Из-за особенностей fdf-file, где внутри SIMPLEFRAME лежат String и BACKDROP. Уровнем никак не поднять.
    --Layer (слои) не прописать, тк работают только с simplefremes, а одновременно багуется.
    --как итог отказался от трех нижних строчек
      --Это не значит, что String плохая или нельзя придумать. Придумать можно. Однако, система обычных фреймов и SimpleFrames несовместима. String не получается взаимодействовать с BACKDROP, всегда ниже лежит. Я уже нашел решение с TEXT. Просто времени не хочется терять на подбор и тесты с String
    --local TooltipStringParentFrame = BlzGetFrameByName("ParentTooltipString", 0)
    --local tooltipText = BlzGetFrameByName("TooltipStringValue", 0)
    --BlzFrameSetLevel(TooltipStringParentFrame, 5)

    BlzFrameSetTextAlignment(tooltipText,TEXT_JUSTIFY_TOP,TEXT_JUSTIFY_LEFT)
    --BlzFrameSetFont(tooltipText, "Fonts\\BLQ55Web.ttf", 0.008, 0)  --MasterFont=Fonts\BLQ55Web.ttf


    --текст шириной 0.25
    BlzFrameSetSize(tooltipText, 0.25, 0)
    -- рамка копирует размеры с оффсетами
    --BlzFrameSetPoint(tooltipBox, FRAMEPOINT_BOTTOMLEFT, tooltipText, FRAMEPOINT_BOTTOMLEFT, -0.005, -0.005)
    --BlzFrameSetPoint(tooltipBox, FRAMEPOINT_TOPRIGHT, tooltipText, FRAMEPOINT_TOPRIGHT, 0.005, 0.005)
    BlzFrameSetPoint(tooltipBox, FRAMEPOINT_BOTTOMRIGHT, tooltipText, FRAMEPOINT_BOTTOMRIGHT, 0.005, -0.005)
    BlzFrameSetPoint(tooltipBox, FRAMEPOINT_TOPLEFT, tooltipText, FRAMEPOINT_TOPLEFT, -0.005, 0.005)
    
    BlzFrameSetTooltip(button, Tooltip)
    BlzFrameSetVisible(Tooltip, false)
    
    BlzFrameSetVisible(tooltipBox, false)
    -- Place the Tooltip above the Button
    BlzFrameSetPoint(tooltipText, FRAMEPOINT_BOTTOM, button, FRAMEPOINT_TOP, 0, 0.03)
    --BlzFrameSetAbsPoint(tooltipText, FRAMEPOINT_BOTTOM, 0.4, 0.35)
    
    --тут задаем текст подсказке. Тут два варианта. Сначала проверял короткий. И потом попробовал большой текст, смотрел как расширяется рамка при увеличении объема текста. Тут вышло много текста, и часть не влезло в рамку. Ничего страшного если смотрится не очень
    BlzFrameSetText(tooltipText, "Первым человеком, который заразился новым коронавирусом, мог стать сотрудник лаборатории в Ухане, который собирал образцы у летучих мышей в естественной среде, сообщил руководитель группы экспертов Всемирной организации здравоохранения (ВОЗ), датский ученый Питер Эмбарек в интервью датскому каналу tv2. «Сотрудник, который был заражен в полевых условиях во время сбора материала, является одной из вероятных гипотез. Это место, где вирус переходит непосредственно от летучей мыши к человеку. В этом случае это был бы работник лаборатории, а не случайный житель деревни или другой человек, который регулярно контактирует с летучими мышами», -- пояснил Эмбарек. В ВОЗ допустили одобрение «Спутника V» к середине сентябряУченый подчеркнул, что эксперты ВОЗ не нашли прямых доказательств того, что вспышка коронавируса связана с исследованиями летучих мышей в лаборатории Уханя. В марте этого года ВОЗ опубликовала доклад о возникновении COVID-19. ВОЗ представила в нем четыре версии появления вируса. Наиболее вероятной авторы считают версию о передаче коронавируса человеку от летучих мышей через животное-посредника. При этом версию об утечке вируса из лаборатории в Ухане в ВОЗ назвали «крайне маловероятной». Затем гендиректор ВОЗ доктор Тедрос Аданом Гебрейесус заявил, что организация готовится ко второму этапу расследования появления коронавируса и ожидает прозрачности от китайских властей. Он заявил, что исключать версию, что коронавирус распространился после утечки из лаборатории в Китае, пока рано, и призвал Китай к открытому сотрудничеству. Он также сообщил, что ВОЗ планирует проверить лабораторию в Ухане, рядом с которой были зарегистрированы первые случаи заражения COVID-19.")
    --BlzFrameSetText(tooltipText, "Привет" )
    
    
        local cursor_on_the_button = false
        local left_button_pressed = false
        local count = 0
       --этим таймером проверяем наведение курсора мыши на кнопку
        TimerStart(CreateTimer(), 1.0/32, true, function()        

            if BlzFrameIsVisible(Tooltip) and (not cursor_on_the_button) then
                print("подсказка отображается")
                cursor_on_the_button = true
                BlzFrameSetVisible(TextureHightLightParentFrame, true)
            elseif (not BlzFrameIsVisible(Tooltip)) and cursor_on_the_button then
                print("подсказки НЕТ")
                cursor_on_the_button = false
                BlzFrameSetVisible(TextureHightLightParentFrame, false)
            end
        end)
    
    
    local trigger_click_button = CreateTrigger()
    BlzTriggerRegisterFrameEvent(trigger_click_button, button, FRAMEEVENT_CONTROL_CLICK )

    TriggerAddAction(trigger_click_button, function()

       print(GetPlayerName(GetTriggerPlayer()).." pressed: "..BlzFrameGetName(BlzGetTriggerFrame()))
       BlzFrameSetEnable(BlzGetTriggerFrame(),false)
       BlzFrameSetEnable(BlzGetTriggerFrame(),true)
       if GetLocalPlayer() == GetTriggerPlayer() then
            EnableUserControl(true)
        --        print("клик левой")
        end

    end)
    
    local timer_for_down_button = CreateTimer()
    
    
    --прожимание кнопки-фрейма (down button) не отслеживается, только отпускание (up button) или клик (click button). Поэтому решаем другим способом, через мышь
    local trigger_click_mouse = CreateTrigger()

    TriggerRegisterPlayerEvent(trigger_click_mouse, GetLocalPlayer(), EVENT_PLAYER_MOUSE_DOWN)
    TriggerRegisterPlayerEvent(trigger_click_mouse, GetLocalPlayer(), EVENT_PLAYER_MOUSE_UP)
    
    TriggerAddAction(trigger_click_mouse, function()
        count = count + 1

        if not left_button_pressed then
            if (GetTriggerEventId()==EVENT_PLAYER_MOUSE_DOWN) and ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT )and cursor_on_the_button then

                print(count..") ".."DOWN")
                --print(count..") "..GetPlayerName(GetTriggerPlayer()).." down left button mouse on the: "..BlzFrameGetName(button))
                left_button_pressed = true
                PauseTimer(timer_for_down_button)
                BlzFrameSetSize(button, 0.039, 0.039)
 
                
                TimerStart(timer_for_down_button, 1.0/32, FALSE, function()   
            
                    
                    BlzFrameSetSize(button, 0.037, 0.037)
                    
                    --если в этом момент уже отпущена кнопка, то отпускаем размер
                    if not left_button_pressed then
                    --но отпускаем не сразу, нам нужно показать 0.037. А потом отпустить
                        TimerStart(timer_for_down_button, 1.0/32, FALSE, function()   
                            BlzFrameSetSize(button, 0.039, 0.039)
                        end)

                    end
                
            
                end)
            end
        else

            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)
    
    end
end
что получилось в итоге?
ну уже лучше. Однако, мне пришлось выравнивать текст по горизонтали и вертикали. И увеличивать оффсеты, а то текст съехал вниз. Когда текста много, то текст съезжает.
Немного смущает, что у данного текста нет выравнивания текста по ширине. В варкрафте не существует выравнивания по ширине. Ранее я видел похожее (см. скрин ниже), но на самом деле там выравнивание по левому краю и выравнивание по верхнему краю происходит. Здесь судя по всему выравнивание по середине, и весь текст не влез, поэтому торчит снизу
Выравниваем текст кодом
BlzFrameSetTextAlignment(tooltipText,TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_LEFT)
и задали оффсеты 0.02 , 0.02
и получаем типичный код варика, см. ниже рисунок.
Все это действие с выравниванием можно было прописать в fdf-file в фрейме TEXT
Проблема осталась только в том,что TEXT не обрезает часть текста, и оно вылезает за пределы размеров. Делает это игра от случая к случаю, то она хорошо обрезает, то плохо. Когда текст упирается в верхние границы экрана и поэтому она смещает текст вниз. Строчка лишняя внизу торчит. За пределами подсказки часть может вылезти, поэтому стоит регулировать кол-ва текста - но тут я не думаю, что пользователь будет вводить целые тексты. Решения я не нашел. Однако, я думаю, что пользователи не будут много текста пихать, верно?

Динамичное отображение инфы. Обновление информации в подсказках

кратко: необходимо иногда, чтобы текст подсказки менялся в зависимости от данных, переменных. Если изменить триггерно переменную, то и описание текста должно также обновляться. Пример,
local int = 50
local s = “воин получил ”..int..” яблок”
Строка s запоминает текст таким, каким был введен. Будущее изменение числа int никак не обновит описание строки s, нужно перезаписывать. К сожалению, в игре предусмотрено только на внутреннем движке. Нам нельзя никак изменить обычными средствами.
Но постойте-ка, изменить это можно на фреймах с помощью таймера. Вопрос как это сделать? таймером. периодически перебирать и изменять описание строки.
это можно сделать с помощью языка lua. там есть замечательная функция string.gsub
local s = “воин получил int яблок” 
string.gsub(s,”int”,”50”) --заменяет в строке s “int” на “50”

Подсветка для SimpleButton

У функциональных кнопок меню есть HighLight. При наведении курсором кнопка подсвечивается. По факту там сверху накладывают полупрозрачную текстуру HighLight. SimpleButton лишена такой функции, тк у нее нет событии наведения мыши (вход/выход). Но есть костыльный способ - проверять видимость подсказки
Второй способ - вы можете закинуть HightLight или Texture внутрь fdf-file вашей подсказки. При наведении у появляется не только tooltip, но и накладываются текстуры свечения. И также исчезают вместе с tooltip. Текстуры нужно наложить на кнопку триггером нативкой BlzFrameSetAllPoints.
Texture очень похожи на HightLight. И могут выигрывать в чем-то. Например, хотел я изменять свечения при наводке BlzFrameSetVertexColor. BlzFrameSetVertexColor почему не работает с HighLight

Коммандная панель

Хотите свою командную панель?
В карте сделаны 12 кнопок замещения командной панели, в зависимости от выбора юнита, у вас должно было быть сменяться изображение, название, описание и прочее.
Хотел подразделить на несколько групп:
  • функциональные кнопки (атака, патруль, стоп, точка сбора, меню строительства итд) - эти кнопки не просто отследить, и к тому же к ним нельзя получить доступ новыми нативными функциями рефорджа.
  • кнопки способностей - к ним можно получить доступ нативными функциями рефорджа. Можно каждую типу юнита записать список обычных способностей. Таким образом при переключении контейнеров, вернем в норму способности
  • кнопки способностей героев - к ним можно получить доступ нативными функциями рефорджа. Можно каждую типу юнита записать список способностей героя.
  • кнопки здании - нажатие на одну из них вызывают таргет, где можно было построить. Можно каждую типу рабочего записать список.здании, которых он мог бы построить [еше не реализовано]
  • кнопки техноложки - вызывает изучение [еше не реализовано]
  • кнопки юнитов - эти юнитов, можно было натренировать/купить в казармах/тавернах [еше не реализовано]
  • кнопки итемов - эти предметы, можно было купить в магазине [еще не реализовано]
Вызов каждой кнопки вызывает определенное действие и может переключать контейнеры. Если кнопка мгновенная и без прицела, то она не переключает. А если кнопка с прицелом, то переключает на таргет меню. Если кнопка меню строительства или меню изучения абилы или список спелбука - то вызывает контейнер с кнопками. Короче, это была задумка. Пока не понял, что залипание есть.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
37
2 года назад
0
Без теорий заговора нельзя было обойтись?)
0
27
2 года назад
Отредактирован MpW
0
ScorpioT1000:
Без теорий заговора нельзя было обойтись?)
в смысле?)) вам нужно это.
варкрафт он такой. что-то работает. что-то не работает. если бы не я, то кто? это все статьи из моего черновика, я в него в разное время вносил изменения, и свои мысли. как какой то дневник или журнал
1
37
2 года назад
1
Я про цитату про ковид, мне кажется, лишнее. это не про правила, чисто личное мнение
0
27
2 года назад
0
ScorpioT1000, ааа. случайно. мне нужно было посмотреть как расширяется текст и рамка подсказки. Поэтому брал большой тест из новостей
Чтобы оставить комментарий, пожалуйста, войдите на сайт.