📄 enemy.java
字号:
import java.util.Random;
import java.util.Vector;
/**
* 敌机类(这里将普通敌机和Boss进行统一处理)
* @author fantasyer
* @version 1.0
*/
class Enemy implements Cloneable, Comparable
{
//敌机属性信息
//相对地图大背景的y坐标(用于控制飞机在整个大地图的绝对坐标)
int startY;
//x坐标、y坐标、x方向速度、y方向速度、运动类型、开火方式、分值、类型
int x, y, xspeed, yspeed, movetype, firetype, life, kind;
//图片的宽度、高度、发射子弹的概率、产生奖品的概率
int width, height, bulletSeed, awardSeed;
//是否显示、是否死亡
boolean isVisible, isDead;
//用于控制随机开火方式
static Random r = new Random();
//计算飞机的运动角度
double angle;
//飞机左右运动的摆幅、控制飞机摆动的方向、保存飞机初始的x值y值
int dis, dir, basex, basey;
//重要Boss使用,不同的step发生不同的子弹
int step;
/**
* 设置飞机的属性,这里的9个属性和关卡文件完全一致
* @param startY 相对整张背景地图的Y坐标
* @param x 相对屏幕的x坐标
* @param y 相对屏幕的y坐标
* @param xspeed x方向的速度
* @param yspeed y方向的速度
* @param movetype 运动类型
* @param firetype 开火类型
* @param life 生命值
* @param kind 飞机类型
*/
Enemy(int startY, int x, int y, int xspeed, int yspeed, int movetype,
int firetype, int life, int kind)
{
this.startY = startY;
this.x = x;
this.y = y;
this.xspeed = xspeed;
this.yspeed = yspeed;
this.movetype = movetype;
this.firetype = firetype;
this.life = life;
this.kind = kind;
this.bulletSeed = 20; //1/20的方式
setAwardSeed();
isVisible = false;
isDead = false;
angle = 0;
dis = 0;
dir = 1;
basex = x;
basey = y;
width = height = Utility.getSize(kind);
}
/**
* 控制敌机的运动,根据不同的类型,有不同的运动轨迹
*/
public void move()
{
if (movetype==Utility.LINE_MOVE) //直线向下运动
{
y += yspeed;
}
else if (movetype==Utility.LEFT_CURVE_MOVE) //左边抛物线
{
x -= xspeed;
y = (basex-x)*(basex-x)/30;
}
else if (movetype==Utility.RIGHT_CURVE_MOVE) //右抛物线
{
x += xspeed;
y = (x-basex)*(x-basex)/30;
}
else if (movetype==Utility.LEFT_RIGHT_MOVE) //左右摇摆,这里需要调整水平和垂直的速度
{
dis = 30; //摆动幅度
x += dir*3;
if (x>(basex+dis)||x<(basex-dis)||x<0||x>Utility.GAME_WIDTH)
{
dir = -dir;
}
y += yspeed;
}
else if (movetype==Utility.CIRCLE_MOVE) //围绕中心的圆周运动,但效果不明显,圆半径60
{
x = basex+(int)(Math.sin(angle)*60);
y = basey+(60-(int)(Math.cos(angle)*60));
angle += 0.1; //可以调整角度变化量和圆的半径
}
else if (movetype==Utility.DOWN_LR_MOVE) //先向下然后左右
{
if (y<100)
{
//垂直下落
y += yspeed;
}
else
{
//左右摇摆
dis = 100; //Boss摆动的幅度大一些
x += dir*3;
if (x>(basex+dis)||x<(basex-dis)||x<0||x>Utility.GAME_WIDTH)
{
dir = -dir;
}
}
}
else if (movetype==Utility.DOWN_CIRCLE_MOVE) //先下落然后圆周运动
{
y += yspeed;
if (y>50)
{
basey = y;
movetype = Utility.CIRCLE_MOVE;
}
}
}
/**
* 返回发出的子弹
* @return Object[] 发出的子弹数组
*/
public Object[] getBullets()
{
Vector v = new Vector();
if (kind==Utility.ENEMY_1)
{
v.add(new Bullet(x+width/2-4, y+height+3, 180, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_2)
{
v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_3)
{
v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_4)
{
v.add(new Bullet(x+width/4, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*3/4, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_5)
{
v.add(new Bullet(x+width/2-4, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2-4, y+height+3, 225, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2-4, y+height+3, 135, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_6)
{
for (int i = 0; i<20; i++)
{
v.add(new Bullet(x+width/2, y+height/2, i*18, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
}
else if (kind==Utility.ENEMY_7)
{
v.add(new Bullet(x+width/2, y+height, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height+15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height+30, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height/2, 30, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height/2, 90, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height/2, 270, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2, y+height/2, 330, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
else if (kind==Utility.ENEMY_8)
{
for (int i = 0; i<7; i++)
{
v.add(new Bullet(x+width/2-4, y+height-10, 135+i*15, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
}
else if (kind==Utility.BOSS_1||kind==Utility.BOSS_2||kind==Utility.BOSS_3||kind==Utility.BOSS_4)
{
return getBossBulltes(kind);
}
else
{
v.add(new Bullet(x+width/2-5, y+height+3, 180, 5, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
return v.toArray();
}
/**
* 返回Boss发出的子弹
* @return Object[] 发出的子弹数组
*/
public Object[] getBossBulltes(int kind)
{
Vector v = new Vector();
if (kind==Utility.BOSS_1)
{
if (step==0)
{
for (int i = 0; i<6; i++)
{
v.add(new Bullet(x+width/2, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
}
step++;
}
else if (step==1)
{
for (int i = 0; i<6; i++)
{
v.add(new Bullet(x+width*3/8, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*5/8, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
step++;
}
else if (step==2)
{
for (int i = 0; i<7; i++)
{
v.add(new Bullet(x+width*3/20, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*17/20, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*3/20+10, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*17/20-10, y+height-30+i*15, 180,20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
}
step = 0;
}
} //Boss1
else if (kind==Utility.BOSS_2)
{
if (step==0)
{
for (int i = 0; i<8; i++)
{
v.add(new Bullet(x+width/2, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
}
step++;
}
else if (step==1)
{
for (int i = 0; i<6; i++)
{
v.add(new Bullet(x+width*2/5, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*3/5-4, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*2/5, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width*3/5-4, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
}
step++;
}
else if (step==2)
{
v.add(new Bullet(x+width/2, y+height-30, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
for (int i = 1; i<=6; i++)
{
v.add(new Bullet(x+width/2-i*10, y+height-30-5*i, 180+i*15,20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
v.add(new Bullet(x+width/2+i*10, y+height-30-5*i, 180-i*15, 20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
}
step = 0;
}
}
else if (kind==Utility.BOSS_3)
{
step = r.nextInt(3);
if (step==0)
{
for (int i = 0; i<8; i++)
{
v.add(new Bullet(x+width/2-15, y+height-30+i*15, 180, 20, 0, Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
v.add(new Bullet(x+width/2+15, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
v.add(new Bullet(x+width/2-30, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1));
v.add(new Bullet(x+width/2+30, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1));
}
}
else if (step==1)
{
v.add(new Bullet(x+width/2, y+height-30, 180, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
for (int i = 1; i<=36; i++)
{
v.add(new Bullet(x+width/2, y+height/2, i*10, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
}
}
else if (step==2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -