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 )游戏开发栏目,我将详细地为你解答。
在下一节中,我们将根据前面所学的内容做一个简单的游戏――推箱子。 |