,移动开发   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,移动开发
您的位置:软件 > 开发者网络 > 开发工具 > 移动开发 > 正文
Eclipse开发J2ME程序之图形化游戏
[文章信息]
作者:中国电子科技集团公司第二十二研究所青岛分所郎锐
时间:2005-04-12
出处:天极网
责任编辑:方舟
[文章导读]
本文将介绍一个简单的图象化手机游戏--"花皮猫大战流氓兔"的制作过程
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 游戏开发新手入门讲座
· 多媒体系列教程:网页设计制作
· 豪杰超级解霸V9使用手册(下)
· 打造个性化的Windows操作系统
· 图解Photoshop CS2 新功能体验
· 编程中的“拿来主义” 第三方控件推荐
· JBuilder 2005 单元测试体验
· 豪杰超级解霸V9使用手册(上)
· 数码照片后期处理与创意设计
[正文]

1 2  下一页

  引言

  现在的手机作为一种娱乐性的电子通信设备,早已超出原先的通话、短信息等基本通信功能,越来越多的娱乐、休闲性软件如手机游戏、电子书、音乐编辑、拍照与图象处理等也都流行于当今各种品牌的手机。其中,游戏软件占有相当大的比重。既然我们已经掌握了手机软件的开发过程,为什么不自己开发一个个性化的手机游戏呢?本文将介绍一个简单的图象化手机游戏--"花皮猫大战流氓兔"的制作过程。花皮猫自然是笔者养的爱猫了,感兴趣的读者也完全可以让自己喜欢的阿猫阿狗担当游戏中的主角,充分展示DIY的魅力!

  游戏的设计

  手机游戏的开发首先需要规划好整体流程和具体的游戏规则(或游戏剧本),然后才能根据此剧本进行具体的编码实现。受文章篇幅限制,本游戏剧本设计不能太复杂。首先将游戏定位为人机对弈类游戏,程序运行开始首先显示本游戏的封面画面,停留几秒后自动转入角色选择画面,在玩家选择某一角色后开始游戏。游戏开始时随机决定哪一方先行。人机分别在3乘3大小的棋盘网格中交替落子(双方棋子图案是有区别的),而且只允许在没有落过子的空网格中下子。只要有一方所落棋子在横、竖、斜任何一方向上的总数达到三颗即获胜。如棋盘被填满时双方均未在上述方向达到三颗棋子则该局为平局。无论结果如何,在每局结束后均显示当局胜负结果与总比分。玩家可以选择退出或是重新开始新的一局。以上便是本游戏的主体框架和基本游戏规则,随后进行的编码工作便以此为依据。

  游戏框架的搭建


图1

  首先建立项目并新建一Midlet TicTacToe加入其中,继续添加ChoosePieceScreen、GameScreen和Game三个类到项目。作为一款游戏,如果仍拿文字来作软件封面显得也太不专业了。如果要在J2ME程序中使用图片,必须预先将其转换为png格式图片然后在项目上点击鼠标右键,从新建菜单下选择文件菜单项将弹出如上所示对话框。刚开始下半部分是隐藏的,需要通过点击高级按钮将其显示出来。选中链接至文件系统中的文件并通过浏览对话框指定要添加的图片路径。最后在文件名一栏输入图片的文件名并点击完成,将图片添加到项目。下面只须在startApp()中通过如下代码装载图片并通过信息框将其显示出来即可:

Image logo = null;
try {
 logo = Image.createImage("/logo.png");
}catch (IOException e) {}
Alert splashScreen = new Alert(null, "郎锐2004年作\n版权所有(c)\n2004--2005", logo, AlertType.INFO);
splashScreen.setTimeout(4000); // 延迟4秒


图2 图3 图4 图5

  在持续显示图2四秒后进入角色选择界面(图3):

choosePieceScreen = new ChoosePieceScreen(this);
Display.getDisplay(this).setCurrent(splashScreen, choosePieceScreen);

  此任务在ChoosePieceScreen类中实现,主要的功能有对角色图标的装载显示、对选定角色的确认等。在其构造函数中首先指定当前界面为列表选择方式,然后通过append()将装载的图象与相应的列表文字建立关联。最后,为了响应用户的输入选择还必须调用setCommandListener()来检测按键事件的发生,并在commandAction()方法中实现对选定角色的确认:

