正文

J2ME 拯救大兵2006-11-30 18:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/21094.html

分享到:

//img3.png//img2.png//img1.png//tree.png //man.png /* *http://blog.programfan.com/blog.asp?author=qq14923349 *程序之巢制作 @J2ME计时器@ *如果有图片 *图片存在rec目录下,记得在存之前把格式转换成png,具体方法是: 1,点击开始 2,附件 3,图画板 4,打开图片 5,另存为(可以存作PNG了,不要直接改后续名,否则运行不了) 6,其他工具,可以选用PS,或者ACDSEE等等改 */   /*    人肉小炒(418138484)  (2006-12-02 12:34:54)没有菜单没有帮助没有退出游戏没有关卡寻路太差可控人物跟npc没有明显区分玩了一会居然跑到屏幕外面去了 */ import javax.microedition.midlet.MIDlet;import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.GameCanvas;import javax.microedition.lcdui.game.*;import java.util.*;public class Saver extends MIDlet{ private SaverCanvas savercanvas;  public void startApp(){  savercanvas=new SaverCanvas(Display.getDisplay(this)); savercanvas.start();         }  public void pauseApp(){}  public void destroyApp(boolean e){}  class SaverCanvas extends GameCanvas implements Runnable{  private Display display; private Sprite xman; private TiledLayer background;  private int Xbackground,Ybackground; private int xmanX=2,xmanY=2;//主角的XY坐标,速度 private int xman_now_X,xman_now_Y;//主角现在的XY坐标 private Random rand; private Sprite enemy1,enemy2,enemy3,enemy4;//不喜欢用数组 private int enemy_now_X,enemy_now_Y;//敌人现在的坐标 private Sprite burst_first,burst_second,burst_third;//为什么不用一个精灵?因为我手上没PS合成-! private int lift=3,killenemy,score; private boolean end=true;  //private Timer bursttimer;//任务 //private BurstTask bursttask;//用于爆炸  private Burst burst;   public SaverCanvas(Display d){  super(true);  display=d;  display.setCurrent(this);         }    private void start(){ try{ xman=new Sprite(Image.createImage("/man.png"),8,8); enemy1=new Sprite(Image.createImage("/man1.png"),8,8); enemy2=new Sprite(Image.createImage("/man1.png"),8,8); enemy3=new Sprite(Image.createImage("/man1.png"),8,8); enemy4=new Sprite(Image.createImage("/man1.png"),8,8);  background=new TiledLayer(15,15,Image.createImage("/tree.png"),8,8);  burst_first=new Sprite(Image.createImage("/img1.png"),8,8); burst_second=new Sprite(Image.createImage("/img2.png"),8,8); burst_third=new Sprite(Image.createImage("/img3.png"),16,16); //一开始没爆炸 burst_first.setVisible(false); burst_second.setVisible(false); burst_third.setVisible(false);   setcell(); enemy_random_raise();    } catch(Exception e){     }  Thread t=new Thread(this); t.start();        }/*      随机出现敌人 */ private void enemy_random_raise(){//随机敌人 int enemyX,enemyY;  rand=new Random(); do{ enemyX=Math.abs(rand.nextInt())%15*8;//屏幕大概就15*8那么大吧,只要是8倍数,而且不在背景  enemyY=Math.abs(rand.nextInt())%15*8; enemy1.setPosition(enemyX,enemyY);   }while(enemy1.collidesWith(background,false));  do{ enemyX=Math.abs(rand.nextInt())%15*8;  enemyY=Math.abs(rand.nextInt())%15*8; enemy2.setPosition(enemyX,enemyY);   }while(enemy2.collidesWith(background,false));  do{ enemyX=Math.abs(rand.nextInt())%15*8;  enemyY=Math.abs(rand.nextInt())%15*8; enemy3.setPosition(enemyX,enemyY);   }while(enemy3.collidesWith(background,false));  do{ enemyX=Math.abs(rand.nextInt())%15*8;  enemyY=Math.abs(rand.nextInt())%15*8; enemy4.setPosition(enemyX,enemyY);   }while(enemy4.collidesWith(background,false));       } /* 敌人出现不能和背景碰撞,初始化敌人出现地点*//*private void firstCheckEnemy(Sprite s){ if(s.collidesWith(background,false)) enemyX=Math.abs(rand.nextInt())%15*8;  enemyY=Math.abs(rand.nextInt())%15*8; s.setPosition(enemyX,enemyY);              }*/ /* 为地图赋予列行*/ private void setcell(){ int map1[]={1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1   };  for(int i=0;i<map1.length;i++) { int column=i%15;//6,1 int row=(i-column)/15;//1 background.setCell(column,row,map1[i]);  }  Xbackground=2; Ybackground=2;  xman.setPosition(8,8); background.setPosition(0,0);          }  public void run(){ Graphics g=getGraphics();  while(end){  alive();  update();  draw(g);  try{ Thread.sleep(100);     } catch(Exception e){}          }        } /* 判断是否结束游戏,生命<0*/private void alive(){  if(lift<0){ end=false;    }      }   /* update()核心方法*/ private void update() {  enemyrandommove();  xman_now_X=xman.getX(); xman_now_Y=xman.getY();     int keyState=getKeyStates();   if((keyState&FIRE_PRESSED)!=0){ burst_first.setPosition(xman_now_X,xman_now_Y); burst_first.setVisible(true); burst=new Burst(xman_now_X,xman_now_Y); burst=null;    }  if((keyState&LEFT_PRESSED)!=0) {  xman.move(-xmanX,0); xman.nextFrame(); checkRole(); } else if((keyState&RIGHT_PRESSED)!=0) {  xman.move(xmanX,0); xman.nextFrame(); checkRole(); } if((keyState&UP_PRESSED)!=0){  xman.move(0,-xmanY); xman.nextFrame(); checkRole();        } if((keyState&DOWN_PRESSED)!=0){  xman.move(0,xmanY); xman.nextFrame(); checkRole();    }  xman_knock_enemy();  burstknockenemy();    } /* 敌人随机移动,并伴随追逐主角*/private void enemyrandommove(){  int enemyvalue;   rand=new Random();  enemy_now_X=enemy1.getX(); enemy_now_Y=enemy1.getY();     if(Math.abs(enemy_now_X-xman_now_X)<24 && Math.abs(enemy_now_Y-xman_now_Y)<24)//判断是否绝对值在X<24或者Y〈24就要追逐 {enemy1.nextFrame(); if(enemy_now_X<xman_now_X) { enemy1.move(1,0); checkEnemy(enemy1); System.out.println("xSSSS");  }   if(enemy_now_X>xman_now_X) {  enemy1.move(-1,0); checkEnemy(enemy1); System.out.println("xSSSS");  }  if(enemy_now_Y>xman_now_Y) {  enemy1.move(0,-1); checkEnemy(enemy1); System.out.println("xSSSS");  }  if(enemy_now_Y<xman_now_Y) {  enemy1.move(0,1); checkEnemy(enemy1); System.out.println("xSSSS");  }  }  //else{  enemyvalue=Math.abs(rand.nextInt())%4;  switch(enemyvalue) { case 0:enemy1.move(-3,0);enemy1.nextFrame();checkEnemy(enemy1);break; case 1:enemy1.move(3,0);enemy1.nextFrame();checkEnemy(enemy1);break; case 2:enemy1.move(0,-3);enemy1.nextFrame();checkEnemy(enemy1);break; case 3:enemy1.move(0,3);enemy1.nextFrame();checkEnemy(enemy1);break; default:break;  }     //}  enemy_now_X=enemy2.getX();//2 enemy_now_Y=enemy2.getY();   if(Math.abs(enemy_now_X-xman_now_X)<24  && Math.abs(enemy_now_Y-xman_now_Y)<24) {enemy2.nextFrame(); if(enemy_now_X<xman_now_X) { enemy2.move(1,0); checkEnemy(enemy2); System.out.println("xSSSS");  }   if(enemy_now_X>xman_now_X) {  enemy2.move(-1,0); checkEnemy(enemy2); System.out.println("xSSSS");  }  if(enemy_now_Y>xman_now_Y) {  enemy2.move(0,-1); checkEnemy(enemy2); System.out.println("xSSSS");  }  if(enemy_now_Y<xman_now_Y) {  enemy2.move(0,1); checkEnemy(enemy2); System.out.println("xSSSS");  }  }  //else{  enemyvalue=Math.abs(rand.nextInt())%4;  switch(enemyvalue) { case 0:enemy2.move(-3,0);enemy2.nextFrame();checkEnemy(enemy2);break; case 1:enemy2.move(3,0);enemy2.nextFrame();checkEnemy(enemy2);break; case 2:enemy2.move(0,-3);enemy2.nextFrame();checkEnemy(enemy2);break; case 3:enemy2.move(0,3);enemy2.nextFrame();checkEnemy(enemy2);break; default:break;  }     //}  enemy_now_X=enemy3.getX();//3 enemy_now_Y=enemy3.getY();    if(Math.abs(enemy_now_X-xman_now_X)<24 && Math.abs(enemy_now_Y-xman_now_Y)<24) {enemy3.nextFrame(); if(enemy_now_X<xman_now_X) { enemy3.move(1,0); checkEnemy(enemy3); System.out.println("xSSSS");  }   if(enemy_now_X>xman_now_X) {  enemy3.move(-1,0); checkEnemy(enemy3); System.out.println("xSSSS");  }  if(enemy_now_Y>xman_now_Y) {  enemy3.move(0,-1); checkEnemy(enemy3); System.out.println("xSSSS1");  }  if(enemy_now_Y<xman_now_Y) {  enemy3.move(0,1); checkEnemy(enemy3); System.out.println("xSSSS1");  } }  //else{  enemyvalue=Math.abs(rand.nextInt())%4;  switch(enemyvalue) { case 0:enemy3.move(-3,0);enemy3.nextFrame();checkEnemy(enemy3);break; case 1:enemy3.move(3,0);enemy3.nextFrame();checkEnemy(enemy3);break; case 2:enemy3.move(0,-3);enemy3.nextFrame();checkEnemy(enemy3);break; case 3:enemy3.move(0,3);enemy3.nextFrame();checkEnemy(enemy3);break; default:break;  }     //}  enemy_now_X=enemy4.getX();//4 enemy_now_Y=enemy4.getY();    if(Math.abs(enemy_now_X-xman_now_X)<24 && Math.abs(enemy_now_Y-xman_now_Y)<24) {enemy4.nextFrame(); if(enemy_now_X<xman_now_X) { enemy4.move(1,0); checkEnemy(enemy4); System.out.println("xSSSS");  }   if(enemy_now_X>xman_now_X) {  enemy4.move(-1,0); checkEnemy(enemy4); System.out.println("xSSSS");  }  if(enemy_now_Y>xman_now_Y) {  enemy4.move(0,-1); checkEnemy(enemy4); System.out.println("xSSSS1");  }  if(enemy_now_Y<xman_now_Y) {  enemy4.move(0,1); checkEnemy(enemy4); System.out.println("xSSSS1");  } }  //else{  enemyvalue=Math.abs(rand.nextInt())%4;  switch(enemyvalue) { case 0:enemy4.move(-3,0);enemy4.nextFrame();checkEnemy(enemy4);break; case 1:enemy4.move(3,0);enemy4.nextFrame();checkEnemy(enemy4);break; case 2:enemy4.move(0,-3);enemy4.nextFrame();checkEnemy(enemy4);break; case 3:enemy4.move(0,3);enemy4.nextFrame();checkEnemy(enemy4);break; default:break;  }      //}         } /* 敌人碰撞背景,则停止*/private void checkEnemy(Sprite s){ if(s.collidesWith(background,false)){ s.setPosition(enemy_now_X,enemy_now_Y); //System.out.println("碰撞");           }      } /*  检测主角是否到边界,或者遇到背景 */ private void checkRole(){  if(xman.collidesWith(background,false)){ xman.setPosition(xman_now_X,xman_now_Y); System.out.println("碰撞");              }           } /* 主角碰到了敌人,自然后退,要判断前后碰撞和上下碰撞 #只需要把主角的左右坐标和敌人坐标比较 #左右坐标有差异的,移动左右 #上下坐标有差异的,移动上下 #实现后退 #主角上次坐标已经保留*/ private void xman_knock_enemy(){ //if(xman.getX()%8==0)原本是为了防止碰撞后斜跳 //if(xman.getY()%8==0)原本是为了防止碰撞后斜跳 if(xman.collidesWith(enemy1,false)){    if(xman.getX()<enemy1.getX()){//敌人左边  xman.setPosition(xman_now_X-16,xman.getY());System.out.println("碰撞1");          }  if(xman.getX()>enemy1.getX()){//敌人右边  xman.setPosition(xman_now_X+16,xman.getY());          }  if(xman.getY()<enemy1.getY()){//敌人在下  xman.setPosition(xman.getX(),xman_now_Y-16);          }  if(xman.getY()>enemy1.getY()){//敌人在上  xman.setPosition(xman.getX(),xman_now_Y+16);          } lift-=1;  //lockXmancheck();                 }  if(xman.collidesWith(enemy2,false)){  if(xman.getX()<enemy2.getX()){//敌人左边  xman.setPosition(xman_now_X-16,xman.getY());System.out.println("碰撞2");          }  if(xman.getX()>enemy2.getX()){//敌人右边  xman.setPosition(xman_now_X+16,xman.getY());          }  if(xman.getY()<enemy2.getY()){//敌人在下  xman.setPosition(xman.getX(),xman_now_Y-16);          }  if(xman.getY()>enemy2.getY()){//敌人在上  xman.setPosition(xman.getX(),xman_now_Y+16);              } lift-=1;   //lockXmancheck();        }  if(xman.collidesWith(enemy3,false)){  if(xman.getX()<enemy3.getX()){//敌人左边  xman.setPosition(xman_now_X-16,xman.getY());System.out.println("碰撞3");          }  if(xman.getX()>enemy3.getX()){//敌人右边  xman.setPosition(xman_now_X+16,xman.getY());          }  if(xman.getY()<enemy3.getY()){//敌人在下  xman.setPosition(xman.getX(),xman_now_Y-16);          }  if(xman.getY()>enemy3.getY()){//敌人在上  xman.setPosition(xman.getX(),xman_now_Y+16);               } lift-=1;   //lockXmancheck();        }  if(xman.collidesWith(enemy4,false)){  if(xman.getX()<enemy4.getX()){//敌人左边  xman.setPosition(xman_now_X-16,xman.getY());System.out.println("碰撞4");          }  if(xman.getX()>enemy4.getX()){//敌人右边  xman.setPosition(xman_now_X+16,xman.getY());          }  if(xman.getY()<enemy4.getY()){//敌人在下  xman.setPosition(xman.getX(),xman_now_Y-16);          }  if(xman.getY()>enemy4.getY()){//敌人在上  xman.setPosition(xman.getX(),xman_now_Y+16);               } lift-=1;           }  lockXmancheck();         } /* 防止主角落在边界上卡住,或者在屏幕之外*/ private void lockXmancheck(){ if(xman.getX()<8){ xman.setPosition(8,xman.getY());    } if(xman.getX()>112){ xman.setPosition(104,xman.getY());      } if(xman.getY()<8){ xman.setPosition(xman.getX(),8);    } if(xman.getY()>104){ xman.setPosition(xman.getX(),96);      }          } /* 炸弹炸到敌人,而且是第三个"炸弹"*/ private void burstknockenemy(){ int enemyX,enemyY;  if(burst_third.collidesWith(enemy1,false)){ rand=new Random(); do{ enemyX=Math.abs(rand.nextInt())%15*8;//屏幕大概就15*8那么大吧,只要是8倍数,而且不在背景  enemyY=Math.abs(rand.nextInt())%15*8; enemy1.setPosition(enemyX,enemyY);   }while(enemy1.collidesWith(background,false));  killenemy+=1;score+=20;         }  if(burst_third.collidesWith(enemy2,false)){ System.out.println("knock"); rand=new Random(); do{ enemyX=Math.abs(rand.nextInt())%15*8;//屏幕大概就15*8那么大吧,只要是8倍数,而且不在背景  enemyY=Math.abs(rand.nextInt())%15*8; enemy2.setPosition(enemyX,enemyY);   }while(enemy2.collidesWith(background,false));  killenemy+=1;score+=20;         }  if(burst_third.collidesWith(enemy3,false)){ System.out.println("knock"); rand=new Random(); do{ enemyX=Math.abs(rand.nextInt())%15*8;//屏幕大概就15*8那么大吧,只要是8倍数,而且不在背景  enemyY=Math.abs(rand.nextInt())%15*8; enemy3.setPosition(enemyX,enemyY);   }while(enemy3.collidesWith(background,false));  killenemy+=1;score+=20;         }  if(burst_third.collidesWith(enemy4,false)){ System.out.println("knock"); rand=new Random(); do{ enemyX=Math.abs(rand.nextInt())%15*8;//屏幕大概就15*8那么大吧,只要是8倍数,而且不在背景  enemyY=Math.abs(rand.nextInt())%15*8; enemy4.setPosition(enemyX,enemyY);   }while(enemy4.collidesWith(background,false));  killenemy+=1;score+=20;         }     }   /* 绘画*/private void draw(Graphics g){  g.setColor(0xffffff); g.fillRect(0,0,getWidth(),getHeight());  background.paint(g);  burstdrawcheck();  enemy1.paint(g); enemy2.paint(g); enemy3.paint(g); enemy4.paint(g);  xman.paint(g);  liftkillscore(g,lift,killenemy,score);  flushGraphics();            } /* 爆炸检测,有按下的话,炸弹暴*/private void burstdrawcheck(){ Graphics g=getGraphics(); if(burst_first.isVisible()) {burst_first.paint(g);}  if(burst_second.isVisible()) {burst_second.paint(g);}  if(burst_third.isVisible()) {burst_third.paint(g);}        }                 } /* 生命,杀敌,分数*/private void liftkillscore(Graphics gg,int l,int k,int s){ int lift=l; int killenemy=k; int score=s;   Graphics g=gg;  g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL));  g.setColor(0x00ffff);  g.drawString("命:"+lift+"  杀敌:"+killenemy+"  分数: "+score,0,112,Graphics.TOP|Graphics.LEFT);              }   /* 炸弹类,做成一个任务,行不通,传值麻烦 class BurstTask implements Runnable{  private int burst_X,burst_Y; private Sprite burst_first,burst_second,burst_third;  public BurstTask(int xman_now_X,int xman_now_Y){ burst_X=xman_now_X; burst_Y=xman_now_Y; try{ burst_first=new Sprite(Image.createImage("/img1.png"),8,8); burst_second=new Sprite(Image.createImage("/img2.png"),8,8); burst_third=new Sprite(Image.createImage("/img3.png"),16,16); //一开始没爆炸 burst_first.setVisible(false); burst_second.setVisible(false); burst_third.setVisible(false); } catch(Exception e){}         }  public void run(){   burst_first.setPosition(burst_X,burst_Y); burst_first.setVisible(true);  try{Thread.sleep(2000);} catch(Exception e){}     }     }   */ /* 爆炸类2,只是简单的变量调用*/class Burst implements Runnable{ private int burstX,burstY;/* 构造器*/  public Burst(int x,int y){  burstX=x; burstY=y;  Thread t=new Thread(this); t.start(); System.out.println("Thread2"); //savercanvas.xman_now_X=100;        } /* 线程启动*/  public void run(){  burstdraw();     } /* 判断,并且炸弹每间隔2秒换图burst_first,burst_second,burst_third;*/private void burstdraw(){ if(savercanvas.burst_first.isVisible()) { try{ Thread.sleep(1000);    } catch(Exception e){}  savercanvas.burst_second.setPosition(burstX,burstY); savercanvas.burst_second.setVisible(true); savercanvas.burst_first.setVisible(false);  }  if(savercanvas.burst_second.isVisible()) { try{ Thread.sleep(1000);    } catch(Exception e){}  savercanvas.burst_third.setPosition(burstX,burstY); savercanvas.burst_third.setVisible(true); savercanvas.burst_second.setVisible(false);  }  if(savercanvas.burst_third.isVisible()) { try{ Thread.sleep(500);    } catch(Exception e){} //savercanvas.burst_third.setVisible(true); savercanvas.burst_third.setVisible(false); }    }     }   } /* if((keyState&FIRE_PRESSED)!=0){// bursttimer=new Timer();// bursttask=new BurstTask(xman_now_X,xman_now_Y);//将主角坐标传到爆炸任务里面// bursttimer.schedule(bursttask,0);            }*/  

阅读(12241) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册