{"id":"mercy213/spritesheet","name":"spritesheet","scope":"mercy213","platform":"roblox","description":"Animate 3D Textures and UI ImageLabels as sprite sheets. Supports looping, ping-pong, multi-sheet sequences, and lazy image size resolution.","version":"0.1.0","latest":"0.1.0","versions":["0.1.0"],"license":"MIT","licenseRating":"safe","licenseCaveats":["The package archive does not include its license text; the license is declared in its manifest metadata."],"licenseVerified":false,"dependencies":{},"integrity":"220cd9bb19035bd20137ae8d455b42c0550878a63f440e6e3208a621a87b0d91","likes":0,"downloads":0,"install":"forest install mercy213/spritesheet","url":"https://forest.dev/p/roblox/mercy213/spritesheet","files":"https://api.forest.dev/ai/package/roblox/mercy213/spritesheet/files","readme":"# SpriteSheet\n\nA Wally package for animating 3D `Texture` instances and UI `ImageLabel`/`ImageButton` elements as sprite sheets in Roblox.\n\n## Installation\n\nAdd to your `wally.toml`:\n\n```toml\n[dependencies]\nSpriteSheet = \"ariel/spritesheet@0.1.0\"\n```\n\nThen run `wally install`.\n\n## API\n\n### `SpriteSheetController:Play(Texture, Rows, Columns, Options?)`\n\nAnimates a 3D `Texture` on a part. Returns a `Handle` with a `:Stop()` method.\n\n```lua\nlocal handle = SpriteSheet:Play(texture, 4, 8, {\n    FPS = 24,\n    Loop = true,\n    StartFrame = 0,\n    Frames = 30,          -- optional: use fewer than Rows*Columns\n    ImageSize = Vector2.new(512, 512), -- optional: skip async size lookup\n})\n\n-- later:\nhandle:Stop()\n```\n\n---\n\n### `SpriteSheetController:PlayUI(Target, Rows, Columns, Options?)`\n\nAnimates one or more `ImageLabel`/`ImageButton` instances. Supports multi-sheet sequences and ping-pong.\n\n```lua\n-- Single image\nlocal handle = SpriteSheet:PlayUI(imageLabel, 4, 8, {\n    FPS = 12,\n    Loop = true,\n    PingPong = false,\n})\n\n-- Multi-sheet sequence\nlocal handle = SpriteSheet:PlayUI(imageLabel, 0, 0, {\n    Sheets = {\n        { Image = \"rbxassetid://111\", Rows = 4, Columns = 8, Frames = 30 },\n        { Image = \"rbxassetid://222\", Rows = 2, Columns = 4, Frames = 8 },\n    },\n    FPS = 24,\n    Loop = true,\n})\n\nhandle:Stop()\n```\n\n---\n\n### `SpriteSheetController:GetImageSize(AssetId): Vector2?`\n\nReturns the pixel size of an asset (cached after first call). Yields on first call.\n\n```lua\nlocal size = SpriteSheet:GetImageSize(\"rbxassetid://123456789\")\n```\n\n## Options\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `FPS` | number | `12` | Frames per second |\n| `Loop` | bool | `true` | Loop the animation |\n| `PingPong` | bool | `false` | Play forward then backward |\n| `StartFrame` | number | `0` | Which frame to start on |\n| `Frames` | number | `Rows*Columns` | How many frames to use |\n| `ImageSize` | Vector2 | auto | Skip async size lookup |\n| `Image` | string | — | Override asset ID (PlayUI) |\n| `Sheets` | table | — | Multi-sheet sequence (PlayUI) |\n","readmeTruncated":false}