📄 character.java
字号:
/*
* 创建日期 2007-3-17
* @author caipiz
*/
package com.cpiz.poptang;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
public class Character extends Sprite
{
Map map = Game.map;
int width;
int height;
int type = Character.HERO;
int status = Character.BORN;
int speed = 3;// 行动速度
int bombsNum = 100;// 可用的泡泡数目
int power = 3;// 泡泡能量
int x = 0, y = 0;// 精灵坐标位置,以左上角为基准
int oldX = 0, oldY = 0;// 精灵上一次位置
int dir = FACE_SOUTH;// 上一次精灵方向
boolean isAlive = true;// 是否活着
boolean isEnabled = true;// 是否有效
Random rand = null;
/**
* 角色年龄,角色大于一定年龄后,停止出生动作
*/
int age = 0;
/**
* 已停止时间,该时间超过一定后人物进入休息状态,做出休息动作
*/
int stayTime = 0;
/**
* 已死亡时间
*/
int deadTime = 0;
/**
* 构造器
* @param spriteImage 精灵Image
* @param row 精灵出生时所在行
* @param col 精灵出生时所在列
*/
private Character(int type, Image spriteImage, int row, int col)
{
super(spriteImage, PopTang.HERO_WIDTH, PopTang.HERO_HEIGHT);
setCell(row, col);
rand = new Random();
this.type = type;
}
/**
* 创建精灵
* @param characterType 精灵类型
* @param row 精灵出生时所在行
* @param col 精灵出生时所在列
* @return 精灵对象
*/
public static Character createCharacter(int characterType, int row, int col)
{
Image imgCharacter = null;
try
{
switch(characterType)
{
case Character.HERO:
imgCharacter = Image.createImage(PopTang.IMAGE_SRC_HERO);
break;
case Character.ENEMY:
imgCharacter = Image.createImage(PopTang.IMAGE_SRC_ENEMY);
break;
default:
break;
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
return new Character(characterType, imgCharacter, row, col);
}
/**
* 设置精灵的坐标位置
* @param row 行索引,从0开始
* @param col 列索引,从0开始
*/
private void setCell(int row, int col)
{
x = col * PopTang.CELL_WIDTH;
y = (row + 1) * PopTang.CELL_HEIGHT - getHeight();
setPosition(x, y);
}
/**
* 获得角色所在格的行索引
* @return 角色所在行
*/
public int getRow()
{
return getRow(getBottomY(y) - PopTang.CELL_HEIGHT / 2);
}
/**
* 获得角色所在格的列索引
* @return 角色所在行
*/
public int getCol()
{
return getCol(x + PopTang.CELL_WIDTH / 2);
}
/**
* 获得精灵实际Y坐标值(用于碰撞检测)
* @param y 精灵顶部坐标Y值
* @return 实际顶部Y坐标
*/
private int getRefY(int y)
{
return getBottomY(y) + 1 - PopTang.CELL_HEIGHT;
}
/**
* 获得精灵底部Y坐标值(用于碰撞检测)
* @param y 精灵左上角坐标Y值
* @return 底部Y坐标
*/
private int getBottomY(int y)
{
return y + getHeight() - 1;
}
/**
* 获得精灵右边缘X坐标值(用于碰撞检测)
* @param x 精灵左上角坐标Y值
* @return 右边缘Y坐标
*/
private int getRightX(int x)
{
return x + getWidth() - 1;
}
/**
* 获得Y坐标所在行
* @param y Y轴坐标值
* @return 像素所在行
*/
private int getRow(int y)
{
return y / PopTang.CELL_HEIGHT;
}
/**
* 获得X坐标所在列
* @param x X轴坐标值
* @return 像素所在行
*/
private int getCol(int x)
{
return x / PopTang.CELL_WIDTH;
}
/**
* 人工智能动作
*/
private void aiAction()
{
oldX = x;
oldY = y;
walk(dir);
if ((x == oldX && y == oldY) || age % (rand.nextInt(50) + 1) == 0)
{
int oldDir = dir;
do
{
dir = rand.nextInt(4) + 2;
}
while(dir == oldDir);
//walk(oldDir);
}
}
/**
* 拾获道具
* @param tool 道具
*/
private void pickUpTool(int tool)
{
switch(tool)
{
case Map.TOOL_BOMB:
bombsNum++;
break;
case Map.TOOL_POWER:
power++;
break;
case Map.TOOL_SPEED:
speed++;
break;
case Map.TOOL_GOLD_COIN:
Game.score += PopTang.GOLD_COIN_SCORE;
break;
default:
break;
}
}
/**
* 更新精灵状态<br>
* 检测是否被炸死,道具拾获
*/
public void update()
{
if(type == Character.ENEMY)
{
aiAction();
}
int col = getCol();
int row = getRow();
if (age < 10000)
{
age++;
}
else
{
age = 100;
}
if (isAlive)
{
// 拾获道具
int tool = map.getBombsAndToolsLayer().getCell(col, row);
if (tool >= Map.TOOL_BOMB)
{
pickUpTool(tool);
map.getBombsAndToolsLayer().setCell(col, row, 0);
}
// 检测所在单元格是否致命
if(map.hasFeature(row, col, Map.DEADLY))
{
isAlive = false;
return;
}
// 由出生状态转静止状态
if(status == Character.BORN && age > PopTang.BORN_TIME)
{
status = Character.FACE_SOUTH;
setFrame(Character.FACE_SOUTH * 5);
return;
}
// 出生状态
if (status == Character.BORN)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -