Add image sequence code (basic video/gif player)

This commit is contained in:
tommy 2024-08-25 01:27:17 -04:00
parent e1e254f40b
commit 5f232c2ae4
Signed by: tommy
GPG Key ID: 56B522AB2EF2263A
3 changed files with 161 additions and 0 deletions

5
ExampleImageSequence.lua Normal file
View File

@ -0,0 +1,5 @@
return {
FrameCount = 103,
FrameTime = 1/30,
AssetIds = {'rbxassetid://18300069384','rbxassetid://18300069589','rbxassetid://18300069926','rbxassetid://18300070468','rbxassetid://18300070631','rbxassetid://18300070885','rbxassetid://18300071124','rbxassetid://18300071342','rbxassetid://18300071571','rbxassetid://18300071719','rbxassetid://18300071905','rbxassetid://18300072135','rbxassetid://18300072297','rbxassetid://18300072500','rbxassetid://18300072694','rbxassetid://18300072942','rbxassetid://18300073249','rbxassetid://18300073449','rbxassetid://18300073654','rbxassetid://18300073831','rbxassetid://18300074100','rbxassetid://18300074381','rbxassetid://18300074708','rbxassetid://18300075078','rbxassetid://18300075466','rbxassetid://18300075720','rbxassetid://18300076000','rbxassetid://18300076198','rbxassetid://18300076380','rbxassetid://18300076569','rbxassetid://18300076756','rbxassetid://18300076968','rbxassetid://18300077201','rbxassetid://18300077433','rbxassetid://18300078411','rbxassetid://18300078643','rbxassetid://18300078870','rbxassetid://18300079032','rbxassetid://18300079171','rbxassetid://18300079360','rbxassetid://18300079574','rbxassetid://18300079739','rbxassetid://18300079897','rbxassetid://18300080098','rbxassetid://18300080258','rbxassetid://18300081182','rbxassetid://18300081370','rbxassetid://18300081526','rbxassetid://18300081769','rbxassetid://18300082111','rbxassetid://18300082264','rbxassetid://18300082443','rbxassetid://18300082668','rbxassetid://18300082892','rbxassetid://18300083289','rbxassetid://18300083549','rbxassetid://18300083783','rbxassetid://18300083999','rbxassetid://18300084209','rbxassetid://18300084421','rbxassetid://18300084609','rbxassetid://18300084891','rbxassetid://18300085170','rbxassetid://18300085359','rbxassetid://18300085542','rbxassetid://18300086179','rbxassetid://18300086563','rbxassetid://18300086750','rbxassetid://18300086973','rbxassetid://18300087147','rbxassetid://18300087371','rbxassetid://18300087710','rbxassetid://18300087931','rbxassetid://18300088118','rbxassetid://18300088292','rbxassetid://18300088593','rbxassetid://18300088865','rbxassetid://18300089071','rbxassetid://18300089261','rbxassetid://18300089426','rbxassetid://18300089679','rbxassetid://18300089846','rbxassetid://18300090041','rbxassetid://18300090244','rbxassetid://18300090433','rbxassetid://18300090610','rbxassetid://18300090787','rbxassetid://18300091118','rbxassetid://18300091264','rbxassetid://18300091503','rbxassetid://18300091849','rbxassetid://18300092103','rbxassetid://18300092324','rbxassetid://18300092535','rbxassetid://18300092814','rbxassetid://18300093005','rbxassetid://18300093137','rbxassetid://18300093571','rbxassetid://18300093888','rbxassetid://18300094077','rbxassetid://18300094259','rbxassetid://18300094479','rbxassetid://18300094743'}
}

View File

@ -0,0 +1,7 @@
return {
FrameCount = 103,
FrameSize = Vector2.new(64, 92),
FrameTime = 1/30,
GridSize = Vector2.new(11, 10),
AssetId = 'rbxassetid://18297119321',
}

149
ImageSequence.lua Normal file
View File

