J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc

上传人:laozhun 文档编号:2393721 上传时间:2023-02-17 格式:DOC 页数:20 大小:124.50KB
返回 下载 相关 举报
J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc_第1页
第1页 / 共20页
J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc_第2页
第2页 / 共20页
J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc_第3页
第3页 / 共20页
J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc_第4页
第4页 / 共20页
J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc》由会员分享,可在线阅读,更多相关《J2ME手机游戏设计案例源代码GameEngineTiledLayer.doc(20页珍藏版)》请在三一办公上搜索。

1、*GameMID。Java/* * To change this template, choose Tools | Templates * and open the template in the editor. */import javax.microedition.lcdui.Display;import javax.microedition.midlet.*;/* * author Administrator */public class GameMID extends MIDlet private Display display; private GameWorld gw=null;

2、public GameMID() display = Display.getDisplay(this); /获取Display gw=new GameWorld(this); /创建游戏画布 display.setCurrent(gw); /设置游戏画布为当前显示画面 public void startApp() if(gw!=null) gw.start(); /游戏开始执行 public void pauseApp() if(gw!=null)gw.setPaused(true); /游戏暂停执行 public void destroyApp(boolean unconditional)

3、/* 退出程序 */ public void exit() try destroyApp(false); catch(Exception e) notifyDestroyed(); *GameWorld。Javaimport java.io.IOException;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.game.GameCanvas;imp

4、ort javax.microedition.lcdui.game.Sprite;import javax.microedition.lcdui.game.TiledLayer;/* * To change this template, choose Tools | Templates * and open the template in the editor. */* * * author Administrator */public class GameWorld extends GameCanvas implements Runnable GameMID mid; /游戏MIDlet T

5、hread MainThread; /游戏主线程 private final int MS_PER_FRAME=30; /设置一次游戏循环所需时间,单位为毫秒(ms),每秒游戏帧数约为1000/MS_PER_FRAME private int cps; /游戏帧速 private boolean isPaused; /游戏暂停状态 private boolean running; /游戏运行状态 Graphics g; /游戏绘图对象 public static int ScreenWidth; /游戏屏幕宽度,设置为静态成员,方便外部访问 public static int ScreenHe

6、ight; /游戏屏幕高度 public static int GameState; /游戏状态,1为暂停,2为游戏进行中,3为游戏失败 public static int KeyState; /按键状态 private Image imgEnemy,imgBoy;/精灵图像 private Sprite sprEnemy; /定义敌人精灵 private MySprite sprBoy; /用扩展的精灵类来定义玩家精灵 /定义三个不同方向的玩家精灵帧序列,右方向可由左方向镜像变换得到 int LSequ=3,4,3,5; /定义左方向精灵帧序列 int USequ=6,7,6,8; /定义上

7、方向精灵帧序列 int DSequ=0,1,0,2; /定义下方向精灵帧序列 int enemyX,enemyY; /敌人精灵坐标 int enemySpeedX; /敌人精灵速度,这里设置为只能水平移动 boolean isColl; /碰撞标志 long CollTextTime; /碰撞文本显示时间 TiledBg tbg; /创建贴图层应用类 TiledLayer tl; /创建贴图层类/定义字体private Font largeFont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_LARGE); private

8、Font mediumFont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_MEDIUM); public GameWorld(GameMID midlet) super(true); this.mid=midlet; /获取MIDlet this.setFullScreenMode(true); /设置为全屏模式 ScreenWidth=getWidth(); /获取屏幕大小 ScreenHeight=getHeight(); g=this.getGraphics(); /获取绘图对象 running=false; /设置

9、游戏运行状态 isPaused=false; GameInit(); /游戏初始化 /* 游戏初始化 */ private void GameInit() try imgBoy = Image.createImage(/Boy.png); imgEnemy=Image.createImage(/enemy.png); catch (IOException ex) ex.printStackTrace(); / 使用Image对象,帧宽度、帧高度,速度,限制范围矩形左上角的X坐标、Y坐标、高度和宽度来构造自定义精灵 sprBoy=new MySprite(imgBoy,32,48,3,0,0,S

10、creenWidth,ScreenHeight); sprBoy.setFrameSequence(LSequ); /设置初始化时的精灵帧序列和方向 sprBoy.setDir( MySprite.LEFT); /设置初始化时精灵方向 sprBoy.defineReferencePixel(sprBoy.getWidth()/2, sprBoy.getHeight()/2); /设置参考点 sprBoy.setRefPixelPosition(ScreenWidth/2, ScreenHeight/2); /通过参考点定位精灵 int sw=sprBoy.getWidth(); int sh=

