一键响应特定功能

技术与开发

上期我们讲解了五子棋游戏界面的开发,本期我们将讲解如何为程序添加按键响应。对于一款手机程序而言,按键响应必不可少,否则用户将无法与程序进行必要的交互。程序按键键位设置是否合理、是否舒适、是否能最大程度体现游戏的可操作性其实也是一门学问。此外,我们还可以知道如何为程序设置一个重新开始游戏的快捷键。

按键响应设计思路

手机的按键数量一般比较有限,好的键位设计可以带来好的用户体验,增加程序的受欢迎程度,糟糕的键位设计则有可能让用户的兴趣尽失。因此,按键布局的合理性对于手机程序来说至关重要。

键位设计要最大限度保证按键方便,而且要符合正常的思维和使用习惯。例如我们不应将*键、#键等按键作为游戏中的常用键,因为它们处于键盘的边缘,需要手指移动较大幅度,增加了游戏的疲劳感,降低了用户体验。

相反,我们应该将实现诸如重新开始游戏等功能的按键设置在偏僻的位置,以避免用户误按。此外,我们也不可以将按键设计为4向右、6向左,这显然是不符合键盘布局和绝大多数用户的习惯的。

在五子棋游戏中,我们选择键盘上的2、4、6、8这四个数字键用于控制方向,2代表向上,8代表向下,4代表向左,6代表向右。选择数字键5代表落子,*号键代表重新开始游戏。这里之所以没有选择手机上的导航键控制方向和落子,是因为不同品牌、不同型号的手机上的导航键对应的键码不完全相同。如果用户有兴趣为手机添加导航键支持,则可以参阅相关机型的开发文档,获取导航键对应的键码。

五子棋游戏的按键响应具体机制是,用户按动控制光标方向的数字键,则光标向相应方向移动一格,但应保证不会移出棋盘,光标移动共有四个方向,即上下左右。光标移动到用户满意的位置后,按下落棋键,则在当前位置摆下一颗棋子。之后变更当前棋子的颜色,由另一玩家走子(图1)。

14-f10-1-1.jpg

设置快捷键

快捷键,简而言之就是利用一个或几个按键组合一步实现一些正常情况下需要多步才能完成的操作。一款成功的手机程序必然要有快捷键支持,相信大家对手机QQ中的5号键还记忆犹新吧,它的存在,让我们可以在收到消息后一键提取。试想一下如果没有这个5号键,每次收到信息都通过菜单进行两三步选择才能看到的话,手机QQ必然会引起报怨。

bg14-01.jpg

五子棋游戏中应该有一个最基本的快捷键,那就是重新开始游戏,我们选择*键作为重新开始游戏的快捷键,为大家演示一个简单的快捷键设置的步骤。有兴趣的读者也可以举一反三,为游戏添加一键悔棋、一键认负等功能。

按键响应设计步骤

第一步:添加按键接口

在Netbeans中选择“文件→打开项目”,打开我们上期所创建的项目,找到GameCanvas.java文件,打开后在上期所创建的GameCanvas类里面添加按键控制的接口。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

if(keyCode==KEY_NUM2 && cursorY>0) //按下的是2且光标没有到顶

cursorY——; //光标上移

else if(keyCode==KEY_NUM8 && cursorY<14) //按下的是8且光标没有到底

cursorY++; //光标下移

else if(keyCode==KEY_NUM4 && cursorX>0) //按下的是4且光标没有到达最左端

cursorX——; //光标左移

else if(keyCode==KEY_NUM6 && cursorX<14) //按下的是6且光标没有到达最右端

小技巧:如果不清楚键盘上某个键对应哪个keyCode,可以单独写个小程序,在keyPressed事件下添加代码,使其显示所获取到的keyCode,这样即可通过在指定机型上进行试验的方式猜解出所有按键的keyCode。

第二步:处理游戏胜负

在上一步中,我们每次走子后都要调用setChess()进行判断,判断每次走子后开始从最后落子的位置向水平方向、竖直方向、左右两条对角线方向是否有五颗连续的同色棋子存在。如果黑棋获胜返回1 ,白棋获胜返回2,无人获胜返回0。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

chessTable[y][x]=turn;

//横向,对下棋点横向左右两边计算棋子,如果连成一线并且棋子数为4颗(加自己一颗)就胜利

