Java手机游戏开发简明教程 (SunJava开发者认证程序员 郎锐)

初稿发布时呢:2008-07-30 —— 来源于本人的百度文章 [由于搬家工具导入]

Java手机游戏开发实例简明教程

(SunJava开发者认证程序员 郎锐)
平等、手机游戏编写基础
1.手机游戏设计之中坚规则
  时,市面上之手机无论在拍卖能力要以储存容量高达都不足和PC机相提并论,但为足以支撑一个统筹优化的微型游戏程序的运作。加上其的大网通信能力,甚至还可以支持有同对战斗能力的网络游戏。正是出于硬件配备的大幅度差距,才直接造成了手机游戏开发及俗游乐支付之庞差距。
  鉴于手机游戏与俗娱乐支付的伟差异,并考虑到当其运行载体的手机的莫过于局限性,在进展手机游戏的统筹时为发生必须依照的口径,即有限的游艺时间;缩短等待时;精干的次序;寻求最特别的兼容性。
  手机当一如既往种典型的MIDP设备,其能供应是发生度的,在规划游戏常常当为用户提供一个点滴的游戏时间,以免游戏时间了长而大气吃一定量的能源。例如,可以管嬉戏时限制于几细分种中完成或者将那个分割也多阶段分次进行。
  鉴于手机游戏的处理速度不可能太快的客观事实,为涵养打的顺风进行,就亟须尽量缩短游戏受的等候时,尤其是于规划基本上人口合伙游戏常常肯定要是小心是问题。而且由于存储空间的范围,也要求统筹能的次,否则将招致支出之玩耍为过分臃肿而无法在大哥大执行。
  也手机游戏寻求最深的兼容性也是产生必不可少之。由于不同型号,不同式样的无绳电话机不仅支持之J2ME
SDK(Java 2 Micro Edition
SDK)不同,屏幕尺寸及按键等啊都设有出入。一舒缓好的嬉戏而因底部的莫兼容而囿于为某个同迟迟机型显然是同等种植浪费,其实游戏的脚本、流程设计等全不用转,只待对任何一系列的手机换必要之低层处理便足以将玩之市场展开及另外机型。
2.手机游戏的落实技能
  虽然J2ME对手机游戏的付出已成主流,但并无是说只有J2ME能够出手机游戏,除此之外还有嵌入式和不够消息等另几种手机游戏实现技术:
  嵌入式游戏是凭于手机出厂时即已固化于芯片中之游乐。早期手机提供的娱乐大多是这无异于好像娱乐。由于这种技术不同意用户自由更新游戏,所以就看似娱乐高速便让裁了。
  短消息娱乐是冲手机短信息服务(SMS)的手机游戏,通过奔娱乐服务商的服务器发送简短的文消息来取从游戏服务器反馈的结果信息。由于这种游戏是纯文本交互形式,因此普通较乏味且输入烦琐,游戏成本比高(通常1长长的短信0.1长)。
  随着Java技术的开拓进取同Java手机的推广应用,使手机游戏进入J2ME时代。这种简化本的Java极大地提高了手机对戏之支撑能力,它抱有比嵌入式和缺乏消息手机游戏更为完善的界面,而且允许使用子图形动画。J2ME手机程序已经变为当下最佳的移动游戏开发条件,本文为正是围绕在J2ME技术拓展对手机游戏开发进程的介绍。
3.《赛车》游戏之本子设计
  本文将朝着大家介绍一磨蹭跑车游戏之造作过程。这是平等悠悠典型的体育竞技类游戏,它坐公路作为赛车场地,选手为同辆跑车,障碍物为于公路放置的炸弹。由于单独布置了扳平部跑车,所以制定的游戏规则不因为速度取胜,而是遵循玩家规避障碍物的灵活程度来积分。这可用玩家安全驾车的时长来度量,因为玩家游戏得越来越熟练,其规避障碍物的一手也就再度灵活,安全驾驶的时光呢就算越长。
  由于手机屏幕小,表现能力有限,而且于大哥大及也从来不供其他软硬件图像处理加速,所以在大哥大玩耍被无可能追求PC机的表现作用。在追求视觉效果的同时,应尽量做到简约。
  本游戏实例采用的是二维图形表现形式,以直无转弯的公路作为赛道。玩家将得以经过手机方向键控制赛车的横倒,以避开随机布置以赛道上的炸弹,炸弹在肆意布置后用不再运动。如果赛车的随意部分以及炸弹相接触就被判定为触弹爆炸,本局游戏结束。
