SDL资料(六):键盘事件

 

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时,设置done为1,然后退出。

如果没有窗口事件,那么就在屏幕上画图,然后更新屏幕,如果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_UP,SDLK_LEFT,SDLK_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  )游戏开发栏目,我将详细地为你解答。

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值