for(int i=1;i<5 && x+i<15;i++){ //向棋子右边计算

if(chessTable[y][x+i]==turn) //当棋子颜色与走棋方相同时

count++;

}

for(int i=-1;i>-5 && x+i>=0;i——){ //向棋子左边计算

if(chessTable[y][x+i]==turn)

count++;

}

if(count==4) //当总数达到4颗时

第三步:一键重新游戏

我们还要添加一个快捷键*,按下键盘上的快捷键*后,游戏将自动重新开始。除此之外,有一方获胜后也将使游戏重新开始,为此我们需要建立一个逻辑处理函数和初始化函数。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

//初始化函数

private void gameInit(){

//设置黑棋先下

turn=1;

//游戏没有进行中

gameFinished=0;

//初始化棋盘 全清

for(int i=0;i<15;i++){

for(int j=0;j<15;j++){

chessTable[i][j]=0;

//打印胜利对话框

String winner="";

if(gameFinished==2)winner="白棋";

else if(gameFinished==1)winner="黑棋";

第四步:在模拟器中显示

在Netbeans工具栏点击■,在dist目录下会生成JAR和JAD文件。打开Symbian SDK自带的S60模拟器,重新安装新版的五子棋并运行,待游戏界面显示后,我们用鼠标点击对应的按键就能实现所添加的按键响应功能(图2)。

14-f10-1-3.jpg

至此,我们的五子棋游戏基本功能就实现了。下期我们将继续完善程序,为我们的游戏添加触摸屏支持,使程序可以适用于触摸屏手机,并进一步增强游戏的用户体验,为游戏添加音效,使游戏具有多媒体效果。

读者反馈

开发QQ群:我照着上期文章的方法做出了程序界面,可程序图标太难看了,如何更改生成的程序图标?

小编:在Netbeans中,选择“文件→项目属性→应用程序描述符→MIDlet标签选择图标”就可以了,在此处的“其他标签”里面可以修改作者姓名等。

开发QQ群:手机上有没有较小的分辨率?

小编:手机上较小的分辨率是有的,例如Nokia手机是176×208,索爱手机是176×220。

开发QQ群:我想模仿上期文章中的操作,可我不会用Netbeans,不知道还有哪些IDE可以用?

小编:不会Netbeans没有关系,会Eclipse不?它也是一个免费开源的IDE,也可以用来设计手机软件(IDE又名集成开发环境,它将编辑、编译、调试等功能集成在一个桌面环境中,大大方便了用户)。Eclipse的一个衍生版本EclipseME适合用于J2ME手机程序开发。此外,还有JBulider,它的功能非常强大,但是它是收费软件。

开发QQ群:上期文章中提到的JAD文件和JAR文件有什么区别?

小编:JAD,即Java 应用程序描述符,它包含 MIDlet 套件的标题信息,例如开发应用程序的公司、应用程序名称和大小。在将应用程序下载到设备上时,将先下载和读取描述符,然后再下载和读取包含 MIDP 应用程序的 JAR 文件。

在装入 MIDlet 套件的完整 JAR 文件之前,移动设备上的应用程序管理软件可使用 JAD 文件验证 MIDlet 是否适用于该设备。JAD 还向 MIDlet 提供特定配置的属性(参数),这样设备便可以确认是否具有足够的空间用于存放应用程序,以及是否应下载完整的应用程序。JAR文件才是真正的程序。

开发QQ群:我自学了使用Image类的使用方法,并在自己开发的手机程序中加入了图片,但是发现程序在有些手机上可以显示图片,有些手机上则不能正常显示,请问这是怎么回事?

小编:MIDP默认只支持PNG格式的图片,而有些手机也会支持JPG或者GIF格式的图片。出现上述情况极有可能是你使用了后面两种图片格式。为了保证程序良好的可移植性,我们建议大家在程序中使用PNG格式的图片。在这里为有需要的读者推荐一个软件2PNG,下载地址为http://www.newhua.com/soft/214.htm,它可以批量地将 TIFF、GIF、Bitmap、PCX、DCX、EPS、Targa、JPEG、PNG格式转换为 PNG格式。

编后

通过本期的示例,大家已经学会如何为五子棋程序添加按键响应。有能力的读者还可以研究如何使用我们的程序中没有涉及的按键,通过我们在小技巧中教大家的方法取得相应的keyCode,为游戏添加四维导航键支持,或者是为QWERT形式的手机键盘添加按键处理,以使程序可以支持更多类型的设备。