第二、配置Eclipse开发条件
  于行使任何一样栽语言进行编程时还距离不起来出条件,Java语言也非差,这里拿于大家介绍一种很有名的支出条件——Eclipse。
1.Eclipse基础
  (1)认识Eclipse
  Eclipse是一个盛开源代码的、与NetBeans、Sun ONE Studio和Borland
Jbuilder类似的同等栽基于Java的整合型可扩大开发平台。就该自我而言,它只有是一个框架和千篇一律组服务,用于通过插件组件构建出环境。幸运的凡,Eclipse
附带了一个业内的插件集,包括Java开发工具(JDT)。其未来底靶子不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系布局,通过开插件,它亦可扩大及其他语言的开支,甚至能够变成图片绘制的家伙。
  难能可贵的凡,Eclipse是一个放源代码的路,任何人都得以下载Eclipse的源代码,并且以斯基础及开发协调之职能插件。也就是说未来一经有人欲,就会见生出树以Eclipse之上的COBOL、Perl、Python等语言的支付插件出现。同时可透过出新的插件扩展现有插件的效果,例如,为了进行手机应用程序的开销,本文所涉及到的《赛车》游戏就是是由此J2ME插件的扩充来加以落实的。
  (2)Eclipse的组织结构
  Eclipse是一个盛开源代码的软件开发项目,它小心让为高度并的工具开发提供一个统效的、具有商业品质的工业平台。它至关重要是因为Eclipse项目、Eclipse工具列和Eclipse技术项目等成,具体包括Eclipse
Platform、JDT、CDT和PDE等4独片。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse
Platform则是一个绽放的而是扩大IDE,提供了一个通用的支付平台。它提供建造块和结构并运行并软件开发工具的根基。Eclipse
Platform允许工具建造者独立开发以及人家工具无缝集成的工具从而无须分辨一个工具功能于哪了,而其余一个家伙功能以何开始。
  Eclipse SDK(软件开发者包)是Eclipse
Platform、JDT和PDE所生产的零部件合并,提供了一个装有丰富特性的开支条件,允许开发者有效地打好无缝集成及Eclipse
Platform中之家伙。Eclipse
SDK由Eclipse项目生产的工具和来源其它开放源代码的老三正软件组合而成。Eclipse项目生产的软件为CPL发布,第三方组件有独家自己的许可协议。
2.Eclipse之下载和安装
  通过前的牵线,我们了解及Eclipse是同样款好良好和知名的开源项目。你唯有需要登陆Eclipse官方网站(www.eclipse.org)就足以免费得这款好的开支环境。
  进入主页后单击“Downloads”链接,将现出镜像列表页面,从中选择于近之镜像点并登下载页面,目前风行版本也3.0.1)。一般情形下,Eclipse同时提供了Release、Stable
Build、Integration Build和Nightly
Build等多只下载版本,建议下载Release或Stable版本。这里选择Release版本。
  进入该本的下载页面,单击“eclipse-SDK-3.0.1-win32.zip”链接进行安装包下载(针对Windows平台)。同时,单击“eclipse3.0.1-SDK-win-LanguagePackFeature.zip”链接下载对应之多国语言包插件以贯彻软件之本地化。
  安装Eclipse的步调非常简单:你只有待用下载的装压缩包仍原路直接解压即可。之后将多国语言包解压缩,并拿解压得到的“plugins”和“features”文件夹去蒙解压到Eclipse安装目录下“eclipse”文件夹下之同名文件夹即可。如果手上操作系统的JRE环境安装是无误,运行Eclipse.exe将进其默认界面。
  注意:这里的前提是JRE环境的安是无误,由于Eclipse本身是故Java语言编写的,而下载的装置压缩包着并无含Java运行环境,因此需要用户自己重新安装JRE,并且用以操作系统的环境变量中指明JRE中bin的路。如果上述设置不得法,Eclipse将无法正常运作。另外,由于Eclipse版本升级较快,如果产生创新版本,需先删除旧本子重新安装,而未克一直解压到本的不二法门覆盖旧本子。
