diff --git a/examples/clock.lua b/examples/clock.lua new file mode 100644 index 0000000..02154ed --- /dev/null +++ b/examples/clock.lua @@ -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 \ No newline at end of file diff --git a/examples/constrain.lua b/examples/constrain.lua new file mode 100644 index 0000000..ff2f938 --- /dev/null +++ b/examples/constrain.lua @@ -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 \ No newline at end of file diff --git a/examples/easing.lua b/examples/easing.lua new file mode 100644 index 0000000..524edcc --- /dev/null +++ b/examples/easing.lua @@ -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 \ No newline at end of file diff --git a/examples/keyboard-functions.lua b/examples/keyboard-functions.lua new file mode 100644 index 0000000..2ef4993 --- /dev/null +++ b/examples/keyboard-functions.lua @@ -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 \ No newline at end of file diff --git a/examples/keyboard.lua b/examples/keyboard.lua new file mode 100644 index 0000000..bac6a76 --- /dev/null +++ b/examples/keyboard.lua @@ -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 \ No newline at end of file diff --git a/examples/milliseconds.lua b/examples/milliseconds.lua new file mode 100644 index 0000000..ef87a5b --- /dev/null +++ b/examples/milliseconds.lua @@ -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 \ No newline at end of file diff --git a/examples/mouse-functions.lua b/examples/mouse-functions.lua new file mode 100644 index 0000000..ff20f27 --- /dev/null +++ b/examples/mouse-functions.lua @@ -0,0 +1,76 @@ +--[[ + Mouse Functions. + + Click on the box and drag it across the screen. + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +local bx = 0 +local by = 0 +local boxSize = 75 +local overbox = false +local locked = false +local xOffset = 0.0 +local yOffset = 0.0 + +function setup() + size(640, 360) + windowTitle("Mouse Functions") + describe("Click on the box and drag it across the screen.") + + noStroke() + rectMode(RADIUS) + + bx = width / 2 + by = height / 2 + boxSize = 75 + overbox = false + locked = false + xOffset = 0 + yOffset = 0 +end + +function draw() + background(0) + + -- Test if the cursor is over the box + if ((mouseX > bx - boxSize and mouseX < bx + boxSize) and (mouseY > by - boxSize and mouseY < by + boxSize)) then + overbox = true + if (not locked) then + stroke(255) + fill(153) + end + + else + stroke(153) + fill(153) + overbox = false + end + + -- draw the box + rect(bx, by, boxSize, boxSize) +end + +function mousePressed() + if (overbox) then + locked = true + fill(255, 255, 255) + else + locked = false + end + xOffset = mouseX - bx + yOffset = mouseY - by +end + +function mouseDragged() + if (locked) then + bx = mouseX - xOffset + by = mouseY - yOffset + end +end + +function mouseReleased() + locked = false +end \ No newline at end of file diff --git a/examples/mouse-press.lua b/examples/mouse-press.lua new file mode 100644 index 0000000..d1422ee --- /dev/null +++ b/examples/mouse-press.lua @@ -0,0 +1,30 @@ +--[[ + Mouse Press. + + Move the mouse to position the shape. + Press the mouse button to invert the color + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +function setup() + size(640, 360) + windowTitle("Mouse Press") + describe("Move and press the mouse button to position the shape and invert the color") + + noSmooth() + fill(126) + background(102) +end + +function draw() + if mouseIsPressed then + stroke(255) + else + stroke(0) + end + + line(mouseX - 66, mouseY, mouseX + 66, mouseY) + line(mouseX, mouseY - 66, mouseX, mouseY + 66) +end diff --git a/examples/mouse-signals.lua b/examples/mouse-signals.lua new file mode 100644 index 0000000..d49035b --- /dev/null +++ b/examples/mouse-signals.lua @@ -0,0 +1,74 @@ +--[[ + Mouse Signals + + Move and click the mouse to generate signals. + The top row is the signal from "mouseX", + the middle row is the signal from "mouseY", + and the bottom row is the signal from "mousePressed". + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +local xvals +local yvals +local bvals + +function setup() + size(640, 360) + windowTitle("Mouse Signals") + describe("Move and click the mouse to generate signals") + + noSmooth() + + xvals = {} + yvals = {} + bvals = {} + + for i = 1, width do + xvals[i] = 0 + yvals[i] = 0 + bvals[i] = 0 + end +end + +function draw() + background(102) + + -- Shift the values to the left + for i = 2, width do + xvals[i - 1] = xvals[i] + yvals[i - 1] = yvals[i] + bvals[i - 1] = bvals[i] + end + + -- Add the new values to the end of the array + xvals[width] = mouseX + yvals[width] = mouseY + + if mouseIsPressed then + bvals[width] = 0 + else + bvals[width] = height / 3 + end + + fill(255) + noStroke() + rect(0, height / 3, width, height / 3 + 1) + + for i = 1, width - 1 do + -- Draw the x-values + stroke(255) + point(i, map(xvals[i], 0, width, 0, height / 3 - 1)) + + -- Draw the y-values + stroke(0) + point(i, height / 3 + yvals[i] / 3) + end + + for i = 2, width do + -- Draw the mouse presses + stroke(255) + line(i, (2 * height / 3) + bvals[i], i, (2 * height / 3) + bvals[i - 1]) + end +end \ No newline at end of file diff --git a/examples/mouse1d.lua b/examples/mouse1d.lua new file mode 100644 index 0000000..8003ea0 --- /dev/null +++ b/examples/mouse1d.lua @@ -0,0 +1,33 @@ +--[[ + Mouse 1D. + + Move the mouse left and right to shift the balance. + The "mouseX" variable is used to control both the + size and color of the rectangles. + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +function setup() + size(640, 360) + windowTitle("Mouse 1D") + describe("Move the mouse left and right to shift the balance.") + + noStroke() + colorMode(RGB, height, height, height) + rectMode(CENTER) +end + +function draw() + background(0.0) + + local r1 = map(mouseX, 0, width, 0, height) + local r2 = height - r1 + + fill(r1) + rect(width / 2 + r1 / 2, height / 2, r1, r1) + + fill(r2) + rect(width / 2 - r2 / 2, height / 2, r2, r2) +end \ No newline at end of file diff --git a/examples/mouse2d.lua b/examples/mouse2d.lua new file mode 100644 index 0000000..0620a15 --- /dev/null +++ b/examples/mouse2d.lua @@ -0,0 +1,30 @@ +--[[ + Mouse 2D. + + Moving the mouse changes the position and size of each box + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +function setup() + size(640, 360) + windowTitle("Mouse 2D") + describe("Moving the mouse changes the position and size of each box") + + noStroke() + rectMode(CENTER) +end + +function draw() + background(0.0) + + fill(255, 204) + rect(mouseX, height / 2, mouseY / 2 + 10, mouseY / 2 + 10) + + fill(255, 204) + + local inverseX = width - mouseX + local inverseY = height - mouseY + rect(inverseX, height / 2, (inverseY / 2) + 10, (inverseY / 2) + 10) +end \ No newline at end of file diff --git a/examples/storing-input.lua b/examples/storing-input.lua new file mode 100644 index 0000000..58dc919 --- /dev/null +++ b/examples/storing-input.lua @@ -0,0 +1,50 @@ +--[[ + Storing Input. + + Move the mouse across the screen to change the position + of the circles. The positions of the mouse are recorded + into an array and played back every frame. Between each + frame, the newest value are added to the end of each array + and the oldest value is deleted + + Adapted from Processing examples. Adapted to L5 2025. Licensed under CC BY-NC-SA 4.0. +]] -- +require("L5") + +local num = 60 +local mx +local my + +function setup() + size(640, 360) + windowTitle("Storing Input") + describe(" Move the mouse across the screen to change the position of the circles and store them") + + noStroke() + + mx = {} + my = {} + + for i = 0, num - 1 do + mx[i] = 0 + my[i] = 0 + end + + fill(255, 153) +end + +function draw() + background(51) + + -- Cycle through the array, using a different entry on each frame. + -- Using modulo (%) like this is faster than moving all the values over + local which = frameCount % num + mx[which] = mouseX + my[which] = mouseY + + for i = 0, num - 1 do + -- which+1 is the smallest (the oldest in the array) + local index = (which + 1 + i) % num + ellipse(mx[index], my[index], i, i) + end +end \ No newline at end of file diff --git a/main.lua b/main.lua index c9d2b7e..6916282 100644 --- a/main.lua +++ b/main.lua @@ -12,5 +12,4 @@ end function draw() -- Fills the background with the color yellow background(255, 215, 0) -end - +end \ No newline at end of file