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

📄 maincanvas.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 JAVA
字号:
package demo;
import PlaneMidlet;

import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;

public class MainCanvas extends GameCanvas implements Runnable{
	//定义一组游戏的状态
	public static final int GAME_UI				= 0;	//进入用户界面
	public static final int GAME_GAMING			= 1;	//进行游戏
	public static final int GAME_END				= 2;	//游戏结束
	public static final int GAME_STATE_NUM 		= 3;	//状态总数
	private int m_nState	= GAME_UI;				//存储当前的游戏状态
	
	private boolean		m_bRunning;			    		//控制线程运行
	private MyUI			m_UI;							//界面对象
	private Scene			m_Scene;						//场景对象
	private PlayerPlane 	m_Plane;						//玩家飞机对象
	private EnemyPlane		m_aEnemy[];						//敌方飞机对象
	private ExplosionSprite	m_aExplosion[];				//爆炸对象
	private LayerManager	m_LayerManager;					//层管理器对象
	private int			m_nScore = 0;					//游戏的得分
	private Random			m_Random;						//随机数对象
	public MainCanvas( ){
		super(true);			
		try{
			//创建用户界面,并设置界面中的按钮
			MyButton button = new MyButton();
			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_LayerManager == null )
			m_LayerManager = new LayerManager();
		//创建玩家飞机
		if( m_Plane == null ){
			try{
				Image img = Image.createImage("/demo/plane.png");
				m_Plane = new PlayerPlane( img, 21, 21 );
				//将玩家飞机及其控制的导弹添入层管理器
				m_LayerManager.append( m_Plane );
				m_LayerManager.append( m_Plane.m_Missile );
				m_Plane.setVisible(true);
			}
			catch (Exception e){}
		}
		int nX = getWidth() / 2;
		int nY = getHeight() - 30;
		//设置玩家飞机的初始位置
		m_Plane.setRefPixelPosition( nX, nY );
		
		//创建敌方飞机
		if( m_aEnemy == null ){
			try{
				Image img = Image.createImage("/demo/enemy.png");
				m_aEnemy = new EnemyPlane[6];
				for( int n = 0; n < m_aEnemy.length; n ++ ){
					m_aEnemy[n] = new EnemyPlane( img, 15, 15 );
					//将敌方飞机及其控制的导弹添入层管理器
					m_LayerManager.append( m_aEnemy[n] );
					m_LayerManager.append( m_aEnemy[n].m_Missile );
				}
			}
			catch (Exception e){}
		}
		
		//创建爆炸
		if( m_aExplosion == null ){
			try{
				Image img = Image.createImage("/demo/explosion.png");
				m_aExplosion = new ExplosionSprite[5];
				for( int n = 0; n < m_aExplosion.length; n ++ ){
					m_aExplosion[n] = new ExplosionSprite( img, 21, 17 );
					//将爆炸对象添入到层管理器
					m_LayerManager.append( m_aExplosion[n] );
				}
			}
			catch (Exception e){}
		}
		//创建场景
		if( m_Scene == null ){
			m_Scene = new Scene(m_Random, getWidth(), getHeight());
			m_Scene.LoadMap();
			//将场景图像添入层管理器
			m_LayerManager.append(m_Scene.m_TLayer);
		}
		//设置可视区域
		m_LayerManager.setViewWindow(0, 0, 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);					//显示标题界面
			break;
		case GAME_GAMING:									//正在游戏
			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 > 50 ){				//间隔50毫秒
				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:					//按下退出键
					PlaneMidlet.midlet.notifyDestroyed();
					break;
				}
			}
			break;			
		case GAME_GAMING:									//游戏中
			m_Plane.Input( keyStates );
			break;
		}
	}
	public void Logic(){	
		switch( m_nState ){
		case GAME_GAMING:									//游戏中
			m_Scene.Logic(getWidth(), getHeight());			//场景逻辑
			m_Plane.Logic(getWidth(), getHeight());			//自机逻辑
			for( int n = 0; n < m_aEnemy.length; n ++ )		//敌机逻辑
				m_aEnemy[n].Logic(getWidth(), getHeight());
			for( int n = 0; n < m_aExplosion.length; n++ )	//爆炸逻辑
				m_aExplosion[n].Logic();
			CreateEnemy();									//产生新的敌机
			CheckCollisions();								//碰撞检测
			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:									//显示游戏画面
			m_LayerManager.paint( g, 0, 0 );
			break;
		case GAME_END:										//游戏结束
			m_LayerManager.paint( g, 0, 0 );
			StringBuffer buff = new StringBuffer();
			buff.append("本次得分:");
			buff.append(m_nScore);
			g.drawString(buff.toString(), 50, 50, 0);
			break;
		}
		flushGraphics();
	}	
	private void CreateEnemy(){							//产生新的敌机
		//同一时刻,屏幕上最多有m_aEnemy.length架敌机
		for( int n = 0; n < m_aEnemy.length; n ++ ){
			if( m_aEnemy[n].isVisible() )
				continue;
			int nX = m_Random.nextInt();
			nX = Math.abs( nX % ( getWidth() - 10 ) ) + 5;
			int nSpeedX = m_Random.nextInt() % 2;
			int nSpeedY = Math.abs( m_Random.nextInt() % 2 ) + 1;
			m_aEnemy[n].SetSpeed( nSpeedX, nSpeedY );
			m_aEnemy[n].setRefPixelPosition( nX, 0 );
			m_aEnemy[n].setVisible(true);
			return;
		}
	}
	private void CheckCollisions(){						//碰状检测
		for( int n = 0; n < m_aEnemy.length; n ++ ){
			//自机与敌方炮弹碰撞
			if( m_Plane.collidesWith( m_aEnemy[n].m_Missile, true ) ){
				CreateExplosion( m_Plane.getRefPixelX(), 
						m_Plane.getRefPixelY() );
				m_aEnemy[n].m_Missile.setVisible(false);
				setState(GAME_END);
				return;
			}
			//我方炮弹与敌机碰撞
			if( m_Plane.m_Missile.collidesWith( m_aEnemy[n], true ) ){
				CreateExplosion( m_aEnemy[n].getRefPixelX(), 
						m_aEnemy[n].getRefPixelY() );
				m_nScore ++;
				m_aEnemy[n].setVisible(false);
				m_Plane.m_Missile.setVisible(false);
			}
		}
	}
	private void CreateExplosion( int nX, int nY ){		//产生爆炸动画
		for( int n = 0; n < m_aExplosion.length; n ++ ){
			if( m_aExplosion[n].isVisible() )
				continue;
			m_aExplosion[n].setRefPixelPosition( nX, nY );
			m_aExplosion[n].setFrame(0);
			m_aExplosion[n].setVisible(true);
			return;
		}
		m_aExplosion[0].setRefPixelPosition( nX, nY );
		m_aExplosion[0].setFrame(0);
		m_aExplosion[0].setVisible(true);
	}
}

⌨️ 快捷键说明

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