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

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

Содержание:
Кратко: тут можно научиться понять как перемещать один фрейм, как связать фрейм с другим фреймом, что делают многие функции, какие баги встречаются, и приведены примеры. Иллюстрировано все в картинках. Я научу вас

FRAMEPOINT (точка фрейма)

Для позиционирования фреймов также необходимы константы framepointtype.
 FRAMEPOINT_TOPLEFT
 FRAMEPOINT_TOP
 FRAMEPOINT_TOPRIGHT
 FRAMEPOINT_LEFT
 FRAMEPOINT_CENTER
 FRAMEPOINT_RIGHT
 FRAMEPOINT_BOTTOMLEFT
 FRAMEPOINT_BOTTOM
 FRAMEPOINT_BOTTOMRIGHT
Чтобы понять для чего нужны эти константы framepointtype, я как переводчик объясню по своему:
Мы можем найти самую крайнюю точку слева, самую крайнюю точку справа, самую крайнюю точку сверху, самую крайнюю точку снизу. Мы получим прямоугольник.
Границы всего фрейма в виде прямоугольника. Будь изображение даже в виде круга или другой формы, границы все равно принимают в виде прямоугольника. Границы фрейма связаны с размерами фрейма (ширина, высота). Если размер не указан, а чаще всего это наблюдается у родителей. Есть другой случай: фреймы-родители, и у них есть фреймы-дети, часто дети привязываются к родителям. Родители могут являться главным фрейм, и быть невидимым, главное это передавать параметры потомкам (прячем предка, прячутся все потомки. выключаем предка -> дети выключаются). Для таких вот вещей и используют родителей, ведь удобно.
Если размер не указан, то наше фрейм-прямоугольник принимает фрейм-точку framepoint_center, конечно, с такими параметрами не увидишь изображение, фрейм становится невидимым. Но можно привязать к этой точке потомков или других фреймов. они будут двигаться за этой точкой. В таком случае, вы не сможете использовать остальные framepoints, кроме одной - framepoint_center. Вы можете двигать центр фрейма, а за ним двигаются связанные фреймы. Это так работает
Есть код пример ниже. Он показывает как меняется позиция фрейма в одних координатах (0.4,0.3) в разных FRAMEPOINTS
код
do
    local real = MarkGameStarted
 function MarkGameStarted()
        real()
    -- create the moving frame
    local frame = BlzCreateFrame("QuestButtonBaseTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
    BlzFrameSetSize(frame, 0.1, 0.1)
    -- the not movingframe to show the difference more clear.
    local screenCenter = BlzCreateFrameByType("BACKDROP", "", frame, "", 0)
    BlzFrameSetSize(screenCenter, 0.02, 0.02)
    BlzFrameSetTexture(screenCenter, "replaceabletextures\\teamcolor\\teamcolor00", 0, false)
    BlzFrameSetAbsPoint(screenCenter, FRAMEPOINT_CENTER, 0.4, 0.3)

    -- every 0.4 seconds change the current used Framepoint
    local counter = 0
    TimerStart(CreateTimer(), 0.4, true, function()
        BlzFrameClearAllPoints(frame)
        BlzFrameSetAbsPoint(frame, ConvertFramePointType(counter), 0.4, 0.3)
        counter = counter + 1
               
        if counter > 8 then
            counter = 0
        end
    end)
 end
end
Можно выбрать любую точку, относительно которой мы будет двигать наш фрейм с помощью нативки BlzFrameSetAbsPoint (но перед тем как сместить, нужно разрушить связи точек framepointtype между фреймами с помощью BlzFrameClearAllPoints , иначе будет плохо. Об этом разжую позже). Можете взять центр и смещать в нужные координаты, а можете взять какую-нибудь крайнюю точку и переместить в нужные координаты.

Разбор функции фреймов

Положение фреймов важно и является ключом к размещению фреймов там, где они должны быть. Для позиционирования фреймов существует 4 нативки. Все 4 имеют большое применение.
native BlzFrameSetPoint takes framehandle frame, framepointtype point, framehandle relative, framepointtype relativePoint, real x, real y returns nothing
native BlzFrameSetAbsPoint takes framehandle frame, framepointtype point, real x, real y returns nothing
native BlzFrameClearAllPoints takes framehandle frame returns nothing
native BlzFrameSetAllPoints takes framehandle frame, framehandle relative returns nothing
объяснение функции
BlzFrameSetAbsPoint (перемещение фрейма)
BlzFrameSetAbsPoint - берет одну точку фрейма framepointtype point, и сдвигает фрейм к этим координатам x,y на экране. Примечание: перед тем как использовать эту функцию, надо кое-что знать. Обычно группы фреймов приклеены между собой особой связью точек, или какими-то правилами. Поэтому прежде чем сдвигать фрейм, необходимо разрушить эту связать с другими точками других фреймов с помощью нативки BlzFrameClearAllPoints, иначе фрейм тупит:
  • картинка вашего фрейма начинает растягиваться.
  • фрейм смещается не туда куда надо.
  • ничего не хочет делать.
из-за относительного положения перемещение фрейма мб с ошибками. Поэтому чистите фреймы BlzFrameClearAllPoints
BlzFrameSetPoint (связывание фрейма точками с другим)
BlzFrameSetPoint - помещает точку framepointtype point FrameA относительно точки framepointtype relativePoint FrameB на относительном расстоянии x,y.
Короче, FrameA привязываем к FrameB с помощью BlzFrameSetPoint. Чтобы удалить эту привязку, нужно чистить точки BlzFrameClearAllPoints(FrameA) и тогда фрейм FrameA перестанет приклеиваться к FrameB.
Когда двигаем точку фрейма FrameB, вместе с ним перемещается и FrameA на относительном расстоянии. Как бы вы не двигали фрейм FrameB, вместе с ним всегда будет привязан FrameA точками. Короче сохраняется некое правило привязки.
Ниже пример смещения кнопки stop за кнопкой move на экране. Связал клавишу stop относительно клавиши move. Клавишами стрелок менял положение кнопки move, и за ним автоматом смещалась кнопка stop. Тут как бы положение кнопки stop постоянно обновляется относительно move
local fh1 = BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 0))
local fh2 = BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 1))
BlzFrameClearAllPoints(fh1)
BlzFrameClearAllPoints(fh2)
BlzFrameSetPoint(fh2, FRAMEPOINT_LEFT, fh1, FRAMEPOINT_RIGHT, 0.01, 0.0) --Pos fh2 below fh1
Некоторые фреймы связываются вот так (это для вашего понимания):
Благодаря этой функции BlzFrameSetPoint вы можете не запоминать размеры фреймов, и спокойно привязывать друг к другу.
Просто FrameB должен при смещении быть свободен от привязи точек во избежании багов (растяжении текстуры, смещения не туда, или совсем нет реакции), благодаря функции BlzFrameClearAllPoints(FrameB) всегда чистится. А вот FrameA может быть привязан всегда к FrameB. Чтобы отвязать FrameA от FrameB нужно использовать BlzFrameClearAllPoints(FrameA) и тогда фрейм FrameA перестанет приклеиваться к FrameB
Примечание переводчика: автор хайва утверждает, что функция BlzFrameSetPoint немного обратная. Настройка относительного положения немного инвертирована, когда нужно было разместить что-то слева от чего-то, нужно поместить правую сторону (движущегося) слева от цели. Но лично я как переводчик проверял и по коду, и по fdf смотрел. Считал. Короче, я не понимаю. Меня запутал автор, и работает не так. Возможно, он имеет что-то другое, хотя вряд ли. Мб патч у него старый. Убил слишком много времени.
Замечания переводчика: эта функция связывания точек BlzFrameSetPoint не работает при взаимодействии функциональных фреймов и SimpleFrames. Короче, функциональный фрейм никак не связывается с SimpleFrames, так и обратно. Он не будет работать. При старте игры можете в настройках связать их, но какой-то связанный элемент просто не отобразится и все. Что очень печально. Типа эта функция должна работать так:
функциональный фрейм+функциональный фрейм = работает
simpleframe + simpleframe = работает
функциональный фрейм + simpleframe = не всегда работает
У simpleframe указанные в fdf-files потомки не могут связываться с другими старшими фреймами, только с братьями и сестрами, приводит к вылету, только родители могут. Лучше тогда потомку задать через функцию BlzFrameSetAllPoints (см. ниже) все параметры родителя. А родителю задать параметры, которые вы хотели задать. В частности, String и Texture не могут существовать как отдельный, они существуют внутри родителя. Их нельзя никак отделить. Отдельно существуют как шаблоны. Об этом мы поговорим позже, сейчас мы изучаем функции.
fdf-код:
Frame "SIMPLEFRAME" "ParentTexture" {
    Width 0.0001,
    Height 0.0001,
    DecorateFileNames,
    Texture "TestTexture" {
    }
}
BlzFrameClearAllPoints (очищение точек связи)
Тут все просто, даже объяснять нечего. BlzFrameClearAllPoints удаляет все текущие привязанные точки этого фрейма.
BlzFrameSetAllPoints (фрейм копируем размеры и позицию другого фрейма)
Я так понял, что благодаря BlzFrameSetAllPoints FrameA копирует все привязанные точки фрейма FrameB, размеры и положение. Также понял, что связывает фрейм с выбранным. Если FrameB триггерно двигать, то FrameA будет двигаться за вами. Если фрейму FrameB изменить размер, FrameA тоже изменит размер.
Когда вы задаете этой функцией BlzFrameSetAllPoints(FrameA, FrameB), то сам фрейм FrameA временно исчезает, FrameA просто не может встать на место существующего. Можете FrameB попозже спрятать, удалить, на место FrameB встанет FrameA. Если фрейм FrameB был привязан к FrameC, то FrameA тоже будет привязан к FrameC. По факту, FrameA накладывается сверху на FrameB. Если у вас две кнопки, то одна закроет другую. Видеть и нажать можете только одну. Можно еще с уровнями поиграть, какую-то кнопку приподнять выше, а какую-то опустить.
Этому можно найти применение, например, у simpleframe есть такая Texture, которая не может существовать отдельно, существует только внутри родителя типа simplebutton или simpleframe ([[ simplebutton динамично нельзя менять изображение], поэтому создается отдельно текстура, а сама simplebutton без текстуры). В Texture можно менять изображение, осталось текстуру привязать. Уловили идею? Вам достаточно изменить размер одному фрейму, и остальные тут же также изменят размеры. Можно еще где-то найти применения. Так что я объяснил.
Когда вы задаете этой функцией BlzFrameSetAllPoints(FrameA, FrameB), то сам фрейм FrameA временно исчезает, FrameA просто не может встать на место существующего. Можете FrameB попозже спрятать, удалить, на место FrameB встанет FrameA. Если фрейм FrameB был привязан к FrameC, то FrameA тоже будет привязан к FrameC.
Если кто-то просто хочет переместить фрейм, имеющий размер, сначала следует использовать BlzFrameClearAllPoints, чтобы освободить уже размещенные точки. SetPoint требует, чтобы относительный фрейм занимал место на экране, этот относительный фрейм может быть установлен на более позднее время, но пока это не произойдет, перемещенный кадр будет отображаться странно или не всё.
Замечания переводчика: в этой нативке BlzFrameSetAllPoints плохо взаимодействуют друг с другом simpleframes и функциональные фреймы.

Функции позиционирования фреймов in ​F​D​F

Не многие любят лезь в fdf-file, но все равно знать функции обязаны. Обычно оч много времени уходит на поиски образцов fdf-функции, проверить, поставить.
Функции фреймов на задание точек FRAMEPOINTS относительное положение в fdf-файлах имеют другие названия.
При создании фреймов в fdf также можно установить положение фреймов. Здесь есть 3 функции:
SetPoint (привязать к конкретному фрейму двумя точками с оффсетами)
SetAllPoints (привязать все точки к заданному фрейму)
Anchor (переместить фрейм к координатам экрана, работает только у SimpleFrames)
давайте полностью разбираемся в них:
SetPoint
SetPoint FramePoint-Own, FrameName, FramePoint-FrameName, xOffset , yOffset,
SetPoint можно рассматривать как триггерное действие:
BlzFrameSetPoint(self, FramePoint-Own, BlzGetFrameByName(FrameName, 0), FramePoint-FrameName, x, y)
  • self - обычно в fdf для удобства и простоты не указывают сам фрейм. Но мы должны знать, что это self-frame, который связывается с другим фреймом на относительном расстоянии. Это как в варкрафте с структурами пример используют точно также self в структурах.
  • FramePoint-Own - это точка FRAMEPOINT фрейма self, которая показывает какая точка фрейма self связывает с другим. Только в fdf не указывают приставки FRAMEPOINT_, если мы в триггере писали FRAMEPOINT_LEFT, только в fdf все укорачивают и называют LEFT
  • FrameName - название второго фрейма, с которым хотите связать фрейм self. обычно все функции в fdf имеют названия. Именно там обращаются не прямо к framehandle, а как названию.
  • FramePoint-FrameName - это точка FRAMEPOINT фрейма с названием FrameName, точку FramePoint-Own связывают именно с точкой FramePoint-FrameName на относительном расстоянии.
  • xOffset, yOffset - координаты задают относительное расстояние между точками FramePoint-Own и FramePoint-FrameName.
  • UseActiveContext - С UseActiveContext Frame будет подключаться к относительному фрейму FrameName с тем же CreateContext, с которым создан текущий Frame. Короче, фрейм наследует номер Context родителя. Что такое Context? Это число, аргумент функции. Когда вы создаете фрейм триггером вы задаёте номер контекста. Когда вы хотите обратится к фрейму, вы вызываете по номеру контекста. Пример в том же
BlzFrameSetPoint(self, FramePoint-Own, BlzGetFrameByName(FrameName, UseActiveContext ), FramePoint-FrameName, x, y)
Напомню, что если создать фрейм с таким же названием и номером-контектом, то ссылка на предыдущий фрейм стирается. Вы не сможете обратиться по BlzGetFrameByName(FrameName, UseActiveContext ). Поэтому так важен номер-контект, вы можете задавать создавать фреймы с таким же именем, но с разными номерами.
пример ниже, фрейм "Test" (backdrop) привязываем к фрейму "ParentBackdrop"
Frame "FRAME" "ParentBackdrop"
    Width 0.2,
    Height 0.2,
	Frame "BACKDROP" "Test" {
	    Width 0.1,
	    Height 0.1,
	    UseActiveContext, //UseActiveContext необязательное действие, но если вы не хотите потерять ссылку Test, то лучше указать. Если не указывать, то номер-контекст не наследуется, принимает ноль. В триггерах я обычно в переменную записываю при создании
	    SetPoint TOPLEFT, "ParentBackdrop", TOPLEFT, 0, 0,
	    BackdropBackground "ReplaceableTextures\CommandButtons\BTNHeroPaladin",
	}
}
Не только к дефолтным, но и к другим шаблонам можно привязать. Однако, те шаблоны должны быть в игре созданы. Иначе сие действие бесплезно. Можно к родителям привязывать, к ним проще. всегда знаешь, что потомки создаются вместе с главными фреймами. Или к какой-нибудь группе фреймов, если у вас они есть и прописаны.
Не обязательно привязывать к родителям, также можно привязать и к существующим дефолтным фреймам игры. Пример ConsoleUI.
Этот фрейм типа BACKDROP с Name Test при его создании будет отображать паладин-значок в верхнем левом углу экрана (сначала должен быть загружен через toc).
Frame "BACKDROP" "Test" {
	Width 0.1,
	Height 0.1,
	SetPoint TOPLEFT, "ConsoleUI", TOPLEFT, 0, 0,
	BackdropBackground "ReplaceableTextures\CommandButtons\BTNHeroPaladin",
}
Важно: SimpleFrames и обычные фреймы никак нельзя привязывать. Иначе, не создается фрейм
SetAllPoints
Обычно в образцах fdf-files никаких параметров в эту функции не указываются, разве что запятую не забудьте SetAllPoints,
Это действие привязывает все точки данного фрейма self-frame к родителю parent-frame. Очень полезно бывает, пример необходимо, чтобы фейковая текстура texture всегда принимала размеры кнопки button. Если вы будет триггером постоянно менять размеры кнопке, то и сама текстура будет принимать те же размеры. Также сие действие помогает и во многих других действиях, в тех же спрайтах не дает съезжать модели от первоначальных координат. Короче, это тоже самое, что и SetPoint, только self-frame повторяет все точки parent-frame
Можно рассматривать как аналогию в триггерах:
BlzFrameSetAllPoints(self,parent)
к сожалению, к parent нельзя обратиться по имени BlzGetFrameByName(FrameName, UseActiveContext ) как было в первом варианте. Тут привязка происходит потомка к родителю.
Пример:
Потомок Test примет размер и положение родителя ParentBackdrop
Frame "FRAME" "ParentBackdrop"
    Width 0.2,
    Height 0.2,
	Frame "BACKDROP" "Test" {
	    SetAllPoints,
		UseActiveContext, //UseActiveContext необязательное действие, но если вы не хотите потерять ссылку Test, то лучше указать. Если не указывать, то номер-контекст не наследуется, принимает ноль. В триггерах я обычно в переменную записываю при создании
	    BackdropBackground "ReplaceableTextures\CommandButtons\BTNHeroPaladin",
	}
}
Напоминание: SimpleFrames и обычные фреймы никак нельзя привязывать. Иначе, не создается фрейм
Anchor (only SimpleFrames)
Перемещает фрейм в нужную позицию
Anchor FramePoint,x,y
Работает правда только у SimpleFrames. У обычным фреймах это не применимо.
Аналогия:
BlzFrameSetPoint(self, point, parent, point, x, y)​
Если у фрейма не задано положение в fdf-file, то центр фрейма принимает автоматически начальную точку координат (0,0). Одни фреймы, пример ConsoleUI расставляет консольные текстуры относительно центра, и у него не указано положение. Некоторым фреймам, напротив, и не нужно это. Может быть они являются какими то главными фреймами или родителями, которые являются по сути контейнерами или переключающими панелями