11、sprBoy.getHeight(); sprBoy.defineCollisionRectangle(sw/10, sh/10, sw*8/10,sh*8/10); /重设精灵的碰撞矩形范围为原来的80 /创建敌人精灵 sprEnemy=new Sprite(imgEnemy,imgEnemy.getWidth()/3,imgEnemy.getHeight()/3); sprEnemy.setFrameSequence(LSequ); /设置精灵循环序列 enemyX=50; /设置敌人精灵的坐标 enemyY=200; enemySpeedX=-2; /设置敌人精灵速度 tbg=new T

12、iledBg(); /创建TiledBg对象 tl=tbg.getTiledbg(); /获取贴图层 /* 游戏运行 */ public void run() int cyclesThisSecond=0; /当前1秒内的循环次数 long cycleStartTime; /循环开始时间 long lastCPSTime=0; /上次计算帧速的时间 long cycleEndTime=0; /循环结束时间 long cycleTimes=0; /一次游戏循环热所花的时间 boolean bSkip = false; /游戏是否跳帧 cps=0; System.out.println(游戏开始)

13、;/在控制台输出开始信息,可屏蔽 /* 游戏主循环 */ while(running) /检查是否运行 cycleStartTime = System.currentTimeMillis();/记录游戏循环开始时间 / 下面语句用于处理游戏内容,如果游戏设置为跳帧, / 则本次循环不处理游戏内容 if(!bSkip) GameInput(); /处理输入消息 GameCycle(); /处理游戏逻辑 render(g); /渲染游戏画面 flushGraphics(); /更新画面 /* 下面语句用于计算游戏循环时间,并进行相应处理 */ cycleEndTime=System.current

14、TimeMillis(); /记录游戏循环结束时间 cycleTimes=cycleEndTime-cycleStartTime; /计算循环时间 /如果循环时间间隔小于MS_PER_FRAME,则通过休眠,使其不小于rate, /并能让系统有空闲转去处理其他事务 if(cycleTimes 1000) /检查距上次计算帧数的/时间是否经过1000ms lastCPSTime=System.currentTimeMillis(); /设定lastCPS为当前时间 cps = cyclesThisSecond; / System.out.println(cps:+cps); /输出每秒的帧数 c

15、yclesThisSecond = 0; /重置帧数 else cyclesThisSecond+; /帧数递增 System.out.println(游戏结束!); release(); /释放资源 exit(); /退出游戏 /* 启动游戏进程 */ public void start() /检查游戏循环是否处于运行状态,如果未运行,则创建线程并启动 /如果游戏处于运行状态,则表示是暂停后的继续执行,仅设置暂停状态即可 if(!running) running=true; MainThread=new Thread(this); MainThread.start(); GameState=

16、2; else GameState=2; setPaused(false); /退出游戏 private void exit() mid.exit(); /退出游戏 /* 停止游戏 */ private void stop() running=false; /终止游戏循环 /* 释放游戏资源 */ private void release() /此处为释放游戏资源的代码 imgEnemy=null; imgBoy=null; sprBoy=null; sprEnemy=null; tbg=null; tl=null; System.gc(); /*获取暂停状态 */ public boolea

17、n getPaused() return isPaused; /* 设置暂停状态 */ public void setPaused(boolean isPaused) this.isPaused = isPaused; /* 处理游戏输入信息 */ private void GameInput() int keyStates = this.getKeyStates(); /获取按键状态 /* 下面是对按键事件的具体处理,应根据游戏需要进行修改*/ KeyState=0; /Fire if(keyStates & FIRE_PRESSED )!=0) KeyState=FIRE_PRESSED;

18、 / Left if (keyStates & LEFT_PRESSED) != 0) KeyState=LEFT_PRESSED; / Right if (keyStates & RIGHT_PRESSED) !=0 ) KeyState=RIGHT_PRESSED; / Up if (keyStates & UP_PRESSED) != 0) KeyState=UP_PRESSED; / Down if (keyStates & DOWN_PRESSED) !=0) KeyState=DOWN_PRESSED; /Game_A if(keyStates & GAME_A_PRESSED)!

19、=0) KeyState=GAME_A_PRESSED; /Game_B if(keyStates & GAME_B_PRESSED)!=0) KeyState=GAME_B_PRESSED; /Game_C if(keyStates & GAME_C_PRESSED)!=0) KeyState=GAME_C_PRESSED; /Game_D if(keyStates & GAME_D_PRESSED)!=0) KeyState=GAME_D_PRESSED; /* 渲染游戏画面 */ private void render(Graphics g) /* 填充背景 */ g.setColor(

20、0xffffff); g.fillRect(0, 0, ScreenWidth,ScreenHeight); /* 下面是对游戏渲染的具体处理,应根据游戏需要进行修改*/ tl.paint(g); /绘制贴图层 / g.drawImage(imgBuild,100, 50, Graphics.LEFT|Graphics.TOP); sprEnemy.paint(g); /绘制敌人精灵 sprBoy.paint(g); /绘制精灵 /当敌人精灵和玩家角色相碰撞时,绘制下面的内容 if(isColl) g.setColor(0xccbbcc); g.fillRect(50, 0, 120, 20)

