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()的更好方法吗?或者甚至可能有其他解决方案
肛
答案 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
。