JME手机游戏设计案例源代码SpaceWar_Enemy_第1页
JME手机游戏设计案例源代码SpaceWar_Enemy_第2页
JME手机游戏设计案例源代码SpaceWar_Enemy_第3页
JME手机游戏设计案例源代码SpaceWar_Enemy_第4页
JME手机游戏设计案例源代码SpaceWar_Enemy_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*GameMID/* author wizardyx */import javax.microedition.lcdui.Display;import javax.microedition.midlet.*;/* 游戏MIDlet */public class GameMID extends MIDlet private Display display; /声明Display private StartScreen startscreen; /声明启动画面对象 private FlashScreen flashscreen; /声明闪屏画面对象 private GameMenu gmenu;

2、/声明菜单画面对象 private GameWorld gw; /声明游戏引擎框架 private GameMusic gm; /声明音效对象 public GameMID() display = Display.getDisplay(this); /获取Display gm=new GameMusic(); loadFlashScreen(); /加载闪屏画面 public void startApp() public void pauseApp() public void destroyApp(boolean unconditional) gmenu=null; flashscreen=n

3、ull; startscreen=null; gm=null; GameMusic.releases(); System.gc(); /释放资源 /* 退出程序 */ public void exit() try destroyApp(false); catch(Exception e) notifyDestroyed(); /* 加载游戏启动画面 */ public void loadStartScreen() flashscreen=null; startscreen=null; startscreen=new StartScreen(this); /创建启动画面 display.setC

4、urrent(startscreen); /设置启动画面为当前显示画面 /* 加载闪屏画面 */ public void loadFlashScreen() flashscreen=new FlashScreen(this); /创建闪屏 display.setCurrent(flashscreen); /设置闪屏画面为当前显示画面 /* 加载游戏菜单*/ public void loadGameMenu(int menuIndex) flashscreen=null; startscreen=null; if(gmenu=null) gmenu = new GameMenu(this); /

5、创建菜单 gmenu.setMenuIndex(menuIndex); /设置当前菜单项 display.setCurrent(gmenu); /设置菜单画面为当前显示画面 /* 加载游戏主界面 */ public void loadGameWorld() gmenu=null; if(gw=null) gw = new GameWorld(this); /创建游戏引擎画布 display.setCurrent(gw); /设置游戏引擎画布为当前显示画面 gw.start(); *Bullet/* author wizardyx */import java.io.IOException;imp

6、ort java.util.Vector;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.game.Sprite;/* * To change this template, choose Tools | Templates * and open the template in the editor. */* 玩家子弹类 */public class Bullet Plane plane; /玩家飞机 Sprite sprb

7、ullet; /子弹精灵 Image imgbullet; /子弹图像 private int bulletPower; private int bulletSpeed =4; /子弹速度 private int shootTimes; /子弹发射计时 private int bulletStay=15; /子弹发射间隔时间 public Vector v; /子弹向量 public Bullet(Plane plane) try imgbullet = Image.createImage(/mybullet.png); /子弹图像 catch (IOException ex) ex.prin