21、; g.setColor(0xffffff); g.setFont(largeFont); g.drawString(被敌人撞上啦!,60,0, Graphics.LEFT| Graphics.TOP); /* 游戏逻辑处理*/ private void GameCycle() switch(GameState) case 1: /游戏暂停状态时的处理 /根据按键状态执行相应功能 switch(KeyState) case GAME_A_PRESSED: /按下GAME_A键时的处理 GameState=4; /设置游戏状态会结束程序 break; case FIRE_PRESSED: /按下

22、FIRE键时的处理 if(getPaused() GameState=2; setPaused(false); break; break; case 2: /游戏处于运行状态时的处理 /根据按键状态执行相应功能 /根据按键状态进行计算 switch(KeyState) case FIRE_PRESSED: /按下Fire键时 GameState=1; /设置游戏状态为暂停 setPaused(true); /设置暂停 break; case GAME_A_PRESSED: /按下Game_A键时 GameState=4; /设置游戏状态为退出 break; case GAME_B_PRESSE

23、D: /按下Game_B键时 sprBoy.setFrame(2); break; default: update(); /更新数据 break; break; case 3: /游戏失败的处理 break; case 4: /游戏退出时的处理 stop(); /停止运行 break; /* 更新数据 */ private void update() /敌人的运动 enemyX+=enemySpeedX; /计算坐标 if(enemyX=ScreenWidth+sprEnemy.getWidth() & enemySpeedX0) enemySpeedX=-enemySpeedX; /改变速度

24、方向 sprEnemy.setTransform(Sprite.TRANS_NONE); if(enemyX+sprEnemy.getWidth()=0 & enemySpeedXsprBoy.getX() sprBoy.move(-sprBoy.getSpeed(), 0); /移动玩家角色精灵 sprEnemy.setTransform(Sprite.TRANS_MIRROR); /设置敌人精灵方向 enemyX+=sprEnemy.getWidth(); /重设敌人精灵坐标 enemySpeedX=2; /设置敌人精灵速度方向 else sprBoy.move(sprBoy.getSpe

25、ed(), 0); /移动玩家角色精灵 sprEnemy.setTransform(Sprite.TRANS_NONE); /设置敌人精灵方向 enemyX-=sprEnemy.getWidth(); /重设敌人精灵坐标 enemySpeedX=-2; /设置敌人精灵速度方向 sprEnemy.setRefPixelPosition(enemyX, enemyY); /重设敌人位置 isColl=true; /设置碰撞标志 CollTextTime=120; /设置碰撞文本显示时间 else if(CollTextTime=0) isColl=false; CollTextTime-; /设置

26、碰撞文本显示时间递减 /根据按键状态计算玩家角色精灵与贴图层数据 switch(KeyState) case LEFT_PRESSED: /按下Left键时 /检查原来是否为左方向的精灵帧序列,如果不是则设置为左方向精灵帧序列 if(sprBoy.getDir()!=MySprite.LEFT) sprBoy.setFrameSequence(LSequ); /设置左方向精灵序列 sprBoy.setTransform(MySprite.TRANS_NONE); /设置为不变换 if(sprBoy.move(MySprite.LEFT) /向左移动,如果到屏幕边缘则移动贴图层 tbg.move

27、(sprBoy.getSpeed(), 0); break; case RIGHT_PRESSED: /按下Right键时 /检查原来是否为右方向的精灵帧序列,如果不是则设置为右方向精灵帧序列 if(sprBoy.getDir()!=MySprite.RIGHT) sprBoy.setFrameSequence(LSequ); /设置左方向精灵帧序列 sprBoy.setTransform(MySprite.TRANS_MIRROR); /设置为镜像变换 /向右移动,如果到屏幕边缘则移动贴图层 if(sprBoy.move(MySprite.RIGHT) tbg.move(-sprBoy.ge

28、tSpeed(), 0); break; case UP_PRESSED: /按下Up键时 /检查原来是否为上方向的精灵帧序列,如果不是则设置为上方向精灵帧序列 if(sprBoy.getDir()!=MySprite.UP) sprBoy.setFrameSequence(USequ); /向上移动,如果到屏幕边缘则移动贴图层 if(sprBoy.move(MySprite. UP) tbg.move(0,sprBoy.getSpeed() ); break; case DOWN_PRESSED: /按下Right键时 /检查原来是否为下方向的精灵帧序列,如果不是则设置为下方向精灵帧序列 if(sprBoy.getDir()!=MySprite.DOWN) sprBoy.setFrameSequence(DSequ); /向下移动,如果到屏幕边缘则移动贴图层 if( sprBoy.move(MySprite.DOWN)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号