SDL_QUIT
事件做过简单的事件处理,现在这节课将教你如何检测按键何时被按下以及是哪个键被按下。//生成信息表面 upMessage = TTF_RenderText_Solid( font, "Up was pressed.", textColor ); downMessage = TTF_RenderText_Solid( font, "Down was pressed.", textColor ); leftMessage = TTF_RenderText_Solid( font, "Left was pressed", textColor ); rightMessage = TTF_RenderText_Solid( font, "Right was pressed", textColor );
所有初始化和加载完成后,我们生成了4个信息表面。
我可能应该在渲染文字时增加错误检测,但是...呃...让我少打点字吧
我可能应该在渲染文字时增加错误检测,但是...呃...让我少打点字吧
//如果有一个事件需要处理 if( SDL_PollEvent( &event ) ) { //If a key was pressed if( event.type == SDL_KEYDOWN ) {
现在我们想要检查是否有按键被按下,我们只需检查事件类型
SDL_KEYDOWN
。
//选择合适的信息表面 switch( event.key.keysym.sym ) { case SDLK_UP: message = upMessage; break; case SDLK_DOWN: message = downMessage; break; case SDLK_LEFT: message = leftMessage; break; case SDLK_RIGHT: message = rightMessage; break; } } //如果用户点击了窗口右上角的关闭按钮 else if( event.type == SDL_QUIT ) { //退出程序 quit = true; } }
现在,如果有一个键被按下,我们需要检查是哪个键被按下。
函数
“key”结构体中包含了一个名为keysym的结构体:
并且keysym结构体中有一个名为“sym”,类型为
如果向上箭头被按下,sym就会是
如果想要了解
另外,我们也检测用户是否点击了窗口右上角的关闭按钮,并且做了相应处理。
函数
SDL_PollEvent()
会将 SDL_KEYDOWN
事件的数据以SDL_KeyboardEvent
的类型保存在SDL_Event
事件结构体中,并命名为“key”:SDL_Key
的数据域,它记录了是哪个按键被按下。如果向上箭头被按下,sym就会是
SDLK_UP
,然后我们就让“Up was pressed”的信息显示出来。同样,如果向下箭头被按下,sym就会是SDLK_DOWN
,然后我们就让“Down was pressed”的信息显示出来,等等。如果想要了解
SDL_Key
的完整定义,你可以在SDL文档中查询。另外,我们也检测用户是否点击了窗口右上角的关闭按钮,并且做了相应处理。
注意: 有些IDE(比如Code::Blocks)会默认地开启
-Wall
信号。 在这种情况下,如果你没有为每个按键键值编写case语句,编译器就会显示警告。你可以通过在switch语句中添加default : ;
防止编译器发出警告://如果有需要显示的信息 if( message != NULL ) { //将图像应用到窗口中 apply_surface( 0, 0, background, screen ); apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen ); //将message指针置空 message = NULL; } //更新窗口 if( SDL_Flip( screen ) == -1 ) { return 1; }
当message表面没有指向任何东西时,它会是NULL,此时不会blit任何表面。当message指向某一个表面时,我们会先将background应用到窗口中,然后再将message表面应用到窗口正中央。
让一个表面居中的方法:先将窗口的宽(或高)减去表面的宽(或高),然后,由于当表面居中时,两侧的外边界是相等的,所以你要将剩余的距离除以2,这样就得到了X(或Y轴)的偏移量,于是就能够使此表面居中。
接下来,我们将message重置为空指针,然后更新窗口。
让一个表面居中的方法:先将窗口的宽(或高)减去表面的宽(或高),然后,由于当表面居中时,两侧的外边界是相等的,所以你要将剩余的距离除以2,这样就得到了X(或Y轴)的偏移量,于是就能够使此表面居中。
接下来,我们将message重置为空指针,然后更新窗口。