正文

J2ME游戏 XX就下一百层(建立了模)2006-10-07 18:56:00

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

分享到:

//说明一下,JPG格式记得用画图板转换为PNG格式否则,嘿嘿```

//009-Lancer01.png
//007-Swamp01.png
//001-Sky01.PNG
import 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要想办法

 


*/

阅读(4194) | 评论(0)


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

评论

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