JSR184,我学完自己做的程序

My Project 同时被 2 个专栏收录
10 篇文章 0 订阅
6 篇文章 0 订阅

这是很早以前看184规范时写的小程序,纯脆是练手的,因为当时没做过真机测试,所以效能上肯定不行,代码也不是很规范,没写注释.整个项目都是跑通的,我在朋友索爱的walkman上测试了下.

现在做app了,游戏方面,很久没看了,一句话很让人省悟,虽然不太愿意相信:基于j2me+web的游戏,是做不出PC平台游戏的那种辉煌的.(game规模,game界面,响应速度,费用,限制太多太多了,还需要硬件的进一步发展,这个产业才能真正壮大起来)

 

 

汗死,CRC校验错误,所有资源文件都不能用.PNG M3G MAX都失效了,只有源文件了,等我回家了再把东西补传上来吧,大家将就下先凑合下看看源码吧。

下图是游戏截图:

 

 

About.java

//Text "About" code skeleton
import javax.microedition.lcdui.*;
public class About extends Form implements CommandListener
{
//Command for going back to the main menu
private Command back = new Command("Back", Command.BACK, 1);
private AirFighterMIDlet parent = null;
private MainMenu menu = null;

public About(String title,AirFighterMIDlet parent, MainMenu menu)
 {
 super(title);
 this.parent = parent;
 this.menu = menu;
 this.addCommand(back);
 this.append("/n/n/n/n    ==== Version 1.0.0 ====/n    Legion 2007年作版权所有(C)");
 this.setCommandListener(this);
 }

public void commandAction(Command p0, Displayable p1)
 {
 if (p0 == back)
  {
  parent.setDisplayable(menu);
  }
 }
}

 

Aim.java

import java.util.Random;

import javax.microedition.m3g.Group;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.RayIntersection;

 

/***
 * 2007.5.8
 * @author hj
 *
 */

public class Aim
{

 private float[] pos = {0.0f, 0.0f, 0.0f};
   
 //是否死亡
 private boolean life=true;
 private int itemID=0;
 private Random rand;
 private Group goomba;
 RayIntersection ri;
    
 /** Empty initialization */
 public Aim(int itemID,Group group,Random ran)
     {
   //System.out.println("Create Aim:");
   goomba=MeshFactory.createGoomba("/res/goomba.m3g");
   //  /res/machine.m3g
   //  /res/goomba.m3g
   group.addChild(goomba);
   goomba.setUserID(itemID);
   setID(itemID);
   ri = new RayIntersection();
   rand=ran;
   setLife(false);
     }
     /**
      * Initializes the particle
      * @param velocity Sets the velocity
      * @param position Sets the position
      * @param color Sets the color (no alpha)
      */
 
 public void init(int i,Group group)
 {
  pos[0] = 15.0f-rand.nextFloat()*30.0f;
  pos[2] = 15.0f-rand.nextFloat()*30.0f;
  group.pick(-1, pos[0],10.0f, pos[2], 0.0f, -1.0f, 0.0f, ri);
   pos[1] = 10.0f-ri.getDistance();
        setLife(true);
       
  //System.out.println("Aim "+i+" pos:"+pos[0]+","+pos[1]+","+pos[2]);
        //System.out.println();
        goomba.translate(pos[0],pos[1],pos[2]);
 }
 
 /*
 public void updata(Group group)
 {
  // x positive
  if (vel[0] >= 0.0f)
  {
   //s速度+半边长+隔离距离
   if (group.pick(-1, pos[0], pos[1], pos[2], 1.0f, 0.0f, 0.0f, ri)&& (ri.getDistance() < (vel[0] + scale)))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[0] = pos[0] + ri.getDistance() - 0.2f;
    vel[0]=-vel[0];
   }
   else
   {
    pos[0] += vel[0];
   }
  }
  else
  {
   if (group.pick(-1, pos[0], pos[1], pos[2], -1.0f, 0.0f, 0.0f, ri)&& (ri.getDistance() < (-vel[0] + scale)))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[0] = pos[0] - ri.getDistance() + 0.2f;
    vel[0]=-vel[0];
   }
   else
   {
    pos[0] += vel[0];
   }
  }
  if (vel[1] >= 0.0f)
  {
   if (group.pick(-1, pos[0], pos[1], pos[2], 0.0f, 1.0f, 0.0f, ri)&& (ri.getDistance() < (vel[1] + scale )))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[1] = pos[1] + ri.getDistance() - 0.2f;
    vel[1]=-vel[1];
   }
   else
   {
    pos[1] += vel[1];
   }
  }
  else
  {
   if (group.pick(-1, pos[0], pos[1], pos[2], 0.0f, -1.0f, 0.0f, ri)&& (ri.getDistance() < (-vel[1] + scale)))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[1] = pos[1] - ri.getDistance() + 0.2f;
    vel[1]=-vel[1];
   }
   else
   {
    pos[1] += vel[1];
   }
  }
  if (vel[2] >= 0.0f)
  {
   if (group.pick(-1, pos[0], pos[1], pos[2], 0.0f, 0.0f, 1.0f, ri)&& (ri.getDistance() < (vel[2] + scale)))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[2] = pos[2] + ri.getDistance() - 0.2f;
    vel[2]=-vel[2];
   }
   else
   {
   pos[2] += vel[2];
   }
  }
  else
  {
   if (group.pick(-1, pos[0], pos[1], pos[2], 0.0f, 0.0f, -1.0f, ri)&& (ri.getDistance() < (-vel[2] + scale)))
   {
    // System.out.println(ri.getIntersected().getUserID());
    pos[2] = pos[2] - ri.getDistance() + 0.2f;
    vel[2]=-vel[2];
   }
   else
   {
    pos[2] += vel[2];
   }
  }
  //System.out.println(vel[0]+","+vel[1]+","+vel[2]);
   goomba.setTranslation(pos[0], pos[1], pos[2]);
 }
 */
 
 public void setPos(float[] tpos)
 {
     System.arraycopy(tpos, 0, pos, 0, pos.length);
 }

     /**
      * @return Returns the pos.
      */
 float[] getPos()
 {
     return pos;
 }

    
     void setLife(boolean life)
     {
         this.life = life;
     }

     boolean getLife()
     {
         return life;
     }
    
     void setID(int id)
     {
      itemID = id;
     }

     int getID()
     {
         return itemID;
     }
   
}

 

 

AimSystem.java

import java.util.Random;

import javax.microedition.m3g.Group;
import javax.microedition.m3g.Transform;

public class AimSystem
{
 Aim[] aim=null;
    int hitnum=0;//记录击中数
    Transform tran;
    Random ran;
 public AimSystem(int aimNum,Group group,BulletSystem bs)
 {
  aim=new Aim[aimNum];
  ran=new Random();
  tran=new Transform();
  tran.setIdentity();
  tran.postTranslate(0.0f, 2.0f, 0.0f);
  for(int i=0;i<aim.length;i++)
  {
   aim[i]=new Aim(300+i,group,ran);
   //System.out.println("Goomba[i] ID:"+aim[i].getID());
   aim[i].init(i,group);
   //System.out.print("Bullet "+(i+1)+"init:");
   
   tran.postRotate(45.0f-ran.nextFloat()*90.0f, 1.0f, 0.0f, 0.0f);
   tran.postRotate(45.0f-ran.nextFloat()*90.0f, 0.0f, 1.0f, 0.0f); 
   bs.start(i+1, aim[i].getPos(), tran);
  } 
 }
 
 public void kpbulletsurvive(BulletSystem bs)
 {
  for(int i=1;i<bs.getBulletnum();i++)
  {
  if(!bs.getBulletState(i))
   {
   tran.postRotate(ran.nextFloat()*180.0f, 1.0f, 0.0f, 0.0f);
   tran.postRotate(90.0f-ran.nextFloat()*180.0f, 0.0f, 1.0f, 0.0f); 

   bs.start(i, aim[i-1].getPos(), tran);
   }
  }
 }
 
 public void update(Group group)
 {
  for(int i=0;i<aim.length;i++)
  {
   if(!aim[i].getLife())
   {
    aim[i].init(i,group);
   }
   else
   {
    //aim[i].updata(group);
   }
  }
 }
 
 public float[] hit(int itemID)
 {
 float pos[]=null;
  for(int i=0;i<aim.length;i++)
  {
   if(aim[i].getID()==itemID)
   {
   hitnum++;
   pos=aim[i].getPos();
   aim[i].setLife(false);
   }
  }
  return pos;
 }
 int gethitNum()
 {
  return hitnum;
 }
 
 
}

 

 

AirFighterCanvas.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Background;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Group;
import javax.microedition.m3g.Image2D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.World;

public class AirFighterCanvas extends GameCanvas implements Runnable
{
private AirFighterMIDlet parent = null;
private MainMenu menu = null;
private StarHScroller scroller; // scroll stars on the screen.

private int width;
private int height;
private boolean gamePaused;

//private boolean pxCollides=true;
//private boolean trance = false;
//private long delay;

private World world;
private Group heightmap;
private Graphics g;
private Graphics3D g3;
private AimSystem as;
private Camera cameraog;
private Camera camera;
private FountainEffect fe;
private ParticleSystem ps;
private BulletSystem bs;
private Transform transform;
private Light[] light;
private Background background;
private Image2D image2d;
private Image crossImage;


private float camerapos[] = new float[] {0.0f, 2.0f, 2.0f };
private float[] gettrans;


private float radian = 3.0f;// 旋转角度
private float cameramove=0.5f;
private float[] bompos;

private boolean key[] = new boolean[9];
private int keystate;
private static final int FIRE = 0;
private static final int UP = 1;
private static final int DOWN = 2;
private static final int LEFT = 3;
private static final int RIGHT = 4;
private static final int GAME_A=5;
private static final int GAME_B=6;
private static final int GAME_C=7;
private static final int GAME_D=8;
static final int TERRAIN_ID = 14;
static final int CAMERA_ID = 15;
static final int SLEEP=30;
static final int AimNum=5;

private int round=0;
private int firnum=0;
private int score=0;