3.局部必要之安排
  (1)配置JRE
  为了保证Eclipse的正常化运行,我们要安排JRE。你可装Sun的JDK或IBM的JDK,推荐应用1.4之上版本。因为只有利用1.4之上版本的JDK才堪享到新增的HotSwap功能于调试带来的有益。这里,我们应用Sun公司之1.5.0版本JDK,你可于Sun公司官方网站http://java.sun.com免费下载。
  (2)安装J2ME SDK
  也能够确保手机应用程序的开支,你还须装J2ME SDK。Sun公司之J2ME
Wireless Toolkit(WTK)便是常用的同样缓慢J2ME
SDK,它提供了运转J2ME应用程序所欲的仓库和模拟器等,通过她可以展开次的编译、校验、运行。有关WTK的音但查询http://java.sun.com/products/j2mewtoolkit。
  时,J2ME Wireless
Toolkit共分3只版:1.0.4、2.0和2.1。其中,1.0.4本就会开MIDP
1.0顺序,2.0版可支付MIDP 2.0应用程序,2.1版本虽可以同时出MIDP
1.0、JTWI、自定义等3种环境。需要小心的凡,并非版本更强越好,必须看需求不同而挑选适当的本子,才会出有好当真机上运行的MIDP应用程序。这里选用的是WTK
2.1,你不过打Sun公司官方网站免费下载,按默认方式安装该工具确保并记下其安装路径以便以后当安装EclipseMe插件时采取。
  这里用选用Sun公司之J2ME Wireless
Toolkit产品,是因如此开发出的手机软件可以有双重怪之通用性。如果你一味是出于为和谐的爱机DIY应用软件之目的,则完全好依据自己运手机的型号从相应厂商网站下载和的相应之J2ME
SDK,这样开发出的手机软件能够以更出色的法子以真机运行。目前有的老之无绳电话机厂商开发的特定J2ME
SDK主要出:Nokia的Nokia DEveloper’s
Suite与Nokia各款手机专属SDK;SonyEricsson的SonyEricsson J2ME
SDK;Siemens的Siemens Mobility Toolkits等。
4.J2ME插件EclipseMe的安装
  通过者的牵线,你本该知道:对手机先后的支付实际为就是当对J2ME项目的付出。虽然上面我们针对环境开展了安排,使该会支持J2ME开发,而且Ecilpse使用起来颇好,但立刻对J2ME开发的支持或远远不够。下面,我们将透过也Eclipse安装一个开发J2ME程序的插件EclipseMe来圆手机应用程序开发之结尾一起准备工作。
  时,EclipseMe的时髦版本为0.5.5(eclipseme.feature_0.5.5_site.zip),你可登陆SourceForge网站http://eclipseme.sourceforge.net/免费下载。
  进入SourceForge网站后单击“Downloads”链接进入产品下载页面,该页面列有任何本的EclipseMe插件与一些本的自程序代码。单击需要下载的eclipseme.feature_0.5.5_site.zip,将起下载镜像列表页面,你可从中选择距离比近之镜像站点进行下载。
  对于EclipseMe
0.5.0版本及重新早版本的装置,可以下载后直将该解压到Eclipse安装目录下的“plugin”文件夹下即可生有益地就对插件的装。但是到了0.5.5本之后,EclipseMe的装置方式产生了于充分转变,再用以前的法将无能够成功安装插件。下面将让出EclipseMe这同样版插件的切实可行装过程:
  启动Eclipse,单击“帮助→软件更新→查找并安装……”菜单命令,打开“安装/更新”对话框,选中“搜索要装的新力量部件”选项。单击“下同样步”按钮。
  于起的对话框中单击“新建本地站点……”按钮,在开辟的对话框中指定EclipseMe压缩包的脚下解压路径,然后拿会晤以“要连以摸着的站点”列表中出现因为当下指定目录也名称的站点项目。选中该品种,展开其树型结构,可以看见该子项EclipseME也叫同时入选。单击“下一样步”按钮。
  提示:最好将EclipseMe压缩包解压到一个路线名遭不包含汉字之文书夹下,例如,E:\EclipsMe\产,否则恐怕会见以安过程被出现一些意外景象要伤安装过程的胜利的开展。
  在出现的对话框中选中“EclipseME”按钮。单击“下一致步”按钮。在产出的对话框中单击“我奉许可协议中的条文”选项。单击“下一致步”按钮。在出现的对话框中指定Eclipse插件而设置至之门路,你得单击“添加站点”按钮,在出现的对话框中选择其他途径(最好还是安装至Eclipse的装置目录下),单击“确定”按钮完成即可。
  为查看EclipseMe插件是否成功安装,你可以于更启Eclipse后单击“窗口→首选项”菜单命令,打开“首选项”对话框。在左窗口看到J2ME件就标明EclipseMe插件都打响安装。

 

