Skip to main content
A Cel represents content in a layer at a specific frame position.

Properties

sprite
Sprite
Parent sprite.
layer
Layer
Parent layer.
frame
Frame
Frame object where this cel exists.
frameNumber
number
Frame number (1-based index).
image
Image
The cel’s image data.
bounds
Rectangle
Cel bounds including position and image size.
position
Point
Cel position in the sprite.
opacity
number
Cel opacity (0-255).
zIndex
number
Z-index for cel ordering.
color
Color
Cel color in the timeline.
data
string
User-defined data string.
properties
table
User-defined properties table.

Examples

Creating and Modifying Cels

local sprite = Sprite(32, 32)
local layer = sprite.layers[1]
local cel = sprite:newCel(layer, 1)

cel.position = Point(10, 10)
cel.opacity = 200

local image = cel.image
image:clear(Color{ r=255, g=0, b=0 })

Working with Cel Images

local sprite = app.sprite
local cel = app.cel

if cel then
  local image = cel.image
  print("Image size:", image.width, "x", image.height)
  print("Cel position:", cel.position.x, cel.position.y)
  print("Cel bounds:", cel.bounds)
  
  -- Modify pixels
  for pixel in image:pixels() do
    pixel(Color{ r=255, g=0, b=0 })
  end
end

Copying Cels Between Frames

local sprite = app.sprite
local layer = app.layer
local sourceCel = layer:cel(1)

if sourceCel then
  local image = Image(sourceCel.image)
  local newCel = sprite:newCel(layer, 2, image, sourceCel.position)
  newCel.opacity = sourceCel.opacity
end

Iterating Through All Cels

local sprite = app.sprite
for i, cel in ipairs(sprite.cels) do
  print(string.format(
    "Cel %d: Layer=%s Frame=%d Position=(%d,%d)",
    i, cel.layer.name, cel.frameNumber,
    cel.position.x, cel.position.y
  ))
end

Moving Cel to Different Frame

local sprite = app.sprite
local cel = app.cel

if cel then
  -- Move cel from current frame to frame 5
  cel.frame = 5
  print("Cel moved to frame:", cel.frameNumber)
end

Cel Metadata

local cel = app.cel
if cel then
  cel.data = "This is frame 1 of the animation"
  cel.properties = {
    duration = 100,
    important = true
  }
  cel.color = Color{ r=255, g=255, b=0 }
end

Build docs developers (and LLMs) love