 public AirFighterCanvas(AirFighterMIDlet parent, MainMenu menu)
 {
  // TODO Auto-generated constructor stub
  super(true);
  this.parent = parent;
  this.menu = menu;
  setFullScreenMode(true);
  this.width = getWidth();
  this.height = getHeight();
        scroller = new StarHScroller(width, height);
  init();
 }

 public void init()
 { 
  world=new World();
  light = new Light[2];
  //System.out.println("World ID:"+world.getUserID()); 
  
        background = new Background();
        image2d=new Image2D(Image2D.RGB, scroller.getImage());
        background.setImage(image2d);
        world.setBackground(background);
        try
        {
        crossImage = Image.createImage("/res/cross.png");
        }
        catch(Exception e)
        {
        }
       
  light[0] = new Light();
  light[0].setMode(Light.OMNI); // Light Mode
  light[0].setColor(0xFFFFFF); // The color of the light
  light[0].setTranslation(15.0f, 15.0f, -15.0f);
  light[0].setUserID(2);
  
  light[1] = new Light();
  light[1].setMode(Light.OMNI); // Light Mode
  light[1].setColor(0xFFFFFF); // The color of the light
  light[1].setTranslation(-15.0f, 15.0f, 15.0f);
  light[1].setUserID(3);
  
  for (int i = 0; i < light.length; i++)
  {
   world.addChild(light[i]);
   //System.out.println("Light ID:"+light[i].getUserID());   
  }
  
  transform = new Transform();
  transform.setIdentity();
  this.g = this.getGraphics();
  g3 = Graphics3D.getInstance();
  gettrans=new float[16];
  
  heightmap=MeshFactory.createHeightMap("/res/heightmap.m3g");
  heightmap.setUserID(1);
  world.addChild(heightmap);
  //System.out.println("HeightMap ID:"+heightmap.getUserID());

  loadcamera();
  //loadcameraog();
   
  bs=new BulletSystem(AimNum+1,world);
  as = new AimSystem(AimNum, world,bs);
  fe = new FountainEffect(-90);
  ps = new ParticleSystem(fe, 10);
 }
 
 private void loadcamera()
 {
  camera = new Camera();
  float aspect = (float) width / (float) height;
  camera.setPerspective(60.0f, aspect, 0.1f, 100.0f);
  camera.setTranslation(camerapos[0], camerapos[1], camerapos[2]);
  world.addChild(camera);
  world.setActiveCamera(camera);  
 }
 
 private void loadcameraog()
 {
  try
  {   
   // Find a specific Camera node in the World.
   camera = (Camera) world.find(CAMERA_ID);
   world.setActiveCamera(camera);
   camera.getTransform(transform);
   transform.get(gettrans);
   camerapos[0]=gettrans[3];
   camerapos[1]=gettrans[7];
   camerapos[2]=gettrans[11];
   
   //System.out.println("/ncameraog init:");
   //System.out.println("Camera posog:"+camerapos[0]+" "+camerapos[1]+" "+camerapos[2]);
   //System.out.println("Camera tran:"+gettrans[3]+" "+gettrans[7]+" "+gettrans[11]);
   
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }  
 }
 
 private void cameramove()
 {
  //transform.postTranslate(0.0f, 0.0f,cameramove);
  if (key[LEFT])
  {
   transform.postRotate(radian, 0.0f, 1.0f, 0.0f);
   // System.out.println(".......left...............");
  }
  else if (key[RIGHT])
  {
   transform.postRotate(-radian, 0.0f,1.0f, 0.0f);
   // System.out.println(".......right...............");
  }

  if (key[UP])
  {
   //camera.postRotate(radian, 1.0f, 0.0f, 0.0f);
   transform.postRotate(radian, 1.0f, 0.0f, 0.0f);
   // System.out.println(".......up...............");
  }
  else if (key[DOWN])
  {
   //camera.postRotate(-radian, 1.0f, 0.0f, 0.0f);
   transform.postRotate(-radian, 1.0f, 0.0f, 0.0f);
  }
  
  if(key[GAME_A])
  {
   transform.postTranslate(0.0f,cameramove, 0.0f);
   //System.out.println("key[GAME_A] processing.");
  }
  
  if(key[GAME_B])
  {
   transform.postTranslate(0.0f,-cameramove,0.0f);
  }

  if(key[GAME_C])
  {
   transform.postTranslate(0.0f, 0.0f,-cameramove);
  }
  
  if(key[GAME_D])
  {
   transform.postTranslate(0.0f, 0.0f,cameramove);
  }
  
  if (key[FIRE])
  {
   if(!bs.getBulletState(0))
   {

    transform.get(gettrans);
  
    //System.out.println("/nFire Pressed:");
    //System.out.println("Camera posog:"+camerapos[0]+" "+camerapos[1]+" "+camerapos[2]);
    //System.out.println("Camera tran:"+gettrans[3]+" "+gettrans[7]+" "+gettrans[11]);

    bs.start(0,camerapos,transform);
    firnum++;//射击数
   }
  }
  
 //transform.get(gettrans);
 //System.out.println("Camera pos:"+(camerapos[0]+gettrans[3])+" "+(camerapos[1]+gettrans[7])+" "+(camerapos[2]+gettrans[11]));

 camera.setTransform(transform); 
 }
 
 public void start()
 {
 gamePaused=false;
 Thread t=new Thread(this);
 t.start();
 }

