金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 桌面设备 >> 文章详情
SDL系列教程(六):键盘事件

akinggw 金桥信息 2006-05-22

SDL系列教程(六):键盘事件

作者:akinggw

在上一篇中,我们讲解了如何用SDL显示漂亮的图片。在这一节中,我们将学习如何通过键盘移动图片。

下面,我们先来看一下这段代码,这段代码来自上面的教程:

 

done = 0;

while (!done)

    {

        SDL_Event event;

        /* 检测事件*/

        while (SDL_PollEvent (&event))

        {

            switch (event.type)

            {

            case SDL_KEYDOWN:

                break;

            case SDL_QUIT:

                done = 1;

                break;

            default:

                break;

            }

        }

/*在屏幕上画图*/  

    apply_surface(x,y,demo,screen);

//更新屏幕

    if( SDL_Flip( screen ) == -1 )

    {

        return 1;   

    }

   }

 

这段代码说明什么呢?首先,我们让done=0,然后进入循环.done=0循环,done=1退出。然后设置一个SDL_Event事件event,用于侦听窗口事件,如果事件为SDL_KEYDOWN,什么事也不做,而当我们的事件为SDL_QUIT时,设置done1,然后退出。

如果没有窗口事件,那么就在屏幕上画图,然后更新屏幕,如果done不为1,继续检测。

现在,我们要在游戏循环中加入键盘事件。

 

我们要如何加呢?

 

在窗口事件之后,画图函数之前加入下列代码:

 

Uint8 *keystates = SDL_GetKeyState( NULL );

   

        //如果向上键被按下

        if( keystates[ SDLK_UP ] )

        {

          y+=1;    //坐标Y轴加1

        }

   

        //如果向下键被按下

        if( keystates[ SDLK_DOWN ] )

        {

          y-=1;           //坐标Y轴减1

 

        }

   

        //如果向左键被按下

        if( keystates[ SDLK_LEFT ] )

        {

          x-=1;          //坐标X轴减1

 

        }

   

        //如果向右键被按下

        if( keystates[ SDLK_RIGHT ] )

        {

          x+=1;         //坐标X轴加1

 

        }

SDL_GetKeyState函数用于得到按键信息,然后保存在keystates数组中。Keystates数组是一个专门用于保存按键状态的数组。然后用SDLK_UPSDLK_LEFTSDLK_RIGHT来表示上,左,和右等键的状态。还有其它的按键表示,祥见下图:

 

在上面的代码中,我们是这样定义的,如果按向上键,Y坐标减1,相反加1;按向左键,X坐标减1,相反加1

这时,我们就能控制图象的移动了,看下面的截图:

 

 

细心的你也许发现,我们拖动图象的时候,在它的后面留下了轨迹。显然,这是不行的。

 

为什么有这种现象呢?

 

那是因为SDL画好图象之后,并不会去清空屏幕,它只是更新图象,所以才留下了这些轨迹。

 

要如何消除这些轨迹呢?

 

我的想法是这样,在显示一幅图象之前,先用一幅图象去覆盖那些因我们拖动而留下的轨迹,然后再来显示它。

 

利用这个办法,首先,我们需要再定义一张图象,并且这张图象最好和屏幕一样大。

 

先定义一张图象:

 

SDL_Surface *background=NULL;

 

然后导入它:

 

background=load_image("background.png");

 

最后在显示我们需要的图象前显示它:

 

apply_surface(0,0,background,screen);

 

 /*在屏幕上画图*/  

apply_surface(x,y,demo,screen);

 

 

测试的结果如下,我们发现轨迹消失了:

 

 

关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如果你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。 如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。

 

在下一节中,我们将根据前面所学的内容做一个简单的游戏――推箱子。


  发表评论 写信给编辑 关闭窗口
同栏目内容
· 两款可与Ipod连接的创意扬声器 2007-11-05
· 骰子大小的iPod便携音箱 2007-10-29
· 三款微软08年新鼠标实物图 2007-10-11
· Razer巨蝮蛇鼠标国内售价599 2007-10-11
· 惠威M1独家豪华玉石版书架箱 2007-10-11
· 数字印刷的特点及其应用 2007-09-24
相关内容
近期主推
科学家绘制“大脑彩虹图”
·科学家绘制“大脑彩虹图”
·农民造出潜水艇成功潜行10秒
·新一轮的“探月热”正在兴趣
·全球掀寻找“梅森素数”浪潮
·科学家发现黑洞约为太阳15倍
·美4000万美元造空中移动城堡
近期热门
第一只懂人话黑猩猩去世
·第一只懂人话黑猩猩去世
·NASA隐瞒在月球发现古文明事实
·发现蒙娜丽莎本来有眉毛和睫毛
·阿根廷出土巨型恐龙骨架化石
·探测:土卫八“阴阳脸”阳光作祟
·华人夺搞笑诺贝尔奖经济学奖
近期焦点
工地挖出清代浓郁香味女干尸
·工地挖出清代浓郁香味女干尸
·美洲发现可在树上生活的鱼
·菲律宾附近海域发现新物种
·“无脸人”的假鼻假唇可装可拆卸
·美国发现极其罕见的白化银鲛(图)
·美国展出罕见连体双胎双头龟
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号