lock&_lock Ответов: 1

Как изменить последовательность с помощью функции mod в C ?


Я делаю проект, чтобы показать 2 фотографии одну за другой на дисплее с частотой обновления 60 Гц. Я хочу показать последовательность медленного перехода (1 рис.каждую секунду. Sec 1 = pic1, sec 2= pic2), а затем медленно переключитесь на более быстрый переход (60x в секунду = 60 кадров в секунду) с помощью клавиши.

Я попытался использовать модуль (mod), но, похоже, я все еще немного запутался в том, как он работает.

Что я уже пробовал:

Я попытался изменить последовательность 60 раз в секунду (60 кадров в секунду). Вот что я делаю :
if(p++ % 2 < 1) argDrawImage(image1);
    else        argDrawImage(image2);
Этот работает, и в этом коде картинка меняется 60 раз в секунду.

Я также делаю keyEvent, чтобы изменить значение модуляции, чтобы получить переход, но, как я уже сказал, я все еще немного запутан в этой функции mod.
if (key == '1' ) {
    mod += 1;
    if (mod > 100) mod = 100;
}

if (key == '2' ) {
    mod -= 1;
    if (mod < 0) mod = 0;
}

1 Ответов

Рейтинг:
1

Rick York

Оператор модуля возвращает остаток операции деления. Если делитель равен 2, то возможные результаты будут равны 0 и 1. Распространенной тактикой является использование массива (или вектора) делителя по размеру. В этом случае их будет двое. Затем результат модуля может быть использован для прямого индексирования в массив. Это очень, очень просто и трудно испортить. Вот реализация кода, который передает массив, его размер и индекс, а функция вычисляет, какое изображение рисовать.

size_t DrawImageMod( Images * images[], size_t imgcount, size_t index )
{
    size_t modvalue = index % imgcount;
    argDrawImage( images[modvalue] );
    return modvalue;
}

void DrawLoop()
{
    // create an array of images

    const size_t count = 2;
    Images * images[count] = { 0 };
    images[0] = CreateImage(...);    // returns a pointer to an Image
    images[1] = CreateImage(...);    // returns a pointer to an Image

    size_t index = 0;
    while( ContinueDrawing() )       // loop until this returns false
    {
        index = DrawImageMod( images, count, index );
        ++index;
    }

    // clean up the images

    DeleteImage( images[1] );
    DeleteImage( images[0] );
}


lock&amp;_lock

Я нашел другой способ, вычитая прошедшее время и время, когда я ударил по клавише. Затем сравните результат с задержкой. Спасибо снова.