 public void run()
 {
  while (!parent.isFinished())
  {
   if (!parent.isPaused())
   {
    draw3D(g);
    //drawMenu(g);
    flushGraphics();
    try
    {
     Thread.sleep(SLEEP);//original 10
    }
    catch (InterruptedException e)
    {
     //TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
 }
 
 public void draw3D(Graphics g)
 {
  try {
   keyprocess();
   cameramove();
   as.update(world);
   
   int id= bs.update(world);
   as.kpbulletsurvive(bs);
   if(id!=0)
   {
    //bompos=as.hit(id);
    bompos=bs.hit(id);
    if(bompos!=null)
    {
     ps.init(bompos);
     //System.out.println("trance");
    }
   }
   // 绑定目标
   g3.bindTarget(g); // Binds the given Graphics or mutable Image2D
   
   //if(((++round)%10)==0)
   // background.setImage(new Image2D(Image2D.RGB, scroller.getImage()));
   
   //image2d.set(0, 0, width, height, scroller.getByteArray(scroller.getImage()));
   
   // 渲染世界 // as the rendering target of this Graphics3D
   g3.render(world); // Render the world
   ps.emit(g3);

  }
  catch (Exception e)
  {
   System.out.println(".......render exception...............");
   e.printStackTrace();
  }
  finally
  {
   g3.releaseTarget();   // 释放目标
  }
  menupaint(g);
 }
 
 void menupaint(Graphics g)
 {

  //g.setColor(0, 255, 0);
  //g.drawRect(width / 2 - 1, height / 2 - 1, 2, 2);
  if(firnum<10)
  {
   score=0;
  }else
  {
   score=(int)((as.gethitNum()+bs.gethitNum())/(firnum/10.0f)*10);
  }
  g.setColor(255, 255, 255);
  
  g.drawString("Shoot:" + firnum, 0, 0, Graphics.TOP | Graphics.LEFT);
  g.drawString("Hit:" + (as.gethitNum()+bs.gethitNum()), 0, 20, Graphics.TOP | Graphics.LEFT);
  g.drawString("Score:"+score, width - 50, 0, Graphics.TOP| Graphics.LEFT);
  
  transform.get(gettrans);
  //System.out.println("/nFire Pressed:");
  //System.out.println("Camera posog:"+camerapos[0]+" "+camerapos[1]+" "+camerapos[2]);
  //System.out.println("Camera tran:"+gettrans[3]+" "+gettrans[7]+" "+gettrans[11]);

  g.drawString("Pos[x]:"+(camerapos[0]+gettrans[3]), 0, height-60, 0);
  g.drawString("Pos[y]:"+(camerapos[1]+gettrans[7]), 0, height-40, 0);
  g.drawString("Pos[z]:"+(camerapos[2]+gettrans[11]), 0, height-20, 0);
  
  g.drawString("Enemy:" + AimNum, width - 50, height - 20, Graphics.TOP | Graphics.LEFT);
  
  
     g.drawImage(crossImage,getWidth()/2, getHeight()/2, Graphics.VCENTER | Graphics.HCENTER);

 }
 
 private void keyprocess()
 {
  keystate = getKeyStates();
  if ((keystate & GameCanvas.FIRE_PRESSED) != 0)
   key[FIRE] = true;
  else
   key[FIRE] = false;
  if ((keystate & GameCanvas.UP_PRESSED) != 0)
   key[UP] = true;
  else
   key[UP] = false;
  if ((keystate & GameCanvas.DOWN_PRESSED) != 0)
   key[DOWN] = true;
  else
   key[DOWN] = false;
  if ((keystate & GameCanvas.LEFT_PRESSED) != 0)
   key[LEFT] = true;
  else
   key[LEFT] = false;
  if ((keystate & GameCanvas.RIGHT_PRESSED) != 0)
   key[RIGHT] = true;
  else
   key[RIGHT] = false;
  if ((keystate & GameCanvas.GAME_A_PRESSED)!= 0) //GameCanvas.KEY_NUM5
   {
   key[GAME_A]=true;
   //System.out.println("key[GAME_A] pressed.");
   }
  else
   key[GAME_A]=false;
  if ((keystate & GameCanvas.GAME_B_PRESSED)!= 0) //GameCanvas.KEY_NUM5
   {
   key[GAME_B]=true;
   //System.out.println("key[GAME_A] pressed.");
   }
  else
   key[GAME_B]=false;
  if ((keystate & GameCanvas.GAME_C_PRESSED)!= 0) //GameCanvas.KEY_NUM5
   {
   key[GAME_C]=true;
   //System.out.println("key[GAME_A] pressed.");
   }
  else
   key[GAME_C]=false;
  if ((keystate & GameCanvas.GAME_D_PRESSED)!= 0) //GameCanvas.KEY_NUM5
   {
   key[GAME_D]=true;
   //System.out.println("key[GAME_A] pressed.");
   }
  else
   key[GAME_D]=false;
  
 }

 public void stop()
 {
 gamePaused=true; 
 }
 
 public boolean isPaused()
 {
 return gamePaused;
 }

 public void gameContinue()
 {
 gamePaused = false;
 }
 
}

 

 

AirFighterMIDlet.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class AirFighterMIDlet extends MIDlet
{
private Display display = null;
private SplashCanvas splash;
boolean started = false;
boolean finished = false;
boolean paused=false;
Thread drawThread;
AirFighterCanvas canvas;
 public AirFighterMIDlet()
 {
 // TODO Auto-generated constructor stub
 splash = new SplashCanvas(this); 
 this.display = Display.getDisplay(this);
 }

 protected void startApp()
 {
 // TODO Auto-generated method stub
 if (display == null)
  {
  display = Display.getDisplay(this);
  }
 //splash screen to the display
 setDisplayable(splash);
 }
 
 protected void destroyApp(boolean arg0) throws MIDletStateChangeException
 {
 // TODO Auto-generated method stub
  setFinished();
 }

 protected void pauseApp()
 {
 // TODO Auto-generated method stub
  paused=true;
 }

 public void setDisplayable(Displayable dl)
 {
 display.setCurrent(dl);
 }

 public synchronized boolean isFinished()
 {
  return finished;
 }

 public synchronized void setFinished()
 {
  finished = true;
 }
 public synchronized boolean isPaused()
 {
  return paused;
 }
}

 

 

BaseRMS.java

import javax.microedition.rms.*;
import java.util.*;
import java.io.*;

abstract public class BaseRMS {
  private String rmsName;
  private RecordStore recordStore;

  BaseRMS(String rmsName) {
    this.rmsName = rmsName;
  }

public void open() throws Exception
  {
    try
    {
      recordStore = RecordStore.openRecordStore(this.rmsName,true);
      if (recordStore.getNumRecords() > 0)
      {
        loadData();
      }
      else
      {
        createDefaultData();
      }
    }
    catch (Exception e)
    {
      throw new Exception(this.rmsName+"::open::"+e);
    }
  }

  public void close()
  {
    if (recordStore != null)
    {
      try
      {
        recordStore.closeRecordStore();
      }
      catch(Exception e)
      {
      System.out.println(this.rmsName+"::close::"+e);
      }
    }
  }

  public RecordStore getRecordStore()
  {
    return this.recordStore;
  }

  public String getRMSName()
  {
    return this.rmsName;
  }

  abstract void loadData() throws Exception;
  abstract void createDefaultData() throws Exception;
  abstract void updateData() throws Exception;
}

 

 

Bullet.java

import java.util.Random;

import javax.microedition.m3g.Group;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Mesh;
import javax.microedition.m3g.RayIntersection;
import javax.microedition.m3g.Transform;

public class Bullet
{
 private Mesh mesh;
 private float scaleobj = 0.2f;
 private float scalebullet = 0.1f;
 RayIntersection ri;
 private Random rand;
    private boolean life=true;
 private Transform transform;
    private int itemID=0;   
 private float[] pos = { 0.0f, 0.0f, 0.0f };
 private float[] posinit = { 0.0f, 0.0f, 0.0f };
 private float[] poshide={0.0f,-3.0f,0.0f};
 private float[] gettrans;
 private float vog = 2.0f;
 private float vobject=0.05f;
 private float v = 0.0f; 
 private float dis=0.2f;
 
 public Bullet(int ID,Group group,Random ran)
 {
  mesh = MeshFactory.createSquare("/res/Legion.png");
  group.addChild(mesh);
  mesh.translate(poshide[0], poshide[1], poshide[2]);
  mesh.setUserID(ID);
  setID(ID);
  
  gettrans=new float[16];
  transform=new Transform();
  transform.setIdentity();
  ri = new RayIntersection();
  rand=ran;
  setLife(false);
 }
 
 public void init(float[] posog,Transform tran,boolean flag)
 {
        System.arraycopy(posog, 0,posinit, 0, posog.length);
  transform.set(tran);
  transform.get(gettrans);
  pos[0]=posinit[0]+gettrans[3];
  pos[1]=posinit[1]+gettrans[7];
  pos[2]=posinit[2]+gettrans[11];
  
  if(flag)
   {
   //true for Camera
   v=vog;
   mesh.setScale(scalebullet, scalebullet, scalebullet);
   }
  else
   {
   v=vobject+rand.nextFloat()*0.05f;
   mesh.setScale(scaleobj, scaleobj, scaleobj);
   }
  //System.out.println("/nBullet init:");
  //System.out.println("Camera posog:"+posog[0]+" "+posog[1]+" "+posog[2]);
  //System.out.println("Bullet posog:"+pos[0]+" "+pos[1]+" "+pos[2]);
  //System.out.println("Camera tran:"+gettrans[3]+" "+gettrans[7]+" "+gettrans[11]);
  
  setLife(true);
  mesh.setTranslation(pos[0], pos[1],pos[2]);
 }
 
 public int update(Group group)
 {
  int id=0;
  mesh.postRotate(15.0f, 0.0f, 0.0f, 1.0f);
  if (group.pick(-1, pos[0], pos[1], pos[2],  1.0f, 0.0f,  0.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);
  }
  else if(group.pick(-1, pos[0], pos[1], pos[2], -1.0f, 0.0f,  0.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);
  
  }
  else if(group.pick(-1, pos[0], pos[1], pos[2],  0.0f, 1.0f,  0.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);

  }
  else if (group.pick(-1, pos[0], pos[1], pos[2],  0.0f,-1.0f,  0.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);

  }
  else if(group.pick(-1, pos[0], pos[1], pos[2],  0.0f, 0.0f,  1.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);

  }
  else if(group.pick(-1, pos[0], pos[1], pos[2],  0.0f, 0.0f,   -1.0f, ri)&& (ri.getDistance() < dis))
  {
   id = ri.getIntersected().getUserID();
   //System.out.println("Bullet Intersected:"+id);
   //System.out.println("Bullet Intersected Class:"+ri.getIntersected().getClass());
   //System.out.println("Bullet Intersected Parent:"+ri.getIntersected().getParent());

   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);

  } 
  
  else if(pos[0]<=-15.0f||pos[0]>=15.0f||pos[2]<=-15.0f||pos[2]>=15.0f||pos[1]<=-0.0f||pos[1]>=10.0f)
  {
   setLife(false);
         System.arraycopy(poshide, 0,pos, 0, poshide.length);
  }
  
  else
  { 
   transform.postTranslate(0.0f, 0.0f, -v);
   transform.get(gettrans);
   pos[0]=posinit[0]+gettrans[3];
   pos[1]=posinit[1]+gettrans[7];
   pos[2]=posinit[2]+gettrans[11];
  }
  mesh.setTranslation(pos[0], pos[1], pos[2]);
  
  //System.out.println("Bullet pos:"+pos[0]+","+pos[1]+","+pos[2]);
  
  return id;
 }
 

    void setLife(boolean life)
    {
        this.life = life;
    }

    boolean getLife()
    {
        return life;
    }
    void setID(int id)
    {
     itemID = id;
    }

    int getID()
    {
        return itemID;
    }
   
 float[] getPos()
 {
     return pos;
 }
}

 

 

BulletSystem.java

import java.util.Random;

import javax.microedition.m3g.Group;
import javax.microedition.m3g.Transform;


public class BulletSystem
{
 Bullet[] bullet=null;
 int hitnum=0;
 int bulletnum=0;
 private Random rand;
 public BulletSystem(int bulletNum,Group group)
 {
  bullet=new Bullet[bulletNum];
  bulletnum=bulletNum;
  rand=new Random();
  for(int i=0;i<bullet.length;i++)
  {
   bullet[i]=new Bullet(100+i,group,rand);
   //System.out.println("Bullet"+i+"ID:"+bullet[i].getID());
  } 
 }
 
 public int getBulletnum()
 {
  return bulletnum;
 }
 
 public boolean getBulletState(int i)
 {
  return bullet[i].getLife();
 }
 
 public void start(int i,float[] posog,Transform tran)
 {
  bullet[i].init(posog, tran,i==0?true:false);
 }
 
 public int update(Group group)
 {
  int id=0;
  int temp=0;
  for(int i=0;i<bullet.length;i++)
   {
   if(bullet[i].getLife())
    {
    temp=bullet[i].update(group);
    if(temp!=0)
     id=temp;
    }
   }
  return id;
 }
 
 public float[] hit(int itemID)
 {
 float pos[]=null;
  for(int i=1;i<bullet.length;i++)
  {
   if(bullet[i].getID()==itemID)
   {
   hitnum++;
   pos=bullet[i].getPos();
   bullet[i].setLife(false);
   }
  }
  return pos;
 }
 
 int gethitNum()
 {
  return hitnum;
 }
}

 

 

 FountainEffect.java


import java.util.Random;

import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Mesh;
import javax.microedition.m3g.Transform;

/**
 * Creates a nice fountain effect for the particles, that shoots particles
 * in a certain direction, determined by its angle. The angle can be changed in real-time.
 */

public class FountainEffect
{
    // The angle of particle emission
    private int angle = 90;
   
    // The sine and cosine of the current angle
    private float[] trig = {1.0f, 0.0f};
   
    // The emitting origin
    private float[] initpos = {0.0f, 7.0f, -7.0f};
   
    private float[] initvel = {0.0f, 0.0f, 0.0f};
    // The randomizer
    Random rand = null;
   
    // The mesh
    Mesh mesh = null;
   
    // The transformation matrix
    Transform trans = new Transform();
   
    // The scale
    //缩放刻度
    float scale = 1.0f;
   
   
    /**
     * @param angle The angle of particle emission
     * 粒子释放角度90向上
     */
    public FountainEffect(int angle)
    {
        // Init the bitmap
     scale=0.15f;
     mesh = MeshFactory.createAlphaPlane("/res/particle.png",0xffffff);
        // Set the angle
        setAngle(angle);
        // Get randomizer
        rand = new Random();
    }
   
   
    /**
     * @see ParticleEffect#update(Particle)
     */
    public void update(Particle p)
    {
        float[] ppos = p.getPos();
        float[] vel = p.getVel();
        ppos[0] += vel[0];
        ppos[1] += vel[1];
        ppos[2] += vel[2];
        p.setPos(ppos);
        p.setLife(p.getLife() - p.getDegradation());
        if(p.getLife() < -0.001f)
        {
        // init(p,new float[]{0.0f,3.0f,-5.0f});
         p.setPos(initpos);
            p.setVel(initvel);
        }
    }
   
   
    /**
     * @see ParticleEffect#render(Particle, Graphics3D)
     * 渲染
     */
    public void render(Particle p, Graphics3D g3d)
    {
        if(p.getLife()>0.01f)
        {
     // Calculate the alpha
        int alpha = (int)(255 * p.getLife());
       
        // Create the color
        int color = p.getColor() | (alpha << 24);//alpha左移3字节
       
        // Set alpha
        MeshOperator.setMeshAlpha(mesh, color);
        // Transform
        trans.setIdentity();
        //使图片始终面对摄像机
        float[] pos = p.getPos();
        trans.postTranslate(pos[0], pos[1], pos[2]);
        trans.postRotate(rand.nextFloat()*90, 1.0f, 0.0f, 0.0f);
        trans.postRotate(rand.nextFloat()*90, 0.0f, 0.0f, 1.0f);
        trans.postScale(scale, scale, scale);
       // System.out.print("mesh pos="+pos[0]+","+pos[1]+","+pos[2]);
      //  System.out.println("   life="+p.getLife()+"  col="+alpha);
        // Render
       g3d.render(mesh, trans);
        }
        else
        {
        }
    }

    /**
     * @see ParticleEffect#init(Particle)
     */
    public void init(Particle p, float[] pos)
    {
//      Set the particle's life
        p.setLife(1.0f);
     p.setPos(pos);
       
        // Create the particle's velocties
        float[] vel = new float[3];
       
        //数度从0.1~0.2
        float xyvel = rand.nextFloat() * 0.05f+0.05f;
        // We want the particle to die slowly
        p.setDegradation(xyvel / 3f);
       
        // Set velocities according to trigonometry with a small deviation
        // ...=1.0f*cos/sin +
        vel[0] = xyvel * trig[1] + rand.nextFloat() * 0.125f-0.0625f;
        vel[1] = xyvel * trig[0] + rand.nextFloat() * 0.025f-0.025f;
       
        // No movement in depth
        vel[2] = 0.0f;
       
        // Set the velocity
        p.setVel(vel);
       
        // Set the random color
        int r = (int)(120 * rand.nextFloat()) + 135;
        int g = (int)(120 * rand.nextFloat()) + 135;
        int b = (int)(120 * rand.nextFloat()) + 135;
        int col = (r << 16) | (g << 8) | b;
       
        p.setColor(col);
       
    }

    /**
     * @param angle The angle to set.
     */
    public void setAngle(int angle)
    {
        this.angle = angle;
        trig[0] = (float)Math.sin(Math.toRadians(angle));
        trig[1] = (float)Math.cos(Math.toRadians(angle));
    }

    /**
     * @return Returns the angle.
     */
    public int getAngle() {
        return angle;
    }
/*
   
     void setEmittingOrigin(float[] pos) {
        this.pos = pos;
    }

    float[] getEmittingOrigin() {
        return pos;
    }
*/
}

 

 

HighScore.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.List;

public class HighScore extends List implements CommandListener
{
private AirFighterMIDlet parent = null;
private MainMenu menu = null;
private Command back=new Command("back",Command.BACK,2);
private HighScoreRMS db;

public HighScore(AirFighterMIDlet parent, MainMenu menu)
{
 super("HighScore",List.IMPLICIT);
 this.parent = parent;
 this.menu = menu;
 db=new HighScoreRMS("HighScore");
 db.loadHighScore();
 String[] temp=new String[9];
 temp=db.getHighScore();
 this.append("Level     Seconds     Score",null);
 this.addCommand(back);
 this.setCommandListener(this);
 for(int i=0;i<3;i++)
 {
  //temp=db.gethighscore(i);
  if(i%3==0)
   this.append(" ",null);
  this.append(temp[i*3]+"         "+temp[i*3+1]+"         "+temp[i*3+2],null);
 }
}

protected void paint(Graphics g)
 {
 //Paint the high scores here
 }

public void commandAction(Command p0, Displayable p1)
{
if (p0 == back)
 {
 parent.setDisplayable(menu);
 }
}

 

 

HighScoreRMS.java

import javax.microedition.rms.*;
import java.util.*;
import java.io.*;

public class HighScoreRMS extends BaseRMS
{
  private int sound = 0; //0:on;1:off;
  private int shake = 0;  //0:on;1:off;
  private String[] HighScorelist=null;
  public HighScoreRMS(String rmsName)
  {
    super(rmsName);
    HighScorelist=new String[9];
  }

public void loadHighScore()
  {
    try
    {
      // Will call either loadData() or createDefaultData()
      this.open();

      // Add any other neccessary processing, in this case there is none

      // Close
      if (this.getRecordStore() != null)
        this.close();
    }
    catch (Exception e)
    {
      System.out.println("Error loading HighScoreRMS" + e);
    }
  }

  public String[] getHighScore()
  {
    return this.HighScorelist;
  }


  public void updateHighScore(String[] str)
  {
    try
    {
      // load current scores
      this.open();

      // update data
      this.HighScorelist = str;

      // Update High Scores
      updateData();

      // close
      if (this.getRecordStore() != null)
        this.close();
    }
    catch (Exception e)
    {
      System.out.println(this.getRMSName() + "::updateHighScore::" + e);
    }
  }

  protected void loadData() throws Exception
  {
    try
    {
        byte[] record = this.getRecordStore().getRecord(1);
        DataInputStream istream = new DataInputStream(new ByteArrayInputStream(record,0,record.length));
        for(int i=0;i<9;i++)
        {
        HighScorelist[i]=istream.readUTF();
        }
    }
    catch (Exception e)
    {
      throw new Exception (this.getRMSName() + "::loadData::" + e);
    }
  }

  protected void createDefaultData() throws Exception
  {
    try
    {
      ByteArrayOutputStream bstream = new ByteArrayOutputStream(30);
      DataOutputStream ostream = new DataOutputStream(bstream);
      ostream.writeUTF("1");
      ostream.writeUTF("60");
      ostream.writeUTF("300");
     
      ostream.writeUTF("2");
      ostream.writeUTF("60");
      ostream.writeUTF("200");
     
      ostream.writeUTF("3");
      ostream.writeUTF("60");
      ostream.writeUTF("100");     
      ostream.flush();
      ostream.close();
      byte[] record = bstream.toByteArray();
      this.getRecordStore().addRecord(record, 0, record.length);
    }
    catch (Exception e)
    {
      throw new Exception(this.getRMSName() + "::createDefaultData::" + e);
    }
  }

protected void updateData() throws Exception
  {
    try
    {
      ByteArrayOutputStream bstream = new ByteArrayOutputStream(30);
      DataOutputStream ostream = new DataOutputStream(bstream);
      for(int i=0;i<9;i++)
       {
          ostream.writeUTF(HighScorelist[i]);
       }
      ostream.flush();
      ostream.close();
      byte[] record = bstream.toByteArray();
      this.getRecordStore().setRecord(1, record, 0, record.length);
    }
    catch(Exception e)
    {
      throw new Exception(this.getRMSName() + "::updateData::" + e);
    }
  }
}

 

 

Instructions.java

//Text instructions. Text can be written in constructor or in own method.
//Developer should remember that also instruction texts should be
//internationalized
import javax.microedition.lcdui.*;
public class Instructions extends Form implements CommandListener
{
//Command for going next instruction if needed
private Command more = new Command(Resources.getString(Resources.ID_GAME_MORE),Command.OK, 1);
//Command for going back to the main menu
private Command back = new Command("Back", Command.BACK, 2);
private AirFighterMIDlet parent = null;
private MainMenu menu = null;

public Instructions(String title,AirFighterMIDlet parent, MainMenu menu)
 {
 super(title);
 this.parent = parent;
 this.menu = menu;
 this.addCommand(back);
 this.addCommand(more);
 this.setCommandListener(this);
 this.append("Up:向上旋转瞄准器;/n" +
   "Down:向下旋转瞄准器;/n"+
   "Left:向左旋转瞄准器;/n"+
   "Right:向右旋转瞄准器;/n"+
   "1(Game_A):向前移动瞄准器;/n"+
   "3(Game_B):向后移动瞄准器;/n"+
   "5(Game_C):向瞄准器;/n"+
   "7(Game_D):向瞄准器./n");
 }

public void commandAction(Command p0, Displayable p1)
 {
 if (p0 == more)
  {
  //go to the next if needed e.g animation
  //parent.setDisplayable(new InstructionAnimation(parent));
  }
 else if (p0 == back)
  {
  parent.setDisplayable(menu);
  }
 }
}

 

 

Language.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;


public class Language extends List implements CommandListener
{
private AirFighterMIDlet parent = null;
private OptionList opt= null;
private LanguageRMS db;
private Command back = new Command("Back", Command.BACK, 2);
private String lang;
public Language(AirFighterMIDlet parent,OptionList optf)
 {
 // TODO Auto-generated constructor stub
 super(Resources.getString(Resources.ID_GAME_LANGUAGE),List.IMPLICIT);
 this.opt = optf;
 this.parent=parent;
 lang=new String();
 db=new LanguageRMS("Language");
 db.loadLanguage();
 lang=db.getlanguage();
 this.addCommand(back);
 this.setCommandListener(this); 
 this.append(Resources.supportedLocales[0],null);
 this.append(Resources.supportedLocales[1],null);
 this.append(Resources.supportedLocales[2],null); 
 this.append(Resources.supportedLocales[3],null); 
 }

public Language(String arg0, int arg1, String[] arg2, Image[] arg3)
 {
 super(arg0, arg1, arg2, arg3);
 // TODO Auto-generated constructor stub
 }

public void commandAction(Command p0, Displayable p1)
{
if (p0==back)
 {
 //System.out.println("Back pressed:");
 //System.out.println(lang);
 db.updateLanguage(lang);
 //System.out.println("After update:"+db.getlanguage());
 parent.setDisplayable(opt);
 }
else
 {
 List lis = (List) p1;
 int idx = lis.getSelectedIndex();
 switch (idx)
  {
  case 0:
   //TODO
   lang=Resources.supportedLocales[0];
   break;
  case 1:
   //TODO
   lang=Resources.supportedLocales[1];
   break;
  case 2:
   //TODO
   lang=Resources.supportedLocales[2];  
   break;
  case 3:
   lang=Resources.supportedLocales[3];
   break;
   //More if needed
  default:
   break;
  }
 //System.out.println("lang:"+lang);
 }
}

}

 

 

LanguageRMS.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class LanguageRMS extends BaseRMS
{
private String lang;
public LanguageRMS(String rmsName)
 {
 // TODO Auto-generated constructor stub
 super(rmsName);
 lang=new String();
 }

public void loadLanguage()
   {
     try
     {
       // Will call either loadData() or createDefaultData()
       this.open();
       // Add any other neccessary processing, in this case there is none
       // Close
       if (this.getRecordStore() != null)
         this.close();
     }
     catch (Exception e)
     {
       System.out.println("Error loading Settings" + e);
     }
   } 

public String getlanguage()
 {
    return this.lang;
  }

public void updateLanguage(String lan)
{
  try
  {
    // load current scores
    this.open();

    // update data
    this.lang =lan;

    // Update High Scores
    updateData();

    // close
    if (this.getRecordStore() != null)
      this.close();
  }
  catch (Exception e)
  {
    System.out.println(this.getRMSName() + "::updateSettings::" + e);
  }
}

protected void createDefaultData() throws Exception
 {
 // TODO Auto-generated method stub
    try
    {
      ByteArrayOutputStream bstream = new ByteArrayOutputStream(20);
      DataOutputStream ostream = new DataOutputStream(bstream);
      ostream.writeUTF("en");
      ostream.flush();
      ostream.close();
      byte[] record = bstream.toByteArray();
      this.getRecordStore().addRecord(record, 0, record.length);
    }
    catch (Exception e)
    {
      throw new Exception(this.getRMSName() + "::createDefaultData::" + e);
    }
 }

void loadData() throws Exception
 {
 // TODO Auto-generated method stub
    try
    {
        byte[] record = this.getRecordStore().getRecord(1);
        DataInputStream istream = new DataInputStream(new ByteArrayInputStream(record,0,record.length));
        lang= istream.readUTF();
    }
    catch (Exception e)
    {
      throw new Exception (this.getRMSName() + "::loadData::" + e);
    }
 }

void updateData() throws Exception
 {
 // TODO Auto-generated method stub
    try
    {
      ByteArrayOutputStream bstream = new ByteArrayOutputStream(20);
      DataOutputStream ostream = new DataOutputStream(bstream);
      ostream.writeUTF(lang);
      ostream.flush();
      ostream.close();
      byte[] record = bstream.toByteArray();
      this.getRecordStore().setRecord(1, record, 0, record.length);
    }
    catch(Exception e)
    {
      throw new Exception(this.getRMSName() + "::updateData::" + e);
    } 
 }

}

 

 

MainMenu.java

import javax.microedition.lcdui.*;
public class MainMenu extends List implements CommandListener
{
private AirFighterMIDlet parent=null;
private AirFighterCanvas game=null;
private LanguageRMS dbl;
private String lang;
private final Command exitCommand = new Command("Exit", Command.EXIT, 1);

public MainMenu(String p0, int p1, String[] p2, Image[] p3,AirFighterMIDlet parent)
 {
 super(p0, p1, p2, p3);
 init(parent);
 }

public MainMenu(String p0, int p1, AirFighterMIDlet parent)
 {
 super(p0, p1);
 init(parent);
 }

public void Refreshlang()
 {
 dbl=new LanguageRMS("Language");
 dbl.loadLanguage();
 lang=dbl.getlanguage();  
 this.deleteAll();
 this.append(Resources.getString(lang,Resources.ID_GAME_NEW), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_OPTIONS),null);
 this.append(Resources.getString(lang,Resources.ID_GAME_HIGHSCORES), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_INSTRUCTIONS), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_ABOUT),null);
 this.append(Resources.getString(lang,Resources.ID_GAME_EXIT),null);
 }

public void init(AirFighterMIDlet parent)
 {
 this.parent = parent;
 dbl=new LanguageRMS("Language");
 dbl.loadLanguage();
 lang=dbl.getlanguage(); 
 this.setCommandListener(this);
 //if game paused then "Continue" should be available in
 //selection list
 //These must be with or without icons
 if (game != null && game.isPaused())
 {
 if(!(this.getString(0).equals(new String(Resources.getString(lang,Resources.ID_GAME_CONTINUE)))))
  {
  this.insert(0,Resources.getString(lang,Resources.ID_GAME_CONTINUE),null);
  }
 this.setSelectedIndex(0,true);
 }
 else
 {
 //These must be with or without icons
 this.append(Resources.getString(lang,Resources.ID_GAME_NEW), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_OPTIONS),null);
 this.append(Resources.getString(lang,Resources.ID_GAME_HIGHSCORES), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_INSTRUCTIONS), null);
 this.append(Resources.getString(lang,Resources.ID_GAME_ABOUT),null);
 this.append(Resources.getString(lang,Resources.ID_GAME_EXIT),null);
 }

 }

