使用MIDP20开发游戏.docx
- 文档编号:10435113
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:16
- 大小:77.44KB
使用MIDP20开发游戏.docx
《使用MIDP20开发游戏.docx》由会员分享,可在线阅读,更多相关《使用MIDP20开发游戏.docx(16页珍藏版)》请在冰豆网上搜索。
使用MIDP20开发游戏
使用MIDP2.0开发游戏
(1)GameCanvas基础
MIDP2.0提供了对游戏的强有力支持,通过javax.microedition.lcdui.game包,原来在MIDP1.0中很多需要自己写的功能现在都被当作标准API实现了,包括GameCanvas,Sprite,Layer等等。
我们将使用MIDP2.0编写一个坦克大战的手机游戏,我也是初学J2ME不久,准备边看书边做,争取把这个游戏做出来!
J2ME高手请多指点,和我一样学习中的朋友欢迎多多交流!
我们的开发环境为WindowsXPSP1+J2DK1.4+J2MEWTK2.1+Eclipse3.0+EclipseMe,关于如何配置Eclipse的J2ME开发环境,请参考:
下面是一个最简单的GameCanvas的例子,出自《J2ME &Gaming》:
//MyGameCanvas.java
//编写Canvas类
importjavax.microedition.lcdui.*;
importjavax.microedition.lcdui.game.*;
publicclassMyGameCanvasextendsGameCanvasimplementsRunnable{
privatebooleanisPlay;//GameLooprunswhenisPlayistrue
privatelongdelay;//Togivethreadconsistency
privateintcurrentX,currentY;//Toholdcurrentpositionofthe'X'
privateintwidth;//Toholdscreenwidth
privateintheight;//Toholdscreenheight
//Constructorandinitialization
publicMyGameCanvas(){
super(true);
width=getWidth();
height=getHeight();
currentX=width/2;
currentY=height/2;
delay=20;
}
//Automaticallystartthreadforgameloop
publicvoidstart(){
isPlay=true;
newThread(this).start();
}
publicvoidstop(){isPlay=false;}
//MainGameLoop
publicvoidrun(){
Graphicsg=getGraphics();
while(isPlay){
input();
drawScreen(g);
try{
Thread.sleep(delay);
}
catch(InterruptedExceptionie){}
}
}
//MethodtoHandleUserInputs
privatevoidinput(){
intkeyStates=getKeyStates();
//Left
if((keyStates&LEFT_PRESSED)!
=0)
currentX=Math.max(0,currentX-1);
//Right
if((keyStates&RIGHT_PRESSED)!
=0)
if(currentX+5 currentX=Math.min(width,currentX+1); //Up if((keyStates&UP_PRESSED)! =0) currentY=Math.max(0,currentY-1); //Down if((keyStates&DOWN_PRESSED)! =0) if(currentY+10 currentY=Math.min(height,currentY+1); } //MethodtoDisplayGraphics privatevoiddrawScreen(Graphicsg){ g.setColor(0xffffff); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0x0000ff); g.drawString("X",currentX,currentY,Graphics.TOP|Graphics.LEFT); flushGraphics(); } } //GameMIDlet.java //编写MIDlet importjavax.microedition.midlet.*; importjavax.microedition.lcdui.*; publicclassGameMIDletextendsMIDlet{ privateDisplaydisplay; publicvoidstartApp(){ display=Display.getDisplay(this); MyGameCanvasgameCanvas=newMyGameCanvas(); gameCanvas.start(); display.setCurrent(gameCanvas); } publicDisplaygetDisplay(){ returndisplay; } publicvoidpauseApp(){ } publicvoiddestroyApp(booleanunconditional){ exit(); } publicvoidexit(){ System.gc(); destroyApp(false); notifyDestroyed(); } } 编译后就可以在模拟器中运行了,一个X在屏幕中心,可以用上下左右键移动它。 使用MIDP2.0开发游戏 (2)使用Sprite Sprite,精灵,顾名思义,专用来代表游戏中的动画角色,比如飞机,坦克等等。 在MIDP1.0中,我们必须自己写专门的类来实现Sprite,幸运的是,MIDP2.0为Sprite提供了强力支持,可以创建静态,动态,不透明和透明的Sprite,下面我们准备在上次的GameCanvas基础上添加一个Sprite并让它动起来。 Sprite的主要构造方法有: Sprite(Image): 构造一个单幅图案的Sprite; Sprite(Image,intwidth,intheight): 构造一个动画Sprite,图片将按照指定大小被分为N个Frame,通过setFrame(intindex)就可以让Sprite动起来。 我们用了一个有透明背景的png图片创建坦克的Sprite: (注意这个图是放大的JPG格式,你需要用Photoshop之类的软件处理成有透明背景的png格式,大小为64x16) 我们在Eclipse中建立如下工程和目录: 以下是画出Sprite的TankGameCanvas.java: packagetank.midp.core; importjavax.microedition.lcdui.*; importjavax.microedition.lcdui.game.*; publicclassTankGameCanvasextendsGameCanvasimplementsRunnable{ //控制方向: privatestaticintINDEX_OF_UP=0; privatestaticintINDEX_OF_DOWN=1; privatestaticintINDEX_OF_LEFT=3; privatestaticintINDEX_OF_RIGHT=2; privatebooleanisPlay;//GameLooprunswhenisPlayistrue privatelongdelay;//Togivethreadconsistency privateintcurrentX,currentY;//Toholdcurrentpositionofthe'X' privateintwidth;//Toholdscreenwidth privateintheight;//Toholdscreenheight privateSpritespriteTank;// oursprite! //Constructorandinitialization publicTankGameCanvas(){ super(true); width=getWidth(); height=getHeight(); currentX=width/2; currentY=height/2; delay=20; //initsprite: try{ Imageimage=Image.createImage("/res/img/player1.png");//注意路径 spriteTank=newSprite(image,16,16);//大小是16x16 } catch(Exceptione){e.printStackTrace();} } //Automaticallystartthreadforgameloop publicvoidstart(){ isPlay=true; newThread(this).start(); } publicvoidstop(){isPlay=false;} //MainGameLoop publicvoidrun(){ Graphicsg=getGraphics(); while(isPlay){ input(); drawScreen(g); try{ Thread.sleep(delay); } catch(InterruptedExceptionie){} } } //MethodtoHandleUserInputs privatevoidinput(){ intkeyStates=getKeyStates(); //Left if((keyStates&LEFT_PRESSED)! =0){ currentX=Math.max(0,currentX-1); spriteTank.setFrame(INDEX_OF_LEFT); } //Right if((keyStates&RIGHT_PRESSED)! =0){ if(currentX+5 currentX=Math.min(width,currentX+1); spriteTank.setFrame(INDEX_OF_RIGHT); } //Up if((keyStates&UP_PRESSED)! =0){ currentY=Math.max(0,currentY-1); spriteTank.setFrame(INDEX_OF_UP); } //Down if((keyStates&DOWN_PRESSED)! =0){ if(currentY+10 currentY=Math.min(height,currentY+1); spriteTank.setFrame(INDEX_OF_DOWN); } } //MethodtoDisplayGraphics privatevoiddrawScreen(Graphicsg){ g.setColor(0);//black g.fillRect(0,0,getWidth(),getHeight()); //画一个Sprite非常简单: spriteTank.setPosition(currentX,currentY); spriteTank.paint(g); flushGraphics(); } } 运行后的画面如下,可以用上下左右控制坦克: : ~ 使用MIDP2.0开发游戏(3)添加背景和前景 上次我们已经让坦克动起来了,现在我们准备给游戏添加背景和前景。 上次讨论了用Sprite实现动画,其实背景和前景也是用Sprite实现的,我们准备一幅背景和一幅前景图片: 注意背景可以不透明,但前景一定要处理成透明的png格式(以上均为jpg截图,请自行用Photoshop等转换)。 修改TankGameCanvas如下: publicclassTankGameCanvasextendsGameCanvasimplementsRunnable{ ... privateSpritespritePlayer1; privateSpritespriteBackground; privateSpritespriteForeground; publicTankGameCanvas(){ ... try{ Imageimage=Image.createImage("/res/img/player1.png"); spritePlayer1=newSprite(image,16,16); spriteBackground=newSprite(Image.createImage("/res/img/bg.png")); spriteForeground=newSprite(Image.createImage("/res/img/fg.png")); } ... } ... } 然后在drawScreen()方法中依次绘制出Sprite: privatevoiddrawScreen(Graphicsg){ spriteBackground.paint(g); spritePlayer1.setPosition(currentX,currentY); spritePlayer1.paint(g); spriteForeground.paint(g); flushGraphics(); } OK,模拟器中效果如下: 下一步我们准备先编写游戏内核,包括地图数据的表示,碰撞处理,定时器的实现,简单的AI等等,希望大家继续关注并支持! : ) : ~ *o* ^_^ 使用MIDP2.0开发游戏(4)改进的地图生成方式 上次我们用Sprite实现了背景,但是这样不便于通过地图数据生成地图。 通常,游戏中的地图都被分成NxN的方格,一般仅有几种图案。 幸运的是,SUN在MIDP2.0已经考虑到了游戏开发者需要的这个功能,TiledLayer便是通过贴图实现的层,它的使用同样异常简单! 首先准备好我们需要的小块区域,在坦克大战的地图中,一共有下面5种: (注意这是放大的jpg格式,你需要处理成40x8的png格式) 分别是冰面,砖块,岩石,河流,树木,具体有什么用玩过的肯定都知道,我就不多说了。 首先读入Image: Image.createImage("/res/img/tile.png"); 然后就可以创建TiledLayer了: newTiledLayer(4,4,image,8,8); 前两个参数指定NxN的方格数,后两个参数指定方格大小(也不一定非得是方格),我们用8x8的大小,这样读入的40x8的png图片便被分成了5个小块,编号是1-5。 为什么不从0开始编号? 因为0是用来表示透明块的。 下面定义一个二维数组,表示地图数据: int[][]map=newint[][]{ {0,0,1,4}, {1,1,2,4}, {0,1,2,4}, {0,1,1,3}, }; 最后用TiledLayer.setCell(col,row,index);就给每个小块贴上对应的图片。 如果index为0,则该小块是透明的。 OK,我们把上次的spriteBackground改成layerBackground: publicclassTankGameCanvasextendsGameCanvasimplementsRunnable{ ... privateTiledLayerlayerBackground; //Constructorandinitialization publicTankGameCanvas(){ ... try{ layerBackground=newTiledLayer(22,22,Image.createImage("/res/img/tile.png"),8,8); intEMP=0; intICE=1; intBRK=2; intROC=3; intRIV=4; intTRE=5; //地图太大了! ! ! int[][]map=newint[][]{//22X22 {EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP}, {EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP,EMP}, {ROC,ROC,ROC,ROC,EMP,EMP,EMP,EMP,EMP,EMP,ICE,ICE,ICE,ICE,ICE,ICE,BRK,BRK,BRK,BRK,BRK,BRK}, {ROC,ROC,ROC,ROC,EMP,EMP,EMP,EMP,EMP,EMP,ICE,ICE,ICE,ICE,ICE,ICE,BRK,BRK,BRK,BRK,BRK,BRK}, {BRK,BRK,BRK,BRK,BRK,BRK,BRK,BRK,BRK,BRK,BRK,BRK,ROC,ROC,BRK,BRK,BRK,BRK,ROC,ROC,ROC,ROC}, 使用MIDP2.0开发游戏(5)游戏内核 我们准备开始设计游戏内核。 通常,游戏和桌面Windows程序不同(扫雷等桌面游戏除外),它不能依赖消息驱动,因为游戏通常只有一个画面,而且需要高速更新。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 MIDP20 开发 游戏