📄 ufo_world.java
字号:
g.drawString("*", 10, 22);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
;
//装载超时时强行退出
if (ti > 1000) {
break;
}
}
//捕捉获取图片时的错误信息
if (this.ufo_canvas.getTracker().isErrorAny()) {
this.baseApplet.showStatus("Error getting images");
return;
}
this.baseApplet.showStatus("Loading completed"); //装载成功
g.dispose();
//绘制背景幕的缓冲区
this.ufo_canvas.setBuf_g(this.ufo_canvas.getBackdrop().getGraphics());
this.ufo_canvas.getBuf_g().drawImage(ufo_canvas.getBgimg(), 0, 0,
ufo_canvas.getWindow_size().width,
ufo_canvas.getWindow_size().height,
this.baseApplet);
// 将背景幕的缓冲绘制到屏幕上
this.ufo_canvas.setBuf_g(baseApplet.getGraphics());
this.ufo_canvas.getBuf_g().drawImage(this.ufo_canvas.getBackdrop(), 0,
0, this.baseApplet);
// 绘制缓冲区
this.ufo_canvas.setBuf_g(ufo_canvas.getBuffer().getGraphics());
this.ufo_canvas.getBuf_g().drawImage(ufo_canvas.getBgimg(), 0, 0,
ufo_canvas.getWindow_size().width,
ufo_canvas.getWindow_size().height,
this.baseApplet);
//重新绘制
this.baseApplet.repaint();
// 显示玩家得分数
display_score();
//绘制导弹发射架
this.ufo_canvas.getL().draw();
this.baseApplet.showStatus("UFO ATTACK");
// 事件循环
for (; ; ) {
ti = System.currentTimeMillis();
// 如果有多余的UFO飞行空间的话可增加一架UFO
if ((UV.size() < NU) &&
(Math.random() > (UV.size() == 0 ? 0.90 : 0.98))) {
this.playAudio.getNewufo().play(); // 播放警报声
U = new UFO(this.ufo_canvas);
U.set_color(this.ufo_canvas.getUfoColor());
// 在相应条件下提高UFO的下降速度
if (score > 10 && Math.random() > 0.7) {
U.vy -= 1;
}
// 在UFO向量中增加一名成员
UV.addElement(U);
}
// 在背景幕上绘制爆炸画面,结束后将其清除
for (int j = EV.size() - 1; j >= 0; --j) {
E = (Explosion) EV.elementAt(j);
if (E.active) {
// 如果爆炸出现就进行其画面的绘制
E.draw();
} else {
// 结束后从背景幕上清除,并从爆炸向量中删除
E.erase();
EV.removeElementAt(j);
}
}
//移动导弹发射架
this.ufo_canvas.getL().move();
//如果导弹存在,移动导弹
if (this.ufo_canvas.getM().active() == true) {
this.ufo_canvas.getM().move();
}
//移动每个UFO
for (int i = 0; i < UV.size(); ++i) {
U = (UFO) UV.elementAt(i);
U.move();
}
//监察UFO与导弹之间的碰撞
for (int i = (UV.size() - 1); i >= 0; --i) {
U = (UFO) UV.elementAt(i);
if (U.active() && this.ufo_canvas.getM().active() &&
U.collision(this.ufo_canvas.getM())) {
++score; //增加玩家的得分
this.playAudio.getExplosion().stop();
display_score();
this.playAudio.getExplosion().play();
//每击落10架UFO后便增加UFO的最大出现数目,直到数目为5
if ((NU < 5) && (score % 10) == 1) {
++NU;
}
// 碰撞发生后,将导弹从背景幕上清除,并使其active属性为false
this.ufo_canvas.getM().active(false);
this.ufo_canvas.getM().erase();
//将被击中的UFO从背景幕上清除,并使其active属性为false
U.active(false);
U.erase();
//显示爆炸的场面
E = new Explosion(this.ufo_canvas, U.px, U.py);
//在爆炸向量中添加一员
EV.addElement(E);
}
// 如果UFO没有被击中,则显示出来,否则,将其从UFO向量中删除
if (U.active()) {
U.draw();
} else {
UV.removeElementAt(i);
}
//如果有一个UFO成功着陆则玩家失败
if ((U.py - U.h / 2) <= 0) {
game_over = true;
display_game_over();
return;
}
}
//如果导弹发射架移动了,重画发射架
if (ufo_canvas.getL().has_moved() ||
((ufo_canvas.getM().py - ufo_canvas.getM().h) <
(ufo_canvas.getL().py + ufo_canvas.getL().h)) ||
(!ufo_canvas.getM().active())) {
ufo_canvas.getL().draw();
}
//如果导弹的active属性值为true,则重画导弹
if (ufo_canvas.getM().active() == true) {
ufo_canvas.getM().draw();
}
// 万一CPU速度太快,要使循环维持在20ms以上
ti = System.currentTimeMillis() - ti;
ti = 20 - ti;
ti = ti > 0 ? 10 + ti : 10;
Thread.yield();
//处理线程sleep函数的异常
try {
Thread.sleep(ti);
} catch (InterruptedException e) {}
;
// 每100次循环重新绘制一次
if ((count = ++count % 500) == 0) {
this.baseApplet.repaint();
}
}
}
//获取这个applet的Frame对象
public Frame getFrame(Component c) {
while (c != null && !(c instanceof java.awt.Frame)) {
c = c.getParent();
}
return (Frame) c;
}
//显示玩家的得分
public void display_score() {
Graphics bkd_g = ufo_canvas.getBackdrop().getGraphics();
bkd_g.clipRect(this.ufo_canvas.getWindow_size().width / 2, 0,
this.ufo_canvas.getWindow_size().width / 2, 40);
bkd_g.drawImage(this.ufo_canvas.getBgimg(), 0, 0,
this.ufo_canvas.getWindow_size().width,
this.ufo_canvas.getWindow_size().height,
this.baseApplet);
bkd_g.setColor(Color.red);
bkd_g.setFont(playText.getFont());
String aux = score > 9 ? "" : "0";
bkd_g.drawString(aux + score,
this.ufo_canvas.getWindow_size().width - 60, 30);
bkd_g.dispose();
Graphics bg = this.ufo_canvas.getBuffer().getGraphics();
bg.clipRect(0, 0, this.ufo_canvas.getWindow_size().width, 40);
bg.drawImage(this.ufo_canvas.getBackdrop(), 0, 0, this.baseApplet);
bg.dispose();
Graphics g = this.baseApplet.getGraphics();
g.clipRect(0, 0, ufo_canvas.getWindow_size().width, 40);
g.drawImage(ufo_canvas.getBuffer(), 0, 0, this.baseApplet);
g.dispose();
}
//游戏结束时进行提示
public void display_game_over() {
playText.set_say_font(playText.getFont());
playText.set_say_mode(playText.CENTER);
playText.set_say_style(playText.SHADOW);
playText.set_say_pos(10, 80);
playText.say("GAME OVER");
playText.set_say_font(playText.getFont_s());
playText.set_say_style(playText.NORMAL);
playText.say("(click to start)");
this.baseApplet.repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -