📄 role.java
字号:
import javax.microedition.lcdui.*;
public class Role {
public Role(Engine GE) {
engine = GE;
}
Engine engine;
int x; /*主角的位置,我们时刻需要知道主角处于地图的什么位置*/
int y;
int w;//主角站立下的碰撞矩形
int h;
int px;//用于主角碰撞的区域
int py;
int pw;
int ph;
int HP; /*生命值*/
int SP; /*能量值*/
final int maxHp = 100; /*主角的生命最大值,主角生命的固定上限*/
boolean isLeft; /*主角的移动方向*/
int actionIndex; //表示主角的哪个动作(站立、行走、攻击……)
int frameIndex; //当前处于该动作下的第几帧
byte curStatus; /*主角的状态表示,如同程序基本状态一样*/
//以下是主角的基本状态,可自由设定,只为表示主角的一些基本动作,可酌情添加
static final byte STATE_STAND = 0; /*站立*/
static final byte STATE_RUN = 1; /*行走*/
static final byte STATE_UP = 2; /*上跳*/
static final byte STATE_DOWN = 3; /*下落*/
static final byte STATE_DECLINE = 4; /*掉落*/
static final byte STATE_ASSAULT = 5; /*攻击*/
static final byte STATE_GAMEOVER = 7; /*结束*/
static final byte STATE_DEAD = 8; /*死亡*/
static final byte STATE_END = 9; /*游戏结束*/
static final byte STATE_DECLINE_AFTER = 10; /*根据需要,设定了下落到地面,地面浮起灰尘的状态*/
static final byte STATE_INJURE = 11; /*受伤*/
static final byte STATE_ATTACK_ONE = 6; /*攻击*/
static final byte STATE_ATTACK_TWO = 12; /*攻击*/
static final byte STATE_ATTACK_THREE = 13; /*攻击*/
static final byte STATE_ATTACK_FOUR = 14; /*攻击*/
static final byte STATE_ATTACK_FIVE = 15; /*攻击*/
static final byte STATE_ATTACK_SIX = 16; /*攻击*/
static final byte STATE_ATTACK_SEVEN = 17; /*攻击*/
boolean isDead;//标记主角是否死亡
static final byte STEP = 6;//主角每次移动步长位6像素
int leftStep = 0;
/**
* 初始化主角的信息
* 包括初始的位置 方向等
*/
protected void init() {
isLeft = false; //初始化主角的方向(面向)
SP = 100; //初始化主角的能量值
HP = maxHp; // 初始化主角生命值
x = 30; //初始化主角位置
y = 10*Map.cellHeight;
setStatus(STATE_STAND); //初始化主角的状态,这里同样需要用一个统一的函数来改变主角的状态,以方便主角在切换状态时需要初始化一些数据(例如初始帧等等)。
isDead = false;
}
/**
* 主角在各状态的帧的切换
* 移动
* 碰撞
*逻辑处理部分
*/
protected void roleLogic() {
if(isDead) return;
switch (curStatus)
{
case STATE_STAND: /*站立状态下的逻辑*/
changeRoleFrameIndex( -1);
roleMove(0,2);
break;
case STATE_RUN: /*行走状态下的逻辑*/
changeRoleFrameIndex(-1);
roleMove(6, 5);
break;
case STATE_UP:
changeRoleFrameIndex( -1);
if (isLeft)
x -= leftStep;
else
x += leftStep;
roleMove(0, -8);
if (frameIndex >= 7)
{ //第四帧以后为下落状态的动画
setStatus(STATE_DOWN);
}
break;
case STATE_DOWN:
if (isLeft)
x -= leftStep;
else
x += leftStep;
frameIndex = 7;
roleMove(0,8);
break;
case STATE_DECLINE:
frameIndex = 7;
roleMove(0,8);
break;
case STATE_DECLINE_AFTER:
changeRoleFrameIndex(STATE_STAND);
break;
case STATE_ATTACK_ONE:
checkRoleAttack();
if (++ iCount > 3) setStatus(STATE_STAND);
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_TWO:
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_THREE:
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_FOUR:
checkRoleAttack();
if (++ iCount > 5)
setStatus(STATE_STAND);
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_FIVE:
checkRoleAttack();
if (++ iCount > 5)
setStatus(STATE_STAND);
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_SIX:
changeRoleFrameIndex(-1);
break;
case STATE_ATTACK_SEVEN:
changeRoleFrameIndex(-1);
break;
case STATE_INJURE:
changeRoleFrameIndex(STATE_STAND);
break;
case STATE_DEAD:
changeRoleFrameIndex(STATE_END);
break;
case STATE_END:
frameIndex = Data.frameItemIndex[0][actionIndex].length -1;
engine.isPass = false;
if(GameMIDlet.canvas.iGameState == GameCanvas.GS_GAME)
GameMIDlet.canvas.setGameState(GameCanvas.GS_GAME_END);
break;
}
if(x > 550){//过关条件
engine.isPass = true;
if(GameMIDlet.canvas.iGameState == GameCanvas.GS_GAME)
GameMIDlet.canvas.setGameState(GameCanvas.GS_GAME_END);
}
}
/**
* 显示主角
* 根据主角的位置x,y
* actionIndex
* frameIndex
* @param g Graphics
*/
protected void drawRole(Graphics g) {
if(isDead) return;
//这里注意:主角对应在动画数据中的编号为0
Tools.drawNpcItemData(g,0,actionIndex,frameIndex,x,y,!isLeft);
}
/**
* 根据按键控制主角状态切换
* @param keyCode int
*/
int iCount = 0;
protected final void controlRole(int keyCode) {
switch (curStatus) {
case STATE_STAND:
if (keyCode == GameCanvas.LEFT) {//方向左键
isLeft = true;//方向向左
setStatus(STATE_RUN);//切换为行走状态
}
else if (keyCode == GameCanvas.RIGHT) {
isLeft = false;
setStatus(STATE_RUN);
}
else if (keyCode == GameCanvas.UP) {
setStatus(STATE_UP);
}
else if(keyCode == GameCanvas.FIRE){
setStatus(STATE_ATTACK_FIVE);//这里选取第5种攻击动作,动画数据中已经含有7种攻击动画,后续攻击动画与之类似。
iCount = 0;
}
break;
case STATE_RUN:
break;
case STATE_UP:
case STATE_DOWN:
if(keyCode == GameCanvas.LEFT){
leftStep = STEP;
isLeft = true;
}
else if (keyCode == GameCanvas.RIGHT) {
leftStep = STEP;
isLeft = false;
}
break;
case STATE_ATTACK_FIVE:
if(keyCode == GameCanvas.FIRE){
iCount = 0;
}
break;
}
}
/**
* 释放按键时的操作
*/
protected final void controlReleased()
{
leftStep = 0;
switch (curStatus)
{
case STATE_RUN:
setStatus(STATE_STAND);
break;
case STATE_UP:
case STATE_DOWN:
break;
}
}
protected void setStatus(byte status) {
if(curStatus == status){
return;
}
aniIndex = 0;
frameIndex = 0;
switch (status)
{
case STATE_STAND:
actionIndex = 0;
break;
case STATE_RUN:
actionIndex = 2;
break;
case STATE_UP:
actionIndex = 4;
break;
case STATE_DOWN:
case STATE_DECLINE:
aniIndex = 7;
actionIndex = 4;
break;
case STATE_DECLINE_AFTER:
aniIndex = 8;
actionIndex = 4;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -