From f802ad40ca7ab85367346722466936f5f65e7189 Mon Sep 17 00:00:00 2001 From: Yam Date: Sun, 8 Mar 2026 03:20:00 -0400 Subject: [PATCH 1/2] Ported "Input" examples from Processing Ported all examples under the Input section of the Processing examples website. --- examples/clock.lua | 70 ++++++++++++++++++++++++ examples/constrain.lua | 50 +++++++++++++++++ examples/easing.lua | 44 +++++++++++++++ examples/keyboard-functions.lua | 97 +++++++++++++++++++++++++++++++++ examples/keyboard.lua | 50 +++++++++++++++++ examples/milliseconds.lua | 29 ++++++++++ examples/mouse-functions.lua | 78 ++++++++++++++++++++++++++ examples/mouse-press.lua | 34 ++++++++++++ examples/mouse-signals.lua | 77 ++++++++++++++++++++++++++ examples/mouse1d.lua | 34 ++++++++++++ examples/mouse2d.lua | 31 +++++++++++ examples/storing-input.lua | 53 ++++++++++++++++++ main.lua | 12 ++-- 13 files changed, 653 insertions(+), 6 deletions(-) create mode 100644 examples/clock.lua create mode 100644 examples/constrain.lua create mode 100644 examples/easing.lua create mode 100644 examples/keyboard-functions.lua create mode 100644 examples/keyboard.lua create mode 100644 examples/milliseconds.lua create mode 100644 examples/mouse-functions.lua create mode 100644 examples/mouse-press.lua create mode 100644 examples/mouse-signals.lua create mode 100644 examples/mouse1d.lua create mode 100644 examples/mouse2d.lua create mode 100644 examples/storing-input.lua diff --git a/examples/clock.lua b/examples/clock.lua new file mode 100644 index 0000000..26f932a --- /dev/null +++ b/examples/clock.lua @@ -0,0 +1,70 @@ +--[[ + 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 website. + https://processing.org/examples/clock.html +]] -- +require("L5") + +-- Declare Variables +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) + + -- Initialize variables + 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 + diff --git a/examples/constrain.lua b/examples/constrain.lua new file mode 100644 index 0000000..b2caecd --- /dev/null +++ b/examples/constrain.lua @@ -0,0 +1,50 @@ +--[[ + Constrain. + + Move the mouse across the screen to move the circle. + The program constrains the circle to its box. + + Adapted from Processing Examples website. + https://processing.org/examples/constrain.html +]] -- +require("L5") + +-- Declare Variables +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("Contrain") + describe(" Move the mouse across the screen to move the circle. The program constrains the circle to its box.") + + -- Draw Modes + 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 diff --git a/examples/easing.lua b/examples/easing.lua new file mode 100644 index 0000000..61ab3e1 --- /dev/null +++ b/examples/easing.lua @@ -0,0 +1,44 @@ +--[[ + 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 website. + https://processing.org/examples/easing.html +]] -- +require("L5") + +-- Declare Variables +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.") + + -- Draw Modes + 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 diff --git a/examples/keyboard-functions.lua b/examples/keyboard-functions.lua new file mode 100644 index 0000000..1252e15 --- /dev/null +++ b/examples/keyboard-functions.lua @@ -0,0 +1,97 @@ +--[[ + 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 website. + https://processing.org/examples/keyboardfunctions.html + by Martin Gomez + + 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 keyPressed() + -- If the key is between 'A'(65) to 'Z' and 'a' to 'z'(122) + local keyByte = string.byte(key) + + if (keyByte >= string.byte('A') and keyByte <= string.byte('Z')) or + (keyByte >= string.byte('a') and keyByte <= string.byte('z')) then + local keyIndex + if keyByte <= string.byte('Z') then + keyIndex = keyByte - string.byte('A') + letterHeight = maxHeight + fill(colors[keyIndex]) + else + keyIndex = keyByte - string.byte('a') + letterHeight = minHeight + fill(colors[keyIndex]) + end + 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 diff --git a/examples/keyboard.lua b/examples/keyboard.lua new file mode 100644 index 0000000..845d688 --- /dev/null +++ b/examples/keyboard.lua @@ -0,0 +1,50 @@ +--[[ + 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 website. + https://processing.org/examples/keyboard.html +]] -- +require("L5") + +-- Declare Variables +local rectWidth = width / 4 + +function setup() + size(640, 360) + windowTitle("Keyboard") + describe("Press letter keys to create forms in time and space") + + -- Draw Modes + noStroke() + background(0) +end + +function draw() + -- Keep draw() heer to continue looping while waiting for keys +end + +function keyPressed() + local keyIndex = -1 + -- Convert the built-in key variable from a string to its byte value + local keyByte = string.byte(key) + + if (keyByte >= string.byte('A') and keyByte <= string.byte('Z')) then + keyIndex = keyByte - string.byte('A') + elseif (keyByte >= string.byte('a') and keyByte <= string.byte('z')) then + keyIndex = keyByte - string.byte('a') + end + + if (keyIndex == -1) then + -- If it's not a letter key, clear the screen + background(0) + else + -- If it's a letter key, fill a rectangle + fill(millis() % 255) + x = map(keyIndex, 0, 25, 0, width - rectWidth) + rect(x, 0, rectWidth, height) + end +end diff --git a/examples/milliseconds.lua b/examples/milliseconds.lua new file mode 100644 index 0000000..cb6ed39 --- /dev/null +++ b/examples/milliseconds.lua @@ -0,0 +1,29 @@ +--[[ + 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 website. + https://processing.org/examples/milliseconds.html +]] -- +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 diff --git a/examples/mouse-functions.lua b/examples/mouse-functions.lua new file mode 100644 index 0000000..43f763d --- /dev/null +++ b/examples/mouse-functions.lua @@ -0,0 +1,78 @@ +--[[ + Mouse Functions. + + Click on the box and drag it across the screen. + + Adapted from Processing Examples website. + https://processing.org/examples/mousefunctions.html +]] -- +require("L5") + +-- Declare Variables +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.") + + -- Draw Modes + noStroke() + rectMode(RADIUS) + + -- Initialize Variables + bx = width / 2.0 + by = height / 2.0 + boxSize = 75 + overbox = false + locked = false + xOffset = 0.0 + yOffset = 0.0 +end + +function draw() + background(0) + + 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 + + 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 diff --git a/examples/mouse-press.lua b/examples/mouse-press.lua new file mode 100644 index 0000000..a7422e8 --- /dev/null +++ b/examples/mouse-press.lua @@ -0,0 +1,34 @@ +--[[ + Mouse Press. + + Move the mouse to position the shape. + Press the mouse button to invert the color + + Adapted from Processing Examples website. + https://processing.org/examples/mousepress.html +]] -- +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") + + -- Draw Modes + noSmooth() + fill(126) + background(102) +end + +function draw() + -- In processing mousePressed is both a function signature and global built-in variable + -- In L5, this is differentiated into mousePressed(), the function and mouseIsPressed, the built-in variable + 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..7e07169 --- /dev/null +++ b/examples/mouse-signals.lua @@ -0,0 +1,77 @@ +--[[ + 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 website. + https://processing.org/examples/mousesignals.html +]] -- +require("L5") + +-- Declare Variables +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 = {} + + -- Initialize tables with 0 + 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 diff --git a/examples/mouse1d.lua b/examples/mouse1d.lua new file mode 100644 index 0000000..44549bd --- /dev/null +++ b/examples/mouse1d.lua @@ -0,0 +1,34 @@ +--[[ + 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 website. + https://processing.org/examples/mouse1d.html +]] -- +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 diff --git a/examples/mouse2d.lua b/examples/mouse2d.lua new file mode 100644 index 0000000..d514480 --- /dev/null +++ b/examples/mouse2d.lua @@ -0,0 +1,31 @@ +--[[ + Mouse 2D. + + Moving the mouse changes the position and size of each box + + Adapted from Processing Examples website. + https://processing.org/examples/mouse2d.html +]] -- +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 diff --git a/examples/storing-input.lua b/examples/storing-input.lua new file mode 100644 index 0000000..42e0fc9 --- /dev/null +++ b/examples/storing-input.lua @@ -0,0 +1,53 @@ +--[[ + 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 website. + https://processing.org/examples/storinginput.html +]] -- +require("L5") + +-- Declare Variables +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 = {} + + -- Initialize tables with 0 + 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 diff --git a/main.lua b/main.lua index c9d2b7e..4b62484 100644 --- a/main.lua +++ b/main.lua @@ -1,16 +1,16 @@ require("L5") function setup() - size(400, 400) + size(400, 400) - -- Set the program title - windowTitle("Basic sketch") + -- Set the program title + windowTitle("Basic sketch") - describe('Draws a yellow background') + describe('Draws a yellow background') end function draw() - -- Fills the background with the color yellow - background(255, 215, 0) + -- Fills the background with the color yellow + background(255, 215, 0) end From 0f0f0a4d14e2614ac2b15528b3ccb9a196f0b6e0 Mon Sep 17 00:00:00 2001 From: Yam Date: Mon, 9 Mar 2026 23:49:24 -0400 Subject: [PATCH 2/2] fix: error declaring rectWidth outside setup() --- examples/keyboard.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/keyboard.lua b/examples/keyboard.lua index 845d688..cdb3cca 100644 --- a/examples/keyboard.lua +++ b/examples/keyboard.lua @@ -10,9 +10,6 @@ ]] -- require("L5") --- Declare Variables -local rectWidth = width / 4 - function setup() size(640, 360) windowTitle("Keyboard") @@ -21,6 +18,9 @@ function setup() -- Draw Modes noStroke() background(0) + + -- Declare Variables + rectWidth = width / 4 end function draw()