暂时禁用SDL事件队列?

时间:2018-03-16 21:50:48

标签: c++ sdl sdl-2

我正在制作老虎机游戏,我一直在解决防止多个旋转排队的问题。 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();

    }
}

2 个答案:

答案 0 :(得分:1)

添加第二个条件:

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

答案 1 :(得分:0)

Keltar的解决方案仅适用于您的旋转推杆&#39; (或任何其他耗时的函数)可以分成足够快的块,以便为主事件循环留出时间来处理新事件进入的速率。

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

1)将另一个事件循环放入阻塞函数中。在那里,您可以采用与主循环不同的方式对传入事件做出非常具体的反应。 (要么以某种方式作出反应,要么可以非常有用,如果你想完成阻塞功能,就会丢弃不需要的事件。在你的例子中:在Escape上中止函数,但是可能忽略Space?对于后者,你可以简单地丢弃所有排队的SDLK_SPACE事件。)

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