![Цитата](images/wow-circle/misc/quote_icon.png)
Сообщение от
decemberx
Dontcrybaby, извращайся наздоровье, я уже всё..
PHP код:
local plates = {}
local FindPlates
do
local regionIndex = 0
local Overlay = [=[Interface\Tooltips\Nameplate-Border]=]
local IsNamePlate = function(obj)
local Name = obj:GetName()
local _, OverlayRegion = obj:GetRegions()
if(Name)then return end
return OverlayRegion and OverlayRegion:GetObjectType() == "Texture" and OverlayRegion:GetTexture() == Overlay
end
FindPlates = function(self)
local numRegions = self:GetNumChildren()
if numRegions ~= regionIndex then
regionIndex = regionIndex + 1
local obj = select(regionIndex, self:GetChildren())
if IsNamePlate(obj) and not plates[obj] then
plates[obj] = true
local regions={}
regions.threatglow, regions.healthborder, regions.castborder, regions.castnostop,
regions.spellicon, regions.highlight, regions.name, regions.level,
regions.dangerskull, regions.raidicon, regions.eliteicon = obj:GetRegions()
regions.healthbar,regions.castbar=obj:GetChildren()
--теперь можно скрвыать, перекрашивать, менять текстуры, размер, шрифты и т.п. на каждом элементе неймплейта.
regions.healthborder:Hide() -- скрыл бордер здоровья
regions.castnostop:Hide() -- скрыл кастбар или че это? не протестил толком
regions.castborder:Hide() -- и его бордер
regions.name:SetFont("Fonts\\ARIALN.TTF",10) -- сменил шрифт и размер текста имени
end
FindPlates(self)
end
end
end
WorldFrame:HookScript("OnUpdate", FindPlates)
Ммм=) Смари у меня плейты работают как ... мб немного не по русски , но если рассуждать про ооп понтах то:
1) Этот кусок кода служит для поиска плейтов , рекурсивный перебор всего что есть на WorldFrame и счетчик (он по сути безполезен).
2) Нужно создать класс , обозвать его к примеру plate_meta
т.е
PHP код:
local plate_meta = {__index = CreateFrame"frame"}
local plate = plate_meta.__index
В твоем случае plate это будет твой класс.
Далее тебе нужно создать что то , что будет инициализировать плейты (первая загрузка плейт) , назовем это что то Init
тогда нужно описать этот метод , а потом его вызывать:
PHP код:
function plate:Init()
--## вот этот кусок кода должен создавать шаблон твоей будующей плейты и прятать дефолтный мусор
end
далее наследуем методы из нашего класса в близовские плейты:
Тут то и нужен тот кусок кода , что ты линканул , перед
PHP код:
plates[obj] = true
нужно сделать следующее:
PHP код:
setmetatable(obj, plate_meta) -- унаследовали все методы от plate B obj
obj:Init() -- а вот и наша инициализация
plates[obj] = true
Константный указатель на обьект будет self , с ним то и будем делать всякие извращения.
PS И совершил ты грех , так прими сию скверну - ах да вот она , так называемый нагреватель cpu :
PHP код:
local regions={}
regions.threatglow, regions.healthborder, regions.castborder, regions.castnostop,
regions.spellicon, regions.highlight, regions.name, regions.level,
regions.dangerskull, regions.raidicon, regions.eliteicon = obj:GetRegions()
regions.healthbar,regions.castbar=obj:GetChildren()
--теперь можно скрвыать, перекрашивать, менять текстуры, размер, шрифты и т.п. на каждом элементе неймплейта.
regions.healthborder:Hide() -- скрыл бордер здоровья
regions.castnostop:Hide() -- скрыл кастбар или че это? не протестил толком
regions.castborder:Hide() -- и его бордер
regions.name:SetFont("Fonts\\ARIALN.TTF",10) -- сменил шрифт и размер текста имени
Прямо грубейшая ошибка , каждый раз будет рекурсивный перебор всего массива regions , пока не наткнется на ключ (то что у тебя после точки) , для получения к нему доступа . Таких ситуаций нужно избегать любой ценой.
Когда с таким встречаешься , логичнее получить доступ к массиву 1 раз , присвоив ему локальную переменную и уже потом пользоваться этой локальной переменной , что бы каждый раз не перебирать все элементы массива. Пока код короткий , этого не заметно , но стоит ему разростись ) Привет SetBackdrop() , точнее его бортики , которые при 40 плейтах садят фпс с 130 (спрятаны плейты) до 25 (показаны плейты).