触摸屏手机 程序也“通吃”

技术与开发

开发程序:五子棋

开发进度:第三期

开发平台:Symbian平台

上期我们讲解了如何为五子棋游戏添加按键响应支持。本期我们将讲解如何为程序添加触摸屏支持。随着手机功能的不断进化,越来越多的中高端手机乃至低端手机都开始配备触摸屏,有些手机是触摸屏键盘双输入,而有些手机则是仅支持触摸屏输入。为了扩大游戏的使用范围,我们应该为游戏增加触摸屏支持的功能。

触摸屏响应设计思路

触摸屏应用在手机上显然是具有很大的进步意义的,传统的按键操作往往比较复杂,例如进入菜单时需要用导航键进行多次选择,而触摸屏手机只需直接点击相应选项即可实现相应功能。触摸屏的出现还使手写输入变成了可能,使得许多不会用手机键盘打字的中老年人也加入了短信一族。

对于手机游戏开发而言,触摸屏的出现为我们带来了机遇,同样伴随着挑战。触摸屏手机大多省去了对实体键盘的支持,使得用户只能利用触摸屏对游戏进行操作,这就意味着诸如《超级玛丽》、《魂斗罗》等众多经典的游戏与纯触摸屏手机无缘。

虽然我们可以在触摸屏上模拟出一些按键供用户操作,但是实际上目前这也只是一种概念,这种方式几乎没有可操作性。因此我们经常需要在开发某些游戏时放弃对触摸屏手机的支持。但是,触摸屏手机由于其触控特性,又为我们的游戏开发带来了机遇。例如五子棋游戏,传统操作方式需要按动键盘移动方向,操作相当麻烦,而在触摸屏手机上用户只需要轻点屏幕即可在相应位置落子,操作的便捷性提高了。

触摸屏手机还适合运行诸如纸牌游戏、扫雷游戏、找茬游戏等各种类型的益智游戏。因此我们在开发益智类游戏的过程中不妨为其添加触摸屏支持,以使游戏可以支持更多的设备,并提高游戏的可玩性。

在程序开发中,我们不需要了解触摸屏的硬件架构,也没有必要了解触摸屏是如何实现触摸感应的,我们只需要使用已经封装好的类中提供的方法即可获取用户的触控信息,再对其作出相应处理,这样即可为程序添加触摸屏支持(图1)。当我们的手指点击触摸屏时,会出现背景音乐。

15-f10-1-1.jpg

3种触摸屏响应

触摸屏响应总共有3种方法。

方法1:protected void pointerPressed(int x, int y),当指针按下时调用

pointerPressed()是一个系统自带的方法,当指针按下时调用,即我们使用手写笔或者手指在屏幕上按下时被调用。它的两个参数x、y分别是指针被按下时的横坐标和纵坐标,它们由系统自动获取。在大部分程序设计应用中,我们只需使用这种方法即可。

方法2:protected void pointerDragged(int x,int y) ,当指针拖动时调用

对于pointerDragged()拖曳事件的处理,默认只是通知当前最新的坐标,我们可以在函数体内添加代码,通过对x、y参数进行记录 ,以确定拖曳的轨迹,并对其作出相应处理。这种方法主要应用于需要拖曳的游戏,比如纸牌游戏等。

方法3:protected void pointerReleased(int x,int y) ,当指针释放时调用

pointerReleased()与pointerPressed()方法的唯一区别就是前者当用户在触摸屏上按下时即激活,后者则等用户按下并释放时才激活,开发者可根据实际情况选择,但多数情况下应选择前者。

触摸屏响应设计步骤

第一步:添加触摸屏响应接口

在NetBeans中选择 “文件→打开项目”,打开我们上期所创建的项目,找到GameCanvas.java文件,打开后在GameCanvas类里面添加触摸屏响应的接口:

protected void pointerPressed(int x, int y)

第二步:设计触摸屏响应功能

由于上期我们已经成功地为游戏添加了按键支持,因此触摸屏控制相对简单,不需要重新设计游戏的逻辑判断部分,只需要判断用户点击时的坐标范围即可。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

cursorX=(x-startX+6)/15; //获取对应的格子x坐标

cursorY=(y-startY+6)/15; //获取对应的格子y坐标

if (x>15 && x<75 && y>260 && y<276) //当用户点击范围为棋盘之外时,使游戏重新开始

keyPressed(KEY_STAR); //触发*号键按下时的事件

if(cursorX>0 &&cursorX<14&&cursorY>0&&cursorY<14) //如果用户点击在棋盘范围内,则在当前位置落子

keyPressed(KEY_NUM5); //触发5号键按下时的事件

