C++ DirectXTK 随时间改变 SpriteTint
C++ DirectXTK Changing SpriteTint Over Time
因此,对于一个大学项目,我希望尝试在特定时间范围内更改精灵的色调。目的是让一组岩石在 5 秒内从灰色变成橙色(模拟加热),然后在接下来的 5 秒内再次从橙色变成灰色(模拟冷却)。
这是使用 DirectXTK 完成的,特别是 SpriteBatch,但是我似乎在控制加热和冷却逻辑方面遇到了一些问题。目前,岩石加热到橙色,但不会冷却下来。
岩石的更新函数,以及我用来控制冷却的进一步的 HeatDelay 函数包括在下面。
timeToChangeColour 初始化为 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
因此,对于一个大学项目,我希望尝试在特定时间范围内更改精灵的色调。目的是让一组岩石在 5 秒内从灰色变成橙色(模拟加热),然后在接下来的 5 秒内再次从橙色变成灰色(模拟冷却)。
这是使用 DirectXTK 完成的,特别是 SpriteBatch,但是我似乎在控制加热和冷却逻辑方面遇到了一些问题。目前,岩石加热到橙色,但不会冷却下来。
岩石的更新函数,以及我用来控制冷却的进一步的 HeatDelay 函数包括在下面。
timeToChangeColour 初始化为 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