Перейти к контенту

Уроки по модостроению


Zeka1996Korneev

Рекомендуемые сообщения

Описание: Менеджер контроля за положением курсора мыши на экране. (экспериментальный, как вариант)
Автор: Singapur22
Принцип: "1 из 4'ёх >> компресс >> 1 из 4'ёх >> компресс >> и т.д."


130923438071.jpg


1. Создаём скриптовый файл, например: _mouse_pos.script


2. Вписываем в тело файла, код класса:
local const_wins  = {"winLT", "winRT", "winLD", "winRD"}
	--/summary/>> Event Rece
function StaticRece(args)
    args[1].rec = args[2]
end
	local win_id = 0
	class "mouse_position" (CUIStatic)
	function mouse_position:__init(x, y, width, height, scriptWnd) super()
    win_id = win_id + 1
    self.id = win_id
    self.X = x
    self.Y = y
    self.widthEl = width / 2   --ширина элемента зоны контроля, в режиме ожидания
    self.heightEl = height / 2 --высота элемента зоны контроля, в режиме ожидания
    self.rec = nil             --постоянная элемента, на котором произашло событие захвата курсора
    self.get = false           --ключ запуска, определения позиции курсора
    self.method = nil          --метод (функция), в которую требуется передать полученные координаты
    self.owner = nil           --объект, которому требуется передать полученные координаты
    
    self:SetWndRect(x, y, width, height) --устанавливаем общий размер зоны контроля (относительно её и будут выдаваться координаты)
    scriptWnd:Register(self, "event_winZC"..self.id)
    scriptWnd:AddCallback("event_winZC"..self.id, ui_events.STATIC_FOCUS_LOST, self.ZoneControllLost, self)
    
    --//делим зону контроля на 4 части
    self.winLT = CUIStatic() --элемент левого,  верхнего угла
    self.winRT = CUIStatic() --элемент правого, верхнего угла
    self.winLD = CUIStatic() --элемент левого,  нижнего угла
    self.winRD = CUIStatic() --элемент правого, нижнего угла
    
    self.winLT.X, self.winLT.Y = x, y
    self.winRT.X, self.winRT.Y = x + self.widthEl, y
    self.winLD.X, self.winLD.Y = x, y + self.heightEl
    self.winRD.X, self.winRD.Y = x + self.widthEl, y + self.heightEl
    
    for _, v in ipairs(const_wins) do
        self[v]:Init(self[v].X, self[v].Y, self.widthEl, self.heightEl)
        self[v]:SetAutoDelete(true)
        local reg_name = "event_"..v..self.id
        scriptWnd:Register(self[v], reg_name)
        scriptWnd:AddCallback(reg_name, ui_events.STATIC_FOCUS_RECEIVED, StaticRece, {self, v})
        self:AttachChild(self[v])
    end
end
	--/summary/>> Event Lost Zone_Controll
function mouse_position:ZoneControllLost()
    self.rec = nil
    if self.get then
        self.get = false
        self:recompress_zone()
    end
end
	--/summary/>> Method Compress
function mouse_position:compress_zone(win)
    if not win then return end
    local x, y = win.X, win.Y
    local width = win:GetWidth() / 2
    local height = win:GetHeight() / 2
    
    if win:GetWidth() < 5 then
        if self.method then
            self.method(self.owner, x + width, y + height)
            self.get, self.method, self.owner = false
            self:recompress_zone()
        end
        return
    end
    
    self:SetWndRectElements(x, y, width, height)
end
	--/summary/>> Method Recompress
function mouse_position:recompress_zone()
    self:SetWndRectElements(self.X, self.Y, self.widthEl, self.heightEl)
end
	--/summary/>> Method SetWndRect
function mouse_position:SetWndRectElements(x, y, width, height)
    self.winLT.X = x
    self.winLT.Y = y
    self.winLT:SetWndRect(self.winLT.X, self.winLT.Y, width, height)
    
    self.winRT.X = x + width
    self.winRT.Y = y
    self.winRT:SetWndRect(self.winRT.X, self.winRT.Y, width, height)
    
    self.winLD.X = x
    self.winLD.Y = y + height
    self.winLD:SetWndRect(self.winLD.X, self.winLD.Y, width, height)
    
    self.winRD.X = x + width
    self.winRD.Y = y + height
    self.winRD:SetWndRect(self.winRD.X, self.winRD.Y, width, height)
end
	--/summary/>> Update
function mouse_position:Update()
    if self.get then
        if not self.rec then
            self.get = false
            return
        end
        get_console():execute("mouse_pos="..tostring(self.rec))
        self:compress_zone(self[self.rec])
    end
end
	--/summary/>> Method Start Get Position Cursor
function mouse_position:GetPos(method, owner)
    self.get, self.method, self.owner = true, method, owner
end


Конструктор, инициализатор менеджера позиции курсора:

self.mp = _mouse_pos.mouse_position(x, y, width, height, scriptWnd)

Где:
x = позиция начала координат, зоны контроля, по X
y = позиция начала координат, зоны контроля, по Y
width = ширина зоны контроля
height = высота зоны контроля
scriptWnd = объект класса CUIScriptWnd,
относительно которого была произведена инициализация менеджера позиции курсора.

Апдейт схемы контроля:

self.mp:Update()

Апдейт необходимо производить из виртуальной функции Update(), объекта класса CUIScriptWnd,
относительно которого была произведена инициализация менеджера позиции курсора.

Метод определения координат, относительно зоны контроля:

self.mp:GetPos(method, owner)

Где:
method = метод (функция), в которую требуется передать полученные координаты, после завершения просчёта
owner = объект, в котором нужно обратиться к указанному методу.
если method является простой функцией (не методом), то owner передаётся в неё как первый аргумент.

Приаттачиваем менеджер к объекту контроля:

self:AttachChild(self.mp)


Изменено пользователем Murarius
  • Нравится 1

Опаа-а!!! Ливер вылез!

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...