//说明一下,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要想办法
*/
评论