C++ C中没有来自SDL轮询事件的响应
我正在尝试学习C语言中的SDL。我在网上找到的教程是。我在VMware中运行Ubuntu 我从教程网站下载了示例代码(.cpp文件)。C++文件工作得很好。但是,如果我用一个比特修改来改变C++到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() )
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_事件才能工作。从我的角度看,语法正确,因此:
默认的
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());
}