8、tStackTrace(); sprbullet=new Sprite(imgbullet,imgbullet.getWidth(),imgbullet.getHeight(); /创建子弹精灵 sprbullet.defineReferencePixel(imgbullet.getWidth()/2, imgbullet.getHeight()/2);/设置参考点 this.plane=plane; /引用玩家飞机 v = new Vector(); /创建存储子弹数据的Vector shootTimes=0; /初始化子弹发射间隔时间 /* 增加新子弹 */ public void add

9、New() /初始化子弹坐标为飞机坐标 int p_x=plane.getX()+plane.getWidth()/2; int p_y=plane.getY(); /根据子弹威力级别,添加不同的子弹 switch(bulletPower) case 1: /前两个参数是子弹的当前坐标,第3个参数是子弹在水平方向上的速度 int a = p_x-5,p_y,0; /一级子弹数据 int b = p_x+5,p_y,0; v.addElement(a); /添加子弹数据到v中 v.addElement(b); break; case 2: int a = p_x-8,p_y+5,0; /二级子弹

10、数据 int b = p_x,p_y,0; int c = p_x+8,p_y+5,0; v.addElement(a); v.addElement(b); v.addElement(c); break; case 3: int a = p_x-8,p_y+5,-1; /三级子弹数据 int b = p_x-5,p_y,0; int c = p_x+5,p_y,0; int d = p_x+8,p_y+5,1; v.addElement(a); v.addElement(b); v.addElement(c); v.addElement(d); break; case 4: int a = p

11、_x-8,p_y,0; /四级子弹数据 int b = p_x+8,p_y,0; int c = p_x,p_y,0; int d = p_x-10,p_y+8,-1; int e = p_x+10,p_y+8,1; int f = p_x-14,p_y+8,-1; int g = p_x+14,p_y+8,1; v.addElement(a); v.addElement(b); v.addElement(c); v.addElement(d); v.addElement(e); v.addElement(f); v.addElement(g); break; case 5: int a =

12、p_x-4,p_y,0; /五级子弹数据 int b = p_x,p_y,0; int c = p_x+4,p_y,0; int d = p_x-6,p_y+6,-1; int e = p_x+6,p_y+6,1; int f = p_x-10,p_y+8,-1; int g = p_x+10,p_y+8,1; int h = p_x-10,p_y+10,-2; int i = p_x+10,p_y+10,2; int j = p_x-14,p_y+12,-2; int k = p_x+14,p_y+12,2; v.addElement(a); v.addElement(b); v.addEl

13、ement(c); v.addElement(d); v.addElement(e); v.addElement(f); v.addElement(g); v.addElement(h); v.addElement(i); v.addElement(j); v.addElement(k); break; /* 删除指定的子弹 */ public void delBullet(int i) if(iv.size() v.removeElementAt(i); /* 绘制子弹 */public void render(Graphics g)int row=null; /循环绘制子弹for(int

14、i=0;i0 & shootTimes%bulletStay=0) addNew(); /增加子弹 shootTimes=0; /重置子弹发射时间 for(int i=v.size()-1;i=0;i-)bulletData = (int)v.elementAt(i); /获取子弹数据bulletData0=bulletData0+2*bulletData2; /计算子弹X坐标bulletData1-=bulletSpeed; /按子弹速度计算Y坐标 /检查子弹是否超出屏幕 if(bulletData10 | bulletData0240) delBullet(i); /当子弹超出屏幕范围,删

15、除子弹 else v.setElementAt(bulletData, i); /更新子弹数据 /* 子弹碰撞检测 */ public int collidesWith(Sprite spr) int n=0; /初始化碰撞次数 int bulletData = null; /初始化子弹数据数组 for(int i=v.size()-1;i=0;i-)bulletData = (int)v.elementAt(i); /获取子弹数据 sprbullet.setRefPixelPosition(bulletData0,bulletData1); /设置子弹精灵位置 /当子弹发生碰撞,删除子弹,并

16、记入碰撞次数 if(sprbullet.collidesWith(spr,false) delBullet(i); n+; return n; /返回碰撞次数 public void Release() v.removeAllElements(); v=null; imgbullet=null; sprbullet=null; *Enemy/* * * author wizardyx */import java.io.IOException;import java.util.Random;import java.util.Vector;import javax.microedition.lcd

17、ui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.game.Sprite;/* * To change this template, choose Tools | Templates * and open the template in the editor. */* 敌人飞机类 */public class Enemy private GameLevel glevel; /关卡对象 private Image imgEnemy; /飞机类型图像 private Sprite sp

18、rEnemy; /飞机类型精灵数组 private int path1; /飞行路径数据 private int path2; private int path3; private int path4; private int planeInfo; /敌机数据 private int stayTimes; /当前敌机的停留时间private int num; /下一个要显示在屏幕上的敌机的索引值private Vector v; /v存放当前需要显示敌人的数据数组private Random r; /随机数,用于计算子弹随机发射 private EnemyBullet ebullet; /敌机

19、子弹/ Bonus bonus; /奖励 public Enemy(GameLevel glevel) this.glevel=glevel; initImage(); /初始化图像和精灵 initLevelResource(); /初始化关卡资源数据 /* 初始化图像和精灵*/ private void initImage() imgEnemy=new Image5; try imgEnemy0 = Image.createImage(/plane0.png);/小飞机图像 imgEnemy1 = Image.createImage(/plane1.png);/直升机图像 imgEnemy2

20、 = Image.createImage(/plane2.png);/霰弹机图像 imgEnemy3 = Image.createImage(/turret.png);/Boss机炮塔图像 imgEnemy4 = Image.createImage(/boss.png);/Boss机图像 catch (IOException ex) ex.printStackTrace(); sprEnemy=new Sprite5; sprEnemy0=new Sprite(imgEnemy0 ,16,16);/小飞机精灵 sprEnemy1=new Sprite(imgEnemy1 ,26,35);/直升

21、机精灵 sprEnemy2=new Sprite(imgEnemy2 ,64,50);/霰弹机精灵 sprEnemy3=new Sprite(imgEnemy3 ,15,20);/Boss机炮塔精灵 sprEnemy4=new Sprite(imgEnemy4 ,64,40);/Boss机精灵 /设置各个精灵的参考点 sprEnemy0.defineReferencePixel(sprEnemy0.getWidth()/2,sprEnemy0.getHeight()/2 ); sprEnemy1.defineReferencePixel(sprEnemy1.getWidth()/2,sprEn

22、emy1.getHeight()/2 ); sprEnemy2.defineReferencePixel(sprEnemy2.getWidth()/2,sprEnemy2.getHeight()/2 ); sprEnemy3.defineReferencePixel(sprEnemy3.getWidth()/2,sprEnemy3.getHeight()/2 ); sprEnemy4.defineReferencePixel(sprEnemy4.getWidth()/2,sprEnemy4.getHeight()/2 ); /* 初始化关卡资源 */ private void initLeve

23、lResource() v = new Vector(); r = new Random(); /路径数据,数组中每个元素记录了该路径点的X坐标,Y坐标,帧ID,停留时间 path2=new int200,0,0,0,200,100,0,50,100,100,0,0,200,200,0,20,200,300,0,0; path3=new int20,0,0,0,20,100,0,0,200,100,0,0,200,200,0,0,200,300,0,0; path1=new int0,0,0,0,100,0,2,0,100,100,4,0,200,200,3,0,240,100,2,0; pa

24、th4=new int0,0,0,0,100,0,0,0,100,100,0,0,200,50,0,0,100,100,0,0; /飞机数据,数组中每个元素记录了飞机的类别,初始x坐标,初始y坐标,目标点索引,图像帧,速度,间隔/停留时间,路径索引,生命值,飞机所带宝物编号 planeInfo=new int 0,0,0,0,0,2,0,0,2,1,0,0,0,0,0,2,10,0,2,0,0,0,0,0,0,2,10,0,2,0,0,0,0,0,0,2,10,0,2,2, 1,-20,0,0,0,2,0,1,10,1,1,0,0,0,0,2,100,1,10,0,1,0,0,0,0,2,12

25、0,1,10,3,1,0,0,0,0,2,120,1,10,0, 2,0,0,0,0,2,0,2,15,1,2,0,0,0,0,2,100,2,15,0,2,0,0,0,0,2,100,2,15,0,2,0,0,0,0,2,100,2,15,2, 0,0,0,0,0,2,0,0,2,1,0,0,0,0,0,2,10,0,2,0,0,0,0,0,0,2,10,0,2,3,0,0,0,0,0,2,10,0,2,0, 1,-20,0,0,0,2,0,1,10,0,1,0,0,0,0,2,100,1,10,0,1,0,0,0,0,2,120,1,10,0,1,0,0,0,0,2,120,1,10,1,

26、 2,0,0,0,0,2,0,2,15,0,2,0,0,0,0,2,20,2,15,1,2,0,0,0,0,2,20,2,15,0,2,0,0,0,0,2,20,2,15,2, 4,0,0,0,0,1,0,4,200,0 ; stayTimes=0; /初始化飞机停留时间为0 num = 0; /初始化下一个要显示在屏幕上的飞机的索引值为0 ebullet=new EnemyBullet(); /* 从敌机数据数组中添加1个敌机数据到当前显示的向量v中*/ private void addNewEnemy() int EnemyData = null; /用于存储1架敌机数据 /从敌机数据数组

27、中获取索引num指定的架敌机数据,并将其加到v2中 if(num=EnemyData6) /检查下一个敌机的间隔时间是否结束 EnemyData6=0; /清除时间间隔 v.addElement(EnemyData); /添加敌机数据到v2 num+; /更新下一个敌机数据索引 stayTimes=0; /重置间隔时间 stayTimes+; /敌机间隔时间递增 /* 使v中由索引vID所指定的飞机按path指定的路径移动 */ private void movePath(int vID,int path) int curX,curY,desID,speed,stay,desX,desY; /

28、当前坐标X、Y,下一路径点索引,速度,目标点坐标X、Y boolean isLive=true; /设置飞机生存状态 int EnemyData=(int ) v.elementAt(vID); /从v2中获取索引vID所指定的飞机数据 curX=EnemyData1; /获取当前坐标 curY=EnemyData2; desID=EnemyData3; /获取下一路径点索引 speed=EnemyData5; /获取速度 stay=EnemyData6; /获取停留时间 desX=pathdesID0; /获取下一路径点坐标 desY=pathdesID1; /检查停留时间是否已结束 if(

29、stay0) /如果停留时间未到,则此次不进行移动运算 stay-; /停留时间递减 EnemyData6=stay; /更新飞机数据数组中的停留时间 else /停留时间结束,进行移动运算 /检查当前位置到目标位置的距离是否小于等于速度值(即每次移动的距离), /如果是,则设置飞机的当前位置到目标位置,完成本次路径点间的移动, /并重新设置下一目标路径点和相关飞机数据 if(Math.abs(desX-curX)=speed & Math.abs(desY-curY)speed) curX=desX; /设置飞机的当前位置到目标位置 curY=desY; desID+; /目标路径点索引递增

30、 /检查路径索引是否超出范围 if(desID=speed) /检查X轴方向到目标位置的距离 /通过目标位置与当前位置X坐标的比较,确定移动方向,并计算坐标 if(desXcurX) curX+=speed; else curX-=speed; if(Math.abs(desY-curY)=speed) /检查X轴方向到目标位置的距离 /通过目标位置与当前位置Y坐标的比较,确定移动方向,并计算坐标 if(desYcurY) curY+=speed; else curY-=speed; EnemyData1=curX; /将移动后的坐标设置到飞机数据数组 EnemyData2=curY; /检查

31、飞机是否还存在 if(isLive) /用飞机数据数组EnemyData更新v2中索引为vID的飞机数据 v.setElementAt(EnemyData,vID); else /从v2中移除数据 v.removeElementAt(vID); /* 更新敌机数据*/ public void update() addNewEnemy(); /增加敌机到画面中 setEnemy(); /设置敌机数据 ebullet.update(glevel.getPlane(); /子弹数据更新 /* 计算飞机数据,包括碰撞检测等 */ private void setEnemy() int EnemyDat

32、a = null; /存储敌机数据的数组 int collidesCount; /记录敌机与玩家子弹在一次循环中的碰撞次数 /循环地从v2中取得飞机数据并进行运算 for(int i=v.size()-1;i=0;i-) EnemyData = (int)(v.elementAt(i); /获取v2中索引为i的飞机数据到EnemyData /用敌机数据数组EnemyData更新v2中的敌机数据 v.setElementAt(EnemyData,i); /根据飞机数据中的路径类型数据,使用不同的路径参数来进行飞机移动运算 switch(EnemyData7) case 0: /小飞机 movePath(i,path1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论