⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maincanvas.java

📁 自己做的HunDouLuo j2me游戏
💻 JAVA
字号:
import java.util.Random;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;


public class MainCanvas extends GameCanvas 
				implements Runnable, CommandListener{
	public static final int GAME_UI				= 0;	//进入用户界面
	public static final int GAME_GAMING			= 1;	//进行游戏
	public static final int GAME_BUTTON			= 2;	//游戏时显示界面按钮
	public static final int GAME_END				= 3;	//游戏结束
	public static final int GAME_STATE_NUM 		= 4;	//状态总数
	private int m_nState	= GAME_UI;						//存储当前的游戏状态
	
	private boolean		m_bRunning;			    		//控制线程运行
	private MyUI			m_UI;							//界面对象
	private Sprite			m_TextSp;						//图形文字对象
	private ManSprite 		m_Man;							//英雄对象
	private EnemySprite	m_aEnemy[];						//敌人对象
	private Scene 			m_Scene;						//场景对象
	private ExplosionSprite m_aExplosion[];				//爆炸对象
	private Random			m_Random;						//随机数对象
	private LayerManager m_LayerManager;					//层管理器对象
	private Command MenuCommand;							//高级按钮对象
	public MainCanvas( ){
		super(true);			
		try{
			//创建用户界面,并设置界面中的按钮
			MyButton button = new MyButton(41, 21, 0, 1, -1, -1, -1, 2);
			m_UI = new MyUI(button);
        }
        catch(Exception exception){}
        setState(GAME_UI);
		Start();
	}
	//重新开牌
	private void Reset(){	
		//创建随机数对象
		if( m_Random == null )
			m_Random = new Random();
		//创建英雄
		if( m_Man == null ){
			try{
				Image img = Image.createImage("/demo/man.png");
				m_Man = new ManSprite(img, 22, 25);
			}
			catch(Exception e){}
		}
		//创建敌人
		if( m_aEnemy == null ){
			m_aEnemy 		= new EnemySprite[4];
			try{
				Image img = Image.createImage("/demo/enemy.png");
				for( int n = 0; n < m_aEnemy.length; n ++ ){
					m_aEnemy[n] = new EnemySprite(img, 17, 24 );
				}
			}
			catch(Exception e){}
		}
		//创建爆炸对象
		if( m_aExplosion == null ){
			m_aExplosion 	= new ExplosionSprite[3];
			try{ 
				//创建爆炸对象
				Image img = Image.createImage("/demo/explosion.png");
				for( int m = 0; m < m_aExplosion.length; m ++ ){
					m_aExplosion[m] = new ExplosionSprite( img, 21, 21 );
				}
			}
		    catch(Exception e){}
		}
		//创建场景对象
	    if( m_Scene == null )
	 	    m_Scene = new Scene();	    
	    if( m_LayerManager == null )
	    {//创建层管理器,并将所有图层添加到管理器
	    	m_LayerManager = new LayerManager();
		    for( int m = 0; m < m_aExplosion.length; m ++ )
		    {
		    	m_LayerManager.append(m_aExplosion[m]);
		    }
		    m_LayerManager.append( m_Man );
		    m_LayerManager.append( m_Man.m_Bullet );
		    for( int n = 0; n < m_aEnemy.length; n ++ )
		    {
		    	m_LayerManager.append(m_aEnemy[n]);
			}
		    m_LayerManager.append(m_Scene.m_TLayer);
	    }
		m_Man.setPosition( getWidth()/2, getHeight()/2 - m_Man.getHeight() + 3 );
		m_Scene.LoadMap();
		m_Scene.m_TLayer.setPosition(0, getHeight()/2 - 25 );
		
		//设置游戏画面的显示区域
		SetViewWindow();
		
        if( MenuCommand == null ){
        	//创建菜单
        	MenuCommand = new Command("Menu", Command.OK, 0);
        	addCommand(MenuCommand);
            setCommandListener(this);
        }
        if( m_TextSp == null ){
        	//创建图形文字对象
        	try{
        		Image img = Image.createImage("/demo/text.png");
        		m_TextSp = new Sprite(img, 82, 25);
        		m_TextSp.defineReferencePixel(41, 23);
        		int x = getWidth()/2;
        		int y = getHeight()/2 - 10;
        		m_TextSp.setRefPixelPosition(x, y);
        	}
        	catch(Exception exception){}
        }
        
	}
	//设置游戏画面的显示区域
	private void SetViewWindow(){
		if( m_LayerManager == null )
			return;
		//根据英雄的位置,设置游戏画面的显示区域
		int nX = m_Man.getRefPixelX() - getWidth()/2;
		int nY = m_Man.getRefPixelY() - getHeight()/2;
		if( nX < 0 )
			nX = 0;
		else if( nX > m_Scene.m_TLayer.getWidth() - getWidth() )
			nX = m_Scene.m_TLayer.getWidth() - getWidth();
		m_LayerManager.setViewWindow( nX, nY, getWidth(), getHeight() );
	}
	private void setState( int state ){					//设置游戏状态
		if( state < 0 || state >= GAME_STATE_NUM )
			return;
		m_nState = state;
		switch( m_nState ){
		case GAME_UI:										//进入用户界面
			m_UI.setState(MyUI.UI_TITLE);					//显示标题界面
			//设置本游戏的按钮类型,本游戏有:开始及退出两种按钮
			m_UI.getButton().setShow(true, false, false, false, false, true );
			break;
		case GAME_BUTTON:									//在游戏中途显示按钮
			m_UI.setState(MyUI.UI_BUTTON);
			//游戏中途,显示复位与退出按钮
			m_UI.getButton().setShow(false, true, false, false, false, true );
			break;
		case GAME_GAMING:									//正在游戏
			m_UI.setState(MyUI.UI_HIDE);
			break;
		case GAME_END:										//游戏结束
			m_UI.setState(MyUI.UI_HIDE);
			break;
		}
	}
	public void Start(){
		m_bRunning = true;
		Thread thread = new Thread(this);	//分配新线程
		thread.start();						//线程启动
	}
	public void run() {
		//得到系统当前时间,并将时间换算成毫秒
		long T1 = System.currentTimeMillis();
		long T2 = T1;
		while(m_bRunning){
			T2 = System.currentTimeMillis();
			if( T2 - T1 > 200 ){			//间隔100毫秒
				T1 = T2;
				Input();
				Logic();
				Paint();
			}
		}
	}
	public void Stop(){
		m_bRunning = false;
	}
	public void Input(){
		int keyStates = getKeyStates();
		switch( m_nState ){
		case GAME_UI:
			{
				switch( m_UI.Input( keyStates ) ){
				case MyButton.BUTTON_START:					//按下开始键
					Reset();
					setState(GAME_GAMING);
					break;
				case MyButton.BUTTON_EXIT:					//按下退出键
					WarriorMidlet.midlet.notifyDestroyed();
					break;
				}
			}
			break;			
		case GAME_GAMING:									//游戏中
			m_Man.Input(keyStates);
			SetViewWindow();
			break;
		case GAME_BUTTON:									//游戏中途显示按钮
			{
				switch( m_UI.Input( keyStates ) ){
				case MyButton.BUTTON_RESET:					//按下复位键
					Reset();
					setState(GAME_GAMING);
					break;
				case MyButton.BUTTON_EXIT:					//按下退出键
					WarriorMidlet.midlet.notifyDestroyed();
					break;
				}
			}
			break;
		case GAME_END:
			if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
				Reset();
				setState(GAME_GAMING);
			}
			break;
		}
	}
	public void Logic(){	
		switch( m_nState ){
		case GAME_GAMING:
			//爆炸逻辑
			for( int m = 0; m < m_aExplosion.length; m ++ ){
				m_aExplosion[m].Logic();
			}
			//英雄逻辑
			m_Man.Logic(getWidth(), getHeight());
		    for( int n = 0; n < m_aEnemy.length; n ++ ){
		    	m_aEnemy[n].Logic(getWidth(), getHeight());
			}
		    //碰撞检测
		    CheckCollision();
		    //产生新的敌人
		    CreateEnemy();
			break;
		}
	}
	public void Paint(){
		Graphics g = getGraphics();
		//用黑色清屏
		g.setColor(0);
		g.fillRect( 0, 0, getWidth(), getHeight() );
		
		g.setColor(0xFFFF0000);
		switch( m_nState ){
		case GAME_UI:								//显示界面
			m_UI.Paint(g, getWidth(), getHeight());
			break;			
		case GAME_GAMING:							//显示游戏画面
		case GAME_BUTTON:
		case GAME_END:
			m_LayerManager.paint(g, 0, 0);
			if( m_nState == GAME_END )
				m_TextSp.paint(g);
			m_UI.Paint(g, getWidth(), getHeight());
			break;
		}
		flushGraphics();
	}
	//碰撞检测
	private void CheckCollision()
	{
		for( int n = 0; n < m_aEnemy.length; n ++ ){
			//我方子弹和敌人碰撞
			if( m_Man.m_Bullet.collidesWith( m_aEnemy[n], true ) ){
				CreateExplosion(m_aEnemy[n].getRefPixelX(), 
						m_aEnemy[n].getRefPixelY());
				m_Man.m_Bullet.setVisible( false );
				m_aEnemy[n].setVisible( false );
			}
			if( m_aEnemy[n].collidesWith( m_Man, true ) ){
				CreateExplosion(m_Man.getRefPixelX(), 
						m_Man.getRefPixelY());
				m_TextSp.setFrame(1);
				setState(GAME_END);
			}
		}
	}
	//随机产生敌人
	public void  CreateEnemy() {
		//以5分之一的概率产生敌人
		int nRs = m_Random.nextInt() % 5;
		if( Math.abs(nRs) != 0 )
			return;
		//如果某一位置的敌人被摧毁,则可以产生新敌人
		for( int n = 0; n < m_aEnemy.length; n ++ ){
	    	if( m_aEnemy[n].isVisible() )
	    		continue;
	    	int x = m_Man.getX() - getWidth()/2 - m_aEnemy[n].getWidth();
	    	boolean bRight = true;
	    	int rand = m_Random.nextInt();
	    	m_aEnemy[n].setFrame(0);
	    	if( rand < 0 ){
	    		x = m_Man.getX() + getWidth()/2 + m_aEnemy[n].getWidth();
		    	bRight = false;
	    	}
	    	int y = m_Man.getRefPixelY();
	    	
	    	m_aEnemy[n].Start(x, y, bRight, 2);
	    	break;
		}
	}
	//产生爆炸,参数nX、nY分别是爆炸位置的横纵坐标
	public void CreateExplosion( int nX, int nY ){
		for( int m = 0; m < m_aExplosion.length; m ++ ){
	    	if( m_aExplosion[m].isVisible() )
	    		continue;
	    	m_aExplosion[m].Start( nX, nY );
	    	break;
		}
	}
	public void commandAction(Command c, Displayable s){
		if( c == MenuCommand ){
			switch( m_nState ){	
			case GAME_END:							//游戏结束,显示按钮
			case GAME_GAMING:						//正在游戏,显示按钮	
				setState(GAME_BUTTON);
				break;
			case GAME_BUTTON:						//正显示按钮,退回游戏
				setState(GAME_GAMING);
				break;
			default:
				break;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -