SDL编程入门(3)事件驱动编程

向右看齐 2022-12-08 05:30 439阅读 0赞

事件驱动编程

除了在屏幕上放置图像外,游戏还要求您处理用户的输入。你可以通过SDL使用事件处理系统来实现这一点。

  1. //主循环标志
  2. bool quit = false;
  3. //事件处理程序
  4. SDL_Event e;

在我们的代码中,在SDL被初始化并加载媒体后(如前面教程中提到的),我们声明一个退出标志,以跟踪用户是否已经退出。由于此时我们刚刚启动应用程序,所以很明显它被初始化为false。

我们还声明一个SDL_Event union。一个SDL事件就是一些类似于按键按下、鼠标移动、操纵杆按钮按下等。在这个应用程序中,我们要寻找退出事件来结束应用程序。

  1. //当应用程序运行时
  2. while( !quit ){
  3. //处理队列中的事件
  4. while( SDL_PollEvent( &e ) != 0 ){
  5. //用户请求退出
  6. if( e.type == SDL_QUIT )
  7. {
  8. quit = true;
  9. }
  10. }
  11. //应用图片
  12. SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
  13. //更新表面
  14. SDL_UpdateWindowSurface( gWindow );
  15. }

在之前的教程中,我们让程序等待几秒钟再关闭。在这个程序中,我们要让程序等待到用户退出后再关闭。

所以我们要让应用程序在用户还没有退出的时候进行循环。这个在应用程序活动时一直运行的循环称为主循环,有时也称为游戏循环。它是任何游戏应用的核心。

在主循环的顶部,我们有我们的事件循环。它的作用是不断处理事件队列,直到它清空。

当你按下一个键、移动鼠标或触摸屏幕时,你就会把事件放到事件队列中。
2faaa9c239b9ca29d2eecdaab4fd28e0.png

事件队列将按照事件发生的顺序存储它们,等待你处理它们。当你想知道发生了什么事件以便处理它们时,你可以通过调用SDL_PollEvent对事件队列进行轮询以获得最近的事件。

SDL_PollEvent所做的工作是从事件队列中获取最近的事件,并将事件中的数据放入我们传递到函数中的SDL_Event中。

9433cddfdc581bb48db7fcff24386905.png

SDL_PollEvent会一直从队列中抽取事件,直到队列清空。当队列为空时,SDL_PollEvent将返回0。因此,这段代码所做的就是不断地从事件队列中轮询事件,直到它为空。如果事件队列中的一个事件是SDL_QUIT事件(就是当用户从窗口中点击X按钮时的事件),我们将退出标志设置为true,这样我们就可以退出应用程序。

在我们处理完框架的事件后,我们绘制到屏幕上并更新它(如前面的教程中所讨论的)。如果quit标志被设置为true,应用程序将在循环结束时退出。如果它仍然是false,它将继续进行,直到用户点击X离开窗口。

在 这里下载本教程的媒体和源代码。

原文链接

关注我的公众号:编程之路从0到1
编程之路从0到1

发表评论

表情:
评论列表 (有 0 条评论,439人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SDL编程入门(30)滚动

    滚动 到目前为止,我们只涉及屏幕大小的平面。有了滚动功能,你可以通过渲染与摄影机相关的所有内容来浏览任何大小的平面。 滚动的基本原理是,你有一个矩形,它的功能是一个摄像

    相关 SDL编程入门(26)运动

    运动 现在我们知道了如何渲染、处理输入和处理时间,我们现在知道了我们需要在屏幕上移动东西的一切。在这里,我们将做一个基本的程序与一个点移动。 //The dot

    相关 SDL编程入门(1)Hello SDL

    Hello SDL 你的第一个图形窗口 所以你学会了C++的基础知识,但你厌倦了制作基于文本的小程序。为了使用诸如图形、声音、键盘、操纵杆等东西,你需要一个API(应用程