📄 planecanvas.java
字号:
if (ep[j][1] == 1) {
if (Math.abs(ep[j][2] - pb[i][2])
+ Math.abs(ep[j][3] - pb[i][3]) < distance) {
// 得到可见敌机最近距离
distance = Math.abs(ep[j][2] - pb[i][2])
+ Math.abs(ep[j][3] - pb[i][3]);
}
}
}
for (int j = 0; j < ep.length; j++) { // 敌人飞机
// 得到最近距离敌机的坐标
if (Math.abs(ep[j][2] - pb[i][2])
+ Math.abs(ep[j][3] - pb[i][3]) == distance) {
if (pb[i][3] + pb[i][5] / 2 > ep[j][3]
+ ep[j][5] / 2) { // 在下
pb[j][3] -= pb[j][8] + 6;
}
if (pb[i][2] + pb[i][4] / 2 < ep[j][2]
+ ep[j][4] / 2) { // 在左
pb[i][2] += pb[i][7] + 3;
}
if (pb[i][2] + pb[i][4] / 2 > ep[j][2]
+ ep[j][4] / 2) { // 在右
pb[i][2] -= pb[i][7] + 3;
}
if (pb[i][3] + pb[i][5] / 2 < ep[j][3]
+ ep[j][5] / 2) { // 在上
pb[j][3] += pb[j][8] + 4;
}
break;
}
}
} else { // 1、2代的移动
switch (pb[i][10]) {
case 0:
pb[i][3] -= 8;
break;
case 1:
pb[i][3] += 8;
break;
case 2:
pb[i][2] -= 8;
break;
case 3:
pb[i][2] += 8;
break;
case 4:// 左上
pb[i][2] -= 8;
pb[i][3] -= 8;
break;
case 5:// 左下
pb[i][2] -= 8;
pb[i][3] += 8;
break;
case 6:// 右上
pb[i][2] += 8;
pb[i][3] -= 8;
break;
case 7:// 右下
pb[i][2] += 8;
pb[i][3] += 8;
break;
}
}
} else {
pb[i][3] -= pb[i][8];
}
// 边界检测
if (pb[i][3] + pb[i][5] / 2 < 0
|| pb[i][3] + pb[i][5] / 2 > height
|| pb[i][2] + pb[i][4] / 2 < 0
|| pb[i][2] + pb[i][4] / 2 > width) {
pb[i][1] = 0;
}
}
}
}
/** 玩家炮弹绘制 */
private void drawPB(Graphics g) {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
for (int i = 0; i < pb.length; i++) {
if (pp[9] == 1 && pb[i][1] == 1) {
// 设置剪切区域
g.setClip(pb[i][2], pb[i][3], pb[i][4], pb[i][5]);
// 绘制炮弹
g.drawImage(pbImg[pb[i][0]], pb[i][2], pb[i][3], Graphics.TOP
| Graphics.LEFT);
// 恢复剪切区域
g.setClip(0, 0, width, height);
}
}
}
/** 添加敌人炮弹,敌人飞机开火 */
private void addEB() {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
// 对应的飞机可见
for (int i = 0; i < ep.length; i++) {
if (ep[i][1] == 1) {
for (int j = 0; j < eb.length; j++) {
// 找到未用的炮弹数据空间
if (eb[j][1] == 0) {
switch (ep[i][0]) {
case BOSS1:
case BOSS2:
// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
if (ep[i][3] + ep[i][5] / 2 > 0
& ep[i][3] + ep[i][5] < pp[4]) {
// 发射计时
ep[i][14]++;
// 每隔10个发射计时单位发射一次三发炮弹
if (ep[i][14] == 176) {
// 炮弹种类
eb[j][0] = 1; // 三发炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 16;
// 炮弹图高
eb[j][5] = 12;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界x)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 8;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 6;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
// 发射计时器返回计时
ep[i][14] = -16;
break;
}
if (ep[i][14] % 16 == 0) {
// 炮弹种类
eb[j][0] = 1; // 双发炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 10;
// 炮弹图高
eb[j][5] = 12;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界x)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 6;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 6;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
}
}
break;
case BOSS3:
// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
if (ep[i][3] + ep[i][5] / 2 > 0
& ep[i][3] + ep[i][5] < pp[4]) {
// 发射计时
ep[i][14]++;
// 每隔7个发射计时单位发射一次跟踪炮弹
if (ep[i][14] == 160) {
// 炮弹种类
eb[j][0] = 3; // 跟踪炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 10;
// 炮弹图高
eb[j][5] = 10;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界x)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 10;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 3;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
// 发射计时器返回计时
ep[i][14] = -20;
break;
}
if (ep[i][14] % 20 == 0) {
// 炮弹种类
eb[j][0] = 2; // 三发炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 16;
// 炮弹图高
eb[j][5] = 12;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界y)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 8;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 6;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
}
}
break;
case EP0:
case EP1:
case EP2:
case EP3:
case EP4:
// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
if (ep[i][3] + ep[i][5] / 2 > 0
& ep[i][3] + ep[i][5] < pp[4]) {
// 发射计时
ep[i][14]++;
// 每隔10个发射计时单位发射一次双发炮弹
if (ep[i][14] == 150) {
// 炮弹种类
eb[j][0] = 1; // 双发炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 10;
// 炮弹图高
eb[j][5] = 12;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界x)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 6;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 6;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
// 发射计时器返回计时
ep[i][14] = -15;
break;
}
if (ep[i][14] % 15 == 0) {
// 炮弹种类
eb[j][0] = 0; // 单发炮弹
// 炮弹可见
eb[j][1] = 1;
// 炮弹图宽
eb[j][4] = 4;
// 炮弹图高
eb[j][5] = 10;
// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
eb[j][2] = ep[i][2] + ep[i][4] / 2
- eb[j][4] / 2;
// 炮弹左上y坐标(飞机下边界x)
eb[j][3] = ep[i][3] + ep[i][5];
// 炮弹伤害值
eb[j][6] = 4;
// 炮弹x向速度
eb[j][7] = 2;
// 炮弹y向速度
eb[j][8] = 6;
// 炮弹初时方向
eb[j][9] = MOVE_DOWN;
}
}
break;
}
break;
}
}
}
}
}
/** 敌人炮弹移动 */
private void ebMove() {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
for (int j = 0; j < eb.length; j++) {
if (eb[j][1] == 1) {
if (eb[j][0] == 3) { // 追踪弹
// 追踪(与玩家飞机的x差y差和小于160时追踪,否则一直向下边界移动)
if (Math.abs(eb[j][2] - pp[3]) + Math.abs(eb[j][3] - pp[4]) < 160) {
if (eb[j][3] + eb[j][5] / 2 < pp[4] + pp[7] / 2) { // 在上
eb[j][3] += 2 * eb[j][8];
} else if (eb[j][3] + eb[j][5] / 2 > pp[4] + pp[7] / 2) { // 在下
eb[j][3] -= eb[j][8];
}
if (eb[j][2] + eb[j][4] / 2 < pp[3] + pp[6] / 2) { // 在左
eb[j][2] += 2 * eb[j][7];
} else if (eb[j][2] + eb[j][4] / 2 > pp[3] + pp[6] / 2) { // 在右
eb[j][2] -= 2 * eb[j][7];
}
} else {
eb[j][3] += 2 * eb[j][8];
// 边界检测
if (eb[j][3] + eb[j][5] / 2 > height) {
eb[j][1] = 0;
}
}
} else {
eb[j][3] += eb[j][8];
if (eb[j][2] + eb[j][4] / 2 < pp[3] + pp[6] / 2) {
eb[j][2] += eb[j][7];
} else {
eb[j][2] -= eb[j][7];
}
// 边界检测
if (eb[j][3] + eb[j][5] / 2 > height
|| eb[j][2] + eb[j][4] / 2 < 0
|| eb[j][2] + eb[j][4] / 2 > width) {
eb[j][1] = 0;
}
}
}
}
}
/** 敌人炮弹绘制 */
private void drawEB(Graphics g) {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
for (int i = 0; i < eb.length; i++) {
if (eb[i][1] == 1) {
g.setClip(eb[i][2], eb[i][3], eb[i][4], eb[i][5]);
g.drawImage(ebImg[eb[i][0]], eb[i][2], eb[i][3], Graphics.TOP
| Graphics.LEFT);
}
}
}
/**
* 添加敌人飞机到敌人飞机数组(最多10架)
*/
private void addEP() {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
if (pp[9] == 1) {
times++;
} else {
return;
}
switch (gate) {
case 1:
for (int i = 0; i < addEPArray1.length; i++) {
// 时间到
if (addEPArray1[i][0] == times) {
for (int j = 0; j < ep.length; j++) {
// 找未添加的空间添加(凡加进去的皆可见,移出屏幕和死亡的不可见)
if (ep[j][1] == 0) {
ep[j][0] = addEPArray1[i][1];
ep[j][1] = 1;
ep[j][2] = addEPArray1[i][2];
ep[j][3] = addEPArray1[i][3];
ep[j][4] = addEPArray1[i][4];
ep[j][5] = addEPArray1[i][5];
ep[j][6] = addEPArray1[i][6];
ep[j][7] = 1;
ep[j][8] = addEPArray1[i][7];
ep[j][9] = addEPArray1[i][8];
ep[j][11] = 1;
ep[j][12] = 0;
ep[j][13] = 0;
ep[j][14] = 0;
// 可见计时初始化
ep[j][10] = 0;
break;
}
}
}
}
break;
case 2:
for (int i = 0; i < addEPArray2.length; i++) {
// 时间到
if (addEPArray2[i][0] == times) {
for (int j = 0; j < ep.length; j++) {
// 找未添加的空间添加(凡加进去的皆可见,移出屏幕和死亡的不可见)
if (ep[j][1] == 0) {
ep[j][0] = addEPArray2[i][1];
ep[j][1] = 1;
ep[j][2] = addEPArray2[i][2];
ep[j][3] = addEPArray2[i][3];
ep[j][4] = addEPArray2[i][4];
ep[j][5] = addEPArray2[i][5];
ep[j][6] = addEPArray2[i][6];
ep[j][7] = 1;
ep[j][8] = addEPArray2[i][7];
ep[j][9] = addEPArray2[i][8];
ep[j][11] = 1;
ep[j][12] = 0;
ep[j][13] = 0;
ep[j][14] = 0;
// 可见计时初始化
ep[j][10] = 0;
break;
}
}
}
}
break;
}
}
/** 敌人飞机的移动和移动动画(按类别进行轨迹描述) */
private void EPMove() {
if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
return;
}
for (int i = 0; i < ep.length; i++) {
// 如果飞机可见
if (ep[i][1] == 1) {
// 飞机动画
if (ep[i][7] == 1) {
ep[i][7] = 2;
} else if (ep[i][7] == 2) {
ep[i][7] = 3;
} else {
ep[i][7] = 1;
}
// 按类进行轨迹描述
switch (ep[i][0]) {
case BOSS1:
// 在y向一定距离内前后移动,同时x向左右来回移动(锯齿形轨迹),一定次数后,y向移动从底部移出
if (ep[i][1] == 1) {
ep[i][10]++;
}
if (ep[i][10] < 500) {
switch (ep[i][11]) {
case MOVE_UP:
break;
case MOVE_DOWN:
// 进入屏幕后选择x向方向开始锯齿轨迹
ep[i][3] += ep[i][9];
if (ep[i][3] >= 0) {
ep[i][10] = 0;
if (ep[i][2] <= width / 2 - ep[i][4] / 2) {
ep[i][11] = MOVE_LEFT;
} else {
ep[i][11] = MOVE_RIGHT;
}
}
break;
case MOVE_LEFT:
ep[i][2] -= ep[i][8];
ep[i][3] += 2 * ep[i][9];
if (ep[i][3] >= 35 || ep[i][3] <= 0) {
// y向速度取反
ep[i][9] = -ep[i][9];
}
// 左边界检测
if (ep[i][2] < 0) {
ep[i][2] = 0;
ep[i][11] = MOVE_RIGHT;
}
break;
case MOVE_RIGHT:
ep[i][2] += ep[i][8];
ep[i][3] += 2 * ep[i][9];
if (ep[i][3] >= 35 || ep[i][3] <= 0) {
// y向速度取反
ep[i][9] = -ep[i][9];
}
// 右边界检测
if (ep[i][2] >= width - ep[i][4]) {
ep[i][2] = width - ep[i][4];
ep[i][11] = MOVE_LEFT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -