快速业务通道

使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
何不试试将它们移植到手机上呢?通过前面的介绍,不难看出,这些经典的2D游戏都可以使用上面的几个类来概括:飞机、子弹、敌人都是Sprite,大海、天空、森林、沙漠都是TileLayer,我们所面临的难题,就是搜集和制作图片素材而已。

这里的实例是“是男人就下一百层”的手机翻版,下载地址:http://www.j2medev.com/Soft/src/game/200610/802.html,作者不详,反正不是我。下面是运行效果图:

使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱 - 编程入门网

使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱(2)

时间:2011-01-18 海边沫沫

首先,我们看一看程序的起点,也就是我们的MIDlet类,在这个程序的LRunner类的构在函数中,创建了一个gameCanv对象,如下:

public LRunner() { dp=Display.getDisplay(this); gc=new gameCanv(); dp.setCurrent(gc); }

然后,在commandAction()函数中,这样启动游戏:

public void commandAction(Command c,Displayable d) { if(c==cmd_exit) { try { destroyApp(false); }catch(Exception e){} notifyDestroyed(); } if((c==cmd_start)&(!gc.getIsOnGame())) { gc.reStart(); } }

于是,游戏的主要逻辑全部交给gameCanv类了,这个类,就是我们前面讲到的GameCanvas类的子类,在这个类中,它实现了Runnable接口,并创建一个新的线程,以实现游戏的主循环,如下:

public void run() //主线程 { isOnGame=true; while(isOnGame) { gameCount++; gameLevelUp(gameCount); try { Thread.sleep(gameSpeed); }catch(Exception e1){} addGameObj(); for(int j=0;j { gfo=(gameFlatObj)objList.elementAt(j); gfo.up(); if(gco==null) { gco=new gameCharObj(gfo.getX(),gfo.getY()); } if(gfo.collidesWith(gco,false)) { isOnFlat=true; gfo.doOnChar(gco); } else { gfo.resetTime(); } if(gfo.getProperties()>1) { gfo.nextFrame(); } gfo.paint(g); } if(gfyo!=null) { if(gfyo.collidesWith(gco,false)) { gfyo.doOnChar(gco); gfyo=null; } else { gfyo.go(); gfyo.nextFrame(); gfyo.paint(g); if(gfyo.getIsBottom()) { gfyo=null; } } } keyPressed(); if(!isOnFlat) { gco.go(); } isOnFlat=false; //*************** if(gameBgCount<0) { gameBgCount++; } else { gameBgCount=-20; } //*************** gco.nextFrame(); gco.paint(g); //*************** drawMenu(g); //*************** g.drawImage(gameTeeth,0,20,0); this.flushGraphics(); chkObjIsTop(); if(gco.isDead()) { setOnGame(false); } } this.flushGraphics(); }

使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱(3)

时间:2011-01-18 海边沫沫

从以上的代码中可以看出,这是一个典型的主循环,它通过调用addGameObj()来随机创建物体,而这些物体中,横板、翻板、传送带、钉板等物体作者将之称为gfo,对应的类为gameFlatObj,而从天而降的圆球称为gfyo,对应的类为gameFlyObj,而这几个类,当然是Sprite类的子类了。在这个主循环中,不难看到gfo.paint(g)和this.flushGraphics()这样的代码,正好和我们前面所说的GameCanvas类实现了双缓冲是对应的。

怎样轮询键盘输入呢?从上面的代码可以看出,作者将轮询键盘事件的代码放到了keyPressed()函数中,我们再来看看这个函数:

private void keyPressed() { int keyState=this.getKeyStates(); if((keyState&GameCanvas.LEFT_PRESSED)!=0) { if(gco!=null) { gco.setCharAct(0,isOnFlat); gco.left(isOnFlat); } return; } if((keyState&GameCanvas.RIGHT_PRESSED)!=0) { if(gco!=null) { gco.setCharAct(1,isOnFlat); gco.right(isOnFlat); } r

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号