接着JAVA飞机大战(四)继续写.
一、在Hero类中英雄机和敌人碰撞的实现
1.英雄机与敌人的碰撞检测
/** 英雄机与敌人的碰撞检测 this:英雄机 other:敌人 */
public boolean hit(FlyingObject other){
int x1 = other.x-this.width/2; //x1:敌人的x-1/2英雄机的宽
int x2 = other.x+other.width+this.width/2; //x2:敌人的x+敌人的宽+1/2英雄机的宽
int y1 = other.y-this.height/2; //y1:敌人的y-1/2英雄机的高
int y2 = other.y+other.height+this.height/2; //y:敌人的y+敌人的高+1/2英雄机的高
int x = this.x+this.width/2; //x:英雄机的x+1/2英雄机的宽
int y = this.y+this.height/2; //y:英雄机的y+1/2英雄机的高
return x>=x1 && x<=x2
&&
y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
}
2.英雄机减命,清空火力值
/** 英雄机减命 */
public void subtractLife(){
life--; //命数减1
}
/** 清空火力值 */
public void clearDoubleFire(){
doubleFire = 0; //火力值清零
}
3.在ShootGame类中实现碰撞hitAction方法
/** 英雄机与所有敌人(敌机+小蜜蜂)的碰撞 */
public void hitAction(){
for(int i=0;i<flyings.length;i++){ //遍历所有敌人
FlyingObject f = flyings[i]; //获取每一个敌人
if(hero.hit(f)){ //撞上了
hero.subtractLife(); //英雄机减命
hero.clearDoubleFire(); //英雄机清火力
//将被撞的敌人与数组中的最后一个元素交换
FlyingObject t = flyings[i];
flyings[i] = flyings[flyings.length-1];
flyings[flyings.length-1] = t;
//缩容(去掉最后一个元素,即被撞的敌人对象)
flyings = Arrays.copyOf(flyings, flyings.length-1);
}
}
}
4.检测游戏结束
/** 检测游戏是否结束 */
public void checkGameOverAction(){ //10毫秒走一次
if(hero.getLife()<=0){ //游戏结束时
state=GAME_OVER; //修改当前状态为游戏结束状态
}
}
二、画状态
1.在ShootGame类中设计四种成员
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; //当前状态(默认为启动状态)
2.调用paint方法画图
/** 画状态 */
public void paintState(Graphics g){
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;
}
}
3.在监听器中根据鼠标事件改变状态
MouseAdapter l = new MouseAdapter(){
/** 处理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; //清理现场
hero = new Hero();
flyings = 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; //变为运行状态
}
}
};
网友评论