{"id":"bondhemlig/gooey-particles","name":"gooey-particles","scope":"bondhemlig","platform":"roblox","description":"UI Particle System with support for Roact.","version":"0.2.1","latest":"0.2.1","versions":["0.2.0","0.2.1"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{"freddylist/llama":{"version":"^1.1.1","alias":"Llama"},"roblox/roact":{"version":"^1.4.2","alias":"Roact"}},"integrity":"cd9d6bc3364d96e88f6e8983f4653073a2fc92a149aa59306790712894cd60a7","likes":0,"downloads":0,"install":"forest install bondhemlig/gooey-particles","url":"https://forest.dev/p/roblox/bondhemlig/gooey-particles","files":"https://api.forest.dev/ai/package/roblox/bondhemlig/gooey-particles/files","readme":"# GooeyParticles\nUI Particle System\n\n## Particle Properties\n```lua\ntype ParticleProperties = {\n\tAcceleration: Vector2,\n\tColor: Color3 | ColorSequence,\n\tImage: string,\n\tLifetime: number | NumberRange,\n\tRate: number,\n\tRotation: NumberRange,\n\tSize: number | NumberSequence,\n\tSpeed: number,\n\tSpread: NumberRange,\n\tTransparency: number | NumberSequence,\n\tZIndex: number\n}\n```\n\n## GooeyEmitter\n#### Methods\nSet's the emitter to be enabled or not\n```lua\nemitter:SetEnabled(enabled: boolean): ()\n```\nDestroy's the emitter, removing all connections. Allows\nyou to pass in a function that gets called when all particles\nare finished running.\n```lua\nemitter:Destroy(onComplete: () -> () | nil): ()\n```\n\n\n## API\n``Emit`` is used for a single burst of particles. Similar to ``ParticleEffect:Emit(number)``\n```lua\nGooeyParticles.Emit(\n\tcontainer: GuiObject,\n\tposition: UDim2,\n\tprops: ParticleProperties,\n\temitSize: number\n): ()\n```\n``CreateEmitter`` is used to create a ``GooeyEmitter`` which is similar to your normal ``ParticleEmitter``,\nyou can turn it on or off by using ``emitter:SetEnabled(boolean)``\n```lua\nGooeyParticles.CreateEmitter(\n\tcontainer: GuiObject,\n\tposition: UDim2,\n\tprops: ParticleProperties\n): GooeyEmitter\n```\n\n## Usage\nAll examples can be found inside the [examples](examples) Folder\nas hoarcekat stories.\n### Continuous Emission\n#### With Roact\n```lua\n-- RoactEmitterExample.story.lua\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\n\nlocal Roact = require(ReplicatedStorage.Packages.Roact)\nlocal GooeyParticles = require(ReplicatedStorage.Packages.GooeyParticles)\n\nlocal Particles = GooeyParticles.RoactElement\n\nlocal TestEmitter = Roact.PureComponent:extend(\"TestEmitter\")\n\nfunction TestEmitter:init()\n\tself:setState({\n\t\thovered = false\n\t})\nend\n\nfunction TestEmitter:render()\n\treturn Roact.createElement(\"TextButton\", {\n\t\tAnchorPoint = Vector2.new(0.5, 0.5),\n\t\tBackgroundColor3 = Color3.new(1, 1, 1),\n\t\tFont = Enum.Font.Gotham,\n\t\tPosition = UDim2.fromScale(0.5, 0.5),\n\t\tSize = UDim2.fromOffset(200, 50),\n\t\tText = \"Hover over me!\",\n\t\tTextSize = 20,\n\t\tZIndex = 2,\n\n\t\t[Roact.Event.MouseEnter] = function()\n\t\t\tself:setState({\n\t\t\t\thovered = true\n\t\t\t})\n\t\tend,\n\t\t[Roact.Event.MouseLeave] = function()\n\t\t\tself:setState({\n\t\t\t\thovered = false\n\t\t\t})\n\t\tend,\n\t}, {\n\t\tUICorner = Roact.createElement(\"UICorner\", {\n\t\t\tCornerRadius = UDim.new(0, 4)\n\t\t}),\n\n\t\tParticles = Roact.createElement(Particles, {\n\t\t\tEnabled = self.state.hovered,\n\t\t\tRotation = NumberRange.new(-360, 360),\n\t\t\tLifetime = NumberRange.new(0.3, 0.5),\n\t\t\tRate = 40,\n\t\t\tImage = \"rbxassetid://6319951708\",\n\t\t\tSize = NumberSequence.new({\n\t\t\t\tNumberSequenceKeypoint.new(0, 0),\n\t\t\t\tNumberSequenceKeypoint.new(1, 100)\n\t\t\t}),\n\t\t\tTransparency = NumberSequence.new({\n\t\t\t\tNumberSequenceKeypoint.new(0, 0),\n\t\t\t\tNumberSequenceKeypoint.new(1, 1)\n\t\t\t}),\n\t\t\tColor = ColorSequence.new({\n\t\t\t\tColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)),\n\t\t\t\tColorSequenceKeypoint.new(1, Color3.new(1, 1, 0))\n\t\t\t}),\n\t\t})\n\t})\nend\n\nreturn function(t)\n\tlocal handle = Roact.mount(Roact.createElement(TestEmitter), t)\n\treturn function()\n\t\tRoact.unmount(handle)\n\t\thandle = nil\n\tend\nend\n```\n#### Without Roact\n```lua\n-- NativeEmitterExample.story.lua\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\n\nlocal GooeyParticles = require(ReplicatedStorage.Packages.GooeyParticles)\n\nreturn function(t)\n\tlocal button = Instance.new(\"TextButton\")\n\tbutton.Size = UDim2.fromOffset(200, 50)\n\tbutton.BackgroundColor3 = Color3.new(1, 1, 1)\n\tbutton.Position = UDim2.fromScale(0.5, 0.5)\n\tbutton.AnchorPoint = Vector2.new(0.5, 0.5)\n\tbutton.Text = \"Hover over me!\"\n\tbutton.Font = Enum.Font.Gotham\n\tbutton.TextSize = 20\n\tbutton.ZIndex = 2\n\tbutton.Parent = t\n\n\tlocal uiCorner = Instance.new(\"UICorner\")\n\tuiCorner.CornerRadius = UDim.new(0, 4)\n\tuiCorner.Parent = button\n\n\tlocal emitter = GooeyParticles.CreateEmitter(\n\t\tbutton,\n\t\tUDim2.fromScale(0.5, 0.5),\n\t\t{\n\t\t\tRotation = NumberRange.new(-360, 360),\n\t\t\tLifetime = NumberRange.new(0.3, 0.5),\n\t\t\tRate = 40,\n\t\t\tImage = \"rbxassetid://6319951708\",\n\t\t\tSize = NumberSequence.new({\n\t\t\t\tNumberSequenceKeypoint.new(0, 0),\n\t\t\t\tNumberSequenceKeypoint.new(1, 100)\n\t\t\t}),\n\t\t\tTransparency = NumberSequence.new({\n\t\t\t\tNumberSequenceKeypoint.new(0, 0),\n\t\t\t\tNumberSequenceKeypoint.new(1, 1)\n\t\t\t}),\n\t\t\tColor = ColorSequence.new({\n\t\t\t\tColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)),\n\t\t\t\tColorSequenceKeypoint.new(1, Color3.new(1, 1, 0))\n\t\t\t}),\n\t\t}\n\t)\n\n\tlocal connections = {}\n\ttable.insert(connections, button.MouseEnter:Connect(function()\n\t\temitter:SetEnabled(true)\n\tend))\n\ttable.insert(connections, button.MouseLeave:Connect(function()\n\t\temitter:SetEnabled(false)\n\tend))\n\n\treturn function()\n\t\temitter:Destroy(function()\n\t\t\tfor _, connection in ipairs(connections) do\n\t\t\t\tconnection:Disconnect()\n\t\t\tend\n\n\t\t\tconnections = nil\n\t\t\tbutton:Destroy()\n\t\t\tbutton = nil\n\t\t\temitter = nil\n\t\tend)\n\tend\nend\n```\n### Single Emission\n#### With Roact\n```lua\n-- RoactEmitExample.story.lua\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\n\nlocal Roact = require(ReplicatedStorage.Packages.Roact)\nlocal GooeyParticles = require(ReplicatedStorage.Packages.GooeyParticles)\n\nlocal PARTICLE_PROPS = {\n\tRotation = NumberRange.new(-360, 360),\n\tLifetime = NumberRange.new(0.3, 0.5),\n\tImage = \"rbxassetid://241629053\",\n\tSize = NumberSequence.new({\n\t\tNumberSequenceKeypoint.new(0, 100),\n\t\tNumberSequenceKeypoint.new(1, 0)\n\t}),\n\tTransparency = NumberSequence.new({\n\t\tNumberSequenceKeypoint.new(0, 0),\n\t\tNumberSequenceKeypoint.new(1, 1)\n\t}),\n}\n\nlocal TestEmitter = Roact.PureComponent:extend(\"TestEmitter\")\n\nfunction TestEmitter:init()\n\tself:setState({\n\t\thovered = false\n\t})\nend\n\nfunction TestEmitter:render()\n\treturn Roact.createElement(\"TextButton\", {\n\t\tAnchorPoint = Vector2.new(0.5, 0.5),\n\t\tBackgroundColor3 = Color3.new(1, 1, 1),\n\t\tFont = Enum.Font.Gotham,\n\t\tPosition = UDim2.fromScale(0.5, 0.5),\n\t\tSize = UDim2.fromOffset(200, 50),\n\t\tText = \"Click me!\",\n\t\tTextSize = 20,\n\t\tZIndex = 2,\n\n\t\t[Roact.Event.MouseButton1Click] = function(rbx)\n\t\t\tGooeyParticles.Emit(rbx, UDim2.fromScale(0.5, 0.5), PARTICLE_PROPS, 20)\n\t\tend\n\t}, {\n\t\tUICorner = Roact.createElement(\"UICorner\", {\n\t\t\tCornerRadius = UDim.new(0, 4)\n\t\t}),\n\t})\nend\n\nreturn function(t)\n\tlocal handle = Roact.mount(Roact.createElement(TestEmitter), t)\n\treturn function()\n\t\tRoact.unmount(handle)\n\t\thandle = nil\n\tend\nend\n\n```\n#### Without Roact\n```lua\n-- NativeEmitExample.story.lua\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\n\nlocal GooeyParticles = require(ReplicatedStorage.Packages.GooeyParticles)\n\nlocal PARTICLE_PROPS = {\n\tRotation = NumberRange.new(-360, 360),\n\tLifetime = NumberRange.new(0.3, 0.5),\n\tImage = \"rbxassetid://241629053\",\n\tSize = NumberSequence.new({\n\t\tNumberSequenceKeypoint.new(0, 100),\n\t\tNumberSequenceKeypoint.new(1, 0)\n\t}),\n\tTransparency = NumberSequence.new({\n\t\tNumberSequenceKeypoint.new(0, 0),\n\t\tNumberSequenceKeypoint.new(1, 1)\n\t}),\n}\n\nreturn function(t)\n\tlocal button = Instance.new(\"TextButton\")\n\tbutton.Size = UDim2.fromOffset(200, 50)\n\tbutton.BackgroundColor3 = Color3.new(1, 1, 1)\n\tbutton.Position = UDim2.fromScale(0.5, 0.5)\n\tbutton.AnchorPoint = Vector2.new(0.5, 0.5)\n\tbutton.Text = \"Click me!\"\n\tbutton.Font = Enum.Font.Gotham\n\tbutton.TextSize = 20\n\tbutton.ZIndex = 2\n\tbutton.Parent = t\n\n\tlocal uiCorner = Instance.new(\"UICorner\")\n\tuiCorner.CornerRadius = UDim.new(0, 4)\n\tuiCorner.Parent = button\n\n\tlocal connection = button.MouseButton1Click:Connect(function()\n\t\tGooeyParticles.Emit(button, UDim2.fromScale(0.5, 0.5), PARTICLE_PROPS, 20)\n\tend)\n\n\treturn function()\n\t\tconnection:Disconnect()\n\t\tconnection = nil\n\t\tbutton:Destroy()\n\t\tbutton = nil\n\tend\nend\n\n```\n","readmeTruncated":false}