FW1FontWrapper IFW1ColorRGBA

FW1FontWrapper IFW1ColorRGBA

我一直在尝试将 RGBA 颜色转换为 UINT32 以便在 IFW1FontWrapper->DrawString 函数中使用,但它导致游戏崩溃。

IFW1ColorRGBA *color;
color->SetColor(r, g, b, a);//Crash
UINT32 clr = color->GetColor32();
color->Release();

r,g,b,a类型为FLOAT 任何人都可以帮助我让它工作吗?

IFW1ColorRGBA *color;

这一行声明了一个指向IFW1ColorRGBA的指针。但是,它不会 初始化 该指针。它当然不会分配任何内存来存储对象。因此,你这里有一个未初始化的指针。

color->SetColor(r, g, b, a);//Crash

然后你去尝试取消引用那个未初始化的指针。 -> 运算符取消引用指针并调用 SetColor 成员函数。 BOOM! 您调用了未定义的行为并崩溃了。该指针实际上并未指向有效的 IFW1ColorRGBA 对象。哎呀

您需要初始化该指针。由于它实际上是一种接口类型,您可能会通过在某些绘图对象上调用 QueryInterface 函数来实现(我们将其称为 pDrawingSomethingOrOther)。
例如:

IFW1ColorRGBA* pColor;
HRESULT hResult = pDrawingSomethingOrOther->QueryInterface(&pColor);
if (SUCCEEDED(hResult))
{
    pColor->SetColor(r, g, b, a);
    UINT32 clr = pColor->GetColor32();
    pColor->Release();
}

@Cody Gray 你的代码没有用,但你帮助我理解了我做错了什么。

这是最终有效的代码:

IFW1ColorRGBA* pColor;
UINT32 clr = 0xffffffff;
pfw1Factory->CreateColor(clr, &pColor);
pColor->SetColor(r, g, b, a);
clr = pColor->GetColor32();