Цветовая анимация - PullRequest
       3

Цветовая анимация

0 голосов
/ 13 октября 2019

Мне нужен способ циклически проходить через белый и черный цвета, как анимация в c

, вот что я использовал раньше

static void ChangeWordColor()
{
    if (color_cycle == 11)
    {
        color_cycle = 0;
    }
    switch (color_cycle)
    {
    case 0:
        updatecolor(0xFFFFFF);
        b4color = 0xFFFFFF;
        break;
    case 1:
        updatecolor(0xDCDCDC);
        break;
    case 2:
        updatecolor(0xD3D3D3);
        break;
    case 3:
        updatecolor(0xC0C0C0);
        break;
    case 4:
        updatecolor(0xA9A9A9);
        break;
    case 5:
        updatecolor(0x808080);
        break;
    case 6:
        updatecolor(0x696969);
        break;
    case 7:
        updatecolor(0x808080);
        break;
    case 8:
        updatecolor(0xA9A9A9);
        break;
    case 9:
        updatecolor(0xC0C0C0);
        break;
    case 10:
        updatecolor(0xD3D3D3);
        break;
    case 11:
        updatecolor(0xDCDCDC);
        break;
    }

    color_cycle++;
}

void FT_print_text_animate(uint dst_x, uint dst_y, int per, const char text)
{
    if (frame % per == 0)
    {
        //every while(1) loop is "per" so every 2 loop cycles it changes color
        ChangeWordColor();
    }

    FT_loop_text(dst_x, dst_y, text, 2);
}

Мне нужен способ анимировать это, возможно, с использованием дельтывремя или лучший метод, возможно, сдвиг битов для цвета, также этот код использует ARGB и updatecolor ();изменяет цвет пикселя FT.

Мне также нужно любое решение для работы в цикле.

1 Ответ

0 голосов
/ 13 октября 2019

Возможно, лучше сделать так, чтобы обновление цвета (или уровня серого в этом случае) отвечало за его собственную синхронизацию. Далее необходимо вызывать функцию 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 массив - все остальное само улаживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...