Декартовая система координат экрана

Координаты и смещение являются факторами всего экрана.
0,0 / 0,0 - нижний левый угол экрана 4:3.
0,8 / 0,6 - это верхний правый угол экрана 4:3.
помню находил константы из DGUI:
real WidthScreen = 0.544 - половина ширины
real HeightScreen = 0.302 - половина высоты
размер стандартной иконки равен около 0.039
можете еще узнать как перемещать мышью фрейм по экрану - поможет смещать фрейм по координатам экрана, а не по координатам карты

Примеры

Кратко: рассмотрим все примеры позиционирования фрейма, именно ваш переводчик учился сначала по ним что-то делать. Примеры должны помочь, если вы еще не поняли.
пример 1. Перемещаем фрейм UpperButtonBarMenuButton
Давайте переместим кнопку меню в другое место
function ReposMenuButtons takes nothing returns nothing
   local framehandle fh = BlzGetFrameByName("UpperButtonBarMenuButton",0)
   call BlzFrameSetAbsPoint(fh, FRAMEPOINT_RIGHT, 0.5, 0.5)
endfunction
Не то, что мы хотели. Кнопка меню растянулась далеко вправо, оттолкнув кнопку "союзники" вправо. Все соседние кнопки менюшки сдвинулись вправо.
давай разберемся почему так происходит
Если заглянуть в файл upperbuttonbar.fdf, то увидите причину растяжения кнопки, UpperButtonBarMenuButton привязана к кнопке UpperButtonBarQuestsButton
пример кода в fdf, обратите внимание на SetPoint оно равнозначно нашей функции BlzFrameSetPoint. Просто в fdf там свои функции по-другому называют ради удобства. Об этом попозже.
fdf-код:
Frame "SIMPLEBUTTON" "UpperButtonBarMenuButton" INHERITS "UpperButtonBarButtonTemplate" {
    	SetPoint LEFT,"UpperButtonBarQuestsButton",RIGHT,0,0,
    	NormalText "UpperButtonBarButtonTextTemplate" "KEY_MENU",
    	DisabledText "UpperButtonBarButtonDisabledTextTemplate" "MENU",
    	HighlightText "UpperButtonBarButtonHighlightTextTemplate" "KEY_MENU",
}
Я не буду код весь код из fdf скидывать. Разберу кратко и детально.
К кнопкам еще текст применяют и прочие данные, но нам они пока не интересны.
Причины растяжения:
Почему же такое происходит? Дело в том, что если фрейм А связан с фреймом В точками LEFT-RIGHT (пример та же кнопка Menu), у нее точка LEFT автоматически привязана с точкой RIGHT фрейма на относительном расстоянии.
Короче, Menu перестает быть связанным с Quest.
Но что будет, если взять другие FRAMEPOINTS и двигать BlzFrameSetAbsPoint?
Примечание: Однако, такое растягивание происходит не со всеми фреймами. С кнопками командной панели и некоторыми самодельными фреймами я такое повторить не смог. Если они связаны, то не хотят смещаться. Так что это не со всеми происходит, не знаю по какой причине. Пробовал с кнопками HeroButtonBar, там растягивался фрейм кнопки героя F1 и многими другими.
Чтобы такого не происходило нужно чистить BlzFrameClearAllPoints(frame).
пример 2. Пробуем тоже самое, но перед смещением чистим точки
Это должно заработать лучше, если мы очистим точки кнопки Menu.
function ReposMenuButtons2 takes nothing returns nothing
   local framehandle fh = BlzGetFrameByName("UpperButtonBarMenuButton",0)
   call BlzFrameClearAllPoints(fh)
   call BlzFrameSetAbsPoint(fh, FRAMEPOINT_RIGHT, 0.5, 0.5)
