看到网上1个别人没做完的小游戏,小弟我重新写过了1下,原码发出来给大家看看(有点混乱),麻烦给点意见,大家交流1下
//=====================主类midlet==============================
/*
* MobileGame.java
*
* Created on 2007年2月19日, 上午8:45
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
/**
*
* @author Victor
* @version
*/
public class MobileGame extends MIDlet {
private Display display=null;
private GameWorld gameworld=null;
public MobileGame(){
gameworld=new GameWorld();
display=Display.getDisplay(this);
}
public void startApp() {
gameworld.start();
display.setCurrent(gameworld);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
//=====================背景类==============================
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;
import java.io.IOException;
/**
*
* @author Victor
*/
public class BackGround extends TiledLayer {
static public Image imgbg=null;
static int map[][]=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
/** Creates a new instance of BackGround */
protected BackGround(int cols,int rows,Image img,int width,int height) {
super(cols,rows,img,width,height);
}
public static BackGround loadImage(){
try{
imgbg=Image.createImage( "/CityBackGround.png ");
System.out.println( "Heightbg "+imgbg.getHeight()+ " Widthbg "+imgbg.getWidth());
}catch(IOException imgError){System.out.println( "imgErroe "+imgError);}
BackGround background=new BackGround(4,4,imgbg,60,80);
for(int i=0;i <4;i++){
for(int j=0;j <4;j++)
background.setCell(j,i,map[i][j]);
}
return background;
}
}
//======================敌人类==========================
/*
* Enemy.java
*
* Created on 2007年2月20日, 下午3:09
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.Sprite;
import java.io.IOException;
import java.util.Random;
/**
*
* @author Victor
*/
public class Enemy {
public GameWorld gameworld;
Sprite monster;
private int[][] enemys;
private Random rnd;
private static Image img;
private int total;
public static final int ENEMY_LEFT=0;
public static final int ENEMY_RIGHT=1;
public static final int ENEMY_TOP=3;
public static final int ENEMY_BUTTOM=4;
public static final int ENEMY_LIFE=0;
public static final int ENEMY_X=1;
public static final int ENEMY_Y=2;
public static final int ENEMY_VX=3;
public static final int ENEMY_VY=4;
/** Creates a new instance of Enemy */
protected Enemy(Image img,int width,int height,int total) {
monster=new Sprite(img,width,height);
// monster.defineReferencePixel(width/2,height/2);
monster.setRefPixelPosition(width/2,height/2);
this.total=total;
rnd=new Random();
enemys=new int[total][5];//产生1片敌人
monster.defineCollisionRectangle(0,0,monster.getWidth(),monster.getHeight());
}
static public Enemy createEnemy(GameWorld world){//产生单个敌人
try{
img=Image.createImage( "/Monster.png ");
}catch(IOException e){}
Enemy enemy=new Enemy(img,24,32,70);//敌人人数确定
enemy.gameworld=world;
return enemy;
}
public void initEnemys(){//初始化ENEMY群
for(int i=0;i <enemys.length;i++){
initEnemy(i);
}
}
private void initEnemy(int i){//初始化ENEMY
int direct=(rnd.nextInt()&0x7fffffff)%4; //确定方向随机
//System.out.println( "方向值 "+direct);
enemys[i][ENEMY_LIFE]=1;
int worldHeight=gameworld.getHeight();
int worldWidth=gameworld.getWidth();
switch(direct){
case ENEMY_LEFT:
// monster.setFrameSequence(new int[]{3,4,5});
// monster.nextFrame();
enemys[i][ENEMY_X]=-5;
enemys[i][ENEMY_Y]=(rnd.nextInt()&0x7fffffff)%worldHeight;
enemys[i][ENEMY_VX] =(rnd.nextInt()&0x7fffffff)%3+1;
enemys[i][ENEMY_VY] =(rnd.nextInt())%3;
break;
case ENEMY_RIGHT:
//monster.setFrameSequence(new int[]{9,10,11});
// monster.nextFrame();
enemys[i][ENEMY_X]=worldWidth+5;
enemys[i][ENEMY_Y]=(rnd.nextInt()&0x7fffffff)%worldHeight;
enemys[i][ENEMY_VX] =((rnd.nextInt()&0x7fffffff)%3+1)*(-1);
enemys[i][ENEMY_VY] =(rnd.nextInt())%3;
break;
case ENEMY_TOP:
// monster.setFrameSequence(new int[]{6,7,8});
// monster.nextFrame();
enemys[i][ENEMY_X]=(rnd.nextInt()&0x7fffffff)%worldWidth;
enemys[i][ENEMY_Y]=-5;
enemys[i][ENEMY_VX] =(rnd.nextInt())%3;
enemys[i][ENEMY_VY] =((rnd.nextInt()&0x7fffffff)%3+1)*(-1);
break;
case ENEMY_BUTTOM:
// monster.setFrameSequence(new int[]{0,1,2});
// monster.nextFrame();
enemys[i][ENEMY_X]=(rnd.nextInt()&0x7fffffff)%worldWidth;
enemys[i][ENEMY_Y]=worldHeight+5;
enemys[i][ENEMY_VX] =(rnd.nextInt())%3;
enemys[i][ENEMY_VY] =((rnd.nextInt()&0x7fffffff)%3+1)*(-1);
break;
}
}
public void updateEnemy(int i){//更新单一敌人
enemys[i][ENEMY_X]+= enemys[i][ENEMY_VX];
enemys[i][ENEMY_Y]+= enemys[i][ENEMY_VY];
if(enemys[i][ENEMY_X] <-5||enemys[i][ENEMY_X]> gameworld.getWidth()){
enemys[i][ENEMY_VX]*=-1;//X反弹敌人
}
if(enemys[i][ENEMY_Y] <-5||enemys[i][ENEMY_Y]> gameworld.background.getHeight()-50){
enemys[i][ENEMY_VY]*=-1;//Y反弹敌人
}
}
public void updateEnemys(Man man,boolean collision){
for(int i=0;i <enemys.length;i++){
if(enemys[i][ENEMY_LIFE]==0){
// System.out.println( "dead monster ");
continue;
}
if(collision){
// System.out.println( "检测碰撞 ");
if(isCollision(man,i,10)){//range
// System.out.println( "碰撞中 ");
//gameworld.man.setVisible(false);
gameworld.result();
enemys[i][ENEMY_LIFE]=0;
continue;
}
}
this.updateEnemy(i);
}
}
public void paint(Graphics g,int x,int y){
for(int i=0;i <enemys.length;i++){
if(enemys[i][ENEMY_LIFE]==0){
continue;
}
paintEnemy(g,i,x,y);
}
}
public void paintEnemy(Graphics g,int i,int x,int y){
//monster.setFrameSequence(new int[]{6,7,8});
monster.nextFrame();
monster.setPosition(enemys[i][ENEMY_X]+x,enemys[i][ENEMY_Y]+y);
if(monster.getX()> 0&&monster.getX() <260&&monster.getY()> 0&&monster.getY() <260){
monster.paint(g);
}
}
private boolean isCollision(Man man,int i,int range){
boolean result=false;
//man.setRefPixelPosition(man.getWidth()/2,man.getHeight()/2);
//System.out.println(monster.collidesWith(man,false));
//return monster.collidesWith(man,false);
int manXc=man.getRefPixelX();
int manYc=man.getRefPixelY();
monster.setPosition(enemys[i][ENEMY_X],enemys[i][ENEMY_Y]);
int enemyXc=monster.getRefPixelX();
int enemyYc=monster.getRefPixelY();
if((manXc-enemyXc)*(manXc-enemyXc)+(manYc-enemyYc)*(manYc-enemyYc) <=range*range)
{
result=true;
}
return result;
}
}
[解决办法]
暂停功能最好完善下.
我是指来了电话或短信时的中断和恢复游戏.
你的代码
public void startApp() {
gameworld.start();
display.setCurrent(gameworld);
}
public void pauseApp() {
}
意味着,电话呼入中断游戏后,不做任何事情.gameworld这个线程继续工作.
看看在pauseApp()中加入gameworld.sleep(long millis);或者加入自己写的暂停游戏方法.
而恢复游戏后.程序再次调有一次startApp()中的gameworld.start();
游戏会不会出逻辑错误?
我没细看完呢,只是先说下我个人的看法.一点小建议.
你的这个没注释,不好看啊.
让大家帮你提修改意见,再多加些注释会更好.