获取事件时SDL_Delay()(有点不高兴)

时间:2015-11-09 18:00:22

标签: c++ sdl

C ++,SDL 2

我正在制作迪斯科模拟器,它只是循环播放图片并播放音乐。

(癫痫警告)http://imgur.com/9ePOIAw

基本上我想运行这段代码

while (isPartying){
        currentImage = image1;
        SDL_BlitSurface(currentImage, NULL, windowSurface, NULL);
        SDL_Delay(25);
        SDL_UpdateWindowSurface(window);

        currentImage = image2;
        SDL_BlitSurface(currentImage, NULL, windowSurface, NULL);
        SDL_UpdateWindowSurface(window);
        SDL_Delay(25);

        currentImage = image3;
        SDL_BlitSurface(currentImage, NULL, windowSurface, NULL);
        SDL_UpdateWindowSurface(window);
        SDL_Delay(25);

        //image 3, 4, 5 and so on

}

一直在举办活动。

while (SDL_PollEvent(&ev) != 0){
        if (ev.type == SDL_QUIT){
            isPartying = false;
        }
    }

我想让它在isPartying循环中间获取事件。现在它只检查开头的事件(或结束,当然取决于我放置事件循环的位置)。任何人都知道等待下一张图片然后SDL_Delay()的更好方法吗?或者甚至可能有其他解决方案

1 个答案:

答案 0 :(得分:1)

基本上,您要做的是一次实现两件事。 您有两种选择:

  • 使用SDL_Thread,但我倾向于在可能的情况下不使用线程(因为您可能需要处理信号量或互斥量)
  • 使用SDL_TimerCallback(有人会说太多的计时器会破坏代码的流程,但这就是我们要用的东西)

以下是代码示例(注意:您必须将SDL_INIT_TIMER传递给SDL_Init())。

void IsPartying()    {
    SDL_Event ev;
    while (SDL_PollEvent(&ev)){
        if (ev.type == SDL_QUIT){
            return false;
        }
    }
    return true
}

uint32_t ChangeImage(uint32_t interval, void* param)    {
    int *imageNb = param;
    (*imageNb)++
    return interval
}

void Processing() {
    // Store your images in SDL_Surface **imageArray
    int imageNb = 0;
    SDL_TimerID t = SDL_AddTimer(25, ChangeImage, &imageNb);

    while (IsPartying())    {
        SDL_BlitSurface(imageArray[imageNb], NULL, windowSurface, NULL);
        SDL_UpdateWindowSurface(window);
        SDL_Delay(1); // Release proc charge
    }
    SDL_RemoveTimer(SDL_TimerID);
}

当然,您仍然需要检查是否迭代了所有图像,否则在尝试访问阵列的未分配单元格时,您会得到一个很好的segfault