endfunction
Ну теперь кнопка больше не растягивается, кнопка “меню” перемещена, также соседние кнопки справа (Allies & Log buttons) сместились вместе с нашей кнопкой. Однако, тексты оторваны от кнопок. И отошли от кнопки Quest. Короче не порядок.
Примечание переводчика: я тестил, и у меня текст не отрывается от кнопок. Возможно, автор тестил на старом патче.
пример 3.
Давайте переместим кнопку «Союзники» под кнопку «Меню», а кнопку «Журнал» - под кнопку «Союзники»
function ReposMenuButtons3 takes nothing returns nothing
   local framehandle allies = BlzGetFrameByName("UpperButtonBarAlliesButton",0)
   local framehandle menu = BlzGetFrameByName("UpperButtonBarMenuButton",0)
   local framehandle log = BlzGetFrameByName("UpperButtonBarChatButton",0)
   call BlzFrameClearAllPoints(allies)
   call BlzFrameClearAllPoints(log)
   call BlzFrameClearAllPoints(menu)
   call BlzFrameSetAbsPoint(menu, FRAMEPOINT_RIGHT, 0.5, 0.5) //Pos Menu
   call BlzFrameSetPoint(allies, FRAMEPOINT_TOP, menu, FRAMEPOINT_BOTTOM, 0.0, 0.0) //Pos allies below menu
   call BlzFrameSetPoint(log, FRAMEPOINT_TOP, allies, FRAMEPOINT_BOTTOM, 0.0, 0.0) //Pos log below allies
