J2ME 2D小游戏入门之旅(一)游戏的框架
时间:2011-08-09
一、游戏的框架
我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者如果要你考虑太多的问题,恐怕会让你偏离主线,这里只给出canvas的代码,不理解可以参看本站的另外一篇系列文章《使用MIDP2.0开发游戏》。
使用singlon实现,因为每个gamecanvas都需要很多的内存空间。另外对我们来说,只要改写gameInit(),gameMain(),一次性初始化的代码写在构造函数中。
public class MyGameCanvas extends GameCanvas
implements Runnable, CommandListener{
private static MyGameCanvas instance;
Graphics g;
boolean running;
Thread t;
Command startcmd,exitcmd,restartcmd;
int keystate;
boolean keyevent;
boolean key_up,key_down,key_left,key_right,key_fire;
private boolean allowinput;
public int screenwidth;
public int screenheight;
boolean gameover;
//define your variable here
//define your variable end
protected MyGameCanvas() {
super(true);
g=getGraphics();
running=false;
t=null;
addCommand(startcmd=new Command("start",Command.OK,1));
addCommand(exitcmd=new Command("exit",Command.EXIT,1));
setCommandListener(this);
screenwidth=getWidth();
screenheight=getHeight();
//put your init once code here
//put your init once code end
}
synchronized public static MyGameCanvas getInstance() {
if (instance == null) {
instance = new MyGameCanvas();
System.out.println("new MyGameCanvas");
}
return instance;
}
public void run(){
System.out.println("MyGameCanvas run start");
long st=0,et=0,diff=0;
int rate=50;//16-17 frame per second
while(running){
st=System.currentTimeMillis();
gameinput();
gameMain();
et=System.currentTimeMillis();
diff=et-st;
if(diff
//System.out.println("Sleep "+(rate-diff));
try {
Thread.sleep(rate - diff);
}
catch (InterruptedException ex) {}
}else{
//System.out.println("rush , and the frame using time: á"+diff);
}
}
System.out.println("MyGameCanvas run end");
}
public void start(){
if(!running){
running=true;
t=new Thread(this);
t.start();
}
}
private void gameMain() {
g.setColor(0,0,0);//clear screen
g.fillRect(0,0,getWidth(),getHeight());
background.paint(g);//draw background
//g.setColor(255,255,255);
//g.drawString("hello",1,1,g.TOP|g.LEFT);
flushGraphics();
}
private void gameInit() {
gameover=false;
gametime=0;
gametimeoffset=System.currentTimeMillis();
allowinput=true;
key_up=key_down=key_left=key_right=key_fire=false;
}
public void stop(){
if(running){
running = false;
}
}
public void commandAction(Command c, Displayable d) {
String cmdstr=c.getLabel();
if(cmdstr.equals("start")){
gameInit();
start();
removeCommand(startcmd);
addCommand(restartcmd=new Command("restart",Command.OK,1));
}else if(cmdstr.equals("restart")){
stop();
while(t.isAlive());
gameInit();
start();
}else if(cmdstr.equals("exit")){
stop();
Navigate.midlet.destroyApp(false);
Navigate.midlet.notifyDestroyed();
}
}
private void gameinput() {
if(allowinput){
keystate=getKeyStates();
key
|