Below is the module and some driver code
--[[
Quick rundown: .new() accepts a Frame Ui object, computes points x1, x2, y1, y2,
and deletes the frame. Several events are created to handle mouse "entering" and when the parent moves.
]]
local UserInputService = game:GetService("UserInputService")
local module = {}
module.__index = module
function module.new(frame: Frame)
local self = setmetatable(module, {})
self.Triggered = false
self.Enabled = true
if frame.Parent.IsA("Frame") then self.Parent = frame.Parent end
self.Position = frame.AbsolutePosition
self.Size = frame.AbsoluteSize --TODO: Dynamic size support!
--compute trigger bounds
self.X1, self.X2, self.Y1, self.Y2 = self.Position.X,
self.Position.X + self.Size.X,
self.Position.Y,
self.Position.Y + self.Size.Y
frame:Destroy()
self.mouseEvent = UserInputService.InputChanged:Connect(function(input)
if not self.Enabled then return end
if input.UserInputType == Enum.UserInputType.MouseMovement then
if input.Position.X >= self.X1 and input.Position.X <= self.X2 and
input.Position.Y >= self.Y1 and input.Position.Y <= self.Y2 then
self.Triggered = true
else
self.Triggered = false
end
end
end)
self.absolutePositionMoveEvent = frame:GetPropertyChangedSignal("AbsolutePosition"):Connect(function()
self.Position = frame.AbsolutePosition
self.X1, self.X2, self.Y1, self.Y2 = self.Position.X,
self.Position.X + self.Size.X,
self.Position.Y,
self.Position.Y + self.Size.Y
end)
return self
end
return module
--driver code, someFrame is a Frame UI object, MouseTriggerModule is the above module script
local MouseTrigger = require(MouseTriggerModule).new(someFrame)
while wait() do
if MouseTrigger.Triggered then print("triggered!") end
end
Is it possible to remove a ton of clutter in the .new()
method by doing something different with the events?