【问题标题】:C++ DirectXTK Changing SpriteTint Over TimeC++ DirectXTK 随时间改变 SpriteTint
【发布时间】:2017-05-17 19:54:10
【问题描述】:

因此,对于大学项目,我希望尝试在特定时间范围内更改精灵的色调。目的是让一组岩石在 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;
}

非常感谢任何帮助!

【问题讨论】:

    标签: c++ visual-studio spritebatch directxtk


    【解决方案1】:

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

    void RockFade::Update(float timeDelta);
    

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

    因为这个条件

    timeDelta < timeToChangeColour
    

    似乎总是如此(因为似乎timeToChangeColour 的值超过了一帧时间)。

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

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

    【讨论】:

    • 这是有道理的!我通过重新调整逻辑解决了这个问题,并使用 totalSeconds 而不是 timeDelta 来评估经过的时间!谢谢!
    猜你喜欢
    • 2020-10-27
    • 2020-07-09
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2013-07-13
    相关资源
    最近更新 更多