Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions examples/clock.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
--[[
Clock.

The current time can be read with the second(), minute(),
and hour() functions. In this example, sin() and cos() values
are used to set the position of the hands

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.
]] --
require("L5")

local cx, cy
local secondsRadius
local minutesRadius
local hoursRadius
local clockDiameter

function setup()
size(640, 360)
windowTitle("Clock")
describe("Display the current time")

stroke(255)

local radius = min(width, height) / 2
secondsRadius = radius * 0.72
minutesRadius = radius * 0.60
hoursRadius = radius * 0.50
clockDiameter = radius * 1.8

cx = width / 2
cy = height / 2
end

function draw()
background(0)

-- Draw the clock background
fill(80)
noStroke()
ellipse(cx, cy, clockDiameter, clockDiameter)

-- Angles for sin() and cos() start at 3 o'clock;
-- subtract HALF_PI to make them start at the top
local s = map(second(), 0, 60, 0, TWO_PI) - HALF_PI
local m = map(minute() + map(second(), 0, 60, 0, 1), 0, 60, 0, TWO_PI) - HALF_PI
local h = map(hour() + map(minute(), 0, 60, 0, 1), 0, 24, 0, TWO_PI * 2) - HALF_PI

-- Draw the hands of the clock
stroke(255)
strokeWeight(1)
line(cx, cy, cx + cos(s) * secondsRadius, cy + sin(s) * secondsRadius)
strokeWeight(2)
line(cx, cy, cx + cos(m) * minutesRadius, cy + sin(m) * minutesRadius)
strokeWeight(4)
line(cx, cy, cx + cos(h) * hoursRadius, cy + sin(h) * hoursRadius)

-- Draw the minute ticks
strokeWeight(2)
for a = 0, 354, 6 do
local angle = radians(a)
local x = cx + cos(angle) * secondsRadius
local y = cy + sin(angle) * secondsRadius
point(x, y)
end
end
47 changes: 47 additions & 0 deletions examples/constrain.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
--[[
Constrain.

Move the mouse across the screen to move the circle.
The program constrains the circle to its box.

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.
]] --
require("L5")

local mx = 0
local my = 0
local easing = 0.05
local radius = 24
local edge = 100
local inner = edge + radius

function setup()
size(640, 360)
windowTitle("Constrain")
describe(" Move the mouse across the screen to move the circle. The program constrains the circle to its box.")

noStroke()
ellipseMode(RADIUS)
rectMode(CORNERS)
end

function draw()
background(51)

-- Change the position of the drawn ellipse to the position of the mouse with easing
if (abs(mouseX - mx) > 0.1) then
mx = mx + (mouseX - mx) * easing
end

if (abs(mouseY - my) > 0.1) then
my = my + (mouseY - my) * easing
end

-- Constrain the position of the ellipse to the inner rectangle
mx = constrain(mx, inner, width - inner)
my = constrain(my, inner, height - inner)
fill(76)
rect(edge, edge, width - edge, height - edge)
fill(255)
ellipse(mx, my, radius, radius)
end
41 changes: 41 additions & 0 deletions examples/easing.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
--[[
Easing.

Move the mouse across the screen and the symbol will follow.
Between drawing each frame of the animation, the program
calculates the difference between the position of the
symbol and the curson. If the difference is larger than
1 pixel, the symbol moves part of the distance (0.05) from its
current position toward the cursor.

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.
]] --
require("L5")

local x = 0
local y = 0
local easing = 0.05

function setup()
size(640, 360)
windowTitle("Easing")
describe(" Move the mouse across the screen and the symbol will follow.")

noStroke()
end

function draw()
background(51)

-- Change the position of the drawn ellipse to the position of the mouse with easing

targetX = mouseX
dx = targetX - x
x = x + dx * easing

targetY = mouseY
dy = targetY - y
y = y + dy * easing

ellipse(x, y, 66)
end
90 changes: 90 additions & 0 deletions examples/keyboard-functions.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
--[[
Keyboard Functions

Click on the window to give it focus and press the letter keys to type colors.
The keyboard function keyPressed() is called whenever a key is pressed.
keyPressed() is another keyboard function that is called when a key is released.

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.

Original 'Color Typewriter' concept by John Maeda.
]] --
require("L5")

local maxHeight = 40
local minHeight = 20
local letterHeight = maxHeight
local letterWidth = 20

local x = -letterWidth
local y = 0

local newletter = false

local numChars = 26
local colors = {}

function setup()
size(640, 360)
windowTitle("Keyboard Functions")
describe("Press letter keys to create forms in time and space")

noStroke()
colorMode(HSB, numChars)
background(numChars / 2)

-- Set a hue value for each key
for i = 0, numChars - 1 do
colors[i] = color(i, numChars, numChars)
end
end

function draw()
if newletter == true then
-- Draw the "letter"
local y_pos
if letterHeight == maxHeight then
y_pos = y
rect(x, y_pos, letterWidth, letterHeight)
else
y_pos = y + minHeight
rect(x, y_pos, letterWidth, letterHeight)
fill(numChars / 2)
rect(x, y_pos - minHeight, letterWidth, letterHeight)
end
newletter = false
end
end

function textinput(text)
local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

if string.match(key, "^[A-Z]$") then
keyIndex = string.find(alphabet, key) - 1
letterHeight = maxHeight
fill(colors[keyIndex])
elseif string.match(key, "^[a-z]$") then
keyIndex = string.find(alphabet, string.upper(key)) - 1
letterHeight = minHeight
fill(colors[keyIndex])
else
fill(0)
letterHeight = 10
end

newletter = true

-- Update the "letter" position
x = x + letterWidth

-- Wrap horizontally
if x > width - letterWidth then
x = 0
y = y + maxHeight
end

-- Wrap vertically
if y > height - letterHeight then
y = 0
end
end
45 changes: 45 additions & 0 deletions examples/keyboard.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--[[
Keyboard.

Click on the image to give it focus and press the letter keys
to create forms in time and space. Each key has a unique identifying
number. These numbers can be used to position shapes in space.

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.
]] --
require("L5")

function setup()
size(640, 360)
windowTitle("Keyboard")
describe("Press letter keys to create forms in time and space")
noStroke()
background(0)
rectWidth = width / 4
end

function keyPressed()
local keyIndex = -1
local alphabet = "abcdefghijklmnopqrstuvwxyz"
local upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

-- Check if it's a letter and get its index
local upperPos = string.find(upperAlphabet, key)
local lowerPos = string.find(alphabet, key)

if upperPos then
keyIndex = upperPos - 1
elseif lowerPos then
keyIndex = lowerPos - 1
end

if keyIndex == -1 then
-- If it's not a letter key, clear the screen
background(0)
else
-- It's a letter key, fill a rectangle
fill(millis() % 255)
local x = map(keyIndex, 0, 25, 0, width - rectWidth)
rect(x, 0, rectWidth, height)
end
end
28 changes: 28 additions & 0 deletions examples/milliseconds.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--[[
Milliseconds.

A millisecond is 1/1000 of a second.
L5 keeps track of the number of miliseconds a program has run.
By modifying this number with the modulo(%) operator,
different patterns in time are created.

Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0.
]] --
require("L5")

function setup()
size(640, 360)
windowTitle("Milliseconds")
describe("How L5 keeps track of the number of milliseconds a program has run")

noStroke()
scale = width / 20
end

function draw()
for i = 0, scale do
colorMode(RGB, (i + 1) * scale * 10)
fill(millis() % ((i + 1) * scale * 10))
rect(i * scale, 0, scale, height)
end
end
Loading