Create: Computing AgesDoc Brass
Programmes intégrés

buttons

panneau de boutons cliquables

Tourne sur Tous Tous les ordinateurs · 50 lignes
Tapez ceci à l'invite d'un ordinateur pour le copier sur le support :
Terminal
> 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

Brass
local buttons = {
  {label = "Lampe gauche", side = "left"},
  {label = "Lampe droite", side = "right"},
  {label = "Lampe dessus", side = "top"},
}
local X = 3
local WIDTH = 20

Chaque 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 :

Brass
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})
Écran
Écran

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.

Brass
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

os.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)
    end

    avec pulse = true dans 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.
Écran
buttons

Le programme

buttons
-- 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