在“首选项”对话框中进行配置

5.针对EclipseMe插件的布置
  为了使新装置之EclipseMe插件能够正常工作,需要针对那个进展布局。展开J2ME项,选择“Platform
Components”子项,在右侧窗口中将同步显示其详细布置。右键单击“Wireless
Toolkits”选项,选择“Add Wireless
Toolkit”命令,在开辟的对话框中单击“浏览”按钮,在起的对话框中指定先前安装的Wireless
Toolkit路径。如果路径指定正确且Wireless
Toolkit也设置是,此时EclipseMe将自动检测出拖欠目录所装的Wireless
Toolkit的版本,并展示在编辑框的花花世界。单击“完成”按钮,在“首选项”对话框右侧的布窗口中将展示该Wireless
Toolkit所支撑之有的特征。如果你是对准某同机型的无绳电话机进行付出,可以还上面的手续将另外厂商的无线开发工具包添加其中。
其三、搭建游戏框架
1.创建J2ME项目
  在Eclipse中首先创建J2ME MIDlet
Suite项目“Racing”,所有继续之编码、调试以及运行都是当这个工程被进行。
  启动Eclipse,单击“文件→新建→项目”菜单命令,在打开的对话框中开展“J2ME”选项,选中“J2ME
Midlet
Suite”子项后单击“下同样步”按钮。在出现的对话框中安装项目名称和类别存放路径,一般保持默认路径即可。单击“下同样步”按钮。
  于起的对话框中对应用程序所支撑之MIDP版本进行点名。如果设想兼容性好择“J2ME
Wireless Toolkit 2.1 MIDP 1.0 platform”选项。当然,你吧足以挑选“MIDP
2.0”选项。单击“下同样步”按钮。
  在起的对话框中针对Java构建设置进行定义,通常保持默认值即可。单击“完成”按钮,EclipseMe将活动安装好项目的编撰和运行条件。你可以导航器视图中单击刚才创建的种类,在右边编辑视图中拿得以查看EclipseMe生成的品类布局。

 

查创建的类型

2.创造J2ME应用程序
  上面创建的MIDlet
Suite,一般也如作MIDlet应用程序套件,它可涵盖一个要么多只MIDlet,只是于昭示时凡因MIDlet
Suite为单位开展,我们的部分实质性的干活且是在MIDlet中完成的。因此,需要连续添加J2ME
MIDlet项“RacingMIDlet”到花色中。
  在导航器上单击鼠标右键,选择“新建→其他”菜单命令,在开拓的对话框中展开“J2ME”选项,选中“J2ME
