//说明一下,JPG格式记得用画图板转换为PNG格式否则,嘿嘿``` //009-Lancer01.png//007-Swamp01.png//001-Sky01.PNGimport javax.microedition.midlet.MIDlet;import javax.microedition.rms.*;import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.util.*;import java.io.*; //简单的动画canvas by sword2008@程序之巢 public class test2 extends MIDlet{ private Display display; public test2(){ } public void startApp(){ new test(Display.getDisplay(this)).start();} public void pauseApp(){ } public void destroyApp(boolean unkowmn){ } class test extends GameCanvas implements Runnable{////////////////////////////////////// private Display display; private long frameDelay; private boolean sleeping;//游戏终止或者停止 private Random rand; private Sprite ken; private int XSpeed,YSpeed,treeYSpeed=-7; private Sprite tree[]=new Sprite[5]; private TiledLayer backgroundLayer; private char sp; private boolean leftB=true,rightB=true,upB=true,downB=true,fireB=false; private boolean treeUp1=true,treeUp2=true,treeUp3=true,treeUp4=true,treeUp5=true; private boolean kenB=true;//kenB是否在空中 private long fenshu;//一看就知道,当前分数 private int HIGHT=0;//下落的高度,好记分 private byte life=3; private int[] hiScores=new int[5];////////////////////////////////////////System.out.println("go well!");//试验憾数 //System.out.println(getHeight()+""+getWidth());// 240 289屏幕大小int layerMap[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };//////////////////////////////////////int layerMap2[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; ////////////////////////////////////// int up[]={12,13,14,15}; int down[]={0,1,2,3}; int left[]={4,5,6,7}; int right[]={8,9,10,11};////////////////////////////////////// public test(Display d){ super(true); display=d; frameDelay=30; }//========================================== public void start(){ display.setCurrent(this); XSpeed=YSpeed=0; rand=new Random(); try{ ken= new Sprite(Image.createImage("/009-Lancer01.png"),32,48); //ken2=new Sprite(Image.createImage("/056-Snake02.png"),48,48); //ken3=new Sprite(Image.createImage("/015-Warrior03.png"),32,48); //ken2.setPosition(40,50); for(int i=0;i<5;i++) tree[i]=new Sprite(Image.createImage("/007-Swamp01.png"),65,32); backgroundLayer=new TiledLayer(4,4,Image.createImage("/001-Sky01.PNG"),60,73); } catch(Exception e){System.out.println(e.toString());}//------------------------------------------ sleeping=false;//============================== for(int i=0;i<layerMap.length;i++) {int column=i%4; int row=(i-column)/4; backgroundLayer.setCell(column,row,layerMap[i]); } //============================== Thread t=new Thread(this); t.start(); }//------------------------------------------ public void run(){ Graphics g=getGraphics(); while(!sleeping){ update(); draw(g); try{Thread.sleep(frameDelay);} catch(Exception e){} } } private void draw(Graphics g){ g.setColor(0x000000); g.fillRect(0,0,getWidth(),getHeight());// { backgroundLayer.paint(g); //ken2.paint(g); //ken3.paint(g); ken.paint(g);} treeMove();//===================================板运动涵数 lifePanduan();//是否结束 flushGraphics(); }//===============/////////////////////////////////////////////////////////////////////////////////////////public void treeMove(){ Graphics g=getGraphics(); g.drawString(fenshu+" 命"+life,20,260,0); fenGo(); if (!treeUp1) //变量判断到顶,重新随机出现 {tree[0].setPosition(Math.abs(rand.nextInt())%5*40,this.getHeight()); treeUp1=!treeUp1; } tree[0].move(0,treeYSpeed); tree[0].paint(g); if (!treeUp2) {tree[1].setPosition(Math.abs(rand.nextInt())%5*40,this.getHeight()+50); treeUp2=!treeUp2; } tree[1].move(0,treeYSpeed); tree[1].paint(g); if (!treeUp3) {tree[2].setPosition(Math.abs(rand.nextInt())%5*40,this.getHeight()+70); treeUp3=!treeUp3; } tree[2].move(0,treeYSpeed); tree[2].paint(g); if (!treeUp4) {tree[3].setPosition(Math.abs(rand.nextInt())%5*40,this.getHeight()+120); treeUp4=!treeUp4; } tree[3].move(0,treeYSpeed); tree[3].paint(g); if (!treeUp5) {tree[4].setPosition(Math.abs(rand.nextInt())%5*40,this.getHeight()+150); treeUp5=!treeUp5; } tree[4].move(0,treeYSpeed); tree[4].paint(g); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////public void fenGo(){if(HIGHT==1000) {fenshu+=10; HIGHT=0; } HIGHT+=10; }///////////////////////////////////public void lifePanduan(){ if(life<3)//命不够,游戏结速 {Graphics g=getGraphics(); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,Font.SIZE_LARGE)); g.setColor(0xff0000); g.drawString(" 你完蛋了 ",50,100,0); g.drawString("2006,10,10 剑制作",50,130,0); g.drawString("http://blog.programfan.com",10,150,0); g.drawString("/blog.asp?author=qq14923349",10,170,0); writeHiScores(); readHiScores();//读记录存储 for(int i=0;i<5;i++){ g.drawString("第 "+i+"名: "+hiScores[i],50,200+i*15,0); } sleeping=true; } }/////////////////////////////////// //---------------------leftB=true;rightB=true;upB=true;downB=true;//人向四面走,想了一个钟头了!public void go(){ char ch=sp; if((ch=='l')&&(leftB==true)) {ken.setFrameSequence(left);leftB=!leftB;rightB=true;upB=true;downB=true;} else if((ch=='l')&&(leftB==false)) ken.nextFrame(); else if((ch=='r')&&(rightB==true)) {ken.setFrameSequence(right);rightB=!rightB;leftB=true;upB=true;downB=true;} else if((ch=='r')&&(rightB==false)) ken.nextFrame(); else if((ch=='u')&&(upB==true)) {ken.setFrameSequence(up);upB=!upB;leftB=true;rightB=true;downB=true;} else if((ch=='u')&&(upB==false)) ken.nextFrame(); else if((ch=='d')&&(downB==true)) {ken.setFrameSequence(down);downB=!downB;leftB=true;rightB=true;upB=true;} else if((ch=='d')&&(downB==false)) ken.nextFrame(); else ken.nextFrame();}///////////////////////////////////////////////////////////public void treeSleep(int i)//这个涵数我一开始就想错了,留着算了。{ try{Thread.sleep(i);} catch(Exception e){e.toString();} }/////////////////////////////////////////////////////////// //-----------------------public void drup()//跳 { Graphics g=getGraphics(); fireB=!fireB; for(int i=1;i<9;i=i+2) {ken.move(i,-i); draw(g);} for(int i=1;i<9;i=i+2) {ken.move(i,i); draw(g); } }//====================public void treeCheckBound(Sprite e,int i){ if(e.getY()<-30) switch(i) {case 0:treeUp1=false;break; case 1:treeUp2=false;break; case 2:treeUp3=false;break; case 3:treeUp4=false;break; case 4:treeUp5=false;break; } }//====================//////////////////////////////////////////////////public void treecheck(){ treeCheckBound(tree[0],0); treeCheckBound(tree[1],1); treeCheckBound(tree[2],2); treeCheckBound(tree[3],3); treeCheckBound(tree[4],4); }////////////////////////////////////////////////// public void kencheck(){//判断人 if(ken.getY()<0)//顶 {ken.move(0,80); fenshu=fenshu-50; } if(ken.getX()<0) ken.setPosition(0,ken.getY());//左 if(ken.getY()>getHeight())//掉下去了 {ken.setPosition(0,0); fenshu=fenshu-100;//分数也要狂减! life=(byte)(life-1);//死一条命 } if(ken.getX()>208)//右边,要减去角色动画X坐标大小,原因getX()是图片的左上角 ken.setPosition(208,ken.getY()); }///////////////////////////////////////////////////*public void move2(){ for(int i=0;i<3;i++) {if(i==1) ken.prevFrame(); else ken.nextFrame(); }}*///=======================public void Laymove()//屏幕移动涵数{if(XSpeed>0&&YSpeed>0) backgroundLayer.move(0,0);}//////////////////////////////////////////////////////////public void kenCollidesWith(){ kenB=false;//没碰到板就为false if( (ken.collidesWith(tree[0],false)) && (ken.getX())<(tree[0].getX()+60)&& (tree [0].getX())<(ken.getX())+20 &&((ken.getY()+35)<tree[0].getY()) ) {YSpeed=treeYSpeed;kenB=true;} if(ken.collidesWith(tree[1],false)&& (ken.getX())<(tree[1].getX()+60)&& (tree[1].getX()) <(ken.getX())+20 &&((ken.getY()+35)<tree[1].getY())) {YSpeed=treeYSpeed;kenB=true;} if(ken.collidesWith(tree[2],false)&& (ken.getX())<(tree[2].getX()+60)&& (tree[2].getX()) <(ken.getX())+20 &&((ken.getY()+35)<tree[2].getY())) {YSpeed=treeYSpeed;kenB=true;} if(ken.collidesWith(tree[3],false)&& (ken.getX())<(tree[3].getX()+60)&& (tree[3].getX()) <(ken.getX())+20 &&((ken.getY()+35)<tree[3].getY())) {YSpeed=treeYSpeed;kenB=true;} if(ken.collidesWith(tree[4],false)&& (ken.getX())<(tree[4].getX()+60)&& (tree[4].getX()) <(ken.getX())+20 &&((ken.getY()+35)<tree[4].getY())) {YSpeed=treeYSpeed;kenB=true;} //}/////////////////////////////////////////////////////////////////////////////////////////////////////private void writeHiScores()//添加记录{ try{//删除前面的记录 RecordStore.deleteRecordStore("HiScores"); } catch(Exception e){} RecordStore rs=null; try{ rs=RecordStore.openRecordStore("HiScores",true); } catch(Exception e){ System.err.println("failed!!"); } for(int i=0;i<5;i++) { if(hiScores[i]>(int)fenshu) hiScores[i]=(int)fenshu;} for(int i=0;i<5;i++) { if(hiScores[i]>(int)fenshu) hiScores[i]=(int)fenshu; byte[] recordData=Integer.toString(hiScores[i]).getBytes(); try{ rs.addRecord(recordData,0,recordData.length); } catch(Exception e){ System.err.println("Failed writing hi scores!"); } } try{//关闭记录存储 rs.closeRecordStore(); } catch(Exception e){ System.err.println("Failed closing hi score record store!"); }}/////////////////////////////////////////////////////////////////////////////////////////////private void readHiScores()//读出记录{ RecordStore rs=null; try{ rs=RecordStore.openRecordStore("HiScores",false); } catch(Exception e){} if( rs!=null ){ try{ int len; byte[] recordData=new byte[8]; for(int i=1;i<=rs.getNumRecords();i++) { if(rs.getRecordSize(i)>recordData.length) recordData =new byte[rs.getRecordSize(i)]; len=rs.getRecord(i,recordData,0); hiScores[i-1]=(Integer.parseInt(new String(recordData,0,len))); } } catch(Exception e){ System.err.println("Failed reading hi scores!"); } try{ rs.closeRecordStore(); } catch(Exception e){ System.err.println("Failed closing hi score record store!"); } } else{ for(int i=0;i<5;i++) hiScores[i]=0; } }//////////////////////////////////////////////////public void update(){//------------------------------------------- int keyState=getKeyStates(); if(kenB){//在空中的话,左右方向不能移动这个功能放弃了 if((keyState&LEFT_PRESSED)!=0) {XSpeed-=10;sp='l';go();} if((keyState&RIGHT_PRESSED)!=0) {XSpeed+=10;sp='r';go();} } else { if((keyState&LEFT_PRESSED)!=0) {XSpeed-=2;sp='l';go();} if((keyState&RIGHT_PRESSED)!=0) {XSpeed+=2;sp='r';go();} } if((keyState&UP_PRESSED)!=0) {YSpeed-=4;sp='u';go();} if((keyState&DOWN_PRESSED)!=0) {YSpeed+=4;sp='d';go();} if((keyState&FIRE_PRESSED)!=0) if((keyState&FIRE_PRESSED)!=0) {drup();} XSpeed=Math.min(XSpeed,20); YSpeed=Math.min(YSpeed,5);//------------------------------------------- YSpeed=10;//一直往下掉 kenCollidesWith();//是否碰到板 kencheck();//人是否到顶或者四面碰壁 treecheck();//板是否到顶 ken.move(XSpeed,YSpeed); Laymove(); XSpeed=0;YSpeed=0;//初始化速度,不要让他一直保留速度 //==============================//----------------- } } }/*算法分析(1)分析是在我完成板上浮之后才想到的,以下都是针对对象角色的分析:1,角色是一直向下的,也就是YSpeed一定有个速度,而且不断做检测,如碰到板,就设置YSpeed为零速度。2,空中不可以左右移动;3, 虽然原来的游戏是不容许跳的,我还是写了个,可以删除,只是为了更具娱乐;4, 角色到顶后会减血,并掉下来,目前还没做体力;5, 原版是有钉的,以后补做吧,用1k多一点的图就够了; 纠正部分算法 (2)1, 为零速度并不能表达角色站在板上,因为角色这时候只是呆在那里,所以应该把YSpeed等于这时候的板的向 上速度;2, 是变量的应该声明,声明了treeYSpeed,并且如果可以合成涵数的话,最后还是放在一个涵数内,那样维护 起来方便,扩展起来也舒服!3, 我突然想起角色图片是16副,有什么问题?没问题,只是,那个涵数,角色向左右上下移动是我想了30分钟 才搞出来,汗!4,不知道为什么图片老是显示向下动,原因是我不小心把一个IF DOWN控制语句删除了。5,midlet2.0的碰撞检测问题,只要碰到边就是算碰撞了,而我们要的是碰到板的平面;6,在空中的做个判断,kenB为False就是在空中7,五个板应该够了.8,忘记空中是可以移动的,不过移动速度好象```忘记了;(3)退出游戏人肉小炒(418138484) 09:56:56让while(参数=false) 人肉小炒(418138484) 09:57:30然后 Gamelet.midlet.notifyDestroyed();就可以退出游戏了 和木块的碰撞依旧有问题人一站上面就占住了!空中移动太过了!未站稳就《Y要想办法 */

评论