免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1303 | 回复: 0
打印 上一主题 下一主题

SDL系列教程(六):键盘事件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-26 11:12 |只看该作者 |倒序浏览

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
  )游戏开发栏目,我将详细地为你解答。

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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19671/showart_118365.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP