摘要: 随着通信技术的发展和手机的普及,手机游戏的开发技术越来越为人们所关注。以J2ME为开发平台,利用Java提供强大工具,不但可以在手机上实现静态HTML技术所无法实现的计算处理、数据存储、与服务器的通信等功能,而且能够开发各种手机游戏。本文在介绍J2ME及其体系结构的基础上,以贪吃蛇游戏为实例,描述了借助J2ME的MIDlet类库开发手机游戏的过程。
目录:
手机游戏开发过程:
3.1 贪吃蛇游戏的规则简介以及开发环境
3.1.1 贪吃蛇游戏的规则简介
在贪吃蛇游戏中,玩家操作由小方块连接而成的蛇,去吃随机散落在画面内的小方块,每吃一块就增加一小方块长度,要是撞壁以及撞自己的尾,就属于失败,如无失败则直到通关为止。屏幕的长度的行向为11单位,纵向为18单位。在这个范围内,玩家通过操作方向键来控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。
3.1.2 开发环境
(1)开发的硬件环境:CPU C1.7HZ/Maxor 40G/DDR 256M/CD-ROW 40X
3.2 详细设计
本游戏的操作流程(如图3-1):用户在启动MIDlet后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[开始]按钮后,就可以开始玩游戏。当用户想暂停时,再次按一下[开始]按钮,游戏就暂停了,在暂停的情况下再按[开始]按钮,游戏继续运行。任何时候按[退出]按钮,游戏MIDlet都会终止。
3.2.1 代码设计
游戏地图是蛇的活动范围和食物随机散落的范围,游戏的容器为行向为11单位,纵向为18单位,如下代码:private final int iX = 10;//地图的开始坐标 private final int iY = 10;//private final int SWIDTH = 16;//图标的宽度 private final int iCells = 11;//地图的列数 private final int iRows = 18;//地图的行数 private final int iBoxW = SWIDTH*iCells;//地图的宽采用二维绘图工具:二维绘图工具drawLine采用4个参数——直线起点的x、y坐标值和直线终点x、y的坐标值,例如:graphics.drawLine(50,0,100,0);这行代码会从位置(50,0)到(100,0)绘制一条直线。绘制一个矩形是一个类似的过程,不同的只是需要用起点加上宽度和高度的方式来指定这个对象。可以绘制透明的或者填充的矩形,甚至可以绘制圆角的矩形。4个绘制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。屏幕的长度为行向为11单位,纵向为18单位;在这个范围内(如图3.3),玩家操作方向键控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。
贪吃蛇最初由3个小正方形组成,小正方形是蛇的身体和游戏容器的组成部分。食物也由一块小正方形组成,并且随机散落在游戏框图的区域内,每次只出现唯一的一个,待玩家操作游戏完成一个任务后面,再出现下个食物,小蛇每吃一个食物就增加一个长度。实现代码如下: public boolean isVisible(){ return sLabel.isVisible(); sLabel.setVisible(false); protected void setPosition(int row, int cell){ sLabel.setBounds(cell*SWIDTH, row*SWIDTH, SWIDTH, SWIDTH);setPosition(--iRow,iCell);setPosition(++iRow,iCell);setPosition(iRow,--iCell);setPosition(iRow,++iCell);static boolean getTouch(){static void setImTouch(){tem.setPosition(this.getRow(),this.getCell());MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的就不需重绘。游戏画布是一个CommandListener,可以接受用户键盘命令,控制蛇的左移,右移,下移,上移。其代码如下:if(aoSnakes[0].getRow()==Food.getRow()&&aoSnakes[0].getCell()==Food.getCell())Snake tempSnakes[] = new Snake[iLen-1];for(int i=0;i<tempSnakes.length;i++){tempSnakes[i] = aoSnakes[i].clone();整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面。欢迎画面和Game Over画面的绘制相当简单,游戏暂停画面的绘制也相当容易,就是设立标志,让paint()执行的时候无需真正执行重绘动作。