J2ME 2D小游戏入门之游戏的框架

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

一、游戏的框架

我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者假如要你考虑太多的问题,恐怕会让你偏离主线,这里只给出canvas的代码,不理解可以参看本站的另外一篇系列文章《使用MIDP2.0开发游戏》。

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<rate){

//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());

flushGraphics();

}

private void gameInit() {

gameover=false;

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();

keyevent=false;

if((keystate & UP_PRESSED)!=0){//up

key_up=true;keyevent=true;

//deal your unstop job code here

//System.out.println("up press");

//deal your unstop job code end

}else if((keystate & UP_PRESSED)==0){//release key

if(key_up==true){

key_up=false;

//deal your one press-one job code here

//System.out.println("up release");

//deal your one press-one job code end

}

}

if((keystate & DOWN_PRESSED)!=0){//down

key_down=true;keyevent=true;

//deal your unstop job code here

//System.out.println("down press");

//deal your unstop job code end

}else if((keystate & DOWN_PRESSED)==0){//release key

if(key_down==true){

key_down=false;

//deal your one press-one job code here

//System.out.println("down release");

//deal your one press-one job code end

}

}

if((keystate & LEFT_PRESSED)!=0){//left

key_left=true;keyevent=true;

//deal your unstop job code here

//System.out.println("left press");

//deal your unstop job code end

}else if((keystate & LEFT_PRESSED)==0){//release key

if(key_left==true){

key_left=false;

//deal your one press-one job code here

//System.out.println("left release");

//deal your one press-one job code end

}

}

if((keystate & RIGHT_PRESSED)!=0){//right

key_right=true;keyevent=true;

//deal your unstop job code here

//System.out.println("right press");

//deal your unstop job code end

}else if((keystate & RIGHT_PRESSED)==0){//release key

if(key_right==true){

key_right=false;

//deal your one press-one job code here

//System.out.println("right release");

//deal your one press-one job code end

}

}

if((keystate & FIRE_PRESSED)!=0){//fire

key_fire=true;keyevent=true;

//deal your unstop job code here

//System.out.println("fire press");

//deal your unstop job code end

}else if((keystate & FIRE_PRESSED)==0){//release key

if(key_fire==true){

key_fire=false;

//deal your one press-one job code here

//System.out.println("fire release");

//deal your one press-one job code end

}

}

if(!keyevent){

//no keyevent here

//System.out.println("NO KEY press");

//no keyevent end

}

}

}

public static void cleanJob(){

instance=null;

}

}

使用singlon实现,因为每个gamecanvas都需要很多的内存空间。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航