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

📄 enemysprite.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 JAVA
字号:
package demo;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;


public class EnemySprite extends Sprite{
	//精灵状态值
	public static final int ENEMY_NORMAL		= 0;	//普通状态
	public static final int ENEMY_DEAD		= 1;	//死亡状态
	public static final int ENEMY_STATE_NUM	= 2;	
	private int m_nState = ENEMY_NORMAL;
	
	//移动方向
	public static final int DIR_STOP		= 0;		//停止运动
	public static final int DIR_UP		= 1;		//向上移动
	public static final int DIR_RIGHT		= 2;		//向右移动
	public static final int DIR_DOWN		= 3;		//向下移动
	public static final int DIR_LEFT		= 4;		//向左移动
	public static final int DIR_TYPE_NUM	= 5;
	private int m_nDir = DIR_STOP;
	

	private int m_nObjCol;								//目标所在的列
	private int m_nObjRow;								//目标所在的行
	private boolean m_aPath[][];						//可以通行的标志数组

	private int m_nTime;								//状态的持续时间	
	public EnemySprite( Image image, int frameWidth, int frameHeight){
		super(image, frameWidth, frameHeight);		
		defineReferencePixel(frameWidth / 2, frameHeight / 2);
		setVisible(false);
		m_nObjCol = -1;
		m_nObjRow = -1;
	}
	//设置当前状态
	public void setState( int state ){
		if( state < 0 || state >= ENEMY_STATE_NUM )
			return;
		m_nState = state;
		switch( m_nState ){
		case ENEMY_NORMAL:
			m_nTime = 10;
			setFrame( 0 );
			break;
		case ENEMY_DEAD:
			m_nTime = 60;
			setFrame( 2 );
			break;
		}
	}
	//获取当前状态
	public int getState(){
		return m_nState;
	}
	//敌人开始运动,参数col、row分别是敌人起始点的列号与行号
	//参数grid为背景格子对象
	public void Start( int col, int row, Grids grid ){
		int x = col * grid.getCellWidth() + grid.getCellWidth()/2;
		int y = row * grid.getCellHeight() + grid.getCellHeight()/2;
		x = x + grid.getX();
		y = y + grid.getY();
		m_nObjCol = -1;
		m_nObjRow = -1;
		setState(ENEMY_NORMAL);
		setRefPixelPosition(x, y);
		setVisible(true);
		ResetPath( grid );	
	}
	//重新设置可通过的格子,参数grid为背景格子对象
	private void ResetPath( Grids grid ){
		TiledLayer TL = grid.getBuiding();
		if( m_aPath == null ){
			m_aPath = new boolean[TL.getColumns()][TL.getRows()];
		}
		for( int col = 0; col < TL.getColumns(); col ++ ){
			for( int row = 0; row < TL.getRows(); row ++ ){
				if( TL.getCell(col, row) == 0 )
					m_aPath[col][row] = true;
				else
					m_aPath[col][row] = false;					
			}
		}
	}
	//让敌人自动寻路,自动追踪吃豆精灵
	//参数grid为背景格子对象,man为吃豆精灵对象
	//参数col、row分别是敌人当前所在位置的列号与行号
	private void SearchPath( Grids grid, ManSprite man, int col, int row )
	{
		if( m_nObjCol != man.getCurCol() || m_nObjRow != man.getCurRow() )
		{//如果吃豆精灵的位置与目标位置不一致,则重新设置目标位置
			m_nObjCol = man.getCurCol();
			m_nObjRow = man.getCurRow();
			//同时,重新设置可通过的格子
			ResetPath(grid);
		}
		m_nDir = DIR_STOP;
		int min = 1000;		//记录与目标最近的距离,此处先设置一个最大值
		
		if( col > 0 && m_aPath[col-1][row] == true )
		{//如果左侧的格子可以通过
			int len = getLen( col-1, row, m_nObjCol, m_nObjRow);
			if( len < min )
			{//如果左侧格子与目标的距离小于当前距离,则向左移动
				min = len;
				m_nDir = DIR_LEFT;
			}
		}
		if( col < m_aPath.length - 1 && m_aPath[col+1][row] == true )
		{//如果右侧的格子可以通过
			int len = getLen( col + 1, row, m_nObjCol, m_nObjRow);
			if( len < min )
			{//如果右侧格子与目标的距离小于当前距离,则向右移动
				min = len;
				m_nDir = DIR_RIGHT;
			}
		}
		if( row > 0 && m_aPath[col][row-1] == true )
		{//如果上侧的格子可以通过
			int len = getLen( col, row-1, m_nObjCol, m_nObjRow);
			if( len < min )
			{//如果上侧格子与目标的距离小于当前距离,则向上移动
				min = len;
				m_nDir = DIR_UP;
			}
		}
		if( row < m_aPath[0].length - 1 && m_aPath[col][row+1] == true )
		{//如果下侧的格子可以通过
			int len = getLen( col, row+1, m_nObjCol, m_nObjRow);
			if( len < min )
			{//如果下侧格子与目标的距离小于当前距离,则向下移动
				min = len;
				m_nDir = DIR_DOWN;
			}
		}
		m_aPath[col][row] = false;
	}
	//获取两个格子之间的移动距离
	//参数col1,row1指定第一个格子,参数col2,row2指定第二个格子
	private int getLen( int col1, int row1, int col2, int row2 ){
		return Math.abs( col1 - col2 ) + Math.abs(row1 - row2);
	}
	//逻辑操作
	public void Logic( Grids grid, ManSprite man )
	{
		if( m_nState == ENEMY_NORMAL )
		{//如果处于正常状态
			int Gx = grid.getCellWidth() / 2;
			int Gy = grid.getCellHeight() / 2;
			int x = getRefPixelX();
			int y = getRefPixelY();
			if( ( x - grid.getX() ) % grid.getCellWidth() == Gx &&
				( y - grid.getY() ) % grid.getCellHeight() == Gy )
			{//只有运动到格子的中间位置,才可以改变方向
				TiledLayer TL = grid.getBuiding();
				int col = ( x - TL.getX() ) / TL.getCellWidth();
				int row = ( y - TL.getY() ) / TL.getCellHeight();
				SearchPath( grid, man, col, row );
			}
			//根据方向,移动敌人
			int len = 1;
			switch( m_nDir ){
			case DIR_UP:
				y -= len;
				setFrame( 0 );
				break;
			case DIR_RIGHT:
				x += len;
				setFrame( 1 );
				break;
			case DIR_DOWN:
				y += len;
				setFrame( 0 );
				break;
			case DIR_LEFT:
				x -= len;
				setFrame( 1 );
				break;
			}
			setRefPixelPosition(x, y);
		}
		else if( m_nState == ENEMY_DEAD )
		{//如果敌人死亡,则过一段时间会恢复正常
			m_nTime --;
			if( m_nTime < 0 )
				setState(ENEMY_NORMAL);
		}
	}
}

⌨️ 快捷键说明

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