I have a custom Inventory GUI I'm making but I'm running across some issues during the development. Here is my current problem though; I want user to be able to drag and drop items to new slots in their inventory and organize it to their own style. I decided to use roblox's open source collision detection for GUI's but it does not appear to be working.
Info: all these things are located in multiple Frames in a ScreenGUI. FILTERING ENABLED is true (I don't think this will effect your answer but please keep this in mind).
If you are still confused or don't understand my question just message my roblox account or leave a comment. My apologies if this does not make any sense, I'm not the best at explaining.
I am currently messing with this but I wanted to hear what others had to say, thanks!
The code (in a localscript obv)
repeat wait() until game.Players.LocalPlayer -------------------------------------------------------- --Variables -------------------------------------------------------- local StarterGui = game:GetService('StarterGui') local Player = game.Players.LocalPlayer local inventory = script.Parent.Inventory local hotbar = script.Parent.HotBar -------------------------------------------------------- -- Startup process -------------------------------------------------------- StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Health, false) StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false) inventory.Visible = false hotbar.Visible = true ------------------------------------------------------- --Bman's Sexy Inventory API ------------------------------------------------------- function sortInv() print("sorting") for _,item in pairs (script.Parent.items:GetChildren()) do for _,slot in pairs (script.Parent.Inventory:GetChildren()) do print(slot.Name) if (slot.Name ~= "INFO") and (slot.ClassName == "Frame") and (slot.containsItem.Value == false) then print(slot.Name) slot.containsItem.Value = true local cloneItem = item:Clone() cloneItem.Parent = slot break end end end end function returnItemsInInv() local items = {} for _,slot in pairs (script.Parent.Inventory:GetChildren()) do if (#slot:getChildren() > 1) then for _,item in pairs (slot:getChildren()) do if (item.ClassName == "ImageLabel") then local num = table.maxn(items) table.insert(items, num, item) end end end end return items end function checkCollision(gui) local items = returnItemsInInv() for _, gui2 in pairs (script.Parent.Inventory:GetChildren()) do print(gui2.Name) if (gui2.Name == "INFO") then break end if gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and gui.Position.Y.Scale>gui2.Position.Y.Scale-(gui2.Size.Y.Scale/2) and gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale then --Downward edge collide gui.Position=UDim2.new(gui2.Position) gui.Parent = gui2 print("boom 1") return end if gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale and gui.Position.Y.Scale+gui.Size.Y.Scale<gui2.Position.Y.Scale+(gui2.Size.Y.Scale/2) and gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale then -- Upward edge collide gui.Position=UDim2.new(gui2.Position) gui.Parent = gui2.Parent print("boom 2") return end if gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale and gui.Position.X.Scale+gui.Size.X.Scale<gui2.Position.X.Scale-(gui2.Size.X.Scale/2) and gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale then -- Left edge collide gui.Position=UDim2.new(gui2.Position) gui.Parent = gui2.Parent print("boom 3") return end if gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and gui.Position.X.Scale>gui2.Position.X.Scale+(gui2.Size.X.Scale/2) and gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale then -- Right edge collide gui.Position=UDim2.new(gui2.Position) gui.Parent = gui2.Parent print("boom 4") return end end end sortInv() --TEMPORARY ------------------------------------------------------- --Keyboard Input ------------------------------------------------------- local Mouse = Player:GetMouse() Mouse.KeyDown:connect(function(Key) print(("The '%s' key was pressed"):format(Key)) if (Key == "e") then if (inventory.Visible == false) then inventory.Visible = true elseif (inventory.Visible == true) then inventory.Visible = false end end end) ------------------------------------------------------- --Dragging items ------------------------------------------------------- while true do local items = returnItemsInInv() for _,item in pairs (items) do item.DragStopped:connect(function(X, Y) print(("The player stopped dragging the GuiObject at (%i, %i)"):format(X, Y)) checkCollision(item) end) end wait() end