欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载
     

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

    • 资源ID:3312911       资源大小:174KB        全文页数:20页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    *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; 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) /* 退出程序 */ 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;import 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 Thread 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 ScreenHeight; /游戏屏幕高度 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; /定义上方向精灵帧序列 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 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; /设置游戏运行状态 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,ScreenWidth,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=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 TiledBg(); /创建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("游戏开始");/在控制台输出开始信息,可屏蔽 /* 游戏主循环 */ while(running) /检查是否运行 cycleStartTime = System.currentTimeMillis();/记录游戏循环开始时间 / 下面语句用于处理游戏内容,如果游戏设置为跳帧, / 则本次循环不处理游戏内容 if(!bSkip) GameInput(); /处理输入消息 GameCycle(); /处理游戏逻辑 render(g); /渲染游戏画面 flushGraphics(); /更新画面 /* 下面语句用于计算游戏循环时间,并进行相应处理 */ cycleEndTime=System.currentTimeMillis(); /记录游戏循环结束时间 cycleTimes=cycleEndTime-cycleStartTime; /计算循环时间 /如果循环时间间隔小于MS_PER_FRAME,则通过休眠,使其不小于rate, /并能让系统有空闲转去处理其他事务 if(cycleTimes<MS_PER_FRAME) bSkip = false; try Thread.sleep(MS_PER_FRAME - cycleTimes); /休眠 catch (InterruptedException ex) ex.printStackTrace(); else /如果循环时间大于MS_PER_FRAME,则设置bSkip为true, /让程序跳过一次循环,以主动丢帧的方式换取游戏速度 bSkip = true; /下面语句用于计算每秒的循环次数,即帧速,在游戏中如果不需要,/可将这部分语句及相关变量注释屏蔽 if (System.currentTimeMillis() - lastCPSTime > 1000) /检查距上次计算帧数的/时间是否经过1000ms lastCPSTime=System.currentTimeMillis(); /设定lastCPS为当前时间 cps = cyclesThisSecond; / System.out.println("cps:"+cps); /输出每秒的帧数 cyclesThisSecond = 0; /重置帧数 else cyclesThisSecond+; /帧数递增 System.out.println("游戏结束!"); release(); /释放资源 exit(); /退出游戏 /* 启动游戏进程 */ public void start() /检查游戏循环是否处于运行状态,如果未运行,则创建线程并启动 /如果游戏处于运行状态,则表示是暂停后的继续执行,仅设置暂停状态即可 if(!running) running=true; MainThread=new Thread(this); MainThread.start(); GameState=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 boolean 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; / 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)!=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(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); 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: /按下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_PRESSED: /按下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() && enemySpeedX>0) enemySpeedX=-enemySpeedX; /改变速度方向 sprEnemy.setTransform(Sprite.TRANS_NONE); if(enemyX+sprEnemy.getWidth()<=0 && enemySpeedX<0 ) enemySpeedX=-enemySpeedX; /改变速度方向 sprEnemy.setTransform(Sprite.TRANS_MIRROR); sprEnemy.setRefPixelPosition(enemyX, enemyY); /设置敌人位置 sprEnemy.nextFrame(); /精灵动画移到后一帧 /检测玩家角色是否与敌人相碰撞,如果是,则后退 if( sprBoy.collidesWith(sprEnemy,false) /通过敌人的速度方向来检查是从哪个方向撞上的,并作相应动作 if(sprEnemy.getX()>sprBoy.getX() sprBoy.move(-sprBoy.getSpeed(), 0); /移动玩家角色精灵 sprEnemy.setTransform(Sprite.TRANS_MIRROR); /设置敌人精灵方向 enemyX+=sprEnemy.getWidth(); /重设敌人精灵坐标 enemySpeedX=2; /设置敌人精灵速度方向 else sprBoy.move(sprBoy.getSpeed(), 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-; /设置碰撞文本显示时间递减 /根据按键状态计算玩家角色精灵与贴图层数据 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(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.getSpeed(), 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)

    注意事项

    本文(J2ME手机游戏设计案例源代码-GameEngine_TiledLayer.doc)为本站会员(李主任)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开