




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*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 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() & enemyspeedx0) enemyspeedx=-enemyspeedx; /改变速度方向 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.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) tbg.move(0,-sprboy.getspeed() ); break; tbg.update(); /更新动态贴图 *mysprite.javaimport javax.microedition.lcdui.image;import javax.microedition.lcdui.game.sprite;/* * to change this template, choose tools | templates * and open the template in the editor. */* * * author administrator */public class mysprite extends sprite private int speed; /速度 private int dir; /方向 private int roundx; /限制矩形范围的左上角坐标 private int roundy; private int roundwidth; /限制矩形范围宽度 private int roundheight; /限制矩形范围高度 /定义各方向静态常量 public final static int left=1; /左 public final static int right=2; /右 public final static int up=3; /上 public final static int down=4; /下 /* 使用image对象,帧宽度w和帧高度h构造精灵*/ public mysprite(image img,int w,int h) super(img,w,h); /使用基类(即sprite)构造方法创建精灵 this.speed=1; /设置默认速度 setdir(down); /设置默认方向 setroundrect(0,0,240,309); /设置缺省时的限制矩形 /* 使用image对象,帧宽度w、帧高度h和速度speed构造精灵 */ public mysprite(image img,int w,int h,int speed) super(img,w,h); this.speed=speed; setdir(down); /设置默认方向 /* 使用image对象,帧宽度、帧高度,速度,限制范围矩形左上角的x坐标、y坐标、高度和宽度来构造精灵 */ public mysprite(image img,int w,int h,int speed,int rx,int ry,int rw,int rh) super(img,w,h); this.speed=speed; /设置速度 setdir(down); /设置默认方向 setroundrect(rx,ry,rw,rh); /设置限制范围矩形 /* 设置限制范围矩形 */ public void setroundrect(int rx,int ry,int rw,int rh) setroundx(rx); setroundy(ry); setroundwidth(rw); setroundheight(rh); /* 向dir方向移动精灵,并返回是否已到达范围矩形边框*/ public boolean move(int dir) boolean isround; isround=false; int movex=0; int movey=0; this.setdir(dir); /设置方向 switch(dir) /通过方向,按设置的速度距离移动精灵 case left: movex=-getspeed(); break; case right: movex=getspeed(); break; case up: movey=-getspeed(); break; case down: movey=getspeed(); break; /下面语句用于将移动点在范围矩形内 if( getx()+movexgetroundx()+getroundwidth() movex=getroundx()+getroundwidth()-getx()-getwidth(); isround=true; if( gety()+moveygetroundy()+getroundheight() movey=getroundy()+getroundheight()-gety()-getheight(); isround=true; super.nextframe(); s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业生产物资采购供应合同书
- 2025年全国煤矿企业主要负责人安全生产理论考试试题(含答案)
- 房地产项目工程监理协议书
- 数字支付新时代:2025年区块链技术在跨境支付中的应用与实践
- 2025年职业健康培训试题及答案指导
- 2025年自动驾驶汽车保险理赔时效性与客户满意度分析报告
- 2025年化脓性关节炎试卷及答案
- 工程进度关键节点跟踪表
- 关于医护关系的金句
- 2025年成人教育终身学习体系构建与平台运营的智能辅导系统研究
- 急诊icu管理制度
- T/CSBME 078-2024掌上超声仪临床应用规范
- T/CEMIA 012-2018光纤激光器用掺镱光纤
- T/BECA 0005-2023建筑垃圾再生回填材料
- 老年医学人才培训汇报
- 线下佣金结算协议合同
- 人工气道湿化管理
- 机关食堂服务员工作职责
- 2024秋七年级数学上册 第1章 有理数1.2 数轴、相反数和绝对值 2相反数教学实录(新版)沪科版
- 安全防坠网施工方案
- 六年级语文毕业考试真题集锦(共9套含答案)
评论
0/150
提交评论