Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 临时禁用SDL事件队列?_C++_Sdl_Sdl 2 - Fatal编程技术网

C++ 临时禁用SDL事件队列?

C++ 临时禁用SDL事件队列?,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我正在做一个吃角子老虎机游戏,我一直在解决防止多个旋转排队的问题。spinReelsRandom()函数启动一系列循环,在这里生成随机数 这个游戏现在运行得很好,除了一个事实,即在旋转过程中反复点击空格键的玩家(老虎机玩家的常见做法)正在排队旋转,用户完成后立即播放。我想忽略用户第一次按下空格键开始旋转后开始的输入,直到spinReelsRandom()函数完成 我已经尝试过的: 通过在主循环中使用SDL_SetEventFilter(下面注释掉),我能够获得所需的结果。我的eventFilt

我正在做一个吃角子老虎机游戏,我一直在解决防止多个旋转排队的问题。spinReelsRandom()函数启动一系列循环,在这里生成随机数

这个游戏现在运行得很好,除了一个事实,即在旋转过程中反复点击空格键的玩家(老虎机玩家的常见做法)正在排队旋转,用户完成后立即播放。我想忽略用户第一次按下空格键开始旋转后开始的输入,直到spinReelsRandom()函数完成

我已经尝试过的:

  • 通过在主循环中使用SDL_SetEventFilter(下面注释掉),我能够获得所需的结果。我的eventFilter只是返回1。但是,由于某些原因,这会阻止SDL_退出工作。我猜这之所以有效,是因为过滤器只返回1,而没有等待轮询的事件,因为它在事件轮询循环之外,防止用户在spinReelsRandom函数完成之前排队等待自旋。如果有一个解释,以及重新启用SDL_退出的方法,这可能就是它

  • 在按下空格键后立即将过滤器移动到过程中似乎不起作用,我尝试使用SDL_SetEventFilter(NULL,NULL)在旋转完成后重置事件过滤器,但它似乎不起作用

  • 我还尝试过使用“IsSpining”标志,该标志在卷轴旋转时翻转为true,并使用启动旋转的检查,但一旦旋转完成后该标志翻转回false,则会开始额外的轮询旋转

我可以用SDL_PeepEvents做些什么吗

这是初始化后的主循环,我的事件是“e”:

while(!退出)
{
while(SDL_PollEvent(&e)!=0)
{           
//轮询事件时,这将设置一个过滤器,以停止轮询更多事件,直到该操作完成。
//注意:这是停止重复旋转的原因,但是它禁用了退出功能。
//SDL_设置事件过滤器(事件过滤器和e);
开关(e型)
{
案例SDL_退出:
退出=真;
打破
案例SDL_按键关闭:
开关(e.key.keysym.sym)
{
案例SDLK_空间:
//连续旋转卷轴直到到达随机目的地的功能
spinReelsRandom();
SDL_延迟(25);
打破
案例SDLK_0:

不能添加第二个条件:

while (SDL_PollEvent(&e) != 0 && quit == false)

Keltar的解决方案只有在“旋转卷轴”(或任何其他耗时的函数)可以分为足够快的块,以便为主事件循环留出时间来处理新事件进入的速率时才起作用

如果不是这样,您有两种选择:

1) 在阻塞函数中放入另一个事件循环。在那里,您可以以与主循环不同的方式对传入事件做出非常明确的反应。(如果希望阻塞函数完成,可以以某种方式作出反应,或者丢弃不需要的事件,这可能非常有用。在您的示例中:退出时中止函数,但可能忽略空格?对于后者,您可以简单地丢弃所有排队的SDLK_空格事件。)


2) 将阻塞函数放入一个单独的线程中,并使用主事件循环为线程函数设置信号。

事件循环不应执行任何模拟,尤其是不执行SDL_延迟等类似操作。模拟操作(如旋转)通常需要多个帧才能完成,此时不应停止其他操作-如果您的操作是在长阻塞函数中实现的,则很难执行此操作。在每个帧(或每个模拟帧)上设置操作已启动的标志执行增量步骤,之后过滤掉启动已经运行的操作的请求就变得很简单了。正如现在所写的,我想你甚至不能在旋转时退出?感谢你的建议,你已经帮了不少忙!在我的问题上下文中重新表述你的建议,而不是在eve中在单独的循环中更新卷轴nt循环,该程序现在是一个大循环,用于轮询事件,检查旋转标志,如果标志打开,则增加每个靠近目标的卷轴,然后在其位置渲染卷轴。玩家现在也可以在卷轴旋转时退出!我与一些有经验的程序员交谈,他们提到l中的循环OOP总是坏消息!这确实是根本问题。谢谢你的建议,但这并没有解决问题,我已经在循环中轮询了一个退出事件。Keltar的建议确实解决了问题!这太好了。不过从现在开始,为了避免浪费,我不会回答一个我确信“不确定”的问题.错误的猜测只会把阅读者弄糊涂,没有用
while (SDL_PollEvent(&e) != 0 && quit == false)