Component/component access/zh

From OpenComputers: Rebooted
Jump to navigation Jump to search

访问组件

本页描述了如何通过Lua访问组件 API。简单来说,组件是一些方块或物品,它们提供了一些API,供与之相连的电脑上的Lua程序调用。

地址

每个组件都有一个地址。这个地址是一个UUID,即唯一标识符。大多数情况下都可以简写这些地址。要从一个缩写的地址中获得完整的地址,你可以调用`component.get`。你还可以手持分析仪按住ctrl右击方块以得到任意方块的地址。

要获得所有连接到你计算机的组件列表,你可以这样做: ```lua Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio lua> local component = require("component") lua> for k,v in component.list() do print(k, v) end xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx keyboard xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx screen xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx gpu ... ```

注意,即使从计算机上拆下来,物品组件的地址通常也不会改变。因此,如果你移除一个硬盘再将其重新插入,它的地址仍与之前的相同。而方块组件则不是这样,拆除它们再重新安装必然会改变地址。

你可以选择像这样过滤组件列表:

这段代码会将每一个名称中包含 "adar" 的组件添加到表radars中,如computronics的雷达(computronicsRadar)或warpDrive(曲率驱动)的雷达(warpdriveRadar)。 ```lua local component = require("component") local radars = {} for address, name in component.list("adar", false) do

table.insert(radars, component.proxy(address))

end ```

这段代码只将所有连接的曲率驱动雷达(warpdriveRadar)添加到表 radars 中 ```lua local component = require("component") local radars = {} for address, name in component.list("warpdriveRadar", true) do

table.insert(radars, component.proxy(address))

end ```

首选组件

component(组件) API会持续追踪每种组件类型的“首选”组件。如果同一种类型下有多个组件,则会随机选择一个作为首选组件。你可以通过`component.xxx`访问特定类型的首选组件,其中`xxx`是类型,比如: ```lua lua> =component.gpu.address xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ```

或者你也可以使用`component.getPrimary("xxx")`。切记,如果指定类型的首选组件不存在,调用此方法会抛出一个错误,因此最好先用`component.isAvailable("xxx")`进行检查。之所以选择直接抛出错误而不是返回`nil`,是因为相较于在后续代码中试图访问`nil`中的元素而产生错误,直接在这里抛出一个错误更能明确问题来源。

这个系统主要是为了让操作系统选择初始输出屏幕。

代理对象

现在我们已经知道了如何获得组件地址,那么看看如何与它们交互吧。有两种方法可以做到这一点。一种是调用`component.invoke(address, method, ...)`。例如: ```lua local component = require("component") component.invoke(modemAddress, "broadcast", port, data) ```

通常而言,更好的方法是获取一个代理对象。代理对象是一个简单的表,为各个API回调提供同名的的函数。此外,每个代理都有两个字段:`address`,用来保存被包装的组件的地址。`type`,用来保存组件的类型。你可以通过这种方法获得代理对象: ```lua local component = require("component") local proxy = component.proxy(address)

-- 上文调用的使用代理对象版本: proxy.broadcast(port, data)

-- 常见的代理对象字段: print(proxy.address) -- 传给上述component.proxy的地址 print(proxy.type) -- "modem" ```

请注意,通过`component.getPrimary`或`component.xxx`访问的首选组件实际上都是代理对象。

直接调用

一些组件的回调可以以"直接调用"的形式执行。直接调用是在计算机的工作线程中进行的,这意味着它们会立即返回。普通调用会被委托给主服务端线程,以避免出现竞态问题或其他线程问题,这也意味着普通调用至多会需要一tick(即50ms)才能完成。这里明确一下:只有component(组件) API会有这种情况。

信号

信号是于组件交互时很重要的一部分。信号可以被组件推入队列,以通知电脑外部变化和事件。例如,用户的输入就是通过信号转发给电脑的。电脑也可以将自己的信号加入队列,这有助于代码复用,或者只是异步通知你代码的其他部分。

目录

< 100% 15% 15% >
组件API 3D打印机 - 抽象总线 - 无线接入点 - 区块加载器 - 电脑 - 合成 - 数据卡 - 数据库 - 调试 - 无人机 - 驱动器 - EEPROM - 经验 - 文件系统 - 发电机 - 地质分析仪 - GPU - 全息投影仪 - 因特网 - 物品栏控制器 - 拴绳 - 微控制器 - 调制解调器 - 运动传感器 - 导航 - 网络拆分器 - 活塞 - 红石 - 运动红石机构 - 机器人 - 屏幕 - 告示牌 - 储罐控制器 - 牵引光束 - 转运器 - 隧道 - 世界传感器
::: 其它 访问组件 - 信号
::: 模组联动 应用能源