C++ C中没有来自SDL轮询事件的响应

C++ C中没有来自SDL轮询事件的响应,c++,c,sdl,C++,C,Sdl,我正在尝试学习C语言中的SDL。我在网上找到的教程是。我在VMware中运行Ubuntu 我从教程网站下载了示例代码(.cpp文件)。C++文件工作得很好。但是,如果我用一个比特修改来改变C++到C文件,程序就不能再检测到任何事件。(这是一个需要用C语言编程的学校项目) 主要功能包括SDL_事件的初始化: int main( int argc, char* args[] ) { //Start up SDL and create window if( !init() )

我正在尝试学习C语言中的SDL。我在网上找到的教程是。我在VMware中运行Ubuntu

我从教程网站下载了示例代码(.cpp文件)。C++文件工作得很好。但是,如果我用一个比特修改来改变C++到C文件,程序就不能再检测到任何事件。(这是一个需要用C语言编程的学校项目)

主要功能包括SDL_事件的初始化:

int main( int argc, char* args[] )
{
    //Start up SDL and create window
    if( !init() )
    {
        printf( "Failed to initialize!\n" );
    }
    else
    {
        //Load media
        if( !loadMedia() )
        {
            printf( "Failed to load media!\n" );
        }
        else
        {           
            //Main loop flag
            bool quit = false;

            //Event handler
            SDL_Event e;

            //While application is running

            //This is the loop that the program got stuck on:
            while( !quit )
            {
                //Handle events on queue
                while( SDL_PollEvent( &e ) )
                {
                    //The program never comes here
                    //User requests quit
                    if( e.type == SDL_QUIT )
                    {
                        quit = true;
                    }
                }

                //Apply the image
                SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );

                //Update the surface
                SDL_UpdateWindowSurface( gWindow );
            }
        }
    }
    //Free resources and close SDL
    close();

    return 0;
}
程序应该寻找关闭窗口的用户输入。SDL_PollEvent始终为0,尽管我确实单击了窗口中的“X”。在第一次点击后,程序不再响应。在我终止程序之前,CPU的使用率相当高。 这不仅发生在关闭窗口时,任何需要SDL_PollEvent的操作都将导致程序无响应

我用来编译的命令是:

gcc -o test test.c `sdl2-config --cflags --libs`

因为C++工作得很好,我想知道我是否错过了C的任何更改,使SDLXPoLvEnter不起作用?或者我用来编译的命令行不正确?我在谷歌上搜索了几个小时,但仍然找不到答案。如果有人能救我,我将不胜感激。谢谢大家!

您的问题很可能在于您通过
while(quit==false)
while(SDL\u PollEvent(&e)==true)
检查布尔条件。这不能正常工作,因为您需要与单个值进行比较,而实际需要的是测试0/非0

喜欢写一些东西,比如:

while ( SDL_PollEvent( &e ) )
{
   ...
}

这个错误的检查可能是破坏代码的原因


true
false
应仅用于布尔变量的初始化,而不用于检查。

首先,您使用的是真正过时的SDL版本。SDL2.0并没有真正使用SDL_曲面;它使用SDL_纹理。SDL2比1.2快了几英里,所以开始使用它吧

这里的关键是,当您执行
printf
语句时,实际上要进行额外的SDL_PollEvent调用。如果你简单地移除它,你可能会解决你的问题

如果您轮询某个事件,而该事件恰好是退出事件,当然,当您第一次收到它时,它不会得到处理。这是因为SDL可能会在第一个
SDL\u PollEvent
调用中接收它,而不是在第二个调用中,依此类推。删除printf语句;如果你真的需要它,把它放在第二个while循环中

下面是SDL2的一些示例代码(其中一小部分是用C++编写的):


请注意,您也应该在SDL2中使用SDL_渲染器。这里有一个相关链接:

我也遇到了这个问题。解决方案是将
exit()
函数重命名为另一个名称。例如:
exitWin()
。也许我们用我们的阻止了另一个功能。我希望它能起作用。

您的代码示例没有显示SDL_Init()代码部分。请仔细检查它是否正确运行,是否设置了所有必需的标志。有关可能的标志,请参阅。请注意,如果您修改了它并删除了SDL_INIT_VIDEO标志,因为您不想要视频,那么事件系统需要SDL_INIT_事件才能工作。

从我的角度看,语法正确,因此:

  • 检查代码中的具体错误位置(在不同的位置使用printf()),以确保您知道问题不是其他问题
  • 仔细检查init()函数,确保设置正确
  • 如果这没有帮助,那么尝试创建一个单独的程序,只进行事件检查。如果这样做行得通,那么将其他部分添加到它,直到它停止工作,您可能会发现问题所在

  • 默认的
    bool
    定义有什么问题?这看起来很奇怪,并且打破了良好编码的一半原则。我们可以得到您的初始化代码吗?包括定义SDLX事件的位置,以及更改C的位置是什么?@ NoNeNo.BooL是用C++定义的,而不是C中定义的。我想在C中编译程序,所以我在这里手动定义了它。而且,编写诸如<代码>(Cux= = false)< />代码通常是个坏主意:更喜欢写<代码>((!)退出)< /C>。对于“==true”也一样,只是省略它。非常感谢您的提醒。我更改了代码,但不幸的是,这并没有解决问题。您是否用最新的代码更新了问题?这个答案确实有道理,因为
    SDL_polleevent
    返回的代码可能不仅仅是0或1。@user2411151您是否重新测试了更新后的代码?
    SDL\u PollEvent
    是否始终返回0?@MicroVirus是的,我这样做了,SDL\u PollEvent仍然返回0=(感谢您的回复。我同意删除“printf”语句,但问题甚至在我添加那一行之前就出现了。我添加它是因为我想看看SDL_PullerEvent的输出是什么,尽管这个方法一点都不好。我删除了“printf”语句,但看起来这不是问题的原因。如果我在C++中编译代码,事件包括按键、鼠标移动、退出窗口都可以被检测到。@ USER 2411151你确定你下载了SDL的正确版本吗?你使用的是MinGW的正确版本吗?
    while (!quit)
    {
       ...
    }
    
    while(!done) {
        while(SDL_PollEvent(&e)) {
          if(e.type == SDL_QUIT) {
            done = true;
          }
    
          const Uint8* keystates = SDL_GetKeyboardState(NULL);
          if (keystates[SDL_SCANCODE_UP]) {
            speedy -= 2;
          } else if (keystates[SDL_SCANCODE_DOWN]) {
            speedy += 2;
          } else if (keystates[SDL_SCANCODE_LEFT]) {
            speedx -= 2;
          } else if (keystates[SDL_SCANCODE_RIGHT]) {
            speedx += 2;
          }
        }
        SDL_RenderClear(base_system.get_renderer());
        SDL_RenderCopy(base_system.get_renderer(), tp.get("bg.png"), nullptr, nullptr);
        SDL_RenderCopy(base_system.get_renderer(), tp.get("square.png"), nullptr, &rekt);
        SDL_RenderPresent(base_system.get_renderer());
    }