(Yes, I'm making a sprite-based game. Don't ask why.)
local label = script.Parent local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local length = label:WaitForChild("Length") local width = label:WaitForChild("Width") local angle = label:WaitForChild("Angle") local delaytime = label:WaitForChild("Delay") local life = label:WaitForChild("Lifetime") local t = label:WaitForChild("Transparency") local delayLine = Instance.new("Frame") delayLine.Parent = label delayLine.Name = "DelayLine" delayLine.Size = UDim2.new(0, 1, length.Value, 0) delayLine.AnchorPoint = Vector2.new(0, 0) delayLine.BorderSizePixel = 0 delayLine.BackgroundColor3 = Color3.fromRGB(255, 255, 255) delayLine.BackgroundTransparency = 0.5 delayLine.Position = UDim2.new(0, 0, 0, 0) local hitbox = Instance.new("Frame") hitbox.Parent = label hitbox.AnchorPoint = Vector2.new(0.5, 0.5) hitbox.Size = UDim2.new(0.33, 0, 1, 0) hitbox.Position = UDim2.new(0.5, 0, 0.5, 0) hitbox.BackgroundTransparency = 1 local hitboxScript = game.ReplicatedStorage.BulletScripts:WaitForChild("LinearHitboxScript"):Clone() hitboxScript.Parent = hitbox hitboxScript.Disabled = true delay(delaytime.Value, function() label:TweenSize(UDim2.new(0, width.Value, 0, length.Value), "Out", "Quad", 0.25, false, function() Debris:AddItem(label, life.Value) end) end) function getRealAngle(a) local val = math.abs(a - 180) if a > 180 then val = val * -1 end return val end label:GetPropertyChangedSignal("Size"):Connect(function() if label.Size == UDim2.new(0, 1, 0, 1) then delayLine.Visible = true label.ImageTransparency = 1 hitboxScript.Disabled = true else delayLine.Visible = false label.ImageTransparency = t.Value hitboxScript.Disabled = false end end) RunService.RenderStepped:Connect(function() label.Rotation = getRealAngle(angle.Value) end)
When the sprite is created, its size is set to UDim2.new(0, 1, 0, 1)
. After a certain amount of time passes, the sprite expands to its true size, determined by the values of Length
and Width
.
However, when the sprite's size changes, it moves towards the bottom of the screen, even though I don't have anything that changes the position in the script. Is there a way to fix it?
Here's the function that creates these sprites, in case it helps with figuring out the problem:
function lib:CreateStraightLaser(x, y, angle, length, width, delaytime, graphic, timer) local RealLaser = getShotData(graphic) local BoundBox = RealLaser.Bound local sLaserScript = ExtraScriptsDirectory:WaitForChild("StraightLaserScript") local sLaser = Instance.new("ImageLabel") sLaser.Name = RealLaser.Name sLaser.Position = UDim2.new(0, x, 0, y) sLaser.Size = UDim2.new(0, 1, 0, 1) sLaser.AnchorPoint = Vector2.new(0.5, 0) sLaser.BackgroundTransparency = 1 sLaser.Image = ShotSheetImage sLaser.ImageRectOffset = BoundBox.Min sLaser.ImageRectSize = Vector2.new(BoundBox.Width, BoundBox.Height) sLaser.ImageTransparency = 1 local l = Instance.new("NumberValue") l.Parent = sLaser l.Name = "Length" l.Value = length local a = Instance.new("NumberValue") a.Parent = sLaser a.Name = "Angle" a.Value = angle local w = Instance.new("NumberValue") w.Parent = sLaser w.Name = "Width" w.Value = width local d = Instance.new("NumberValue") d.Parent = sLaser d.Name = "Delay" d.Value = delaytime local life = Instance.new("NumberValue") life.Parent = sLaser life.Name = "Lifetime" life.Value = timer local t = Instance.new("NumberValue") t.Parent = sLaser t.Name = "Transparency" t.Value = RealLaser.Transparency local newLaserScript = sLaserScript:Clone() newLaserScript.Parent = sLaser newLaserScript.Disabled = false sLaser.Parent = getLocalPlayerGui() return sLaser end
When you change the size of a GUI object, it by default expands towards the bottom right corner of the screen. Therefore, you not only have to tween the size, but also the position. To do this, I used TweenSizeAndPosition, with another parameter after the endSize being the endPosition. The endPosition I set to the original position minus half of the width and half of the length to "center" it. Let me know if it works!
local label = script.Parent local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local length = label:WaitForChild("Length") local width = label:WaitForChild("Width") local angle = label:WaitForChild("Angle") local delaytime = label:WaitForChild("Delay") local life = label:WaitForChild("Lifetime") local t = label:WaitForChild("Transparency") local delayLine = Instance.new("Frame") delayLine.Parent = label delayLine.Name = "DelayLine" delayLine.Size = UDim2.new(0, 1, length.Value, 0) delayLine.AnchorPoint = Vector2.new(0, 0) delayLine.BorderSizePixel = 0 delayLine.BackgroundColor3 = Color3.fromRGB(255, 255, 255) delayLine.BackgroundTransparency = 0.5 delayLine.Position = UDim2.new(0, 0, 0, 0) local hitbox = Instance.new("Frame") hitbox.Parent = label hitbox.AnchorPoint = Vector2.new(0.5, 0.5) hitbox.Size = UDim2.new(0.33, 0, 1, 0) hitbox.Position = UDim2.new(0.5, 0, 0.5, 0) hitbox.BackgroundTransparency = 1 local hitboxScript = game.ReplicatedStorage.BulletScripts:WaitForChild("LinearHitboxScript"):Clone() hitboxScript.Parent = hitbox hitboxScript.Disabled = true delay(delaytime.Value, function() label:TweenSizeAndPosition(UDim2.new(0, width.Value, 0, length.Value), label.Position-UDim2.new(0, width.Value *0.5, 0, length.Value * 0.5), "Out", "Quad", 0.25, false, function() Debris:AddItem(label, life.Value) end) end) function getRealAngle(a) local val = math.abs(a - 180) if a > 180 then val = val * -1 end return val end label:GetPropertyChangedSignal("Size"):Connect(function() if label.Size == UDim2.new(0, 1, 0, 1) then delayLine.Visible = true label.ImageTransparency = 1 hitboxScript.Disabled = true else delayLine.Visible = false label.ImageTransparency = t.Value hitboxScript.Disabled = false end end) RunService.RenderStepped:Connect(function() label.Rotation = getRealAngle(angle.Value) end)