C++ DirectXTK 随时间推移更改 SpriteTint

C++ DirectXTK Changing SpriteTint Over Time

本文关键字:SpriteTint DirectXTK 时间 C++      更新时间:2023-10-16

所以对于一个大学项目,我希望尝试在特定的时间范围内改变精灵的色调。目的是让一组岩石在 5 秒内从灰色变成橙色(模拟加热它们),然后在接下来的 5 秒内再次将它们从橙色变成灰色(模拟冷却它们)。

这是使用DirectXTK,SpriteBatch完成的,但是我似乎在控制加热和冷却逻辑时遇到了一些问题。目前,岩石加热到橙色,但不会冷却下来。

下面包括岩石的更新功能,以及我用来控制冷却的进一步的热延迟功能。

timeToChangeColor 初始化为 5。

void RockFade::Update(float timeDelta)
{
    if ((timeDelta >= timeToChangeColour) && (heatDelay == false))
    {
        this->heatUp = false;
        HeatDelay();
        timeToChangeColour = timeDelta + 10;
    }
    else if ((timeDelta < timeToChangeColour) && (heatDelay == false))
    {
        this->heatUp = true;
    }
    if (heatUp)
    {
        this->newBlue  -= 0.002f;
    }
    else
    {
        this->newBlue += 0.002f;
    }
    this->spriteTint = DirectX::SimpleMath::Color{ 1.0f, 1.0f, newBlue, 1.0f};
}
void RockFade::HeatDelay()
{
    heatDelay = true;
    Sleep(5);
    heatDelay = false;
}

任何帮助将不胜感激!

代码最大的概念问题是在函数中

void RockFade::Update(float timeDelta);

您似乎假设timeDelta将是自过去指定的固定时间以来的时差,但实际上是自上次调用Update以来的时差。

因此,条件

timeDelta < timeToChangeColour
似乎

总是正确的(因为似乎timeToChangeColour的值超过一帧时间)。

实现你在这里要做的事情的第一步可能是积累时间,并将其作为你的基础,例如:

this->myAccumulatedTime += timeDelta; // initialize it to zero