13.4.5 奖品模块
本项目的奖品模块功能是通过类 Bonus 实现的,它是 IceBonus 和 LargerGoalBonus 的父类。主要提供一些公共的成员或方法。一个 Bonus 类主要包括自己的绘制部分、触发后的绘制、自己生命周期计时、触发后生命周期计时、触发后后台数据的修改、触发生命周期结束后后台数据的恢复。 Bonus 类是在文件 Bonus.java 中实现的,具体代码如下。
public abstract class Bonus{
public static final int PREPARE = 0; //准备态,可以画出来,但是不可以碰到
public static final int LIVE = 1; //活动态,可以被画出,可以被碰到
public static final int DEAD = 2; //死亡态,不可以被画出,不可以被碰到
public static final int EFFECTIVE = 3; //生效态,不可以被画出,不可以被碰到,但是可以画
//其产生的作用,如冰冻等
public static final int LIFE_SPAN = 5000;
public static final int EFFECT_SPAN = 5000;
public static final int PREPARE_SPAN = 2000;
int status = -1; //0:存在, 1:死亡, 2:生效
int x,y; //Bonus 中心点的坐标
int bonusSize; //Bonus 的大小
int selfIndex=0; //自己帧索引
int effectIndex = 0; //生效后的索引
int selfFrameNumber; //自己动画帧总数
int effectFrameNumber; //生效动画帧总数
int target; //对谁起作用 0 为自己, 8 为 AI,以他们的进攻方向区分
GameView father; //FieldView 对象引用
Bitmap [] bmpSelf; //用于绘制自己的 Bitmap 数组
Bitmap [] bmpEffect; //用于绘制效果的 Bitmap 数组
Timer timer = new Timer(); //创建定时器对象
List<Bonus> owner; //记录自己被添加到哪个集合中
//设置一段时间后才可以从 PREPARE 到 LIVE 态
public void setPrepareTimeout(int timeout){
timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
Bonus.this.status = Bonus.LIVE;
setTimeout(Bonus.LIFE_SPAN);
}
},
timeout);
}
//设置定时的方法
public void setTimeout(int timeout){
timer = new Timer();
timer.schedule(new TimerTask(){ //调用成员方法 schedule 来启动一个定时器
@Override
public void run() {
Bonus.this.status = Bonus.DEAD; //杀死 Bonus
Bonus.this.undoJob(); //调用 undoJob 方法
Bonus.this.owner.remove(Bonus.this); //从其所属的集合中移除自己
father.balDelete.add(Bonus.this); //将自己添加到待删除集合中
}
},
timeout);
}
//画自己的方法
public void drawSelf(Canvas canvas){
canvas.drawBitmap(bmpSelf[(selfIndex++)%selfFrameNumber], x-bonu