public void commandAction(Command p0, Displayable p1)
 {
 if(p0 == exitCommand)
 {
 System.out.println("ExitCommand Pressed.");
 parent.setFinished();
   parent.setDisplayable(this);
 }
 else
 {
 List lis = (List)p1;
 String selected =lis.getString(lis.getSelectedIndex());
 System.out.println(selected);
 if (selected.equals(Resources.getString(lang,Resources.ID_GAME_NEW)))
  {
  game = new AirFighterCanvas(parent, this);
  game.addCommand(exitCommand);
  game.setCommandListener(this);
  parent.setDisplayable(game);
  game.start();
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_OPTIONS)))
  {
  parent.setDisplayable(new OptionList(Resources.getString(lang,Resources.ID_GAME_OPTIONS),List.IMPLICIT,parent, this));
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_HIGHSCORES)))
  {
  parent.setDisplayable(new HighScore(parent,this));
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_INSTRUCTIONS)))
  {
  parent.setDisplayable(new Instructions(Resources.getString(lang,Resources.ID_GAME_INSTRUCTIONS),parent,this));
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_ABOUT)))
  {
  parent.setDisplayable(new About(Resources.getString(lang,Resources.ID_GAME_ABOUT),parent,this));
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_EXIT)))
  {
  parent.notifyDestroyed();
  }
 else if (selected.equals(Resources.getString(lang,Resources.ID_GAME_CONTINUE)))
  {
  if (game != null)
   {
   game.gameContinue();
   parent.setDisplayable(game);
   }
  else
   {}
  }

 }
 }

}

 

 