endfunction
Кнопки "Меню", "Союзники" и "Чат" расположены в столбик, текст там, где он должен быть, теперь все порядок.
Эти фреймы отошли чуть вправо от центра, но это потому, что мы переместили меню с помощью FRAMEPOINT_RIGHT. И из-за неправильной информации об общем размере x, неверная информация была 0,6 как максимум для 4:3, но 0,8 - это правый конец экрана 4:3, а не 0,6. 0,5 гораздо ближе к 0,4, чем к 0,8, поэтому он более центрирован.

Привязка рамки к тесту

Кратко: поговорим о другом увлекательном опыте с tooltip (подсказками).
Возьмем любую ситуацию. К примеру, у нас есть box (коробка, или точнее рамка), а внутри будет существовать текст. Проблема возникает, когда нужно определить размер рамки, и как должен лежать текст внутри. Обычно если текста много, то он вылезает за пределы рамки. Будет очень не красиво. По идее, если текста много, то размер рамки должен стать больше.
Короче, вся зависимость идет от фрейма-текста.
Как это реализовать?
Можно использовать привязку к угловым точкам framepoints. Например очень короче идут эти 4 точки, достаточно взять 2 точки и соединить с двумя такими же:
FRAMEPOINT_TOPLEFT
FRAMEPOINT_TOPRIGHT
FRAMEPOINT_BOTTOMLEFT
FRAMEPOINT_BOTTOMRIGHT
Главное, это задать размеры фрейма типа TEXT, т.е. пограничные размеры. Обычно какую-то сторону текста обнуляют, чтобы текст мог расширяться в какую-то сторону.
Тут как бы текст не растягивался, и не увеличивался. Рамка увеличивается также, растягивается следом за текстом. Помните всплывающую подсказку в варкрафте, ваше описание может увеличиваться.
Кроме того, не забывайте делать выравнивание текста. У фрейма типа TEXT существует функция выравнивания по левому краю, по правому, по центру, по горизонтали, по вертикали. Если интересует тема, то рекомендую посмотреть пример с Tooltips (об этом разберемся позже в след уроках)
Это можно рассмотреть в этом уроке.

