CC:游戏手柄

CC:游戏手柄

CC:游戏手柄为CC:Tweaked添加了一个外设方块,使ComputerCraft计算机能够读取玩家的真实游戏手柄/控制器输入。

技术

CC: Gamepads 添加了一个 CC:Tweaked 外设方块,让 ComputerCraft 计算机能够读取玩家的真实游戏手柄/控制器输入。

控制器在玩家客户端读取,发送到服务器,并通过绑定的 Gamepad 外设暴露给 Lua。这适用于单人游戏、局域网和专用多人服务器。 要求

Minecraft 1.21.1
NeoForge 21.1.x
CC:Tweaked 1.117.1

使用方法

将 Gamepad 外设方块放置在 CC:Tweaked 计算机旁边,或通过调制解调器连接到计算机。
手持一个 Gamepad 物品。
手持 Gamepad 物品潜行右键点击 Gamepad 外设方块以进行绑定。
将绑定的 Gamepad 物品保持在主手或副手。
插入/通过蓝牙连接你的控制器,并在计算机上运行 Lua 代码。

最多 4 名玩家可以同时向同一个 Gamepad 外设发送输入。每位玩家获得 1 到 4 的槽位。 Lua 外设

像包装其他 CC:Tweaked 外设一样包装该外设:

local pad = peripheral.find("gamepad")

功能 getPlayers()

返回已连接控制器状态的列表。

每个条目包括:

slot: 玩家槽位,1 到 4
player: 玩家名称
playerId: 玩家 UUID
controllerId: 客户端控制器 ID
controllerName: 控制器名称
guid: 控制器 GUID
buttons: 编号按钮表
buttonNames: 命名按钮表
axes: 编号轴表
axisNames: 命名轴表
updatedAt: 服务器时间戳

getState(slot)

返回某一个槽位的完整状态表。

如果该槽位未绑定控制器,则抛出错误。 isDown(slot, button)

如果编号按钮被按住,返回 true。

按钮:

A
B
X
Y
左肩键
右肩键
返回/选择
开始
菜单/主页
左摇杆
右摇杆
方向键上
方向键右
方向键下
方向键左

isButtonDown(slot, name)

如果命名按钮被按住,返回 true。

名称:

a b x y leftBumper rightBumper back select start guide home leftStick rightStick dpadUp dpadRight dpadDown dpadLeft

getAxis(slot, axis)

返回一个编号轴的值。

轴:

左 X,-1 到 1
左 Y,-1 到 1
右 X,-1 到 1
右 Y,-1 到 1
左扳机,0 到 1
右扳机,0 到 1

getAxisValue(slot, name)

返回一个命名轴的值。

名称:

leftX leftY rightX rightY leftTrigger rightTrigger

getMaxPlayers()

返回 4。 getButtonCount()

返回 15。 getAxisCount()

返回 6。 事件

当控制器状态改变时,连接的计算机接收:

cc_events, "gamepad", slot, playerName, controllerId

示例:

local event, kind, slot, player, controllerId = os.pullEvent("cc_events") if kind == "gamepad" then print(player .. " updated slot " .. slot) end

Lua 示例程序

此程序打印槽位 1 的基本状态,并在按下 Start 时退出。

local pad = peripheral.find("gamepad") if not pad then error("No gamepad peripheral found") end

print("Waiting for gamepad input...")

while true do local event, kind, slot, player = os.pullEvent("cc_events") if kind == "gamepad" and slot == 1 then local lx = pad.getAxisValue(1, "leftX") local ly = pad.getAxisValue(1, "leftY") local a = pad.isButtonDown(1, "a") local b = pad.isButtonDown(1, "b")

term.clear()
term.setCursorPos(1, 1)
print("Player: " .. player)
print(("Left stick: %.2f %.2f"):format(lx, ly))
print("A: " .. tostring(a))
print("B: " .. tostring(b))
print("Start exits")

if pad.isButtonDown(1, "start") then
  break
end

end end

多人游戏注意事项

控制器输入仅接受来自发送它的玩家。
玩家必须持有绑定到目标外设的 Gamepad 物品。
控制器 ID 和 GUID 在服务器端进行验证。
数据包大小、字符串长度、按钮数量、轴数量和轴值在状态被接受之前都会进行验证。
玩家断开连接或其控制器列表变化时,玩家状态将被清除。