设计界面先定分辨率

技术与开发

随着3G时代的到来,基于手机等移动设备的程序开发必将成为一个热门领域,拥有广阔的市场前景并蕴藏着无穷的财富。因此越来越多的开发爱好者开始进军手机程序开发,那应该如何转型呢?如何快速上手呢?如何利用SDK开发出手机程序呢?本系列不容错过。投稿信箱:pcw-chendx@vip.sina.com。

上期我们讨论了几大手机平台的优缺点和市场前景。从本期开始,我们以在Symbian平台上制作一个五子棋游戏为例,逐步引导大家了解手机程序的开发过程和编程的思路。这个程序开发共需要4期,要经过界面设计、按键响应、触摸屏支持、联机对战4个重要的步骤,分别讲解分辨率设定、快捷键设置、触摸屏支持、蓝牙连接4个知识点。

五子棋程序结构图

开发一个手机程序,离不开界面设计、按键响应这两个环节,根据不同的程序还有声音播放、触摸屏控制以及蓝牙通讯等环节。我们选择的五子棋程序,基本涵盖了手机程序开发中的重要环节。

五子棋程序的开发流程图如图1所示。首先我们要创建主类作为程序入口,之后为程序添加操作界面,使程序能绘制出棋盘和棋子,再为程序添加按键响应,使我们可以移动游戏光标。

13-f11-1-1.jpg

再在光标指向的位置处摆放棋子,并在棋子落下后进行胜负判断。随后我们还将为游戏添加音效和背景音乐,例如棋子落子声等,还将考虑对触摸屏的支持,直接在触摸屏幕上点击就在相应位置落子。如果有需要还可以为游戏添加联机功能,通过调用蓝牙通讯模块与其他手机实现联机对战。我们在开发过程中用到了Symbian SDK,主要面向S60系列的手机。

界面设计思路

手机程序的开发,尤其是手机游戏程序的开发,对于界面的设计有着很高的要求,如何在较小的屏幕上展示出必要的信息,绘制出漂亮的游戏画面,是一门精妙的学问。用户界面从功能上可划分为高级用户界面和低级用户界面两种类型。

高级用户界面通俗地讲就是利用系统自带的一些组件设计出的界面,比如系统自带了文本框、图片框、按钮等,我们可以将它们加以利用,组合出一套人机交互的界面。低级用户界面通俗地讲就是利用系统提供的API在屏幕上精确地绘制出各种所需的图形。高级用户界面在应用程序设计中使用较多,而游戏开发中则更多需要用到低级用户界面。

五子棋游戏的界面元素主要包括棋盘和棋子。棋盘和棋子有两种表现方法,一种是使用一张棋盘图片和黑白棋子图片各一张,并在界面的相应位置贴图,另一种是通过调用函数绘制出棋盘和棋子。这里我们推荐采用后者,因为这样可以通过调整界面大小来适应不同分辨率的屏幕。

五子棋界面的开发流程图如图2所示。首先我们要创建界面的接口,然后设计界面的画布大小,再在画布中绘制棋盘和一套黑白棋子,通过绘制字符串的方法来判断下一步棋子的颜色。

13-f11-1-2.jpg

分辨率要单独考虑

屏幕分辨率是手机程序设计时必须考虑的因素,开发商的做法一般是针对不同屏幕不同机型开发不同的版本。目前主流的分辨率有240×320、128×160等,早期的手机则多是128×128。我们在开发时不可能兼顾所有的手机,但在开发后可以针对目标机型进行修改移植,因此我们在开发时应充分考虑它的可移植性。这里我们定的分辨率是240×320。

就五子棋游戏而言,分辨率移植并不困难,比如我们要将它移植到128×160的手机上时,需要修改g.fillRect(0,0,240,320)为g.fillRect(0,0,128,160),并根据修改之后所有涉及屏幕尺寸的代码进行相应调整,以使棋盘线条、棋子等的尺寸也相应缩小,即可方便地制作出一个新分辨率版本。

控制分辨率我们要用到两个类:Graphics类和Canvas类,它们是基于像素级别进行操作的,我们可以通过修改它们的参数来达到修改程序分辨率的目的。

小提示:这里所说的分辨率不同于屏幕尺寸,一些读者往往存在误区,认为程序开发中的屏幕大小指的是屏幕的尺寸。实际上这种说法是错误的,程序并不关心屏幕的尺寸,而关心的是屏幕上排布的像素点有多少,也就是我们所说的分辨率。例如240×320这一分辨率既可存在于2英寸屏,又可存在于2.4英寸屏,只是2.4英寸屏上每个像素点的体积要大于2英寸屏上的像素点。

界面设计步骤

第一步:创建接口

要开发界面,我们先要创建界面的接口。在Netbeans开发环境中创建一个J2ME项目,将主类命名为FiveGameMIDlet(具体操作请看第11期F10版)。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