MeshFactory.java


import javax.microedition.lcdui.Image;
import javax.microedition.m3g.Appearance;
import javax.microedition.m3g.Background;
import javax.microedition.m3g.Group;
import javax.microedition.m3g.Image2D;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Material;
import javax.microedition.m3g.Mesh;
import javax.microedition.m3g.PolygonMode;
import javax.microedition.m3g.Texture2D;
import javax.microedition.m3g.TriangleStripArray;
import javax.microedition.m3g.VertexArray;
import javax.microedition.m3g.VertexBuffer;

public class MeshFactory {

 private static VertexArray vertexarray; // 顶点数组

 private static VertexBuffer vertexbuff; // 缓冲器

 private static VertexArray texturearray; // 纹理数组

 private static VertexArray normalarray;

 private static Material material;

 private static TriangleStripArray TSArray; // 三角形带

 private static Appearance appearnce; // 外观

 private static Texture2D t2d;

 // 底顶点
 private static final byte[] s_plane_v = new byte[]
        { -1, 0, 1,   1, 0, 1,
   1, 0, -1,    -1, 0, -1 };

 private static final int[] s_plane_index = { 0, 1, 3, 2 };

 private static final int[] plane_indices = new int[] { 4 };

 private static final byte[] s_plane_normal = new byte[] {
    0, 1, 0,   0, 1, 0,
      0, 1, 0,   0, 1, 0 };

