2017-01-03 10 views
0

대학 프로젝트에서 특정 시간대에 스프라이트의 색조를 변경하려고합니다. 목표는 5 초 동안 회색에서 오렌지색으로 변하는 것을 시뮬레이션 한 다음, 다시 5 초 동안 주황색에서 회색으로 다시 냉각시키는 것입니다 (냉각을 시뮬레이션 함).C++ DirectXTK SpriteTint 시간이 지남에 따라 변경

이 작업은 특히 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이 호출 된 이래로 이 때문에 (그것의 값이 한 프레임 시간을 초과 timeToChangeColour 것 때문에)

timeDelta < timeToChangeColour 

항상 사실로 보인다 조건을의

.

당신이

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

이 말이 : 예컨대, 시간을 축적 할 수 있습니다 여기하려고 노력하고 기초로 사용하는 것을 달성을 향한 첫 걸음! 로직을 다시 지그하여 timeDelta와는 반대로 totalSeconds를 사용하여 문제를 해결했습니다. 감사합니다. –