day10
1.英雄机和敌人的碰撞
1) 借用FlyingObject中的hit()碰撞行为
借用FlyingObject中的goDead()方法
在Hero中设计subtractLife()减命、clearDoubleFire()清空火力值4
/** 成员方法:减命 */
public void subtractLife() {
life--; //命数减1
}
/** 成员方法:清空火力值 */
public void clearDoubleFire() {
doubleFire = 0; //火力值归0
}
2)因为英雄机与敌人碰撞为定时发生的,所以在run()中调用heroBangAction()方法:
在heroBangAction()中:
遍历所以敌人,获取每个敌人,判断是否与英雄机撞上了
若撞上了:敌人去死、英雄机减命 、英雄机清空火力值
/** 成员方法:英雄机与敌人的碰撞 */
public void heroBangAction() { //每10个毫秒走一次
for (int i = 0; i < enemies.length; i++) {
FlyingObject f =enemies[i]; //得到每一个敌人
if (hero.isLife() && f.isLife() && f.hit(hero)) { //若撞上了
f.goDead(); //敌人去死
hero.subtractLife(); //英雄机减命
hero.clearDoubleFire(); //英雄机清火力
}
}
}
2.检测游戏结束
1)借用hero的getLIfe()获取命
2)因为检测游戏结束为定时发生的,所以在run()中调用checkGameOverAction()方法:
在checkGameOverAction()中:
判断英雄机的命数 <= 0,若为true则
/** 成员方法:检测游戏结束 */
public void checkGameOverAction() {//每10个毫秒走一次
if(hero.getLife() <= 0) { //游戏结束了
state = GAME_OVER;
}
}
3.画状态
1)设计了四个状态常量,当前状态state变量
设计了三个静态图片,在static块中初始化
2)在paint()中设计在不同状态下画不同的图片
3)将一堆action()设计为仅在运行状态下在执行
将英雄机随着鼠标动设计为仅在运行状态下在执行
4)重写mouseClicked()鼠标点击事件
重写mouseClicked()鼠标点击事件
重写mouseClicked()鼠标点击事件
/** 常量:游戏的开始、运行、暂停、结束)*/
public static final int START = 0;
public static final int RUNNING = 1;
public static final int PAUSE = 2;
public static final int GAME_OVER = 3;
/** 成员变量:当前状态(默认为启动状态) */
private int state = START;
/** 成员变量:三张图(启动、暂停、结束) */
private static BufferedImage start;
private static BufferedImage pause;
private static BufferedImage gameover;
static { //初始化静态图片
start = FlyingObject.loadImage("start.png");
pause = FlyingObject.loadImage("pause.png");
gameover = FlyingObject.loadImage("gameover.png");
}
switch(state) { //在不同状态下画不同的图
case START: //启动
g.drawImage(start, 0, 0, null);
break;
case PAUSE: //暂停
g.drawImage(pause, 0, 0, null);
break;
case GAME_OVER: //结束
g.drawImage(gameover, 0, 0, null);
break;
}
/** 重写mouseMoved()鼠标移动 */
public void mouseMoved(MouseEvent e) {
if(state == RUNNING) {
int x = e.getX(); //获取鼠标的x坐标
int y = e.getY(); //获取鼠标的y坐标
hero.moveTo(x, y); //英雄机随着鼠标移动
}
}
/** 重写mouseClicked()鼠标点击 */
public void mouseClicked(MouseEvent e) {
switch (state) { //根据当前状态做不同操作
case START: //启动状态 state = RUNNING; //变为运行状态
break;
case GAME_OVER: //结束状态
score = 0;
sky = new Sky();
hero = new Hero();
enemies = new FlyingObject[0];
bullets = new Bullet[0];
state = START; //变为启动状态
break;
}
}
/** 重写mouseExited()鼠标移出 */
public void mouseExited(MouseEvent e) {
if(state == RUNNING) { //运行状态
state = PAUSE; //修改为暂停状态
}
}
/** 重写mouseEntered()鼠标移入 */
public void mouseEntered(MouseEvent e) {
if(state == PAUSE) { //暂停状态
state = RUNNING; //修改为运行状态
}
}