 // 纹理坐标
 private static final byte[] s_plane_texture = new byte[]{
    0, 1,   1, 1,   1,0,   0, 0 };
 
 /******************************square**********/
//  8 顶点
 private static final byte[] s_vertices =
 {
 // 0 1 2 3
   -1, -1, 1,  1, -1, 1,  -1, 1, 1,  1, 1, 1, /* front */
   // 4,6,5,7,
   -1, -1, -1, -1, 1, -1,  1, -1, -1,  1, 1, -1,/* back */
   // 2 3 6 7
   -1, 1, 1,  1, 1, 1,  -1, 1, -1,  1, 1, -1,/* top */
   // 0,4,1,5,
   -1, -1, 1,  -1,-1, -1,  1,-1, 1,  1,-1, -1,/* bottom */
   // 1 5 3 7
   1, -1, 1,  1, -1, -1,  1, 1, 1,  1, 1, -1,/* right */
   // 0,2,4,6
   -1,-1, 1,  -1, 1, 1, -1,-1,-1,  -1, 1, -1, /* left */
 };

 // 定义各个面,外观全部逆时针
 private static final int[] s_indices = { 0, 1, 2, 3, /* front */
 4, 5, 6, 7, /* back */
 8, 9, 10, 11, /* top */
 12, 13, 14, 15, /* bottom */
 16, 17, 18, 19, /* right */
 20, 21, 22, 23 /* left */
 };

 // 面顶点长度
 private static final int[] indices_Length = new int[] { 4, 4, 4, 4, 4, 4 };

 // 纹理坐标
 private static final byte[] s_texture = new byte[] { 0, 1, 1, 1, 0, 0, 1,
   0,/* front */
   1, 1, 1, 0, 0, 1, 0, 0,/* back */
   0, 0, 0, 1, 1, 0, 1, 1,/* top */
   0, 0, 0, 1, 1, 0, 1, 1, /* bottom */
   0, 1, 1, 1, 0, 0, 1, 0,/* right */
   1, 1, 1, 0, 0, 1, 0, 0 /* left */
 };

 // 正方体法线向量
 private static final byte[] s_normal = new byte[] {
 // 0 1 2 3
   0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, /* front */
   // 4,6,5,7,
   0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,/* back */
   // 2 3 6 7
   0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,/* top */
   // 0,4,1,5,
   0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,/* bottom */
   // 1 5 3 7
   1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,/* right */
   // 0,2,4,6
   -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, /* left */

 };

 public static Group createHeightMap(String path)
 {
 Group group=null;
  try
  {
   group=(Group)Loader.load(path)[0];
   group.postRotate(-90.0f, 1.0f, 0.0f, 0.0f);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 return group;
 }
 
 public static Group createGoomba(String path)
 {
 Group goomba=null;
  try
  {
   //System.out.println("Loading Aim Model:"+path);
   goomba=(Group)Loader.load(path)[0];
   goomba.postRotate(-90.0f, 1.0f, 0.0f, 0.0f);
  }
  catch (Exception e)
  {
   System.out.println("Model Loadiing ERROR");
   e.printStackTrace();
  }
 return goomba;
 }
 
 public static Mesh createPlane(String path)
 {
        Mesh mesh=null;
//      顶点矩阵
  vertexarray = new VertexArray(s_plane_v.length / 3, 3, 1);
  vertexarray.set(0, s_plane_v.length / 3, s_plane_v);
  
  normalarray = new VertexArray(s_plane_normal.length / 3, 3, 1);
  normalarray.set(0, s_plane_normal.length / 3, s_plane_normal);

  // 面三角形条带
  TSArray = new TriangleStripArray(s_plane_index, plane_indices);// 索引,索引长度

  texturearray = new VertexArray(s_plane_texture.length / 2, 2, 1);
  texturearray.set(0, s_plane_texture.length / 2, s_plane_texture);

  vertexbuff = new VertexBuffer();
  vertexbuff.setPositions(vertexarray, 1.0f, null);
  vertexbuff.setTexCoords(0, texturearray, 1.0f, null);
  vertexbuff.setNormals(normalarray);
  //vertexbuff.setDefaultColor(0xffffffff);

  // 设置多边形模式设置
  PolygonMode polygonMode = new PolygonMode();
  // 起用透视修正,这样在多个三角形组成的平面中,纹理就不会弯曲
  polygonMode.setPerspectiveCorrectionEnable(true);

  // 创建纹理
  t2d = createTexture(path);

  // 材料
  material = new Material();
  material.setVertexColorTrackingEnable(true);
  // 生成外貌
  appearnce = new Appearance();
  appearnce.setPolygonMode(polygonMode);
  appearnce.setMaterial(material);
  appearnce.setTexture(0, t2d);

  // 生成网眼
  mesh = new Mesh(vertexbuff, TSArray, appearnce);
  return mesh;
 }

 public static Mesh createSquare(String path)
 {

  Mesh mesh = null;
  // Create vertex data.
  // 顶点矩阵
  vertexarray = new VertexArray(s_vertices.length / 3, 3, 1);
  vertexarray.set(0, s_vertices.length / 3, s_vertices);
  /*
   * // 颜色矩阵 colorarray =new VertexArray(s_color.length / 3, 3, 1);
   * colorarray.set(0, s_color.length / 3, s_color);
   */
  normalarray = new VertexArray(s_normal.length / 3, 3, 1);
  normalarray.set(0, s_normal.length / 3, s_normal);

  // 面三角形条带
  TSArray = new TriangleStripArray(s_indices, indices_Length);// 索引,索引长度

  texturearray = new VertexArray(s_texture.length / 2, 2, 1);
  texturearray.set(0, s_texture.length / 2, s_texture);

  vertexbuff = new VertexBuffer();
  vertexbuff.setPositions(vertexarray, 1.0f, null);

  vertexbuff.setTexCoords(0, texturearray, 1.0f, null);
  vertexbuff.setNormals(normalarray);

  // 设置多边形模式设置
  PolygonMode polygonMode = new PolygonMode();
  polygonMode.setCulling(PolygonMode.CULL_BACK);
  polygonMode.setPerspectiveCorrectionEnable(true);

  // 创建纹理
  t2d = createTexture(path);

  // 材料
  material = new Material();
  material.setVertexColorTrackingEnable(true);

  // 生成外貌
  appearnce = new Appearance();
  appearnce.setPolygonMode(polygonMode);
  appearnce.setMaterial(material);
  appearnce.setTexture(0, t2d);
  // appearnce.setFog(fog);

  // 生成网眼
  mesh = new Mesh(vertexbuff, TSArray, appearnce);
  return mesh;

 }
 
 public static Mesh createAlphaPlane(String path,int alpha)
 {
  Mesh mesh=createPlane(path);
  MeshOperator.convertToBlended(mesh, alpha, Texture2D.FUNC_BLEND);
  return mesh;
 }
 
 

 private static Texture2D createTexture(String path)
 {
  Texture2D texture = null;
  try {
   
   // 载入图片
   Image texImg = Image.createImage(path); // Load the image
   // 创建纹理
            //create the texture from the image
   //注意Image2D.RGB /Image2D.RGBA的区别
   texture = new Texture2D(new Image2D(Image2D.RGBA, texImg));
   
           //  设置混合方式
   texture.setBlending(Texture2D.FUNC_REPLACE);
            //repeat the texture.
   texture.setWrapping(Texture2D.WRAP_CLAMP,Texture2D.WRAP_CLAMP);

   // 设置过滤方式
   texture.setFiltering(Texture2D.FILTER_BASE_LEVEL, Texture2D.FILTER_NEAREST);
  
  } catch (Exception e) {
   System.out.println("Failed to create texture");
  }
    return texture;
 }
 
 private static Background createBackground(String path)
 {
  Background background=null;
  
  return background;
 }
 
}

 

 

MeshOperator.java


/***
 * 2007.5.8
 * @author hj
 *
 */
import javax.microedition.m3g.CompositingMode;
import javax.microedition.m3g.Mesh;
/**
 * Performs some basic operations on Mesh objects
 */
public class MeshOperator
{
    /** Sets the alpha blending of a mesh. Only meaningful if the mesh already is alpha blended */
 /** 设置一个网面的Alpha混合. 如果网面已经是Alpha混合,这才有意义 */
 public static void setMeshAlpha(Mesh m, int alpha)
    {
        m.getVertexBuffer().setDefaultColor(alpha);
    }
   
