C++ DirectXTK Изменение SpriteTint с течением времени

Поэтому для университетского проекта я пытаюсь изменить оттенок спрайта в течение определенного периода времени. Цель состоит в том, чтобы заставить набор камней изменить цвет с серого на оранжевый (имитируя нагревание) в течение 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;
}

Любая помощь очень ценится!

1 ответ

Решение

Самая большая концептуальная проблема с вашим кодом в том, что в функции

void RockFade::Update(float timeDelta);

Вы, кажется, предполагаете, что timeDelta будет разница во времени с указанного фиксированного времени в прошлом, но на самом деле это разница во времени с последнего раза Update назывался.

Из-за этого условия

timeDelta < timeToChangeColour

кажется, всегда верно (потому что кажется timeToChangeColourзначение превышает один кадр).

Первым шагом к достижению того, что вы пытаетесь сделать здесь, может стать накопление времени и использование его в качестве основы, например:

this->myAccumulatedTime += timeDelta; // initialize it to zero
Другие вопросы по тегам