魔兽世界UI - 没有插件的自定义框架

时间:2015-09-01 14:17:00

标签: user-interface lua coordinates world-of-warcraft

在“魔兽世界”中,我创建了一个小的coords脚本,输出当前的coords:

local function ou(self,elapsed)
    px,py=GetPlayerMapPosition("player")
    DEFAULT_CHAT_FRAME:AddMessage(format("( %s )  [%f , %f]",GetZoneText(), px *100, py *100))
end

local f = CreateFrame("frame")
f:SetScript("OnUpdate", ou)

但是这会阻止默认聊天框...

如何创建自定义框架以及如何访问它?
(我无法使用SendChatMessage的自定义渠道

...我想在不制作插件的情况下这样做,谢谢:)

1 个答案:

答案 0 :(得分:1)

我找到了一个在全局变量中存储帧的解决方案,因为我不打算创建一个插件,整个程序需要一些宏(宏的最大字符数是255)。

第一个宏 - 准备稍后将设置帧属性的函数
f =将要设置的输入帧
x = x位置坐标
y = y位置坐标

function setMyFrame(f,x,y)
   f:SetSize(288,100)
   f:SetPoint("TOPLEFT",UIParent,"TOPLEFT",x,y) 
   f.text = f.text or f:CreateFontString(nil,"ARTWORK","QuestFont_Shadow_Huge")   
   f.text:SetAllPoints(true)     
end

第二个宏 - 准备coords函数,将当前coords设置为frame的文本
ctotel =自上次更新帧以来经过的时间
creft =在SECONDS中帧的更新频率 - 好的每秒0.1到10次是性能友好且快速调整到更新
f =将更新的输入框架
i =“自上次更新呼叫周期以来已经有多长时间”(您没有设置 - 它是从WoW系统继承的)

ctotel = 0
creft = 0.1
function myCoords(f,i)
   ctotel = ctotel + i
   if ctotel >= creft then
      px,py=GetPlayerMapPosition("player")
      f.text:SetText(format("( %s ) [%f , %f]",GetZoneText(), px *100, py *100))
      ctotel = 0
   end
end

第三个宏 - 在全局变量中存储框架并设置它并以myCoords作为回调运行更新脚本<​​/ p>

myCoordsFrame = CreateFrame("Frame","MyCoordsFrame",UIParent)
setMyFrame(myCoordsFrame, 500, 0)
myCoordsFrame:SetScript("OnUpdate", myCoords)

当然在游戏中所有的宏都必须以/ run开头,并且必须内联 - 没有换行符 - 而不是换行符只是腾出空间......

此外,你必须以这个^^^顺序运行宏(第一个=&gt;第二个=&gt;第三个)

将框架和creft设置为全局变量的优势:
框架在世界上不能被破坏(你必须重新摧毁它们)所以当它是全局的时候你可以随后移动它

/run setMyFrame(myCoordsFrame, NEW_X_COORDINATE, NEW_Y_COORDINATE)

如果你想更快/更快地更新坐标,你可以通过重置褶皱来实现 - 例如几乎实时刷新每0.05或甚至0.01秒:
/run creft = 0.05 ...甚至/run creft = 0.01

使Coords可移动 - 可以通过鼠标拖动(从WoWhead获得Wanderingfox):

myCoordsFrame:SetMovable(true)
myCoordsFrame:EnableMouse(true)
myCoordsFrame:SetScript("OnMouseDown",function() myCoordsFrame:StartMoving() end)
myCoordsFrame:SetScript("OnMouseUp",function() myCoordsFrame:StopMovingOrSizing() end)

...以及复制粘贴游戏宏:

/run myCoordsFrame:SetMovable(true) myCoordsFrame:EnableMouse(true) myCoordsFrame:SetScript("OnMouseDown",function() myCoordsFrame:StartMoving() end) myCoordsFrame:SetScript("OnMouseUp",function() myCoordsFrame:StopMovingOrSizing() end)