    /**
     *
     * @param m The mesh to convert to a blended one
     * @param alpha The alpha color to blend with
     * @param textureBlending The texture blending parameter.
     */
  /**
  *
  * @param m 用来被转化为混合的网面
  * @param alpha 用来混合的alpha颜色
  * @param textureBlending 纹理混合参数.
  */

    public static void convertToBlended(Mesh m, int alpha, int textureBlending)
    {
        // Set the alpha
        setMeshAlpha(m, alpha);
       
        // Fix the compositing mode
        CompositingMode cm = new CompositingMode();
        cm.setBlending(CompositingMode.ALPHA);
        m.getAppearance(0).setCompositingMode(cm);
        m.getAppearance(0).getTexture(0).setBlending(textureBlending);
    }
}

 

 

OptionList.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;
public class OptionList extends List implements CommandListener
{
private AirFighterMIDlet parent = null;
private MainMenu menu = null;
private Settings db;
private LanguageRMS dbl;
private String lang;
//private KeyDefinitions def = null;
private Command back = new Command("Back", Command.BACK, 2);
private String[] change;
private int[] sets;
public OptionList(String p0, int p1, String[] p2, Image[] p3,AirFighterMIDlet parent, MainMenu menu)
 {
 super(p0, p1, p2, p3);
 this.menu = menu;
 init(parent);
 }

public OptionList(String p0, int p1, AirFighterMIDlet parent,MainMenu menu)
 {
 super(p0, p1);
 this.menu = menu;
 init(parent);
 }

private void init(AirFighterMIDlet parent)
 {
 //System.out.println("Parent:"+this.parent.toString());
 this.parent = parent;
 dbl=new LanguageRMS("Language");
 dbl.loadLanguage();
 lang=dbl.getlanguage(); 
 //System.out.println("Menu:"+menu.toString());
 //System.out.println("Parent:"+this.parent.toString());
 this.addCommand(back);
 this.setCommandListener(this);
 db=new Settings("Settings");
 db.loadSettings();
 change=new String[2];
 sets=new int[2];
 change[0]=change[1]="OFF";
 sets[0]=db.getsound();
 sets[1]=db.getshake();
 //System.out.println(db.getRMSName());
 //System.out.println("before:"+db.getsound()+" "+db.getshake());
 if(sets[0]==0)
  change[0]="ON";
 if(sets[1]==0)
  change[1]="ON";
 //These are just a examples for the game specific options
 this.append(Resources.getString(lang,Resources.ID_GAME_SOUNDS)+":/t"+change[0],null);
 this.append(Resources.getString(lang,Resources.ID_GAME_VIBRA)+":/t"+change[1],null);
 this.append(Resources.getString(lang,Resources.ID_GAME_LANGUAGE)+":/t",null);
 }

private void setstring(String s0,String s1)
 {
 this.set(0, s0, null);
 this.set(1, s1, null);
 }

public void commandAction(Command p0, Displayable p1)
 {
 if (p0 == back)
  {
  db.updateSettings(sets[0],sets[1]);
  //System.out.println("After:"+db.getsound()+" "+db.getshake());
  parent.setDisplayable(menu);
  menu.Refreshlang();
  }
 else
  {
  List lis = (List) p1;
  int idx = lis.getSelectedIndex();
  switch (idx)
   {
   case 0:
    //TODO
    if(change[0]=="ON")
     {
     sets[0]=1;
     change[0]="OFF";
     }
    else
     {
     sets[0]=0;
     change[0]="ON";
     }
    break;
   case 1:
    //TODO
    if(change[1]=="ON")
     {
     change[1]="OFF";
     sets[1]=1;
     }
    else
     {
     change[1]="ON";
     sets[1]=0;
     }
    break;
   case 2:
    //TODO
    parent.setDisplayable(new Language(parent,this));
    break;
   case 3:
    //parent.setDisplayable(def);
    break;
    //More if needed
   default:
    break;
   }
  setstring(Resources.getString(lang,Resources.ID_GAME_SOUNDS)+":/t"+change[0],Resources.getString(lang,Resources.ID_GAME_VIBRA)+":/t"+change[1]);
  }
 }
}

 

 

Particle.java

 

public class Particle
{
    // The life of the particle. Goes from 1.0f to 0.0f
   // 粒子的寿命. 从 1.0f 到 0.0f
    private float life = 0.001f;
   
    // The degradation of the particle
    //衰变
    private float degradation = 0.01f;
   
    // The velocities of the particle
    //速率
    private float[] vel = {0.0f, 0.0f, 0.0f};
   
    // The position of the particle
    //位置
    private float[] pos = {1.0f, 1.0f, 3.0f};
   
    // The color of the particle (RGB format 0xRRGGBB)
    //  粒子的颜色 (RGB 形式 0xRRGGBB)
    private int color = 0xffffff;
   
    /** Empty initialization */
    public Particle()
    {
    }
   
    /**
     * Initializes the particle
     * @param velocity Sets the velocity
     * @param position Sets the position
     * @param color Sets the color (no alpha)
     */
    public Particle(float[] velocity, float[] position, int color)
    {
        if((velocity!=null)&&(velocity.length==3))
         setVel(velocity);
        if((position!=null)&&(velocity.length==3))
         setPos(position);
        if(color>=0)
         this.setColor(color);
    }

    /**
     * @param life The life to set.
     */
    void setLife(float life) {
        this.life = life;
    }

    /**
     * @return Returns the life.
     */
    float getLife() {
        return life;
    }

    /**
     * @param vel The vel to set.
     */
    void setVel(float[] tvel) {
        System.arraycopy(tvel, 0, vel, 0, vel.length);
    }

    /**
     * @return Returns the vel.
     */
    float[] getVel() {
        return vel;
    }

    /**
     * @param pos The pos to set.
     */
    void setPos(float[] tpos) {
        System.arraycopy(tpos, 0, pos, 0, pos.length);
    }

    /**
     * @return Returns the pos.
     */
    float[] getPos() {
        return pos;
    }

    /**
     * @param color The color to set.
     */
    void setColor(int color) {
        this.color = color;
    }

    /**
     * @return Returns the color.
     */
    int getColor() {
        return color;
    }

    /**
     * @param degradation The degradation to set.
     */
    public void setDegradation(float degradation) {
        this.degradation = degradation;
    }

    /**
     * @return Returns the degradation.
     */
    public float getDegradation() {
        return degradation;
    }
}

 

 

ParticleSystem.java

 

import javax.microedition.m3g.Graphics3D;

/**
 * Manages emission of particles in our 3D world
 */
public class ParticleSystem
{
 //效果,接口
    private FountainEffect ft = null;
   
    // The particles
    //粒子
    Particle[] parts = null;
   
    /**
     * 创建一个碎片系统,
     * @param effect effect 控制碎片的行为
     * @param numParticles 发射的碎片数量
     */

    public ParticleSystem(FountainEffect effect, int numParticles)
    {
        // Copy the effect
        this.ft = effect; 

        // Init the particles
        parts = new Particle[numParticles];
        for(int i = 0; i < parts.length; i++)
        {
         parts[i] = new Particle();
        }
    }
   
    public void init(float pos[])
    {
     for(int i = 0; i < parts.length; i++)
        {
            ft.init(parts[i],pos);
        }
    // System.out.println("parts init");
    }
   