Не работает SetPoint или SetAllPoints? иерархия фреймов

Есть еще один момент, о котором нужно поговорить. У фреймов есть собственная иерархия. Когда создается первый фрейм, он становится старшим фреймом. Второй фрейм является младшим фреймом. Можно это так назвать.
Встречается так, что нельзя точки старшего фрейма привязать к младшему фрейму. Даже, если они никак не связаны друг с другом (по идее у них общий родитель gameUI), все равно будет некое старшинство.
По правилу, мы должны:
привязывать точки младшего фрейма к старшему . Можно и наоборот, привязать старшего к младшему. Однако, говорят, что это не всегда работает. И нужно соблюдать иерархию.
пример моей системы
Было такое дело, нужно было для simplebutton создать иконки. тк обычные фреймы всегда выше simpleframes. А у simplebuttons нет залипании, и они через backdrops прокликиваются:
код создания
--backdrop - старший фрейм, расчитывался как родитель кнопкам
local backdrop = BlzCreateFrame("QuestButtonBaseTemplate",gameUI,0,0)

--циклами моздаем иконки кнопкам
local IconButton[1] = BlzCreateFrameByType("BACKDROP","",backdrop,"",0)
--циклом создаются 4x3=12 кнопок. С верхнего левого угла до нижнекго правого
local IconButton[12]= BlzCreateFrameByType("BACKDROP","",gameUI,"",0)
Позже должен бы растянуть фон backdrop
BlzFrameSetPoint(backdrop,FRAMEPOINT_TOPLEFT,IconButton[1],FRAMEPOINT_TOPLEFT,-offsetx,offsety)
BlzFrameSetPoint(backdrop,FRAMEPOINT_BOTTOMRIGHT,IconButton[12],FRAMEPOINT_BOTTOMRIGHT,offsetx,-offsety)
В итоге backdrop от последнего действия пропадает
Hate: ты из-за иерархии не можешь цеплять. фреймы не могу крепиться к чему то выше их иерархии. иначе бы возникло бы circular dependancy. circular dependancy это когда
func A requires C
func B requires A
func C requires B
короче в таком случае перемещать такие фреймы аналогично вылету, тк происходит зацикливание.
Поэтому советую привязываю младших к старшим фреймам. В моем случае нужно было создать кнопки, а потом привязать фон.
local inventar= BlzCreateFrameByType("FRAME","",gameUI,"",0)

