上一篇:J2ME中定点库MathFP使用入门 >>
J2ME游戏开心药丸开发全程展示
笔者把这款游戏命名为开心药丸,下面开始做简单介绍:
游戏名:开心药丸
运行平台:MIDP1.0
游戏方法介绍:
游戏屏幕上方会随机掉下由两个方块组成的方块组,每个方块从红黄蓝绿四种颜色中随机产生一种,这样共有4*4=16种组合方式,(是不是很象我们感冒时吃的胶囊!这就是名字的由来),每4个相同的颜色组合在一起的方块会自动消去,随着游戏的不断发展,速度会不断提高,直到GAMEOVER......
在进行开发之前我们要画出程序的流程图:
下面我们就这个游戏来介绍以下类的结构:
笔者设计的是
SquareMIDlet:主程序,对整个游戏的生命周期进行控制。
Piece:存储各个方块组合的详细参数。
GameCanvas:这是精华所在,对这个画面的绘制和操作包含在这个类里,大家千万要注意,这是笔者自己写的GameCanvas,千万不要和MIDP2.0里的game包弄混淆。
具体实现详解:
首先从主程序入手: 在设计的时候我们不需要为这个类添加太多的功能,我们只需要在在这个类里面加入适当的控制机制,对整个游戏的生命周期进行控制,太多的代码会导致游戏结构的混乱。
我们这个系列文章将会围绕这三个关键类进行描述,先看一看主程序:
| import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class SquareMIDlet extends MIDlet { public void SquareMIDlet() { gc=new GameCanvas(this); display=Display.getDisplay(this); display.setCurrent(gc); } public void startApp() { gc.start(); } public void pauseApp() { gc.pause(); } public void destroyApp(boolean unconditional) {} void Exit() { try { destroyApp(false); notifyDestroyed(); }catch(Exception e){} } private GameCanvas gc; private Display display; } |
在此 我们给出相应的主程序的UML图 方便读者了解整个游戏的架构!~
很明显,我们通过调用GameCanvas里的开始(start)和暂停(pause)等等方法来控制程序的状态。
接着我们来设计 Piece 这个类,它的作用是什么呢,它是存储单个方块信息的类,(我们的药丸由两个方块组成,即两个 Piece 的随机组合)该类的核心之一便是如何判断在方块落下之后和左右上下相邻的方块之间的颜色是否相同,相同即消去之间的边界线,不相同即需要在它们之间描绘上一条边界线。这样一个设计需要 4 个布尔值来进行判断,还需要定义好方块的高度和宽度(不同的手机的屏幕大小不一,在实际开发过程当中要注意好这样的问题)。
在看代码之前 大家先看一下UML图对整个类有个大致的了解~
核心代码如下:
| /* * * @author 夏彦端 * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ import javax.microedition.lcdui.*; class Piece { int currentcolor=0x00ffffff; /** * 先定义四种基本颜色的常量,当然如果你认为让游戏更复杂一些才好玩,可以在这里适当的加上 * 其他的颜色 ~ */ static final int red=0x00ff0000; static final int green=0x0000ff00; static final int blue=0x000000ff; static final int yellow=0x00ffff00; /** * 下面需要定义我们的四个布尔函数值,来进行和周围方块的判别 * */ boolean isup =false; boolean isdown=false; boolean isleft=false; boolean isright=false; /** * 下面需要定义方块的宽度和高度,注意这里的宽度和高度需要是可被你游戏实际屏幕的高度和宽度 * 整除的数字,否则会带来不必要的麻烦 ~ * */ static int width=12; static int height=12; void drawPiece(Graphics g,int x,int y) { g.setColor(this.currentcolor); g.fillRect(x,y,width,height); g.setColor(0,0,0); if(!isup) { g.drawLine(x,y,x+width,y); } if(!isdown) { g.drawLine(x,y+height,x+width,y+height); } if(!isright) { g.drawLine(x+width,y,x+width,y+height); } if(!isleft) { g.drawLine(x,y,x,y+height); } } } |
这里我并没将 currentcolor 以及四个布尔值这些变量设置为封装访问,或许一些 OO 设计的 FANS 会质疑我的做法,但是因为我们这是在手机上写程序,而不是在 PC 上,有充足的处理机供你调度,我们如果另外再写个方法来给外部访问 currentcolor 的话,会给程序在手机上运行造成不必要的负担,所以我们没有对 currentcolor 这个变量进行任何额外的特殊处理。
现在我们进入本游戏最核心的设计部分, GameCanvas 类的设计!
毋庸质疑我们的 GameCanvas 会实现 Runnable,CommandListener 这两个接口,还必须定义好几个和游戏状态相关的常量,并对游戏的初始化进行处理,这里我想提一下初始化,这是曾经最让我头痛的地方,因为这里要设置好 N 多的变量,而且必须要对他们进行适当的初始化,否则整个程序都会出问题,拿这个游戏来说,我们必须定义好如下几个常量:
存储分数的变量, Piece 数组,方块组落下速度调整变量 speed, 方块组落下时间的变量 time, 落下次数 count, 循环标志 isstop, 判断是否需要下一个方块组落下的变量 isfall, 判断按键是否有效的变量 iskey 。
怎么样,是否头很大?):在进行游戏设计之前我们必须设计好一些必须的变量,并且对其初始化,从而实现对整个游戏的流程控制。
接下来,我们需要对游戏的命令处理部分进行设计,正如我们前面流程图所画的过程,我们的几个必须命令为开始命令 start, 离开命令 exit, 暂停命令 pause, 继续命令 resume, 还有一个离开命令 quit 。( exit 是在标题画面的是否和 start 配对使用,而 quit 则是对整个游戏的退出时起作用。)
命令部分的代码如下 :
| private Command start = new Command("Start", Command.SCREEN, 2); private Command exit = new Command("Exit", Command.SCREEN, 1); private Command pause = new Command("Pause", Command.SCREEN, 2); private Command resume = new Command("Resume", Command.SCREEN, 2); private Command quit = new Command("Quit", Command.SCREEN, 1); |
相应的命令处理部分为:
| public void commandAction(Command c, Displayable s) { if(c == start) { doGameInit(); gameState = GAME_START; doThreadStart(); }else if(c == exit) { square.Exit(); }else if(c == pause) { removeCommand(pause); addCommand(resume); doPauseOrResume(); }else if(c == resume) { removeCommand(resume); addCommand(pause); doPauseOrResume(); }else if(c == quit) { doGameStop(); removeCommand(pause); removeCommand(resume); removeCommand(quit); doTitle(); } } |
我们需要特别注意的是同一时刻能够在屏幕上同时显示的命令有哪几个,比如说当我们在按下 quit 后屏幕上就无须显示 pause,resume,quit ,因为此时我们已经基本上选择了离开游戏,还有在命令处理函数里面我们在每个命令按下后都会出发相应的处理函数,我们留在下一篇文章介绍这些函数的写法。
下一篇:利用J2ME开发移动3D游戏之3D图形API >>
相关文章:
- · 小编原创:SEO工具之搜索引擎收录量查看
- · 为春节添色彩 贺卡也玩DIY
- · 让FlashGet也能断点续拷硬盘文件
- · 给你请一个磁盘整理高手 PerfectDisk
- · 让WinRAR解压文件后直接打开解压目录
- · 全新P2P网络电视TVKoo
- · IE也可玩“超级拖拽”
- · “迅雷听听”让你歌曲听不完
- · 让Nero下岗 简洁刻录软件ONES全面应用
- · 给你的WinRAR请一个好管家
- · 千万不能更新的QQ网络硬盘
- · The World浏览器秘技两则
- · 下载QQ珊瑚虫版v4.0 抵挡探隐身软件侦测
- · 腾讯QQ/TM珊瑚虫增强包v4.0最终测试版发布
- · 腾讯QQ/TM珊瑚虫外挂发布v4.0 B3版
- · 腾讯QQ/TM珊瑚虫外挂发布v4.0 B4版
- · 解决珊瑚虫QQ不能在Win2003运行的问题
- · 腾讯QQ2005 Beta3珊瑚虫版 v3.2发布
- · 腾讯QQ2005珊瑚虫版发布v3.2.1版
- · QQ/TM珊瑚虫增强包v4.1 B1增聊天机器人
- · QQ珊瑚虫增强包v4.1最终测试版发布
- · 珊瑚虫QQ/TM增强包4.1正式版发布
- · 输入代码 与珊瑚虫QQ聊天机器人对话
- · 腾讯QQ2005珊瑚虫版v4.1a发布
- · 解决珊瑚虫QQ不能在Win2003运行的问题
- · 快速学用腾讯TM:多人语音会议
- · 快速学用腾讯TM:远程协助
- · 快速学用腾讯TM:远程演示文档
- · 快速学用腾讯TM:发送和接收文件
- · 快速学用腾讯TM:设置在线状态
- · 快速学用腾讯TM:互动空间
- · 快速学用腾讯TM:TM气象站
- · 快速学用腾讯TM:信息到达提示
- · 腾讯网启用全新Logo 体现品牌新内涵
- · TM2006新春版新功能用法:我的空间
- · 关于腾讯TM新功能的内部消息
- · 新TM可用任意邮箱帐号登录 下周发布
- · TM2006体验版发布!增全新“热度”功能
