跳转到内容

使用组件

在插件中启用组件系统分两个阶段:

  1. 启用组件 UI
  2. 从用户选择的组件获取颜色值

启用组件 UI 的第一步是为 SignalRGB 定义设备通道。我们将以 Corsair Node Pro 为例。首先创建一个数组来概述通道的外观,然后在初始化函数中将它们发送到 SignalRGB 的后端,以便在开始渲染之前创建它们。

const DeviceMaxLedLimit = 204;
//Channel Name, Led Limit
var ChannelArray = [
["Channel 1", 204],
["Channel 2", 204],
]
function SetupChannels(){
device.SetLedLimit(DeviceMaxLedLimit);
for(let i = 0; i < ChannelArray.length; i++){
device.addChannel(ChannelArray[i][0],ChannelArray[i][1]);
}
}

在上述代码中,您会看到我们为通道布局了一个 2D 数组,每个条目是通道名称和 LED 限制。在 SetupChannels() 中,我们将设置总 LED 限制,然后迭代调用 device.addChannel 处理数组中的每个条目。

如果您想硬编码,也可以直接执行此循环而不使用数组。

function SetupChannels(){
device.SetLedLimit(204);
device.addChannel("Channel 1",204);
device.addChannel("Channel 2",204);
}

在 Initialize 内调用 SetupChannels 函数以完成设备初始化。

export function Initialize()
{
SetupChannels()
}

保存文件更改后,您的通道将出现在设备页面上。接下来,我们将深入探讨从选定组件获取颜色值的方法。

设置通道后,我们需要从中获取颜色——这就是将通道名称保存到数组中的好处所在。

总体思路是:

对于每个通道 -> 对于通道上的每个组件 -> getColors()

这一切都封装在 device.channel().getColors() 函数中。Corsair Node Pro 一次发送一个通道的颜色数据,因此我们需要将数据保持”分离”以便于使用。

不过,这里还有一个额外的部分:我们正在检查通道的 LedCount(),如果它返回 0,我们将为用户脉冲该通道。这是一个很好的指示器,让他们知道需要设置通道。

以下是普通用例、硬编码版本和不带通道脉冲检查版本的代码示例。

function SendChannel(Channel)
{
let ChannelLedCount = device.channel(ChannelArray[Channel][0]).LedCount();
let ColorData = []
if(device.getLedCount() == 0){
ChannelLedCount = 80;
let pulseColor = device.getChannelPulseColor(ChannelArray[Channel][0], ChannelLedCount);
ColorData = device.createColorArray(pulseColor, ChannelLedCount, "Seperate");
}else{
ColorData = device.channel(ChannelArray[Channel][0]).getColors("Seperate");
}
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}
function SendChannel1()
{
let ChannelLedCount = device.channel("Channel 1").LedCount();
let ColorData = []
if(device.getLedCount() == 0){
ChannelLedCount = 80;
let pulseColor = device.getChannelPulseColor("Channel 1", ChannelLedCount);
ColorData = device.createColorArray(pulseColor, ChannelLedCount, "Seperate");
}else{
ColorData = device.channel("Channel 1").getColors("Seperate");
}
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}
SendChannel(Channel)
{
let ColorData = []
ColorData = device.channel(ChannelArray[Channel][0]).getColors("Seperate");
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}

最后,我们只需在渲染循环中调用此函数即可。SendChannel 函数底部包含将颜色数组转换为数据包并将其发送到设备的代码。这部分特定于设备,需要您自己进行逆向工程!

export function Render()
{
SendChannel(0);
device.pause(1);
SendChannel(1);
device.pause(1);
SubmitLightingColors();
}

某些设备比较特殊,超出了常规模式,或者您可能正在尝试在插件中做一些新颖的事情,需要与单个组件交互。在这些情况下,我们不能使用 device.channel().getColors(),而是需要自己循环遍历单个组件。

为此,我们将使用 device.channel().getComponentNames() 获取所有组件 ID,然后使用 device.channel().getComponentColors() 迭代获取单个颜色数组。

以下示例只是将各个数组连接在一起,但您可以在两者之间对它们做任何需要的事情。

let components = device.channel("Channel 1").getComponentNames();
for(let i = 0; i < components.length;i++){
let ComponentColors = device.channel("Channel 1").getComponentColors(components[i]);
RGBData = RGBData.concat(ComponentColors)
}

如果您需要在插件中深入了解细节,可以使用 device.channel.getComponent()