Midlet”子项后单击“下一样步”按钮。在产出的对话框中指定包(也可以保持默认值)和名称,单击“完成”按钮后,EclipseMe将自动生成框架代码,并将新创造的RacingMIDlet类以如下代码进行编辑:
  public class RacingMIDlet extends MIDlet {
   public Display display;
   public GameCtrl game;
   public RacingMIDlet() {
   super();
  }
   protected void startApp() throws MIDletStateChangeException {
   // 获得Display
   display = Display.getDisplay(this);
   // 获得Displayable
   Displayable current = display.getCurrent();
   if (current == null) {
   // 装载logo图像
   Image logo = null;
   try{
   logo = Image.createImage(“/logo.png”);
   }catch (IOException e) { }
   // 显示logo
   Alert splashScreen = new Alert(null,
“郎锐2005年作\n版权所有(c)\n2005–2006”, logo, AlertType.INFO);
   // 延迟4秒
   splashScreen.setTimeout(2000);
   //新建ChooseDemo对象
   game = new GameCtrl(this);
   // 显示闪屏界面
   display.setCurrent(splashScreen, game);
   }else {
   // 显示当前界面
   display.setCurrent(current);
   }
   }
   protected void pauseApp() {
  }
   protected void destroyApp(boolean arg0) throws
MIDletStateChangeException {
   }
   public void quit() throws MIDletStateChangeException {
   // 退出程序
   destroyApp(false);
   notifyDestroyed();
   }
  }
  这里透过一个Alert信息封锁就对闪屏界面的示,所用的位图logo.png在初步好暂用临时图像取代,最后再由图画完成的正统图像替换。
  因为戏主题吧赛车,因此本例使用的logo位图太好显示有赛车的图标,并助以拥有艺术字效果的玩乐名称。图标可以生有益于地下载得到,而玩耍名称的点子字效果一般如果出于开发人员自己形成。除了可应用正规的筹划软件外,还而采取简单种植不同颜色书写和书、同大小的娱乐名称,然后用深色文字置后,浅色文字错位少许后放置于前台的计通过视觉错觉来兑现立体字的功能。最后更同图标合成到平等摆PNG格式的位图,即可到位一个略logo位图的制作。

 

Logo制作过程表示

  编辑了后,Eclipse将唤起有差不多处错误在,这至关重要是由于GameCtrl类还尚未增长造成的。接下来,向工程长于Canvas类继承的GameCtrl类,并编制其类为如下代码,以保留于RacingMIDlet类传入的MIDlet对象和指向命令按键、方向按键的增长与响应:
  public class GameCtrl extends Canvas implements CommandListener{
   private final Command startCommand;
   private final Command quitCommand;
   private final RacingMIDlet midlet;
   public GameCtrl(RacingMIDlet midlet) {
   super();
   // 保存MIDlet类对象
   this.midlet = midlet;
   // 添加命令按键
   quitCommand = new Command(“退出”, Command.EXIT, 2);
   addCommand(quitCommand);
   startCommand = new Command(“开始”, Command.OK, 1);
   addCommand(startCommand);
   // 侦听按键响应
   setCommandListener(this);
   }
   protected void paint(Graphics g) {
   }
   public void commandAction(Command arg0, Displayable arg1) {
   if (arg0 == startCommand){
   // 用户开始打
   initialize();
   }
   if (arg0 == quitCommand){
   // 用户退娱
   try{
   midlet.quit();
   }
   catch(MIDletStateChangeException e){}
   }
   }
   private void initialize() {
   }
   protected void keyPressed(int keyCode) {
   // 得到按键动作
   int gameAction = getGameAction(keyCode);
   switch (gameAction) {
   case RIGHT:
   break;
   case LEFT:
   break;
   default:
   break;
   }
   }
  }
  这里除了新增的keyPressed()方法外,与原先介绍了的先后框架并无太死之出入。这个keyPressed()方法要用来捕获用户的手机按键,由于当跑车开时才需要控制其左右活动方向即可,因此此才对getGameAction
()方法返回的键值与RIGHT和LEFT进行较。稍后将不辱使命这点儿只分支的功能实现。
季、实现休闲游界面
  由于用跑车游戏抽象为场地、选手与障碍物,因此于打闹之界面实现时也至关重要围绕这3单中心进行。
1.兑现场地界面
  由于这里的公路是平直无转弯无路口的,因此展现到二维平面上即是一个矩形。可以想像,如果一味以大哥大屏幕显示一个矩形,无论填充啊颜色,都颇麻烦让人联想到是如出一辙长条公路。为了见有公路之性状,不妨在公路中绘制一漫长隔离车道用底斑点线。由于在比赛进行经常,赛车与公路中间是互运动的,而作游戏的中坚,赛车一定是休能够盖玩家视线的。也就是说,赛车应当尽高居屏幕显示范围之内,这样一来,为了呈现赛车的动,就得让公路动起来。一个简约的办法是,在绘制公路中间的斑点线时对同一位置的点进行轮流绘制。

 

