次の方法で共有


LampArray での色の設定

ILampArray のすべての色更新関数では、RGBA カラー値の表現に LampArrayColor 構造体を使用します。

アルファ値 (LampArrayColor::a) は、色の相対的な透明度を表します。0 は完全に透明で、0xFFは完全に不透明です。 0xFF 以外のアルファ値を使用した場合、色は黒に対して追加のブレンド ステップを実行します。 このブレンド手順を回避するには、色を設定するときに 0xFF 以外のアルファ値を渡さないでください。

ILampArray SetColor API は、最大限のパフォーマンスとランプ状態の一貫性を確保するために、シングル スレッドからの呼び出しを前提として設計されています。

すべてのランプを更新しています

ILampArray::SetColor メソッドは、デバイス上のすべてのランプを目的の色に合わせて変更します。

次の例は、LampArray コールバックを登録し、接続されている各デバイスの色を設定する方法を示しています。

const LampArrayColor greenColor = { 0x0 /* r */, 0xFF /* g */, 0x0 /* b */, 0xFF /* a */};
std::vector<Microsoft::WRL::ComPtr<ILampArray>> lampArrays;

void MyLampArrayCallback(
    _In_opt_ void* context,
    bool isAttached,
    _In_ ILampArray* lampArray)
{
    if (isAttached)
    {
        lampArray->SetColor(greenColor);
        lampArrays.push_back(lampArray);
    }
    else
    {
        for (auto iter = lampArrays.begin(); iter != lampArrays.end(); )
        {
            if (iter->Get() == lampArray)
            {
                lampArrays.erase(iter);
            }
            else
            {
                iter++;
            }
        }
    }
}

void MainLoop(
    _In_ volatile bool & cancelMonitoring) noexcept
{
    LampArrayCallbackToken token = LAMPARRAY_INVALID_CALLBACK_TOKEN_VALUE;
    if (SUCCEEDED(RegisterLampArrayCallback(
        MyLampArrayCallback,
        nullptr /* context */,
        &token)))
    {
        while (!cancelMonitoring)
        {
            Sleep(100);
        }

        UnregisterLampArrayCallback(token, 5000);
    }
}

個別のランプまたはランプ グループのターゲット設定

ILampArray::SetColorsForIndices は、LampArray に含まれる 1 つ以上のランプを更新します。 この API に渡されるランプ インデックスは、任意の順序で指定できます。

次の例は、LampArray に含まれるすべてのランプの色を交互に設定する方法を示しています。

void SetAlternatingColors(ILampArray* lampArray)
{
    const LampArrayColor blueColor = { 0x0 /* r */, 0x0 /* g */, 0xFF /* b */, 0xFF /* a */};
    const LampArrayColor redColor = { 0xFF /* r */, 0x0 /* g */, 0x0 /* b */, 0xFF /* a */};

    const uint32_t lampCount = lampArray->GetLampCount();

    // Set up our index and color buffers
    std::vector<uint32_t> indicesBuffer(lampCount);
    std::vector<LampArrayColor> colorsBuffer(lampCount);

    // Populate the buffers
    for (uint32_t i = 0; i < lampCount; i++)
    {
        // We will use all the Lamps for this update.
        indicesBuffer[i] = i;

        // Odd numbered indices will be red, even numbered indices will be blue
        if (i % 2 != 0)
        {
            colorsBuffer[i] = redColor;
        }
        else
        {
            colorsBuffer[i] = blueColor;
        }
    }

    // Apply the colors to the LampArray
    lampArray->SetColorsForIndices(lampCount, indicesBuffer.data(), colorsBuffer.data());
}

次の例は、LampArray 上の個々のランプまたはランプのグループの色を更新する方法を示しています。

void MyCustomColorUpdate(ILampArray* lampArray)
{
    const LampArrayColor greenColor = { 0x0 /* r */, 0xFF /* g */, 0x0 /* b */, 0xFF /* a */};
    const LampArrayColor yellowColor = { 0xFF /* r */, 0xFF /* g */, 0x0 /* b */, 0xFF /* a */};
    const LampArrayColor whiteColor = { 0xFF /* r */, 0xFF /* g */, 0xFF /* b */, 0xFF /* a */};

    const uint32_t lampCount = lampArray->GetLampCount();

    // Set custom colors for a single lamp at index 4
    const uint32_t index = 4;
    lampArray->SetColorsForIndices(1, &index, &greenColor);

    // Simultaneously make Lamp 1 yellow and Lamp 3 white
    std::vector<uint32_t> indicesBuffer = { 1, 3 };
    std::vector<LampArrayColor> colorsBuffer = { yellowColor, whiteColor };

    // Apply the colors to the LampArray
    lampArray->SetColorsForIndices(static_cast<uint32_t>(indicesBuffer.size()), indicesBuffer.data(), colorsBuffer.data());
}

キーボード スキャン コードを使用したランプのターゲット設定

ILampArray::SetColorsForScanCodes では、LampArray キーボードの特定のキーについて、ランプの色を簡単に設定できます。 これは、押すキーをユーザーに指示するチュートリアル機能や、ゲームの状態に関連する情報をキーボードに表示する機能などの実現に役立ちます。

次の例は、LampArray キーボードの WASD キーについてランプの色を変更する方法を示しています。

#define SC_W    0x11
#define SC_A    0x1E
#define SC_S    0x1F
#define SC_D    0x20

void UpdateWASDKeys(ILampArray* lampArray)
{
    const LampArrayColor blueColor = { 0x0 /* r */, 0x0 /* g */, 0xFF /* b */, 0xFF /* a */};
    const LampArrayColor yellowColor = { 0xFF /* r */, 0xFF /* g */, 0x0 /* b */, 0xFF /* a */};

    // Set the color for all lamps. We will override the WASD keys below.
    lampArray->SetColor(blueColor);

    // Set up the buffer of scan codes for the Lamps we want to target
    std::vector<uint32_t> scanCodesBuffer = { SC_W, SC_A, SC_S, SC_D };

    // Create a matching buffer of LampArrayColors. In this example, we will set all of the WASD keys to yellow.
    std::vector<LampArrayColor> colorsBuffer;
    for (size_t i = 0; i < scanCodesBuffer.size(); i++)
    {
        colorsBuffer.push_back(yellowColor);
    }

    // Set the color for the WASD keys
    lampArray->SetColorsForScanCodes(static_cast<uint32_t>(scanCodesBuffer.size()), scanCodesBuffer.data(), colorsBuffer.data());
}

関連項目

Lighting API の概要
ILampArray リファレンス
LampArrayColor
ILampArray::SetColor
ILampArray::SetColorsForIndices
ILampArray::SetColorsForScanCodes