    /** The method that does it all. Needs to be called every tick of a game loop */
    /** 这个方法完成所有操作. 需要在每一个游戏循环中调用。 */
    public void emit(Graphics3D g3d)
    {
        for(int i = 0; i < parts.length; i++)
        {
         ft.update(parts[i]);
         ft.render(parts[i], g3d);          
        }
    }
}

 

 

Resources.java

/*
* A simple class to simulate a resource bundle.
* Modify the contents of this class according to the
* locales/languages you want your application to support.
* In your application, retrieve a string using code such as the
* following:
* <pre>
* <code>String s = Resources.getString(Resources.ID_GAME_NEW);
* </code></pre>
* Copyright (C) 2002 Nokia Corporation
*/
public class Resources
{
// Identifiers for text strings.
public static final int ID_GAME_NEW = 0;
public static final int ID_GAME_OPTIONS = 1;
public static final int ID_GAME_HIGHSCORES = 2;
public static final int ID_GAME_INSTRUCTIONS = 3;
public static final int ID_GAME_ABOUT = 4;
public static final int ID_GAME_CONTINUE = 5;
public static final int ID_GAME_BACK = 6;
public static final int ID_GAME_MORE = 7;
public static final int ID_GAME_EXIT = 8;
public static final int ID_GAME_LEVEL = 9;
public static final int ID_GAME_SOUNDS = 10;
public static final int ID_GAME_VIBRA = 11;
public static final int ID_GAME_NAME = 12;
public static final int ID_GAME_LANGUAGE = 13;
// List of supported locales.
// The strings are Nokia-specific values
// of the "microedition.locale" system property.

public static final String[] supportedLocales ={"en", "fi-FI", "fr", "de"};
//NOTE: default language must be the first one
//for getString to work!
// Strings for each locale, indexed according to the
// contents of supportedLocales
private static final String[][] strings = {
{ "New game",   "Settings",  "High scores",   "Instructions", "About", "Continue", "Back",   "More",  "Exit game","Level",   "Sounds", "Shakes",    "Game name", "Language"},
{ "Uusi peli",   "Asetukset",  "Huipputulokset",  "Peliohjeet", "Tietoja", "Jatka",  "Poistu", "Jatka", "Poistu", "Vaikeusaste",  "Peli??net","V?rin?tehosteet", "Pelin nimi", "Language"},
{ "Nouveau jeu",  "Paramètres",  "Scores",    "Instructions", "A propos", "Continuer","Retour", "Suite",  "Sortir", "Niveau",   "Sons",  "Vibrations",   "Jeu nom",  "Language"},
{ "Neues Spiel",  "Einstellungen","Rekord",    "Anleitung", "über",  "Weiter",  "Zurück", "Weiter", "Beenden", "Ebene",   "Ton",   "Vibrationen",   "Spiel name", "Language"}};

/*
* Gets a string for the given key.
* @param key Integer key for string
* @return The string
*/

public static String getString(String lang,int key)
{
String locale = lang;
if (locale == null)
 {
 locale = new String(""); // use empty instead of null
 }
// find the index of the locale id
int localeIndex = -1;
for (int i = 0; i < supportedLocales.length; i++)
 {
 if (locale.equals(supportedLocales[i]))
  {
  localeIndex = i;
  break;
  }
 }
// not found
if (localeIndex == -1)
 {
 // defaults to first language, in this example English
 return strings[0][key];
 }
return strings[localeIndex][key];
}

public static String getString(int key)
 {
 String locale = System.getProperty("microedition.locale");
 if (locale == null)
  {
  locale = new String(""); // use empty instead of null
  }
 // find the index of the locale id
 int localeIndex = -1;
 for (int i = 0; i < supportedLocales.length; i++)
  {
  if (locale.equals(supportedLocales[i]))
   {
   localeIndex = i;
   break;
   }
  }
 // not found
 if (localeIndex == -1)
  {
  // defaults to first language, in this example English
  return strings[0][key];
  }
 return strings[localeIndex][key];
 }
}

 

 

Seconds.java


public class Seconds extends Thread
{
private int second=0;
private boolean running;
private AirFighterCanvas t;
public Seconds(AirFighterCanvas t)
 {
 this.t=t;
 }

public void start()
 {
 running=true;
 super.start();
 }

public void halt()
 {
 running=false;
 }

public void run()
 {
 while(running)
  {
  second++;
  //t.repaint();
  try
   {
   Thread.sleep(1000);
   }
  catch(InterruptedException ie)
   {
   
   }
  }
 }

public int getSecond()
 {
 return second;
 }
}

 

 

SplashCanvas.java

import java.util.Timer;
import java.util.TimerTask;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;

public class SplashCanvas extends Canvas
{
private AirFighterMIDlet  parent = null;
private MainMenu menu = null;
private Timer timer = null;
private Image img;
public SplashCanvas(AirFighterMIDlet parent)
 {
 this.parent = parent;
 menu = new MainMenu(Resources.getString(Resources.ID_GAME_NAME),List.IMPLICIT, parent);
 startTimer();
 
 try
 {
 img=Image.createImage("/res/LogoImage.png");
 }
 catch(Exception e)
 {
 System.out.println("Splash Image create Error:"); 
 System.out.println(e.toString());  
 }
 
 }
protected void paint(Graphics g)
 {//Do the splash screen here
 //gi.setColor(0x1211FF);
 //gi.fillRect(0,0 ,getWidth(),getHeight());
 
 g.drawImage(img, (this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/2,16|4);//16TOP|4LEFT|1HCENTER
 
 //g.setColor(0,0,0);
 }
protected void keyPressed(int keyCode)
 {
 timer.cancel();
 timer = null;
 //All key events received set the main menu to the screen
 parent.setDisplayable(menu);
 }

//Timer for the splash screen. Main menu is set to the display
//after 5 seconds.
private void startTimer()
 {
 TimerTask task =new TimerTask()
     {public void run()
      {
      parent.setDisplayable(menu);
      }
     };
     timer = new Timer();
     timer.schedule(task, 5000);
 }
}

 

 

StarHScroller.java

/*****************************************************************************

 Description: Used to create a star scrolling effect.

 Created By: Oscar Vivall 2006-01-09
 @file        StarHScroller.java

 COPYRIGHT All rights reserved Sony Ericsson Mobile Communications AB 2004.
 The software is the copyrighted work of Sony Ericsson Mobile Communications AB.
 The use of the software is subject to the terms of the end-user license
 agreement which accompanies or is included with the software. The software is
 provided "as is" and Sony Ericsson specifically disclaim any warranty or
 condition whatsoever regarding merchantability or fitness for a specific
 purpose, title or non-infringement. No warranty of any kind is made in
 relation to the condition, suitability, availability, accuracy, reliability,
 merchantability and/or non-infringement of the software provided herein.

 *****************************************************************************/

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import java.util.*;

public class StarHScroller
{

    public final int NUM_STARS = 30;
    public final int WIDTH, HEIGHT;

    public int []posX = new int[NUM_STARS];
    public int []posY = new int[NUM_STARS];
    public int []size = new int[NUM_STARS];
    int[] raw;
    Image image = null;
    Graphics g;
    Random r = new Random();
    int bgColor = 0x00;
    int fgColor = 0xFFFFFF;
   
    public StarHScroller(int w, int h)
    {
        WIDTH = w;
        HEIGHT = h;
        try
        {
            image = Image.createImage(WIDTH, HEIGHT);
            g = image.getGraphics();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        raw = new int[image.getWidth() * image.getHeight()];
        for(int i=0; i<NUM_STARS; i++)
        {
            size[i] = r.nextInt(2)+1;
            posX[i] = r.nextInt(WIDTH);
            posY[i] = r.nextInt(HEIGHT) + 1;
        }
    }

    private void initStar(int index)
    {
        size[index] = r.nextInt(2)+1;
        posX[index] = -10 + r.nextInt(10);;
        posY[index] = r.nextInt(HEIGHT) + 1;
    }

    public void draw()
    {
        g.setColor(fgColor);
        for(int i=0; i<NUM_STARS; i++)
        {
            g.fillRect(posX[i], posY[i], size[i], size[i]);
            switch(size[i])
            {
                case 1:
                    posX[i] +=1;
                    break;
                case 2:
                    posX[i] +=2;
                    break;
            }
            if(posX[i] > WIDTH)
            {
                initStar(i);
            }
        }
    }
   
    public byte[] getByteArray(Image image)
    {
     int raw[] = new int[image.getWidth() * image.getHeight()]; 
     image.getRGB(raw, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight()); 
     byte rawByte[] = new byte[image.getWidth() * image.getHeight() * 4];  int n = 0; 
     for(int i = 0; i < raw.length; i++) 
     {  
      // break up into channels  
      int ARGB = raw[i];  
      int a = (ARGB & 0xff000000) >> 24; // alpha channel!  
      int r = (ARGB & 0xff0000) >> 16;   // red channel!  
      int g = (ARGB & 0x0000ff00) >> 8;  // green channel!  
      int b = ARGB & 0x000000ff;     // blue channel !     
      rawByte[n] = (byte)b;  
      rawByte[n + 1] = (byte)g;  
      rawByte[n + 2] = (byte)r;  
      rawByte[n + 3] = (byte)a;    
      // you can see these codes 
      // from "http://forum.java.sun.com/thread.jspa?forumID=76&threadID=629677"  
      // put the color back together  
      //argb = ((a << 24) | (r << 16) | (g << 8) | b);  
      n += 4; 
     }  
     raw = null; 
     return rawByte;
    }
   
    /*
    public byte[] getByteArray()
    {
     updateImage();
     
    image.getRGB(raw, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
    byte rawByte[] = new byte[image.getWidth() * image.getHeight() * 4];
    int n = 0;
    for(int i = 0; i < raw.length; i++)
    {
    int ARGB = raw[i];
    int a = (ARGB & 0xff000000) >> 24;
    int r = (ARGB & 0xff0000) >> 16;
    int g = (ARGB & 0xff00) >> 8;
    int b = ARGB & 0xff;
    rawByte[n] = (byte)b;
    rawByte[n + 1] = (byte)g;
    rawByte[n + 2] = (byte)r;
    rawByte[n + 3] = (byte)a;
    n += 4;
    }
    return rawByte;
    }
    */
   
   
    /*
     byte[] byteArray = new byte[width*height*4]; //assuming we store Alphaint[] rgbArray = new int[width*height];myImage.getRGB(rgbArray, 0, width, 0, 0, width, height); for(int i=0; i<rgbArray.length*4; i+4){   byteArray[i+0] = (rgbArray[i/4] >> 24);   byteArray[i+1] = (rgbArray[i/4] >> 16) & 0x000000FF;   byteArray[i+2] = (rgbArray[i/4] >>  8) & 0x000000FF;   byteArray[i+3] = rgbArray[i/4] & 0x000000FF;}
     */
   
   
   
    public void updateImage()
    { 
     g.setColor(bgColor);
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setColor(fgColor);
        draw();
    }
   
    public Image getImage()
    { 
     g.setColor(bgColor);
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setColor(fgColor);
        draw();
        return image;
    }
   
   
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值