Возможно, лучше сделать так, чтобы обновление цвета (или уровня серого в этом случае) отвечало за его собственную синхронизацию. Далее необходимо вызывать функцию FT_print_text_animate()
только с интервалом, несколько более быстрым, чем требуемый интервал обновления - он обрабатывает собственное время и меняет цвет только тогда, когда это необходимо:
#include <time.h>
#include <stdint.h>
#define GREY_LEVEL_CHANGE_PERIOD (CLOCKS_PER_SEC / 5) // Change five time per second (for example)
static void UpdateTextGreyLevel()
{
// Levels to cycle back-and forth through
static const uint32_t grey_levels[] = { 0xFF,0xDC,0xD3,0xC0,0xA9,0x80,0x69 } ;
// Current grey index and direction through cycle
static int cycle_index = 0 ;
static int direction = -1 ;
// Set current grey level
uint32_t grey_level = grey_levels[cycle_index] ;
updatecolor( grey_level << 16 | grey_level << 8 | grey_level );
// If it is time to change grey level....
static clock_t last_change = 0 ;
clock_t now = clock() ;
if( now - last_change > GREY_LEVEL_CHANGE_PERIOD )
{
// Start new interval
last_change = now ;
// Change direction at either end of the cycle
if( cycle_index == sizeof(grey_levels) - 1 || cycle_index == 0 )
{
direction = -direction ;
}
// Increment/decrement cycle index
cycle_index += direction ;
}
}
void FT_print_text_animate( uint dst_x, uint dst_y, const char text )
{
UpdateTextGreyLevel() ;
FT_loop_text( dst_x, dst_y, text, 2 ) ;
}
Например, у вас может быть основной цикл:
for(;;)
{
FT_print_text_animate(0, 0, "Hello!" ) ;
}
И уровень серого будет меняться с интервалами 200 мс (в этом примере) независимо от этого. Если вы также «перемещаете» текст, то при определении позиции может использоваться аналогичная независимая от тарифа синхронизация для обновления позиции.
По сути, вы вызываете функцию так же быстро, как и вы. в состоянии, и пусть функция определяет, пора ли что-нибудь обновить. Таким образом, все ваши тайминги могут быть полностью независимы друг от друга и не зависеть от какого-либо интервала обновления цикла.
Чтобы изменить число и значения уровней серого, необходимо только изменить grey_levels
массив - все остальное само улаживается.