super("请选择:", List.IMPLICIT); // 设置列表选择
this.midlet = midlet;
append(CAT_TEXT, loadImage("/cat.png")); // 添加图象选项到列表
append(RABBIT_TEXT, loadImage("/rabbit.png"));
setCommandListener(this); // 侦听按键响应
……
public void commandAction(Command arg0, Displayable arg1) {
 if (arg0 == List.SELECT_COMMAND){
  // 检测是否为列表按键响应
  // 检测用户选中的选项
  boolean isPlayerCat = getString(getSelectedIndex()).equals(CAT_TEXT);     
  midlet.choosePieceScreenDone(isPlayerCat); // 进入游戏画面
 }
}

  这里是通过检测用户选择的列表项文字来判断玩家选择的是花皮猫还是流氓兔并通过变量isPlayerCat来标识,在choosePieceScreenDone()方法中新建一个GameScreen对象并将其作为当前显示界面来开始一局新的游戏。GameScreen类负责游戏界面的绘制,如对棋盘和双方棋子的绘制以及对光标移动的处理等工作。

  游戏界面编程

  对弈游戏最主要的界面就是棋盘与棋子的绘制。这首先要根据屏幕大小计算棋盘网格间距和棋子的大小:

screenWidth = getWidth();// 获取屏幕大小
screenHeight = getHeight();
if (screenWidth > screenHeight) {// 计算网格大小
 boardCellSize = (screenHeight - 2) / 3;
 boardLeft = (screenWidth - (boardCellSize * 3)) / 2;
 boardTop = 1;
}else{
 boardCellSize = (screenWidth - 2) / 3;
 boardLeft = 1;
 boardTop = (screenHeight - boardCellSize * 3) / 2;
}

  绘制棋盘时,首先用背景色清空整个画布然后再分别按行列绘制出黑色网格即可:

g.setColor(WHITE);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setColor(BLACK);
for (int i = 0; i < 4;i++) {
 g.fillRect(boardLeft, boardCellSize*i+boardTop,(boardCellSize*3)+2,2);
 g.fillRect(boardCellSize * i + boardLeft, boardTop, 2, boardCellSize * 3);
}

  棋子的绘制可以通过在指定位置显示装载的图象来实现。例如,对于花皮猫棋子的绘制可按如下代码先装载预先准备好的图象(大小须与网格相匹配)然后再调用drawImage方法在指定位置绘制。对于流氓兔棋子的绘制只需更改待装载的图象即可:

private void drawCat(Graphics g, int x, int y) {
 Image image = null;
 try {// 装载图象
  image = Image.createImage("/cat.png");
 }catch (Exception e) {}
 g.drawImage(image, x + 1, y + 1, 0); // 在指定位置绘制图象
}

  至于对移动光标的处理,可以先在将要移动到的网格内侧绘制一个新的、四边与棋盘网格紧密相连的黑色矩形框,然后再在原网格位置用原网格背景进行重绘以擦除上次绘制的光标痕迹。在擦除旧光标痕迹时首先需要判断该位置是空白还是绘制有棋子图案,并根据判断结果绘制白色矩形或是重新装载当前显示的棋子图象。图4给出了几个回合后的游戏截图,只要游戏没有结束,上述绘制模块将会多次反复调用执行。如果程序的智能控制部分判断出游戏已经结束并给出胜负结果,则不再显示棋盘界面而是通过下面这段代码以特定的字体在白色画布上绘制出当前战绩(如图5所示)。

Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); // 设置字体
int strHeight = font.getHeight();
int statusMsgWidth = font.stringWidth(statusMsg);
int tallyMsgWidth = font.stringWidth(tallyMsg);
int strWidth = tallyMsgWidth;
if (statusMsgWidth > tallyMsgWidth)
strWidth = statusMsgWidth;
int x = (screenWidth - strWidth) / 2; // 计算字符绘制位置
x = x < 0 ? 0 : x;
int y = (screenHeight - 2 * strHeight) / 2;
y = y < 0 ? 0 : y;
g.setColor(WHITE); // 白色清空画布
g.fillRect(0, 0, screenWidth, screenHeight);
g.setColor(BLACK); // 黑色显示信息
g.drawString(statusMsg, x, y, (Graphics.TOP | Graphics.LEFT));
g.drawString(tallyMsg, x, (y + 1 + strHeight), (Graphics.TOP | Graphics.LEFT));

  在显示此界面时,如果用户按下退出或开始键,则在commandAction方法中将通过如下代码分别执行程序退出处理或是重新开始下一局新的游戏:

if (arg0 == exitCommand) // 退出
 midlet.quit();
else if (arg0 == newGameCommand) // 开始游戏
 initialize();


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
,移动开发相关内容,移动开发焦点新闻
  • Eclipse开发J2ME程序之插件安装
  • Eclipse开发J2ME程序之安装配置
  • MVC在J2ME项目中的应用之MVC慨述
  • Eclipse开发J2ME手机程序之简介
  • 通过实例论证J2ME的事件传输机制
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,移动开发Advertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价