📄 enemysprite.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 + -