Анимация спрайтов со случайной частотой

У меня есть программа, которая отображает 5 взрывов в строке одновременно. Я хотел бы знать, как заставить каждый взрыв анимироваться с разной скоростью. Вот код, который на самом деле анимирует спрайты:

//=========================================================================
//
// Helper functions
//
//========================================================================
void Sprite_Draw_Frame(LPDIRECT3DTEXTURE9 texture, int destx, int desty, int framenum, int framew, int frameh, int columns)
{
    D3DXVECTOR3 position( (float)destx, (float)desty, 0);
    D3DCOLOR white = D3DCOLOR_XRGB(255, 255, 255);`

    RECT rect;
    rect.left = (framenum % columns) * framew;
    rect.top = (framenum / columns) * frameh;
    rect.right = rect.left + framew;
    rect.bottom = rect.top + frameh;

    spriteobj->Draw(texture, &rect, NULL, &position, white);
}

void Sprite_Animate(int &frame, int startframe, int endframe, int direction, int &starttime, int delay)
{
    if((int)GetTickCount() > starttime + delay)
    {
        starttime = GetTickCount();

        frame += direction;
        if(frame > endframe) frame = startframe;
        if(frame < startframe) frame = endframe;
    }
}

//============================================================================
//
// Function calls
//
//==============================================================================

Пытался использовать случайные числа для переменной задержки в Sprite_Animate, чтобы кадры задерживались с разной скоростью. Однако взрывы продолжали анимироваться синхронно.

Функция Sprite_Animate просто обновляет глобальные переменные frame и starttime, чтобы продолжить отрисовку каждого нового кадра с помощью функции Sprite_Draw_Frame.

    //animate and draw the sprite
    for(int i = 0; i < 5; i++)
    {
        Sprite_Animate(frame, 0, 29, 1, starttime, rand() %100);
        Sprite_Draw_Frame(explosion, (i * 100), 100, frame, 128, 128, 6);
    }

Для этого есть простое решение, и если кому-то нужен полный код, я могу отправить его вам по запросу.


person WhoruTzu    schedule 01.10.2013    source источник


Ответы (1)


ТАК я понял это. Причина, по которой все они были синхронизированы даже со случайными значениями delay, заключается в том, что все они использовали одни и те же глобальные переменные frame и starttime.

Поэтому вместо этого создайте структуру EXPLOSION с переменными-членами frame и starttime, а затем используйте вектор, чтобы содержать их все. После этого его просто нужно было повторить.

Новый код здесь на случай, если кто-то еще столкнется с этой проблемой.

//The structue to contain each explosions own frame and starttime variables
struct EXPLOSION
{
    int frame;
    int starttime;
};


//============================================================================
//
// Function calls
//
//==============================================================================

//animate and draw the sprite
    for(int i = 0; i < 5; i++)
    {
        Sprite_Animate(explosions[i].frame, 0, 29, 1, explosions[i].starttime, rand() % 100);
        Sprite_Draw_Frame(explosion, i * 100, 100, explosions[i].frame, 128, 128, 6);
    }
person WhoruTzu    schedule 02.10.2013