📄 mansprite.java
字号:
package demo;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
public class ManSprite extends Sprite{
//精灵状态值
public static final int MAN_BIRTH = 0; //刚出生状态
public static final int MAN_NORMAL = 1; //普通状态
public static final int MAN_STRONG = 2; //无敌状态
public static final int MAN_DEAD = 3; //无敌状态
public static final int MAN_STATE_NUM = 4;
private int m_nState = MAN_NORMAL;
private int m_nBirthX;
private int m_nBirthY;
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_nTime; //状态的持续时间
private int m_nLife; //生命值
private int m_nCurCol; //当前所处的列
private int m_nCurRow; //当前所处的行
public ManSprite( Image image, int frameWidth, int frameHeight){
super(image, frameWidth, frameHeight);
defineReferencePixel(frameWidth / 2, frameHeight / 2);
}
//重新设置生命值
public void Reset(){
m_nLife = 3;
m_nCurCol = -1;
m_nCurRow = -1;
}
//设置出生地点
public void setBirth( int col, int row, Grids grid ){
int x = col * grid.getCellWidth() + grid.getCellWidth()/2;
int y = row * grid.getCellHeight() + grid.getCellHeight()/2;
m_nBirthX = grid.getX() + x;
m_nBirthY = grid.getY() + y;
setState(MAN_BIRTH);
}
//设置状态
public void setState( int state ){
if( state < 0 || state >= MAN_STATE_NUM )
return;
m_nState = state;
switch( m_nState ){
case MAN_NORMAL:
setFrame( 0 );
break;
case MAN_BIRTH:
m_nTime = 20;
setFrame( 0 );
setRefPixelPosition( m_nBirthX, m_nBirthY );
break;
case MAN_STRONG:
m_nTime = 100;
setFrame( 2 );
break;
case MAN_DEAD:
m_nLife --;
m_nTime = 20;
setFrame( 4 );
}
}
//获取状态
public int getState(){
return m_nState;
}
//获取生命值
public int getLife(){
return m_nLife;
}
//获取当前所处的列
public int getCurCol(){
return m_nCurCol;
}
//获取当前所处的行
public int getCurRow(){
return m_nCurRow;
}
//设置运动方向,参数keyStates为按键状态,参数grid为背景格子
public void input( int keyStates, Grids grid ){
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 )
return;
int col = m_nCurCol;
int row = m_nCurRow;
//根据输入改变方向,如果新方向上有建筑,则不能移动
TiledLayer TL = grid.getBuiding();
if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
{
row --;
if( row < 0 )
row = row + TL.getRows();
if( TL.getCell(col, row) == 0 )
m_nDir = DIR_UP;
else
m_nDir = DIR_STOP;
}
else if( ( keyStates & GameCanvas.DOWN_PRESSED ) != 0 ){
row ++;
if( row >= TL.getRows() )
row = row - TL.getRows();
if( TL.getCell(col, row) == 0 )
m_nDir = DIR_DOWN;
else
m_nDir = DIR_STOP;
}
else if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 ){
col --;
if( col < 0 )
col = col + TL.getColumns();
if( TL.getCell(col, row) == 0 )
m_nDir = DIR_LEFT;
else
m_nDir = DIR_STOP;
}
else if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 ){
col ++;
if( col >= TL.getColumns() )
col = col - TL.getColumns();
if( TL.getCell(col, row) == 0 )
m_nDir = DIR_RIGHT;
else
m_nDir = DIR_STOP;
}
else
m_nDir = DIR_STOP;
//根据运动方向,设置精灵图像
switch( m_nDir ){
case DIR_LEFT:
setTransform(Sprite.TRANS_MIRROR);
break;
case DIR_RIGHT:
setTransform(Sprite.TRANS_NONE);
break;
}
}
//逻辑操作,沿运动方向运动,参数grid为背景格子
public void Logic( Grids grid ){
int x = getRefPixelX();
int y = getRefPixelY();
int len = 1;
switch( m_nDir ){
case DIR_UP:
y -= len;
break;
case DIR_RIGHT:
x += len;
break;
case DIR_DOWN:
y += len;
break;
case DIR_LEFT:
x -= len;
break;
}
//如果超出范围,则吃豆精灵从另一侧进入背景
if( x < grid.getX() )
x = x + grid.getWidth();
if( x >= grid.getX() + grid.getWidth() )
x = x - grid.getWidth();
if( y < grid.getY() )
y = y + grid.getHeight();
if( y >= grid.getY() + grid.getHeight() )
y = y - grid.getHeight();
setRefPixelPosition(x, y);
m_nCurCol = (getRefPixelX() - grid.getX()) / grid.getCellWidth();
m_nCurRow = (getRefPixelY() - grid.getY()) / grid.getCellHeight();
//让吃豆精灵吃豆
TiledLayer BeanTL = grid.getBeanTL();
int index = BeanTL.getCell(m_nCurCol, m_nCurRow);
if( index != 0 ){ //如果有东西,则将东西吃掉
BeanTL.setCell(m_nCurCol, m_nCurRow, 0);
if( index == 4 ) //如果吃到的是咖啡,则让吃豆精灵强壮
setState( ManSprite.MAN_STRONG );
}
//设置运动动画,并根据各种状态的维持时间,重新设置新状态
switch( m_nState ){
case MAN_NORMAL:
if( getFrame() == 0 )
setFrame( 1 );
else
setFrame( 0 );
break;
case MAN_BIRTH:
setFrame( 0 );
m_nTime --;
if( m_nTime < 0 )
setState( MAN_NORMAL );
break;
case MAN_STRONG:
if( getFrame() == 2 )
setFrame( 3 );
else
setFrame( 2 );
m_nTime --;
if( m_nTime < 0 )
setState( MAN_NORMAL );
break;
case MAN_DEAD:
m_nTime --;
if( m_nTime < 0 )
setState( MAN_BIRTH );
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -