📄 fightersprite.java
字号:
package demo;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
public class FighterSprite extends Sprite{
public static final int FIGHTER_NORMAL = 0; //正常状态
public static final int FIGHTER_BOXING = 1; //打拳
public static final int FIGHTER_BOOT = 2; //踢腿
public static final int FIGHTER_WAVE = 3; //发波
public static final int FIGHTER_STATE_NUM = 4; //状态总数
private int m_nState = FIGHTER_NORMAL;
private int m_nLife; //生命值
private boolean m_bRight = true; //是否面向右的标志
public WaveSprite m_Wave; //冲击波对象
private Random m_Random; //随机数对象
public FighterSprite(Image image, int frameWidth, int frameHeight) {
super(image, frameWidth, frameHeight);
defineReferencePixel( frameWidth / 2, frameHeight / 2 );
setVisible(false);
m_Random = new Random();
try{
Image wave = Image.createImage("/demo/wave.png");
m_Wave = new WaveSprite(wave, 20, 12 );
}
catch(Exception e){}
}
//获取当前状态
public int getState(){
return m_nState;
}
//设置当前状态
public void setState(int state){
if( state < 0 || state >= FIGHTER_STATE_NUM )
return;
m_nState = state;
}
//获取生命值
public int getLife(){
return m_nLife;
}
//设置生命值
public void setLife(int life){
m_nLife = life;
}
//设置碰撞检测的范围
public void setCollisionRect(){
switch( m_nState ){
case FIGHTER_BOXING:
defineCollisionRectangle(20, 6, 9, 6);
break;
case FIGHTER_BOOT:
defineCollisionRectangle(20, 22, 9, 6);
break;
}
defineCollisionRectangle(0, 0, getWidth(), getHeight());
}
//设回默认的碰撞检测范围
public void ResetCollisionRect(){
defineCollisionRectangle(0, 0, getWidth(), getHeight());
}
//向后退
public void MoveBack(int scrWidth){
int dis = 4;
if( !m_bRight )
dis = -dis;
int x = getRefPixelX();
int y = getRefPixelY();
x = x - dis;
if( x >= getWidth()/2 && x < scrWidth - getWidth()/2 ){
setRefPixelPosition(x, y);
}
}
//开始战斗,参数nX、nY分别是斗士初始的横纵坐标
//参数bRight为true表示斗士向右,反之斗士向左
public void Start( int nX, int nY, boolean bRight ) {
m_bRight = bRight;
setRefPixelPosition( nX, nY );
m_nLife = 100;
if( m_bRight )
setTransform(Sprite.TRANS_NONE);
else
setTransform(Sprite.TRANS_MIRROR);
setState(FIGHTER_NORMAL);
m_Wave.setVisible(false);
setVisible(true);
}
//处理按键操作,主要处理1号、3号及7号键的操作。参数scrWidth是屏幕的宽
public void keyPressed(int keyCode, int scrWidth){
switch( keyCode ){
case Canvas.KEY_NUM1:
setState(FIGHTER_BOXING);
break;
case Canvas.KEY_NUM3:
setState(FIGHTER_BOOT);
break;
case Canvas.KEY_NUM7:
setState(FIGHTER_WAVE);
break;
}
}
//处理其他按键的操作,参数scrWidth是屏幕的宽
public void Input(int keyStates, int scrWidth){
int x = getRefPixelX();
int y = getRefPixelY();
int speed = 2;
if( !m_bRight )
speed = - speed;
if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 )
x += speed;
if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 )
x -= speed;
if( x >= getWidth()/2 && x < scrWidth - getWidth()/2 ){
setRefPixelPosition(x, y);
}
}
//逻辑操作,参数scrWidth、scrHeight分别是屏幕的宽和高
public void Logic( int scrWidth, int scrHeight ){
m_Wave.Logic(scrWidth, scrHeight);
switch( m_nState ){
case FIGHTER_NORMAL:
setFrame(0);
break;
case FIGHTER_BOXING:
setFrame(1);
setState(FIGHTER_NORMAL);
break;
case FIGHTER_BOOT:
setFrame(2);
setState(FIGHTER_NORMAL);
break;
case FIGHTER_WAVE:
setFrame(3);
if( !m_Wave.isVisible() ){
if( m_bRight )
m_Wave.Start( getX() + getWidth(), getY() + 15, m_bRight, 3);
else
m_Wave.Start( getX(), getY() + 15, m_bRight, 3);
}
setState(FIGHTER_NORMAL);
break;
}
}
//电脑自动输入,参数scrWidth、scrHeight分别是屏幕的宽和高
//参数objectX是目标的位置
public void AutoInput( int scrWidth, int scrHeight, int objectX ){
int x = getRefPixelX();
int y = getRefPixelY();
int rand = Math.abs(m_Random.nextInt() % 20);
if( Math.abs(x - objectX) < getWidth() + 2 )
{//如果离目标比较近
switch( rand ){
case 0:
setState(FIGHTER_BOXING);
break;
case 1:
setState(FIGHTER_BOOT);
break;
case 2:
setState(FIGHTER_WAVE);
break;
default:
setState(FIGHTER_NORMAL);
break;
}
}
else
{//如果离目标比较远
int dis = 2;
if( x - objectX < 0 )
dis = -2;
switch( rand ){
case 0:
setState(FIGHTER_WAVE);
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
x -= dis;
setState(FIGHTER_NORMAL);
break;
default:
setState(FIGHTER_NORMAL);
}
if( x >= getWidth()/2 && x < scrWidth - getWidth()/2 ){
setRefPixelPosition(x, y);
}
}
}
//显示图像,g对应手机屏幕
public void Paint(Graphics g){
super.paint(g);
m_Wave.paint(g);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -