版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、/游戏引擎 private GameMenu gmenu=null; /声明游戏菜单 public GameMID() display = Display.getDisplay(this); /获取Display loadGameMenu(1); 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(); public void loadGameMenu(int menuIndex) if(gmenu=null) gmenu = new GameMenu(this); /创建游戏菜单 gmenu.setMenuIndex(menuIndex); display.setCurrent(gmenu); /设置游戏菜单为当前显示画面 public void loadGameWorld() gmenu=null; if(gw=null) gw =
4、 new GameWorld(this); /创建游戏引擎画布 display.setCurrent(gw); /设置游戏引擎画布为当前显示画面 gw.start(); *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;/* * To c
5、hange 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/M
6、S_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 Im
7、age img;/图像 private int currentX;/图像坐标 private int currentY;/定义字体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=mi
8、dlet; /获取MIDlet this.setFullScreenMode(true); /设置为全屏模式 ScreenWidth=getWidth(); /获取屏幕大小 ScreenHeight=getHeight(); g=this.getGraphics(); /获取绘图对象 running=false; /设置游戏运行状态 isPaused=false; GameInit(); /游戏初始化 /* 游戏初始化 */ private void GameInit() try img = Image.createImage("/icon.png"); /创建图像 cat
9、ch (IOException ex) ex.printStackTrace(); currentX =ScreenWidth / 2; /初始化图像坐标 currentY = ScreenHeight / 2; /* 游戏运行 */ public void run() int cyclesThisSecond=0; /当前1秒内的循环次数 long cycleStartTime; /循环开始时间 long lastCPSTime=0; /上次计算帧速的时间 long cycleEndTime=0; /循环结束时间 long cycleTimes=0; /一次游戏循环热所花的时间 boolea
10、n bSkip = false; /游戏是否跳帧 cps=0; System.out.println("游戏开始");/在控制台输出开始信息,可屏蔽 /* 游戏主循环 */ while(running) /检查是否运行 cycleStartTime = System.currentTimeMillis();/记录游戏循环开始时间 / 下面语句用于处理游戏内容,如果游戏设置为跳帧, / 则本次循环不处理游戏内容 if(!bSkip) GameInput(); /处理输入消息 GameCycle(); /处理游戏逻辑 render(g); /渲染游戏画面 flushGraphi
11、cs(); /更新画面 /* 下面语句用于计算游戏循环时间,并进行相应处理 */ cycleEndTime=System.currentTimeMillis(); /记录游戏循环结束时间 cycleTimes=cycleEndTime-cycleStartTime; /计算循环时间 /如果循环时间间隔小于MS_PER_FRAME,则通过休眠,使其不小于rate, /并能让系统有空闲转去处理其他事务 if(cycleTimes<MS_PER_FRAME) bSkip = false; try Thread.sleep(MS_PER_FRAME - cycleTimes); /休眠 catc
12、h (InterruptedException ex) ex.printStackTrace(); else /如果循环时间大于MS_PER_FRAME,则设置bSkip为true, /让程序跳过一次循环,以主动丢帧的方式换取游戏速度 bSkip = true; /下面语句用于计算每秒的循环次数,即帧速,在游戏中如果不需要,/可将这部分语句及相关变量注释屏蔽 if (System.currentTimeMillis() - lastCPSTime > 1000) /检查距上次计算帧数的/时间是否经过1000ms lastCPSTime=System.currentTimeMillis()
13、; /设定lastCPS为当前时间 cps = cyclesThisSecond; System.out.println("cps:"+cps); /输出每秒的帧数 cyclesThisSecond = 0; /重置帧数 else cyclesThisSecond+; /帧数递增 System.out.println("游戏结束!"); release(); /释放资源 exit(); /退出游戏 /* 启动游戏进程 */ public void start() /检查游戏循环是否处于运行状态,如果未运行,则创建线程并启动 /如果游戏处于运行状态,则表示
14、是暂停后的继续执行,仅设置暂停状态即可 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() /此处为释放游戏资源的代码 img=nul
15、l; 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 &a
16、mp; 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) K
17、eyState=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
18、_PRESSED; /* 渲染游戏画面 */ private void render(Graphics g) /* 填充背景 */ g.setColor(0xffffff); g.fillRect(0, 0, ScreenWidth,ScreenHeight); /* 下面是对游戏渲染的具体处理,应根据游戏需要进行修改*/ /绘制图像,图像位置随按键移动 g.drawImage(img,currentX, currentY, Graphics.HCENTER|Graphics.VCENTER); /下面语句用于绘制屏幕尺寸和游戏帧速 /定义字符串 String strWH="Widt
19、h:"+String.valueOf(ScreenWidth)+" Height:"+String.valueOf(ScreenHeight); String strCPS="CPS:"+String.valueOf(cps); /绘制背景矩形 g.setColor(0xccbb00); g.fillRect(15, 8, 60, 20); g.fillRect(115, 8, 120, 20); /绘制字符串 g.setColor(0xffffff); g.setFont(mediumFont); /设置字体 g.drawString(str
20、CPS,20,10, Graphics.LEFT| Graphics.TOP); g.drawString(strWH,120,10, Graphics.LEFT| Graphics.TOP); /当处于游戏暂停状态时,绘制下面的内容 if(getPaused() g.setColor(0xccbbcc); g.fillRect(70, 100, 100, 20); g.setColor(0xffffff); g.setFont(largeFont); g.drawString("游 戏 暂 停",85,100, Graphics.LEFT| Graphics.TOP);
21、/* 游戏主函数,处理游戏逻辑*/ 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: /游戏处于运行状态时的处理 /根据按键
22、状态执行相应功能 switch(KeyState) case FIRE_PRESSED: /按下Fire键时 GameState=1; /设置游戏状态为暂停 setPaused(true); /设置暂停 break; case LEFT_PRESSED: /按下Left键时 currentX = Math.max(0, currentX - 2); /改变水平坐标 break; case RIGHT_PRESSED: /按下Right键时 currentX = Math.min(ScreenWidth - 2, currentX + 2);/改变水平坐标 break; case UP_PRES
23、SED: /按下Up键时 currentY = Math.max(0, currentY - 2); /改变垂直坐标 break; case DOWN_PRESSED: /按下Right键时 currentY = Math.min(ScreenHeight - 2, currentY + 2); /改变垂直坐标 break; case GAME_A_PRESSED: /按下Game_A键时 GameState=4; /设置游戏状态为退出 break; case GAME_B_PRESSED: /按下Game_B键时 break; break; case 3: /游戏失败的处理 break; c
24、ase 4: /游戏退出时的处理 stop(); /停止运行 break; *GameMenu.javaimport java.io.IOException;import java.util.Timer;import java.util.TimerTask;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.game.GameCanvas;import javax.microedition.lcdui.game.Sprite;
25、/* * To change this template, choose Tools | Templates * and open the template in the editor. */* * * author Administrator */public class GameMenu extends GameCanvas private GameMID mid; /声明MIDlet private int MenuIndex; /菜单项索引 private final byte glt=Graphics.LEFT|Graphics.TOP; /锚点 private Image back
26、ground,menu,menuarrow,icon; /菜单图像 private int menuY=270; /菜单Y坐标 private int menuArrowX=65; /箭头X坐标 private Timer timer; /声明定时器 private TimerTask task; /定时器任务 public GameMenu(GameMID mid) super(false); this.setFullScreenMode(true); /设置为全屏模式 this.mid=mid; /设置MIDlet MenuIndex=1; /初始化菜单项索引 InitImage(); /
27、初始化图像 menuAnima(); /菜单动画 /* 初始化图像*/ private void InitImage() /加载图像资源 try background=Image.createImage("/background.png"); menu=Image.createImage("/menu.png"); menuarrow=Image.createImage("/menuarrow.png"); icon=Image.createImage("/menuIcon.png"); catch (IOExce
28、ption ex) ex.printStackTrace(); public void render() Graphics g=this.getGraphics(); g.drawImage(background, 0, 0, glt); /绘制背景 g.drawImage(icon,40,60,glt); /绘制菜单项 g.drawRegion(menu, 0,MenuIndex*18, 72, 18,Sprite.TRANS_NONE , 83, menuY, glt); /绘制箭头 g.drawImage(menuarrow,menuArrowX,menuY,glt); g.drawRe
29、gion(menuarrow,0,0,16,18,Sprite.TRANS_MIRROR, 224-menuArrowX, menuY,glt); flushGraphics(); /更新绘图 /* 获取当前菜单项索引 */ public int getMenuIndex() return MenuIndex; /* 设置当前菜单项索引 */ public void setMenuIndex(int MenuIndex) this.MenuIndex = MenuIndex; /* 左移菜单项 */ public void menuLeft() MenuIndex-; if(MenuIndex<0) MenuIndex=6; /* 右移菜单项 */ public void menuRight() M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年扬州市妇幼保健院公开招聘高层次及紧缺专业人才8人备考题库及答案详解参考
- 2025年宋庆龄幼儿园工作人员公开招聘备考题库及1套完整答案详解
- 2025年郑州市航空港区和昌云著鸿运湾幼儿园招聘15人备考题库及完整答案详解1套
- 2025年甘肃省城乡发展投资集团有限公司招聘备考题库及1套参考答案详解
- 2025年非遗皮影五年人才培养报告
- 2025年重庆市九龙坡区华美小学教师招聘备考题库有答案详解
- 智能社区邻里关系与平台建设的2025年可行性研究
- 2025年江北新区教育局所属事业单位公开招聘教师备考题库及一套完整答案详解
- 2025年武汉情智学校招聘备考题库有答案详解
- 2025年封丘县建勋学校招聘备考题库完整答案详解
- 机器学习与随机微分方程的深度集成方法-全面剖析
- There+be句型练习题及答案
- 吊索具的使用与报废标准
- 2025-2030年中国疏浚工程行业市场前景展望与十三五规划研究报告
- 2024年国家公务员考试行测真题附解析答案
- 电网安全课件
- 招标代理机构遴选投标方案(技术标)
- 九年级语文下册-【《祖国啊我亲爱的祖国》课后习题参考答案】
- 自然科学导论智慧树知到期末考试答案章节答案2024年宁波财经学院
- MOOC 隧道工程-中南大学 中国大学慕课答案
- 电缆沟施工安全风险评估与防控技术
评论
0/150
提交评论