@ -0,0 +1,149 @@
--tommy * 2024 (@__tommyy)
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local Sequence = {}
Sequence.Assets = {}
local TotalImages = 0
local ImagesLoaded = 0
for _, SpritesheetDefinition in script:GetChildren() do
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local TemporaryLoadingGui = Instance.new("ScreenGui", PlayerGui)
TemporaryLoadingGui.Name = "TemporaryLoader"
local ReturnedSpritesheetDefinition = require(SpritesheetDefinition)
Sequence.Assets[SpritesheetDefinition.Name] = {}
local SpriteSheetDataContainer = Sequence.Assets[SpritesheetDefinition.Name]
SpriteSheetDataContainer.Definition = ReturnedSpritesheetDefinition
if ReturnedSpritesheetDefinition.AssetId then
TotalImages += 1
local NewImageLabel = Instance.new("ImageLabel", TemporaryLoadingGui)
NewImageLabel.Size = UDim2.fromOffset(1, 1)
NewImageLabel.Image = ReturnedSpritesheetDefinition.AssetId
NewImageLabel.BackgroundTransparency = 1
NewImageLabel.Name = SpritesheetDefinition.Name
SpriteSheetDataContainer.Image = NewImageLabel
NewImageLabel.ImageTransparency = 0
task.spawn(function()
while not NewImageLabel.IsLoaded do
RunService.RenderStepped:Wait()
end
ImagesLoaded += 1
NewImageLabel.ImageTransparency = 1
end)
elseif ReturnedSpritesheetDefinition.AssetIds then
if not SpriteSheetDataContainer.Images then
SpriteSheetDataContainer.Images = {}
end
TotalImages += ReturnedSpritesheetDefinition.FrameCount
for ImageIndex = 1, ReturnedSpritesheetDefinition.FrameCount do
local NewImageLabel = Instance.new("ImageLabel", TemporaryLoadingGui)
NewImageLabel.Size = UDim2.fromOffset(1, 1)
NewImageLabel.Image = ReturnedSpritesheetDefinition.AssetIds[ImageIndex]
NewImageLabel.BackgroundTransparency = 1
NewImageLabel.Name = `{SpritesheetDefinition.Name}_{ImageIndex}`
SpriteSheetDataContainer.Images[ImageIndex] = NewImageLabel
NewImageLabel.ImageTransparency = 0
task.spawn(function()
while not NewImageLabel.IsLoaded do
RunService.RenderStepped:Wait()
end
print(`Image {SpritesheetDefinition.Name} #{ImageIndex} loaded`)
ImagesLoaded += 1
NewImageLabel.ImageTransparency = 1
end)
end
end
end
while ImagesLoaded < TotalImages do
RunService.RenderStepped:Wait()
end
print(`Loaded {ImagesLoaded} images for ImageSequence`)
function Sequence.PlaySequenceTrueSpritesheet(ImageLabel: ImageLabel, SpritesheetDefinition, DoLoop: boolean)
local FrameCount = SpritesheetDefinition.Definition.FrameCount
local FrameSize = SpritesheetDefinition.Definition.FrameSize
local FrameTime = SpritesheetDefinition.Definition.FrameTime
local GridSize = SpritesheetDefinition.Definition.GridSize
local AssetId = SpritesheetDefinition.Definition.AssetId
ImageLabel.Image = AssetId
ImageLabel.ImageRectSize = FrameSize
local LoopThread; LoopThread = coroutine.create(function()
local TimeElapsed = 0
local ImageIndex = 0
while coroutine.status(coroutine.running()) ~= "dead" do
TimeElapsed += RunService.RenderStepped:Wait()
if TimeElapsed >= FrameTime then
TimeElapsed -= FrameTime
local OffsetX = FrameSize.X * (ImageIndex % GridSize.X)
local OffsetY = FrameSize.Y * math.floor(ImageIndex / GridSize.X)
ImageLabel.ImageRectOffset = Vector2.new(OffsetX, OffsetY)
ImageIndex += 1
if ImageIndex == FrameCount - 1 then
if DoLoop then
ImageIndex = 0
else
break
end
end
end
end
end)
coroutine.resume(LoopThread)
return function()
coroutine.close(LoopThread)
end
end
function Sequence.PlaySequenceButRobloxIsBad(ImageLabel: ImageLabel, SpritesheetDefinition, DoLoop: boolean)
local FrameCount = SpritesheetDefinition.Definition.FrameCount
local FrameTime = SpritesheetDefinition.Definition.FrameTime
local AssetIds = SpritesheetDefinition.Definition.AssetIds
ImageLabel.Image = "rbxassetid://0"
ImageLabel.ImageRectSize = Vector2.zero
ImageLabel.ImageRectOffset = Vector2.zero
local LoopThread; LoopThread = coroutine.create(function()
local TimeElapsed = 0
local ImageIndex = 1
while coroutine.status(coroutine.running()) ~= "dead" do
TimeElapsed += RunService.RenderStepped:Wait()
if TimeElapsed >= FrameTime then
TimeElapsed -= FrameTime
local AssetId = AssetIds[ImageIndex]
if AssetId then
ImageLabel.Image = AssetId
end
ImageIndex += 1
if ImageIndex == FrameCount then
if DoLoop then
ImageIndex = 1
else
break
end
end
end
end
end)
coroutine.resume(LoopThread)
return function()
coroutine.close(LoopThread)
end
end
function Sequence.PlaySequence(ImageLabel: ImageLabel, SpritesheetDefinition, DoLoop: boolean)
return (SpritesheetDefinition.Definition.AssetId and
Sequence.PlaySequenceTrueSpritesheet or
Sequence.PlaySequenceButRobloxIsBad)(ImageLabel, SpritesheetDefinition, DoLoop)
end
return Sequence