//程序的入口类,提供程序的入口点和异常操作

public class FiveGameMIDlet extends MIDlet {

public void startApp() {

//程序的执行入口方法,打开手机程序时从这里开始执行

public void pauseApp() {

//程序发现有电话来了,或者其他异常时会跳到这里执行

public void destroyApp(boolean unconditional) {

//程序被退出或者强制关闭的时候,跳到这里执行

小知识:MIDlet是手机游戏的接口类,程序通过 FiveGameMIDlet 找到程序的执行入口点。通俗地讲就是用户执行程序先进入FiveGameMIDlet,然后进入startApp() ,出现中断或者来电话时跳到pauseApp() ,退出时跳到 destroyApp() 并释放程序资源。

第二步:建立画布并绘制棋盘棋子

新建一个java类,并让它继承Canvas 类,重写它的paint()。这一步就决定了程序的分辨率的大小。关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

int cursorX=0,cursorY=0; //下棋光标坐标

//棋盘开始边距

int startX=15;

int startY=15;

public GameCanvas(){

//使游戏全屏

this.setFullScreenMode(true);

//用于绘制棋盘的方法

private void drawBoard(Graphics g)

{

g.setColor(200,184,189); //设置棋盘背景色

g.fillRect(0,0,240,320); //注意此处,我们假设用户手机分辨率为主流的240×320,并将棋盘设置为240×320像素

g.setColor(0,0,0);

//绘制棋盘

g.drawRect(startX-2,startY-2,214,214); //绘制一个以13,13,214,214为顶点的矩形

for(int i=0;i<15;i++) //通过循环画线,横竖各15条

{

g.drawLine(i*15+startX,0+startY,i*15+startX,210+startY);

g.drawLine(startX,i*15+startY,210+startX,i*15+startY);

//根据chessTable绘制棋子

private void drawChess(Graphics g)

{

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

{

for(int j=0;j<15;j++) //遍历chessTable数组中的每一项

{

if(chessTable[i][j]==1) 发现某一点为黑棋时

{

g.setColor(0,0,0); //画黑棋

g.fillRoundRect(j*15+startX-6,i*15+startY-6,12,12,12,12);

}

if(chessTable[i][j]==2) //发现某一点为白棋时

{

g.setColor(255,255,255); //画白棋

g.fillRoundRect(j*15+startX-6,i*15+startY-6,12,12,12,12);

private void drawCursor(Graphics g) //绘制游戏中的指示光标

小知识:绘制五子棋界面时主要用到两个类——Graphics和Canvas。Graphics类提供了简单的二维几何绘图功能,它与J2SE中的java.awt.Graphics类非常相似。Graphics类通过改变指定像素点的像素值的方法绘制图形。Canvas类则是画布,所有的图形图像绘制和用户交互(包括按键、指针和Command)都由这个类负责。

第三步:调用画布

有了画布,我们要使用此前创建的FiveGameMIDlet主类,让它来调用我们的画布并将它铺在屏幕上。代码如下所示:

public void startApp() {

//新建游戏场景

GameCanvas gCanvas =new GameCanvas();

//取得屏幕设备

Display screen = Display.getDisplay(this);

//将场景放到屏幕设备中

screen.setCurrent(gCanvas);

}

第四步:生成界面

运行IDE上的生成功能,生成JAR和JAD文件,在S60模拟器运行该程序时,就可以看到我们设计的五子棋棋盘界面了(图3)。有条件的读者也可以将它通过数据线或其他方式传入自己的手机,欣赏我们所绘制出的第一个手机游戏界面。

13-f11-1-3.jpg

此时细心的读者也许会产生疑问,程序绘制出的棋盘上为什么没有看到棋子呢?不要着急,目前为止我们讲解了如何利用Canvas和Graphics进行游戏界面的绘制,下期我们将讲解如何为游戏添加按键响应功能,以使我们的程序可以实现真正的人机交互,之后我们再利用按键在游戏中将棋子摆放在界面上相应的位置,并进一步完善我们的游戏。

读者反馈

开发QQ群:Symbian SDK中自带的模拟器可以运行哪几种程序?能否运行为其他平台开发的程序?

小编:Symbian模拟器支持SIS格式和JAR格式的程序, SIS格式是Symbian的独有格式,仅能运行于Symbian平台上,JAR格式基于J2ME的格式。为其他平台开发的程序除非是JAR格式文件才有可能被支持,此外还要看该程序设计时使用的分辨率和按键键位等信息,如果不相符则不能在Symbian模拟器上正常运行。

编后

相信通过本期的示例,大家已经初步学会利用Canvas类和Graphics类绘制圆形、矩形,利用这两个类还可以绘制出三角形、扇形等众多基本图形。如果把其中一些基本图形组合起来,就可以开发出诸如扑克、推箱子等游戏的界面。