我正在制作老虎机游戏,我一直在解决防止多个旋转排队的问题。 spinReelsRandom()函数启动了一系列循环,在这里生成随机数。
游戏现在运行得非常好,除了在旋转期间反复击中太空按钮的玩家(老虎机玩家的常见练习)正在排队在用户完成后立即播放的旋转。我想在第一次用户按空格键开始旋转之后忽略输入,直到spinReelsRandom()函数完成。
我已经尝试过:
我可以通过在主循环中使用SDL_SetEventFilter(下面已注释掉)来获得所需的结果。我的eventFilter只是返回1.但是,出于某种原因,这会阻止SDL_Quit工作。我的猜测为tp为什么这样做是因为过滤器只返回1,而没有事件等待轮询,因为它在事件轮询循环之外,阻止用户排队旋转直到spinReelsRandom函数完成。如果有解释,以及重新启用SDL_Quit的方法,可能就是这样!
在按空格键后立即将过滤器移动到过程中似乎不起作用,我尝试跟进SDL_SetEventFilter(NULL,NULL)以在旋转完成后重置事件过滤器但是它似乎不起作用。
我也尝试过使用“isSpinning”标志,当卷轴旋转并使用启动旋转的检查时翻转为true,但是一旦旋转完成,标志一旦翻转为假,额外的轮询旋转开始。
我可以用SDL_PeepEvents做些什么吗?
这是初始化后的主循环,我的事件是“e”:
while (!quit)
{
while (SDL_PollEvent(&e) != 0)
{
// When an event is polled, this sets a filter to stop polling for more events until that action is completed.
// Note: This is what's stopping the repeated spins, however it has disabled the quit functionality.
// SDL_SetEventFilter(eventFilter, &e);
switch (e.type)
{
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
switch (e.key.keysym.sym)
{
case SDLK_SPACE:
//Function that continuously spins the reels until they reach a random destination
spinReelsRandom();
SDL_Delay(25);
break;
case SDLK_0:
cout << "This works";
break;
case SDLK_ESCAPE:
quit = true;
break;
}
}
//Final Spin Cleanup
spinCleanup();
}
}
答案 0 :(得分:1)
添加第二个条件:
while (SDL_PollEvent(&e) != 0 && quit == false)
答案 1 :(得分:0)
Keltar的解决方案仅适用于您的旋转推杆&#39; (或任何其他耗时的函数)可以分成足够快的块,以便为主事件循环留出时间来处理新事件进入的速率。
如果不是这样,您有两种选择:
1)将另一个事件循环放入阻塞函数中。在那里,您可以采用与主循环不同的方式对传入事件做出非常具体的反应。 (要么以某种方式作出反应,要么可以非常有用,如果你想完成阻塞功能,就会丢弃不需要的事件。在你的例子中:在Escape上中止函数,但是可能忽略Space?对于后者,你可以简单地丢弃所有排队的SDLK_SPACE事件。)
2)将阻塞函数放入一个单独的线程中,并使用主事件循环将信号设置到线程函数。