4.16 关卡
至此,《泡泡堂》手机版的引擎已经可以算是搭建完毕,但还没有一个可玩的关卡,仍然不能开始游戏。
为了提高游戏的扩展性,本游戏的关卡布局是通过文件配置实现的。新增关卡只需要加入所需的图片和声音资源,再增加一个关卡配置文件即可。也可以重复利用已有的图片和声音资源,只增加一个新布局的关卡配置。
一个关卡的信息包括:
? 关卡要使用的图片资源文件序号
? 关卡要使用的声音资源文件序号
? 关卡地图布局
? 主角的出生位置
? 敌人数目
? 敌人的出生位置
在Java里很容易定义一个数据结构来存放上述信息,我们只需要构建一个关卡信息类Stage,并对该类进行持久化,保存成一个关卡配置文件即可。
4.16.1 保存关卡配置
可惜J2ME精简了J2SE的序列化接口,使得不能直接将Stage类保存并写入文件。但Stage数据类型比较简单,排列也比较固定,可以人工的对该类进行序列化持久保存。
已定义的Stage类有如下属性:
public int stageIndex = -1;
public int imgIndex = 1;
public int midIndex = 1;
public byte[][][] mapData = new byte[3][7][8];
public byte[] heroPosition = new byte[2];//英雄出生位置,英雄所在的行和列
public byte[] enemyPosition = new byte[10];// 敌人出生位置
? int stageIndex是关卡序号,是作为配置文件的文件名保存的。
? int imgIndex是图片文件序号
? int midIndex是声音文件序号
? byte[][][] mapDate是大小为3×7×8的字节型数组,用来保存地图布局
? byte[]heroPosition是一个大小为2的字节型数组,这两个元素分别保存主角出生的行和列。
? byte[] enemyPosition是一个大小为10的字节型数组,每两个连续的元素可以用来表示一个NPC的出生位置,元素值为-1则表示不需要该NPC。它满足了同时保存敌人数目和敌人位置的需求。
因为J2ME不支持文件写入,配置文件的生成须建立一个J2SE工程来实现。写配置文件的代码如下:
/**
* 存储地图数据
* @param stage 要保存为的关卡
* @throws IOException
*/
public void save(int stage) throws IOException
{
FileOutputStream os = new FileOutputStream("stage/" + stage);
DataOutputStream dos = new DataOutputStream(os);
// 写入地图贴图文件索引
dos.writeInt(imgIndex);
// 写入音乐文件索引
dos.writeInt(midIndex);
// 写入地图数据
byte[] map = new byte[3 * 7 * 8];
int index = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 7; j++)
{
for(int k = 0; k < 8; k++)
{
map[index++] = mapData[i][j][k];
}
}
}
dos.write(map);// 一次性将整个地图读入一维数组中
// 写入英雄出生点
dos.write(heroPosition);
// 写入敌人出生点
dos.write(enemyPosition);
// 将数据写出文件
dos.flush();
}
这个方法将Stage类的所有属性有依次写入了文件当中,使用十六进制编辑器查看关卡文件很容易找到与属性的对应关系。
图 4.16 1 关卡配置文件结构
4.16.2 读取关卡配置
游戏在读取关卡配置的时候只需要按照保存时的顺序,将对应的类型一个个读入Stage对象中即可。
/**
* 获取指定关卡地图数据
* @param stage 关卡号
* @return 关卡数据对象
* @throws IOException 未找到对应关卡数据文件则抛出异常
*/
public static Stage loadStage(int stageIndex) throws IOException
{
Stage stageData = new Stage();
stageData.stageIndex = stageIndex;
DataInputStream dis = new DataInputStream(Stage.class.getResourceAsStream("/stage/" + stageIndex));
// 读取地图贴图文件索引
stageData.imgIndex = dis.readInt();
// 读取地图贴图文件索引
stageData.midIndex = dis.readInt();
// 读取地图数据
byte[] map = new byte[3*7*8];
dis.read(map);// 一次性将整个地图读入一维数组中
int index = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 7; j++)
{
for(int k = 0; k < 8; k++)
{
stageData.mapData[i][j][k] = map[index++];
}
}
}
// 读取英雄出生点
dis.read(stageData.heroPosition);
// 读取敌人出生点并获得敌人数目
dis.read(stageData.enemyPosition);
return stageData;
}
图 4.16 2为本游戏中三个关卡的效果,其中第一关与第二关是共享资源图片的。
图 4.16 2 不同关卡效果
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
so cool~
好详尽的注释
我上次做项目的时候,开始没写注释
结果后来交的时候要求30%的注释量
从头注释那一堆代码的时候
那个晕啊!
确实很酷!
这样一来我都觉得自己做的设计根本没有任何意义。
很不错,谢谢你的分享了!!
谢谢啊
老大,没有下载版吗?
我也是在做毕业设计,感觉j2me同j2ee实在差别太大了。快崩溃了。
还有,你的画面很漂亮呀。
下载版?
不是有源程序嘛,deployed目录下的PopTang.jar和PopTang.jad就可以直接传到手机里用了。
呵呵,记得我当时实习手机开发上美工课画像素画....
手那是发麻啊~~~
不错啊,非常感谢!!!
赞一个
你的作品和论文写得很好,觉得你做东西真的很认真,佩服
记得我一年多前做毕业设计,很多都是应付式的,现在觉得真是有点后悔。
最近想学学j2me,主要是搞个超级玛丽,谢谢你的作品了,有很好的参考价值。
很好呀!要象你多学点。
真是太伟大了
你怎么不搞个大屏的啊
?
因为我自己用的N6070就这么大,方便测试
非常感谢
正打算做手机游戏的毕业设计,没有头绪一定好好参考.
就不客气的收下了
感激不尽!(一百遍) 楼主太好了! 我都不知道用语言了! 总之一句感激不尽! 279636240是我的QQ希望高手们多多指点!
楼主很不错啊,向你学习钻研和贡献精神
lz强人!张某佩服。小弟现在国外工作,实不如意,打算明年年底回国工作,打算从事J2ME手机游戏的开发工作。因为我喜欢玩游戏,一直都想自己做个游戏,可惜,雷声大,雨点小。
我的毕业设计是JPG和BMP图片的相互转换,用TurboC2谢谢,最后实现了,可是,程序写得很烂,跟Lz比简直是相差十万八千里啊,一句话,还是佩服!
昨晚配置J2ME的环境,搞到凌晨3点,没有成功,装好EclipseME后,首选项中的J2me选项出来了,但是Platform Components这个选项始终没有。不知Lz能否指导小弟一下?小弟感激不尽!
我大半年没写过程序了,刚打开Eclipse看了下,也没找到你说的Platform Components.
不知道你要做何用?
哦,这个问题已经解决了,Eclipe版本不同,3.2好像没有这个选项,不过系统已经配置好了,helloworld已经运行成功,不过还是谢谢你,呵呵~~
我今年大四了,我跟导师说明年毕业设计换你的这个题目,因为我可能明年会进一家手机游戏公司,打算也做个泡泡堂,不知道你介不介意让我使用你的部分代码和论文,可能还需要你稍微指点一下,谢谢了
QQ:376773982
可以,有疑问请联系我QQ,只是代码方面我已经忘得差不多了。。。
哥们 你真伟大啊 收藏了
老大,你什么时候上QQ啊,给你留言也没用,有没有开题报告之类的资料可以给我参考一下啊?论文有没有DOC版的,我还有几个代码的问题想请教你一下,谢谢了
QQ:376773982
不好意思,平时工作非常忙,加我QQ的时请注明身份,否则一般是不通过的。
9931817到底是不是你QQ啊,我用google搜到的
根本就没有身份验证啊。
不好意思, 我的QQ是7405440...我也忘了我有没有在Blog上公布过QQ了.
我想玩这款游戏,能告诉我在哪下载吗,我在你的blos里找不到,有源码我也不会用
马上要毕业了,课题就是基于J2EE的手机游戏的编程,因为我是学通信的对软件的开发不是很了解,准备毕业论文就这么混过去,看到LZ和各位师哥师姐的留言我决定认真的做玩,要让以后没有遗憾。
我也是万老师的学生,他是一个很好的老师,不过我不是一个跟你一样的好学生,呵呵,是他推荐我来的,他说你做的毕业设计是代表了大学生本科的最高水平,佩服。。。师哥~~~
做的不错哦..如果是大屏幕的,在模拟器上玩的会更爽的,一个字,强!还有个问题,看了下高手的论文,地图是三维的,那么,这也算一款三维游戏了吧..
你好!冒昧打扰了。我现在在做j2me的手机游戏。我是个新手。看了你的程序。我有点搞不懂。关于那个“保存关卡配置”具体是怎么做的啊。是怎么生成的十六进制配置文件的?如果你有空的话,麻烦回答下。谢谢哈!
用你目录做参考写另一个游戏的论文,谢谢了
你好,我现在是个大四的毕业生,由于Java根基浅薄,看了你的毕业设计关于那个关卡类的设计是怎么完成的?还望指教阿!QQ:61508486
bbbbbb
你好,我也是软件学院的学生,万老师上课的时候提过你,在这看到你的东西,很荣幸,呵呵!你的程序做的真的很好,向你学习,也请教下,你的泡泡堂在Jbuilder X里面应该如何运行,我其他的配置应该都没问题,就是运行不了,
java.io.IOException: CreateProcess: C:\Nokia\Devices\S40_SDK_3rd_Edition_Feature_Pack_2\bin\javaw -classpath D:\ppt\classes;C:\Nokia\Devices\S40_SDK_3rd_Edition_Feature_Pack_2\lib\classes.zip ppt.PopTang error=2
还望指教,谢谢!
我读书那会老师用JBuilder教学, 但我还是坚持用自己的Eclipse, 不熟悉JBuilder的配置, 帮不上你了.
我也向你推荐Eclipse或NetBean.开发工具的选择上大可不必跟着老师走, 想当年我们学C语言时还用Turbo C, 打击了多少人...还不如用Ultra Edit + cl呢!
确实不错,比我那时做的强多了!!记得我做手游毕设的时候好像还从没人做过手游毕设~~呵呵
万老师确实是好老师,如果没有他的指导的话就无法完成游戏了!
伟大啊
很强大,谢谢分享,希望能向你请教!谢谢
very good
谢谢分享,希望以后能向你请教!
大虾,请较一下,请问你知道J2ME游戏的脚本是怎么写的吗?地图工具用的是什么呢?有没有相关的教程啊?网上关于脚本的东西很少,地图工具也没有教程,自己摸索蛮耗时间的说~~
借鉴了下你的这个项目,论文还有部分代码(主要是整体的框架),不知道可行否?谢谢先~
@jerry_zihuai
无所谓~
我喜欢玩这个游戏,嘿嘿 !
Find Canon IR2830 Sharp AR-208s
Buy Sharp MX-M200D
Canon Image Runner
Image Runner 2018
Buy Canon IR-2020
Review Canon IR-1025IF
High-Performance Laser All-in-One for your Business or Small Workgroup
Buy Panasonic
Panafax UF-7200
Sharp FO-DC535 REFURB
Find Brother8480DN
Canon Canon IR-1025IF
Sharp FO-2080