接着JAVA飞机大战(三)继续写.
一、实现删除越界的敌人和子弹
1.在Flyingobject父类定义抽象方法,检查是否越界
public abstract boolean outOfBounds();
2.Airplane,bee,bullet,Hero子类重写outOfBounds()抽象方法
/** 重写outOfBounds()检查Airplane是否出界 */
public boolean outOfBounds(){
return this.y>=ShootGame.HEIGHT; //敌机的y>=窗口的高,即为越界了
}
/** 重写outOfBounds()检查bee是否出界 */
public boolean outOfBounds(){
return this.y>=ShootGame.HEIGHT; //小蜜蜂的y>=窗口的高,即为越界了
}
/** 重写outOfBounds()检查bullet是否出界 */
public boolean outOfBounds(){
return this.y<=-this.height; //子弹的y<=负的子弹的高,即为越界了
}
/** 重写outOfBounds()检查Hero是否出界 */
public boolean outOfBounds(){
return false; //永不越界
}
action(){
run(){
...
outOfBoundsAction(); //删除越界的
repaint();
}
}
4.outOfBoundsAction(){
1)声明活着的数组
2)遍历flyings/bullets数组
判断对象是否不越界:
若true:
将对象添加到活着的数组中
3)将活着的数组复制到flyings/bullets数组中
}
/** 删除越界的飞行物 */
public void outOfBoundsAction(){ //10毫秒走一次
int index = 0; //1)不越界敌人数组下标 2)不越界敌人个数
FlyingObject[] flyingLives = new FlyingObject[flyings.length]; //不越界敌人数组
for(int i=0;i<flyings.length;i++){ //遍历所有敌人
FlyingObject f = flyings[i]; //获取每一个敌人
if(!f.outOfBounds()){ //不越界
flyingLives[index] = f; //将不越界敌人对象保存到不越界敌人数组中
index++; //1)不越界敌人数组下标增一 2)不越界敌人个数增一
}
}
flyings = Arrays.copyOf(flyingLives,index); //将不越界敌人数组复制到flyings中,flyings的新长度为index,即不越界敌人个数
index = 0; //1)不越界子弹数组下标归零 2)不越界子弹个数归零
Bullet[] bulletLives = new Bullet[bullets.length]; //不越界子弹数组
for(int i=0;i<bullets.length;i++){ //遍历所有子弹
Bullet b = bullets[i]; //获取每一个子弹
if(!b.outOfBounds()){ //不越界
bulletLives[index] = b; //将不越界子弹对象保存到不越界子弹数组中
index++; //1)不越界子弹数组下标增一 2)不越界子弹个数增一
}
}
bullets = Arrays.copyOf(bulletLives,index); //将不越界子弹数组复制到bullets中,bullets的新长度为index,即不越界子弹个数
}
二、子弹和敌人碰撞的实现
1.检测敌人是否和子弹相撞
class FlyingObject{ //敌人
public boolean shootBy(Bullet obj){
this:敌人
obj:子弹
}
}
或者
class Bullet{ //子弹
public boolean shoot(FlyingObject obj){
this:子弹
obj:敌人
}
}
/** 检查敌人是否被子弹击中 this:敌人 bullet:子弹 */
public boolean shootBy(Bullet bullet){
int x1 = this.x; //x1:敌人的x
int x2 = this.x+this.width; //x2:敌人的x+敌人的宽
int y1 = this.y; //y1:敌人的y
int y2 = this.y+this.height; //y2:敌人的y+敌人的高
int x = bullet.x; //x:子弹的x
int y = bullet.y; //y:子弹的y
return x>=x1 && x<=x2
&&
y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
}
2.英雄机得火力和命
/** 英雄机增火力 */
public void addDoubleFire(){
doubleFire+=40; //火力值增40
}
/** 英雄机增命 */
public void addLife(){
life++; //命数增1
}
3.在ShootGame类中检查子弹与敌机是否相撞
action(){
run(){
...
bangAction(); //检查碰撞
repaint();
}
}
/** 所有子弹与所有敌人(敌机+小蜜蜂)的碰撞检测 */
public void bangAction(){ //10毫秒走一次
for(int i=0;i<bullets.length;i++){ //遍历所有子弹,将子弹传给bang()方法
Bullet b = bullets[i]; //获取每一个子弹
bang(b); //一个子弹与所有敌人(敌机+小蜜蜂)的碰撞检测
}
}
/** 一个子弹与所有敌人(敌机+小蜜蜂)的碰撞检测 */
public void bang(Bullet b){
int index = -1; //被撞敌人的下标
for(int i=0;i<flyings.length;i++){ //遍历所有敌人,获取每一个敌人f
FlyingObject f = flyings[i]; //获取每一个敌人
if(f.shootBy(b)){ //撞上了
index = i; //记录被撞敌人的下标
break; //其余敌人不再比较了
}
}
if(index!=-1){ //撞上了
FlyingObject one = flyings[index]; //获取被撞的敌人对象
}
}
4.在相撞的前提下判断是敌人还是奖励
if(index!=-1){ //撞上了
FlyingObject one = flyings[index]; //获取被撞的敌人对象
if(one instanceof Enemy){ //若是敌人
Enemy e = (Enemy)one; //强转为敌人类型
score += e.getScore(); //玩家得分
}
if(one instanceof Award){ //若是奖励
Award a = (Award)one; //强转为奖励类型
int type = a.getType(); //获取奖励类型
switch(type){ //根据不同的奖励得到不同的奖励
case Award.DOUBLE_FIRE: //若类型为火力
hero.addDoubleFire(); //则英雄机增火力
break;
case Award.LIFE: //若类型为命
hero.addLife(); //则英雄机增命
break;
}
}
}
5.把子弹打中的敌人移除(从flyings中删除)
//将被撞的敌人与数组中的最后一个元素交换
FlyingObject t = flyings[index];
flyings[index] = flyings[flyings.length-1];
flyings[flyings.length-1] = t;
//缩容(去掉最后一个元素,即被撞的敌人对象)
flyings = Arrays.copyOf(flyings,flyings.length-1);
注:保证最后一个元素就是被撞的敌人
网友评论