⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufo_world.java

📁 一个完美的applet游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            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 + -