简而言之展示公路特征

  可能于纸面上老麻烦了解这样简单的处理怎么能有公路想后移动的效用,不妨将直达图的公路中线看作13截连接的LED灯管,开始时也奇数的灯管点来得,为偶数的熄灭。接下来点亮的灯管熄灭,熄灭的点亮,如此频繁,正而街头的霓虹灯,可以通过对灯管点来得、熄灭的决定来兑现同种植运动的视觉错觉。在代码实现上而在paint()方法中上加如下代码来实现对公路中线的绘图:
  // 绘制动态公路中线
  g.setColor(0, 0, 255);
  if (lineMode == true){
  lineMode = false;
  for (int i = 0; i < height; i += 20)
  g.drawLine(width / 2, i, width / 2, i + 10);
  }else{
  lineMode = true;
  for (int i = 10; i < height; i += 20)
  g.drawLine(width / 2, i, width / 2, i + 10);
  }
  其中,通过lineMode变量对虚线的绘图模式展开支配,width和height分别吗屏幕的大幅度与冲天。在构造函数中分头通过getWidth()和getHeight()方法得到。为了能以固定时间距离周期性地调用paint()函数,可每当次初始化方法initialize()中创造一个定时器,并在定时器的施行方法run()中上加repaint()方法以好对paint()函数的周期性调用。有关定时器的创,可先行为工程长一个根据TimerTask类的新类NextFrame,用于周期性定时执行任务。并于GameCtrl类添加其类声明和另外一个Timer类的靶子:
  private Timer timer = new Timer();
  private NextFrame nextFrame;
  于得被定时器时,以nextFrame对象啊参数去调用Timer类的schedule
()方法并点名时间距离即可:
  nextFrame = new NextFrame(this);
  timer.schedule(nextFrame, 300, 300);
2.落实炸弹和赛车界面
  炸弹和赛车的界面实现,可以由此调用低级类Graphics中的相关绘图方法来绘制,也得以经过展示位图的办法来贯彻。前者几乎不占用内存,但绘制过程繁琐,后者的示方式相比要简明过剩但也要霸占少量的内存。这里,我们选用后者。

 

炸弹和赛车示意

  首先准备及图所出示之星星点点摆PNG格式位图并以那个补偿加至工程中。炸弹和赛车作为本游戏的支柱,其图像于玩耍过程中将被数利用,因此,为方便使用可拿和当时片个图相关的Image对象定义为公有型的切近成员变量。并以看似构造函数中形成对位图文件的装载:
  try{
  // 装载炸弹图像
  bombImage = Image.createImage(“/bomb.png”);
  // 装载赛车图像
  carImage = Image.createImage(“/car.png”);
  }catch(Exception e) {}
  对于这种Image对象的绘图,可运Graphics类成员函数drawImage()方法,该方式的采取方法在前文已出过详尽介绍。由于赛车需要横平移,炸弹也要在让随意放置后连从屏幕滑了,因此于绘制Image对象时,其职务最好会由此公有型的切近成员变量来安装。这样就得于一个特别的主宰方式中针对赛车和炸弹的展示位置展开调整,而以paint()方法被单独担负对图纸进行绘图,从而实现对娱乐效果的模块化划分。下面就段赛车与炸弹图像的绘图代码用坐分别图像的骨干位置吗基准点进行绘图,共得同样辆赛车和季蔸炸弹的屏幕绘制:
  // 赛车水平位置
  public int carPos = 0;
  // 炸弹位置
  public int[] bombPosX = {0, 0, 0, 0};
  public int[] bombPosY = {0, 0, 0, 0};
  // 炸弹是否出界
  public boolean[] bombCanUse = {false, false, false, false};
  ……
  // 绘制赛车
  g.drawImage(carImage, carPos, height – carImage.getHeight(),
Graphics.HCENTER | Graphics.VCENTER);
  // 绘制炸弹
  for (int i = 0; i < 4; i++){
   if (bombCanUse[i] == true)
   g.drawImage(bombImage, bombPosX[i], bombPosY[i],
Graphics.HCENTER | Graphics.VCENTER);
  }
  这里的bombCanUse数组用来对脚下炸弹是否出界予以标识,这里所说之炸弹出界并无是依靠炸弹时岗位超出屏幕范围,而是以实事求是屏幕上方另设同一连续的和诚屏幕等死之、可用来随便放置炸弹的杜撰屏幕。此虚拟屏幕及诚实屏幕的并集才是炸弹的有效区域。凡是获得于这个区域外之炸弹都反对销毁,如果生炸弹移出有效区域,则以炸弹放置区重新随机放置一枚,始终维持炸弹中区域外之炸弹总数也4只。

 