在这里我们用到了一个技巧,就是没有重写逻辑代码,而是调用了我们上期已经完成的keyPressed()函数。因为上期我们已经设置了5号键代表走棋,*号键代表游戏重新开始。

我们只用在需要的时候人为模拟5号键和*号键的按键动作即可实现同样的效果。当然,对于没有添加按键处理事件的程序,或者是纯触摸屏程序,则需要在相应位置内添加完整的逻辑处理代码才可以实现同样的效果。

第三步:添加音乐

在完成第二步后,我们的五子棋游戏已经可以支持触摸屏控制了,现在我们来为程序增加音效,使其在游戏过程中播放背景音乐,当我们的手指点击触摸屏时出现走棋声。不同品牌、不同机型所支持的音乐格式都有可能不同,但一般来说都会支持WAV、MIDI格式等。添加音乐的关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

//调整按键下棋播放音乐

protected void keyPressed(int keyCode){

………………

else if(keyCode==KEY_NUM5){

//游戏结束 gameFinished>0

gameFinished=setChess(cursorX,cursorY);

//播放走棋音乐

mp.playMoveSound();

}else if(keyCode==KEY_STAR){

gameFinished=3;

第四步:在模拟器中测试

参照我们上期提供的方法重新生成JAD和JAR文件。由于Symbian SDK自带的模拟器暂时不支持触摸屏,所以我们要在支持触摸屏的手机中运行程序才可以检验效果。此外,还可以使用无线开发工具包(WTK)中的模拟器运行该程序(图2)。

15-f10-1-2.jpg

小提示:无线开发工具包(WTK)中自带的模拟器虽然支持触摸屏,但默认并没有开启对触摸屏的支持,要模拟出触摸屏效果,需要在NetBeans安装目录下找到如下文件:

X:\NetBeans\mobility8\WTK2.5.2\wtklib\devices\DefaultColorPhone\DefaultColorPhone.properties

# Touchscreen support

###############

touch_screen=true

该文件中的touch_screen默认为false,请手动将它修改为true并保存。

下期我们将完成五子棋系列最后一期,为游戏添加蓝牙接口,实现联机对战功能。

读者反馈

开发QQ群:看了上期的文章,我想用方向键来操作落子的方位,我用的是Symbian平台的手机,该怎么做?

小编:不同的手机方向键的键值不同,对于具体的手机而言,要对手机的键值做分析才能对keyCode做判断。我在S60模拟器中为你运行了该键值测试程序,测试结果是导航键中,上方向键值是-1,下方向是-2,左方向是-3,右方向是-4。导航键中的确认键键值是-5。

开发QQ群:手机上的独特按键,比如拍照键、音量控制键可以自己设计吗?

小编:不同的手机有不同的情况,小编本人的手机不可以,但是据我所知有些手机是支持的。建议你使用上期我们提供给大家的方法,写个简单的检测程序,对拍照键、音量控制键进行检测。

成功获取对应键值就可以自己设计它们的快捷键。不过不建议使用这类特殊按键,一是这类按键可能位置偏僻,不方便按到,二是这类按键通用性不强,程序中使用这类按键可能造成无法在手机上正常运行,请三思。

开发QQ群:抓狂了!我自己写了一个按键检测的小程序,为什么不可以用?程序如下所示:

private void keyPressed(int keyCode) {

System.out.println("keyPressed" + keyCode);

}

小编:keyPressed()是一个接口方法,在接口中规定了必须是protected型的,你这里写成了private,所以无效。只需要修改前缀为protected即可。该函数修改后即可用于按键键码的检测,请读者朋友参考。

开发QQ群:学了上期的东西后我有想法,能否利用按键响应事件做一个键位更改程序,运行后可以更改手机的键位,比如将*号键改成0号键?

小编:你的想法很好,理论上也可以实现。但是不能用J2ME。J2ME中的键位响应只能对当前的程序有效,如果想在程序内实现按*号键时在屏幕上显示一个0,可以很容易做到,但是你的意思应该是希望把软件启动后,即使在打电话拨号时按*也可以拨0。

这个就要用C++等开发语言做底层的编程了,而且这样的软件在Symbian平台上运行很可能还涉及到权限问题,需要用证书对软件进行签名才可以。你可以查阅SDK的帮助文档看看有没有合适的资料。

编后

通过本期学习,大家已经学会了如何为游戏添加触摸屏支持功能。有能力的读者还可以举一反三研究如何在触摸屏中拖动物体、控制游戏,为自己增加开发经验。由于申请加入开发QQ群的人数太多,我们决定启用第二个QQ群,群号是84524010,验证码:手机开发。