按钮模块

按钮本身为瞬时型:按下/弹起是分开的,isPressed 读取当前按下状态。
此外还提供「玩家点击检测」「玩家互动锁」「灯带控制」「表面标签」四组能力,可组合出锁存按钮等自定义行为。
press() / release() 会播放对应的按键音效——音效由按钮的实际动作(运动)触发,而不是玩家的原始鼠标输入。
操作说明
- 配置模块:手持扳手对准模块右键 或者 蹲下+右键 可以打开模块配置界面,配置模块 ID、tooltip等属性
- 拆卸模块:手持扳手蹲下右键 可以拆卸模块
基础:按下 / 弹起 / 状态
btn.press()
按下按钮,并播放按下音效(灯带在「自动模式」下会随按下点亮)。
btn.release()
弹起按钮,并播放弹起音效(灯带在「自动模式」下会随弹起熄灭)。
btn.isPressed()
返回当前是否处于按下状态(布尔)。
玩家点击检测
Note
用于区分「玩家点击」与「Lua 调用 press/release」。只有玩家实际点击(客户端→服务端的交互包)才会更新下列状态,btn.press() 不计数。
btn.wasClicked()
返回自上次读取以来按钮是否被玩家按下过(只在按下边沿 0→1 触发,松开鼠标不触发;读取后自动清除标志,适合边沿检测)。
btn.getClickCount()
返回玩家累计点击次数(每次玩家按下 +1;Lua 的 press() 不计入)。
local last = btn.getClickCount()
while true do
local now = btn.getClickCount()
if now ~= last then
print("新增点击", now - last, "次")
last = now
end
os.sleep(0.05)
end
btn.clearClicked()
清除「未读点击」标志(不读取)。
表面标签
按钮表面可以显示文字标签(渲染方式参考旋钮角度文字:默认居中、白色、字号一致)。传入空串 "" 可清除显示,但会保留之前设置的位置/字号/颜色,下次写入文字时继续沿用。
btn.setLabel(text)
在按钮表面写入文字。传入空串 "" 可清除显示(之前设置的位置/字号/颜色会被保留)。
btn.getLabel()
读取按钮表面文字(未设置时返回空串)。
btn.setLabelPosition(x, y)
设置标签相对标签原点的位置偏移。单位为 MC 像素(1px = 1/16 块);x 向右为正、y 向上为正。(0, 0) 为标签原点——按钮表面视觉中心(默认)。
btn.getLabelPosition()
读取标签位置偏移,返回 x, y(MC 像素)。
btn.setLabelScale(scale)
设置标签字号(块/字体像素)。默认 1/512(与旋钮角度显示完全一致);值越大字越大,例如 1/256 为两倍大。
btn.getLabelScale()
读取标签字号(默认 1/512)。
btn.setLabelColour(colour)
设置标签颜色(0xRRGGBB,默认白色 0xFFFFFF)。
btn.getLabelColour()
读取标签颜色(0xRRGGBB,默认 0xFFFFFF)。
btn.setDropShadow(dropShadow)
设置标签是否绘制投影(默认 true,与旋钮角度文字一致)。设为 false 可去掉文字下方的阴影。
btn.getDropShadow()
读取标签当前是否绘制投影(默认 true)。
组合使用:
btn.setLabel("START")
btn.setLabelPosition(0.2, 0.1) -- 相对原点:右移 0.2px、上移 0.1px
btn.setLabelScale(1 / 256) -- 放大为旋钮角度字号的 2 倍
btn.setLabelColour(0xFF0000) -- 红色
btn.setDropShadow(false)
玩家互动锁(Lua 完全控制按钮)
btn.setPlayerControl(enabled)
设置玩家互动开关。
true(默认):玩家可按下/弹起按钮,行为照常false:按钮由 Lua 完全控制——玩家点击不会改变按下状态、也不会直接播放音效,但仍会更新wasClicked()/getClickCount()(音效由press()/release()触发,跟随按钮实际动作)
btn.getPlayerControl()
返回当前是否允许玩家互动(布尔,默认 true)。
灯带控制
btn.setLight(level)
设置灯带亮度(0..1),并自动切换到「代码控制」模式(此后玩家互动不再改变灯带)。
0= 熄灭,1= 最亮
btn.getLight()
返回 Lua 设定的灯带亮度(0..1,默认 0)。
btn.setLightControl(codeControlled)
设置灯带是否由代码控制。
true:灯带亮度只随setLight改变(玩家互动不影响灯带)false(默认):自动模式,灯带随按下状态点亮/熄灭
btn.isLightControlled()
返回灯带当前是否由代码控制(布尔)。
示例
示例 1:Lua 控制的锁存按钮(灯带自动跟随)
不控制灯带(保持默认「自动模式」),只用玩家互动锁接管按钮行为,把瞬时按钮变成「点击翻转」的锁存按钮:灯带自动跟随按下状态点亮。
local pe = require("ccpe.pe")
local monitor = pe.getPeripheral(3)
local btn = monitor.getModule(0)
-- 锁住玩家互动:玩家点击不再直接改变按钮状态,脚本全权决定按下/弹起
btn.setPlayerControl(false)
local latched = false
while true do
if btn.wasClicked() then
latched = not latched
if latched then
btn.press() -- 按下:播放按下音效,灯带自动点亮
else
btn.release() -- 弹起:播放弹起音效,灯带自动熄灭
end
end
sleep(0.05)
end
示例 2:灯带表示状态的锁存按钮(按钮保持瞬时)
不控制按钮按下/弹起行为(保持玩家可互动的瞬时按钮),只用灯带表示锁存状态:每次点击翻转灯带,灯带不再跟随瞬时按压。
local pe = require("ccpe.pe")
local monitor = pe.getPeripheral(3)
local btn = monitor.getModule(0)
-- 灯带交给 Lua(setLight 会自动切到代码控制模式,不再跟随按下)
btn.setLight(0)
local latched = false
while true do
if btn.wasClicked() then
latched = not latched
if latched then
btn.setLight(1) -- 灯带点亮 = 开
else
btn.setLight(0) -- 灯带熄灭 = 关
end
end
sleep(0.05)
end