炸弹中区域示意

  最后,一定要记在paint()方法开始绘制下一场景之前经过下的清屏语句擦除当前光景的示。否则,在戏耍开始后随着各种角色的倒,屏幕将改为一个“大花脸”。
  // 白色清空画布
  g.setColor(255, 255, 255);
  g.fillRect(0, 0, width, height);
五、角色移动及碰撞检测
  前照游戏的骨架和界面都曾经落实,但这之游玩还毫无生气,因为我们还尚未实现该神魄。接下来将进行的角色移动与碰撞检测将能使打中之中坚动起来,并能够通过对脚下游玩状态的检测来机关判断游戏是否得了。
1.角色移动
  (1)移动赛车
  由于道路的动是通过轮班绘制公路中线所招的错觉来兑现之。因此,实际真正需要活动的角色只有炸弹和赛车。本例将坐赛车为极,它始终处于屏幕下方,玩家可通过手机左右方向键实现对赛车的左右挪。显然,对赛车的动决定总体由于玩家操纵,其控制代码只会于keyPressed()方法对不当、右按键的分段处理面临落实。由于当以前的设计着贯彻了展示和控制的诀别,因此当此只有待对表示赛车水平位置的carPos变量取值进行改动即可。为防范赛车移有屏幕,需要添加必要的越界保护代码:
  // 得到按键动作
  int gameAction = getGameAction(keyCode) switch (gameAction) {
  case RIGHT:
   // 右变赛车
   carPos += 5;
   // 防止越界
   if (carPos > width – carImage.getWidth() / 2)
   carPos = width – carImage.getWidth() / 2;
   break;
  case LEFT:
   // 左移赛车
   carPos -= 5;
   // 防止越界
   if (carPos < carImage.getWidth() / 2)
   carPos = carImage.getWidth() / 2;
   break;
  default:
   break;
  }
  // 重绘屏幕
  repaint();
  (2)移动炸弹
  以及赛车不同,炸弹的走决定是因为手机全权负责。只要打在运行,炸弹就未鸣金收兵的由屏幕上方滑落,对于接近的处理该到由定时器任务类成就相关操作。NextFrame类成员方法run()将以定时器每次给触发时调用。
  于拍卖炸弹移动时,首先对炸弹是否高于有效区域展开检测。由于起运行时屏幕没有炸弹,所以可以将那个当做超出有效区域进行拍卖。对于这种场面,首先通过Random类的nextLong()方法获得两独随机数,然后分别坐屏幕宽度与高度为模进行取模运算,其结果经越界限制后用作炸弹的起来设置坐标。在每安装同一棵炸弹后如若立马针对该炸弹所对应之bombCanUse元素设置炸弹中值,以以连续的拍卖中执行下落显示。
  及赛车的横活动类,炸弹的大跌可以通过持续追加其纵坐标来实现。只是在降低过程中不要进行越界保护处理,如果炸弹通过有效区域便透过bombCanUse将该标志为无效。将在生自然时周期更前面的进程:
   for (int i = 0; i < 4; i++){
   // 炸弹没显示时设置初始位置,显示后水平位置一定
   if (gameCtrl.bombCanUse[i] == false){
   // 随机设置炸弹初始位置
   int x = (int)(rand.nextLong());
   x = (int)(x % gameCtrl.width);
   gameCtrl.bombPosX[i] = x;
   int y = (int)(rand.nextLong());
   y = (int)(y % gameCtrl.height);
   // 将炸弹装置于编造屏幕
   gameCtrl.bombPosY[i] = -y;
   // 限制炸弹水平位置
   if (x < bombWidth)
   x = bombWidth;
   if (x > gameCtrl.width – bombWidth)
   x = gameCtrl.width – bombWidth;
   // 标志第i单炸弹进入可视区
   gameCtrl.bombCanUse[i] = true;
   }else{
   // 炸弹下移
   gameCtrl.bombPosY[i] += 3;
   // 炸弹出界检测
   if (gameCtrl.bombPosY[i] > gameCtrl.height + bombHeight / 2)
   gameCtrl.bombCanUse[i] = false;
   }
  }
  如果此时运作程序,虽然好实现赛车在遍布有炸弹的公路及行驶的效益,而且玩家也足以操纵赛车的前进方向,但却在一个沉重之通病——当赛车和炸弹相撞时,炸弹依旧跌,赛车还行驶,好像什么还无发生同样。这是由没有呢戏上加碰撞检测代码所给。