--циклами создаем кнопки
local IconButton[1] = BlzCreateFrameByType("BACKDROP","",inventar,"",0)
--циклом создаются 4x3=12 кнопок. С верхнего левого угла до нижнекго правого
local IconButton[12]= BlzCreateFrameByType("BACKDROP","",inventar,"",0)

--backdrop - теперь является младшим =)
local backdrop = BlzCreateFrame("QuestButtonBaseTemplate",inventar,0,0)

--растягиваем фрейм
BlzFrameSetPoint(backdrop,FRAMEPOINT_TOPLEFT,IconButton[1],FRAMEPOINT_TOPLEFT,-offsetx,offsety)
BlzFrameSetPoint(backdrop,FRAMEPOINT_BOTTOMRIGHT,IconButton[12],FRAMEPOINT_BOTTOMRIGHT,offsetx,-offsety)
Аналогично должно работать также и с функцией SetAllPoints - BlzFrameSetAllPoints
На самом деле, скажу вам, что в момент написания статьи так и было, пока позже не убедился, что я ошибался. и тут была моя простая ошибка в коде. А backdrop сдвигал в x,y и size растягивал - я их забыл выключить. Так что знайте, что старшего тоже можно привязать к младшему, однако, ошибки могут происходят и по описанной причине. Решено было оставить, мало ли.
проверка
в чистом скрипте проверка показывает, что системе плевать на иерархию. Пока, что это простая проверка, что попроще. Я уже начал сомневаться в наличии иерархии, решено оставить пока в статье.
do
    local real = MarkGameStarted

    function MarkGameStarted()
        real()
    
        print('start')
        
        local size_button = 0.039
        
        gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
        local backdrop =BlzCreateFrame("QuestButtonBaseTemplate", gameUI, 0, 0)
        local icon_1 = BlzCreateFrameByType("BACKDROP","",gameUI,"",1)
        local icon_2 = BlzCreateFrameByType("BACKDROP","",gameUI,"",2)
        
        
        --настройка backdrop
        BlzFrameSetAbsPoint(icon_1, FRAMEPOINT_CENTER, 0.2,0.4)
        BlzFrameSetSize(icon_1, size_button, size_button)
        BlzFrameSetTexture(icon_1, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, true)
        BlzFrameSetLevel(icon_1,2)

        BlzFrameSetAbsPoint(icon_2, FRAMEPOINT_CENTER, 0.5,0.2)
        BlzFrameSetSize(icon_2, size_button, size_button)
        BlzFrameSetTexture(icon_2, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn", 0, true)
        BlzFrameSetLevel(icon_2,2)
        
        BlzFrameSetPoint(backdrop, FRAMEPOINT_TOPLEFT, icon_1, FRAMEPOINT_TOPLEFT, -0, 0)
        BlzFrameSetPoint(backdrop, FRAMEPOINT_BOTTOMRIGHT, icon_2, FRAMEPOINT_BOTTOMRIGHT, 0, -0)
    

        print("END")
    end
end

Ограничения экрана 4:3

Большинство созданных функциональных фреймов не могут покидать часть экрана 4:3. Ранее мы в декартовой системе координат показывали экран 4:3. Могу напомнить еще раз:
Если создать фрейм, и переместить за пределы экрана 4:3, то ваш фрейм упрется в границы экрана 4:3. Либо картинка с текстом упрется в границы. Или фрейм деформируется: картинка backdrop сожмется или становится меньше, текст обрезается или переносится на след строку.
Вот кнопка взятая из примера:
Теперь фрейм двигается стрелками по экрану, и заметил следующее:
Тоже самое происходит, если двигать вправо до правой границы, или вниз - до нижней границы, вверх до верхней. короче, двигать можно только в пределах этого экрана 4:3.
Обычно кнопка не хочет двигаться совсем, сколько не задавай, упирается в границу экрана 4:3. А бывает, что кнопка может деформироваться:
Если вернуться назад, то кнопка возвращает в норму. А если опять, то упирается в границы или деформируется.
SimpleFrames свободны от этого ограничения. Можно освободить Frames от этого ограничения 4:3, указав при создании другого Parent вместо GAME_UI. Ведь изначально, при создании указан родитель BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0) для mainButton:
mainButton  = BlzCreateFrame("ScriptDialogButton", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
в Reforged такой Parent может быть BlzGetFrameByName("ConsoleUIBackdrop", 0). Использование ConsoleUIBackdrop в качестве родителя перемещает их на более низкий уровень, ниже SimpleFrames. То есть изображение других фреймов будет находится выше, чем изображение наше изображение. Про уровни можно узнать здесь.
Или можно использовать BlzGetFrameByName("Leaderboard", 0) или BlzGetFrameByName("Multiboard", 0). Эти изображения находятся выше SimpleFrames, но мультиборд или доску нужно сначала создать. То есть изображение вашего фрейма может находится выше, чем изображения других фреймов. Ваши фреймы также могут быть потомками этих других родителей, где не влияет ограничение экрана 4:3.
Заменив родителя на BlzGetFrameByName("ConsoleUIBackdrop", 0) в функции создании, я избавился от ограничения:
mainButton  = BlzCreateFrame("ScriptDialogButton", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0,0)
И смог сдвинуть фрейм за пределы экрана 4:3
Или использовать SimpleFrames, которые не сильно зависят от родителя. Обычно при создании функции BlzCreateSimpleFrame.

Fullscreen Frame (Полноэкранный фрейм)

Вместо того, чтобы в Warcraft 3 перемещать и мучаться с ограничениями экрана 4:3. Можно размещать фреймы относительно созданных фреймов, которые являются полноэкранными. Такой полноэкранный размер можно сделать, установив размер кадра каждые 0.хх секунд на
BlzFrameSetSize(relative, BlzGetLocalClientWidth()/BlzGetLocalClientHeight()*0.6, 0.6)
Этот фрейм также будет помещен в нижнюю часть экрана:
BlzFrameSetAbsPoint(relative, FRAMEPOINT_BOTTOM, 0.4, 0.0)
Фрейм должен иметь возможность покидать экран 4:3, чтобы это работало. Теперь можно позировать фрейм относительно родственника.

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