SDL入门教程(十一):3、做一个对话框

作者:龙飞

        有了按钮类,我们制作对话框就很轻松了。边写程序边说明吧。

bool  hand_dialog( const  ScreenSurface &  screen,  const  std:: string &  dialog_text,  int  size)
{
    
const   int  CENTRE_X  =  (screen.point() -> w)  /   2 ;
    
const   int  CENTRE_Y  =  (screen.point() -> h)  /   2 ;
    
const   int  HALF_SUB_BUTTON_W  =   64   /   2 ;

先找出显示屏的中心点,然后是对话框按钮宽度的一半。这些是为了在屏幕中心的对称位置显示YES和NO

    PictureSurface quitBG( " ./images/dialog_bg.png " , screen);
    quitBG.blit();

载入对话框的背景

    TextSurface quitDlg(dialog_text, screen,  215 195 122 , size);
    
int  quitDlg_x  =  CENTRE_X  -  ((quitDlg.point() -> w) / 2 );
    
int  quitDlg_y  =  CENTRE_Y  -   50 ;
    quitDlg.blit(quitDlg_x, quitDlg_y);

载入对话框的提示文字

     const   int  YES_X  =  CENTRE_X  -   40   -  HALF_SUB_BUTTON_W;
    
const   int  YES_Y  =  CENTRE_Y  +   30 ;
    Button yesButtonEffect(
" ./images/h3_yes_off.png " " ./images/h3_yes_over.png " , screen);
    yesButtonEffect.setup(YES_X, YES_Y, 
5 );
    yesButtonEffect.blitOut();

构建YES按钮

     const   int  NO_X  =  CENTRE_X  +   40   -  HALF_SUB_BUTTON_W;
    
const   int  NO_Y  =  CENTRE_Y  +   30 ;
    Button noButtonEffect(
" ./images/h3_no_off.png " " ./images/h3_no_over.png " , screen);
    noButtonEffect.setup(NO_X, NO_Y, 
5 );
    noButtonEffect.blitOut();

构建NO按钮

    screen.flip();

显示屏幕

    SDL_Event gameEvent;
    
while true  ){
        
while  ( SDL_PollEvent( & gameEvent)  !=   0  ){
            
if  ( gameEvent.type  ==  SDL_KEYDOWN ){
                
if  ( gameEvent.key.keysym.sym  ==  SDLK_ESCAPE ){
                    
return   false ;
                }
            }
            quitBG.blit();
            quitDlg.blit(quitDlg_x, quitDlg_y);
            
if  ( yesButtonEffect.effectiveClick(gameEvent)  ==   true  )
                
return   true ;
            
if  ( noButtonEffect.effectiveClick(gameEvent)  ==   true  )
                
return   false ;
            screen.flip();
        }
    }
}

主循环了。可以通过按下ESC或者按下NO按钮取消对话框,按下YES按钮则表示做出了选择。我们使用effectiveClick()方法,一次性的将接收事件,判断事件,显示按钮的不同状态集成性的完成了。

 

此文章来自于【http://blog.csdn.net/lf426/article/details/2657231

SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。这些多媒体功能包括了音频、键盘和鼠标(事件)、游戏摇杆等。当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口,以及为OpenGL与各种操作系统之间提供了统一的标准接口以实现3D图形。从这些属性我们可以看出,SDL基本上可以认为是为以电脑游戏为核心开发的多媒体库。 SDL支持主流的操作系统,包括Windows和Linux。在官方的介绍中,我们可以找到它所支持的其他平台。(SDL supports Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. )。SDL本身从C语言开发,并且能很好的在C++等高级语言中使用。在官方可以看到SDL所支持的语言很多。(Including Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, and Tcl. ) SDL在GNU LGPL version 2下发布,这意味着你可以免费的使用。并且可以免费的用于商业软件的制作(只要你直接使用SDL的动态链接库,Windows下的SDL.dll)。如果你将SDL库编译进了自己的二进制代码中,你需要指明你所使用的SDL库的版本以及包括你自己修改的源代码,并说明这些代码的原始出处。这是很宽松的法律,你可以用如此强大的多媒体库完全合法的免费开发商业游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值