2.碰撞检测
  碰撞检测是戏受常常利用的同样种重点算法。用于检测游戏被的片物体是否有表面接触,例如,子弹是否命中歹徒,炮弹是否击中目标等等。只有进行了碰撞检测才发会以产出上述情况后实现歹徒被击毙、目标为损毁等结果。

 

炸弹和赛车发生撞击示意

  上图显示了炸弹和赛车发生碰时之拥有可能情况。从图备受可以看,只要炸弹意进入图被之虚线矩形框就定和赛车发生了碰撞。对本游戏而言,发生了碰撞即表示赛车被炸毁,游戏了。所以,在炸弹落过程遭到易于写来如下碰撞检测代码:
   // 碰撞检测
   if (gameCtrl.bombPosY[i] + bombHeight / 2 >= gameCtrl.height –
carHeight * 3 / 2 && gameCtrl.bombPosY[i] – bombHeight / 2 <=
gameCtrl.height – carHeight / 2 && gameCtrl.bombPosX[i] + bombWidth /
2 >= gameCtrl.carPos – carWidth / 2 && gameCtrl.bombPosX[i] –
bombWidth / 2 <= gameCtrl.carPos + carWidth / 2){
   // 结束游戏
   gameCtrl.isGameOver = true;
   // 关闭定时器
   cancel();
   }
  其中,carWidth、carHeight、bombWidth和bombHeight变量分别是经carImage和bombImage对象调用各自的getWidth()和getHeight()方法要回得到的赛车图像尺寸以及炸弹图像尺寸。如果发碰,将经过公有型的boolean类型变量isGameOver来指示游戏之扫尾。同时调用TimerTask类成员方法cancel()关闭先前安的定时器。
  对于非胜负类游戏,由于当耍了时并不曾高出方,所以一般还是盖积分的样式报告给玩家当前企业所获得的分数。对于本例,分数显然是与安康驾驶时间变为正比的,在程序实现时,可以于定时器每次触发run()方法时对积分进行添加,并当娱乐了时通过下述代码以信息框的花样拿眼前积分反馈让玩家:
  isGameRun = false;
  // 显示logo
  Alert result = new Alert(“本局积分”, String.valueOf(score), null,
AlertType.INFO);
  // 延迟4秒
  result.setTimeout(2000);
  // 显示闪屏界面
  midlet.display.setCurrent(result, this);
  经过上述辛勤工作,一慢慢悠悠真的J2ME手机游戏程序都形成!
六、测试和颁布游戏
  单击“运行→运行”菜单命令,在开辟的对话框左侧配置窗口中右键单击“Wireless
Toolkit
Emulator”选项,选择“新建”命令,在对话框右侧将显示相应的运行配置选项。一般可涵养默认设置,也可以“Emulation银河至尊游戏官网”选项卡中对默认设备进行点名。通常选择“DefaultClolorPhone”选项即可,其学的是当彩屏手机上的运作效果。由于当下支撑Java的无绳电话机般配备都不是不行没有,绝大多数乎都是彩屏配置,因此“DefaultClolorPhone”选项应该是较大众。当然,你呢得以设置“DefaultGrayPhone”等其余选择以套在单色或其它安排的无绳电话机及之运作效果。
  最后,单击“运行”按钮执行我们创建的赛车游戏。
  当然,本例作为同一款教学性质的嬉戏实例,没有做最好多之一揽子和优化。给你养了比较生之戏扩大空间。你得当本游戏基础及尝试进一步的扩大以及改,例如,增加前后方向键以仿加大油门和刹车;另外多有参赛车辆;根据玩家游戏进行时间的尺寸动态调整游戏难度,包括加快车速、增加障碍物等等。代码编写无误后得以先以PC上之模拟器中运行调节,并对出现的题目开展改动,一切对后更于包发布。

相关文章