2017-01-03 3 views
0

Donc, pour un projet universitaire, je cherche à changer la teinte d'un sprite sur une période donnée. L'objectif est de faire passer un ensemble de roches du gris à l'orange (en les simulant en les chauffant) pendant 5 secondes, puis de les faire passer de l'orange au gris (en les simulant en les refroidissant) au cours des 5 secondes suivantes. Ceci est fait en utilisant le DirectXTK, SpriteBatch en particulier, mais je semble avoir quelques problèmes pour contrôler la logique de chauffage et de refroidissement. Actuellement, les roches chauffent jusqu'à l'orange, mais ne refroidissent pas.C++ DirectXTK Modification de SpriteTint au fil du temps

La fonction de mise à jour pour les roches, ainsi qu'une autre fonction HeatDelay que j'utilise pour contrôler le refroidissement sont incluses ci-dessous.

timeToChangeColour est initialisée à 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; 
} 

Toute aide est grandement appréciée!

Répondre

1

Le plus gros problème conceptuel avec votre code est que dans la fonction

void RockFade::Update(float timeDelta); 

Vous semblez supposer que timeDelta sera une différence de temps depuis un temps fixe déterminé dans le passé, mais il est en fait la différence de temps depuis la dernière fois que Update a été appelée.

En raison de cette condition

timeDelta < timeToChangeColour 

semblent être toujours vrai (car il semble la valeur de » timeToChangeColour est supérieure à un temps de trame).

La première étape vers la réalisation de ce que vous essayez de faire ici pourrait être d'accumuler le temps et l'utiliser comme base, par exemple .:

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

Cela est logique! J'ai résolu le problème en re-jigging la logique, et en utilisant totalSeconds par opposition à timeDelta pour évaluer le temps passé! Merci! –