
buttons
panneau de boutons cliquables
> examples buttons > edit buttons
Un panneau de commande : trois boutons à l'écran, chacun allumant et éteignant une sortie de redstone. Cliquez-les dans le terminal, ou faites un clic droit dessus sur un moniteur collé à l'ordinateur. Toute salle de contrôle commence ainsi.
Quoi construire
- Des Lampes à redstone (ou des portes, des Embrayages de Create, tout ce qui obéit à la redstone) à gauche, à droite et sur l'ordinateur.
- Si vous voulez, un moniteur contre l'ordinateur : un clic droit sur son écran appuie sur les boutons depuis le monde, sans ouvrir le terminal.
Sur le Calculateur à tubes, le papier du téléscripteur ne se clique pas, mais un moniteur marche. Sur les écrans à phosphore de l'Ordinateur à transistors et du Mini-ordinateur, les couleurs ne se voient pas, mais les textes ON et OFF si.
Comment il marche
local buttons = {
{label = "Lampe gauche", side = "left"},
{label = "Lampe droite", side = "right"},
{label = "Lampe dessus", side = "top"},
}
local X = 3
local WIDTH = 20Chaque bouton est une petite table : son texte et la face qu'il pilote. Le programme y ajoute ensuite sa ligne (y) et son état (on) : une table peut recevoir de nouveaux champs à tout moment.
La fonction draw peint un bouton : elle déplace le curseur avec term.set_cursor(), choisit un fond vert ou rouge avec term.set_bg(), et écrit le texte complété d'espaces (string.rep()) pour que chaque bouton fasse exactement WIDTH caractères de large. Voici ce qu'elle dessine :
local X, WIDTH = 3, 20
local function draw(b)
term.set_cursor(X, b.y)
local state = "OFF"
if b.on then
state = "ON"
term.set_bg(term.colors.green)
else
term.set_bg(term.colors.red)
end
local text = " " .. b.label
write(text .. string.rep(" ", WIDTH - #text - #state - 1) .. state .. " ")
term.set_bg(term.colors.black)
end
term.clear()
term.set_cursor(1, 1)
print("Panneau de commande")
draw({label = "Lampe gauche", y = 3, on = true})
draw({label = "Lampe droite", y = 5, on = false})
draw({label = "Lampe dessus", y = 7, on = false})
draw utilise X et WIDTH, qui sont local à tout le fichier : c'est permis en Brass. Une fonction ne peut pas utiliser les variables local d'une autre fonction, c'est pourquoi le bouton arrive en paramètre.
local e = os.pull_event("click")
for i = 1, #buttons do
local b = buttons[i]
if e.y == b.y and e.x >= X and e.x < X + WIDTH then
b.on = not b.on
rs.set(b.side, b.on)
draw(b)
end
endos.pull_event() avec "click" attend un clic. L'évènement indique le caractère cliqué (e.x, la colonne, et e.y, la ligne, à partir de 1 en haut à gauche), le pixel (e.px, e.py), le bouton de la souris et la provenance (e.source, "terminal" ou "monitor"). Un clic tombe sur un bouton quand il est sur sa ligne, entre sa première et sa dernière colonne. Le bouton bascule alors, pilote sa face et se redessine.
Idées
- Un quatrième bouton : ajoutez
{label = "Porte arrière", side = "back"}à la liste. Les lignes suivent toutes seules. Un bouton poussoir qui envoie une brève impulsion au lieu de basculer, pour une cloche ou une Presse mécanique de Create :
Brass if b.pulse then rs.set(b.side, true) sleep(0.2) rs.set(b.side, false) else b.on = not b.on rs.set(b.side, b.on) draw(b) endavec
pulse = truedans la table de ce bouton.- Pilotez des Liaisons de redstone de Create plutôt que des faces, pour atteindre des machines lointaines :
link.set(). - Affichez des valeurs en direct à côté des boutons (un stock, une vitesse), redessinées par un minuteur : voir Évènements pour attendre les clics et les minuteurs en même temps.
- La recette panneau de commande construit un panneau plus grand pour un mur de moniteurs.

Le programme
-- Des boutons cliquables : cliquez-les dans le terminal, ou faites un
-- clic droit dessus sur un moniteur collé à l'ordinateur. Chacun commute
-- une sortie : posez des lampes (portes, embrayages Create...) à gauche,
-- à droite et dessus.
local buttons = {
{label = "Lampe gauche", side = "left"},
{label = "Lampe droite", side = "right"},
{label = "Lampe dessus", side = "top"},
}
local X = 3 -- première colonne des boutons
local WIDTH = 20
-- Dessine un bouton : vert s'il est allumé, rouge sinon.
local function draw(b)
term.set_cursor(X, b.y)
local state = "OFF"
if b.on then
state = "ON"
term.set_bg(term.colors.green)
else
term.set_bg(term.colors.red)
end
local text = " " .. b.label
write(text .. string.rep(" ", WIDTH - #text - #state - 1) .. state .. " ")
term.set_bg(term.colors.black)
end
term.clear()
term.set_cursor(1, 1)
print("Panneau de commande")
for i = 1, #buttons do
buttons[i].y = 1 + i * 2
buttons[i].on = false
draw(buttons[i])
end
term.set_cursor(1, 10)
print("Ctrl+T pour quitter")
while true do
-- e.x, e.y : le caractère cliqué (1, 1 en haut à gauche)
-- e.source : "terminal" ou "monitor"
local e = os.pull_event("click")
for i = 1, #buttons do
local b = buttons[i]
if e.y == b.y and e.x >= X and e.x < X + WIDTH then
b.on = not b.on
rs.set(b.side, b.on)
draw(b)
end
end
end