续『java编程(射击游戏)』 2008-05-19 20:25

字号:    

    //停止运行函数

    public vid stop(){

        if(game!=null){

            game.stop();

            game=null;  //如果线程正在运行,强行令其停止

        }

        //重新设置光标形状

        getFrame(this).setCursor(Frame.DEFAULT_CURSOR);

    }

    //游戏主线程的执行函数

    public void run(){

        //定义本地变量和对象

        PLANE P;

        Explosion E;

        long count=0;

        long ti=0;

        //等待图片装载完毕

        Graphics g=getGraphics();

        g.setColor(Color.red);

        g.drawString("Starting Game...",20,20);

        while(tracker.checkAll(true)==false){

            if((ti++%2)==0){

                g.setColor(Color.red);

            }else{

                g.setColor(Color.green);

            }

            g.drawString("*",10,22);

            try{

                thread.sleep(50);

            }catch(InterruptedException e){

            }

            //装载超时时强行退出

            if(ti>1000){

                break;

            }

        }

        //捕捉获取图片时的错误信息

        if(tracker.isErrorAny()){

            showStatus("Error getting images");

            return;

        }

        showStatus("Loading completed");

        g.dispose();

        //绘制背景的缓冲区

        buf_g=backdrop.getGraphics();

        buf_g.drawImage(backimg,0,0,window_size.width,window_size.height,this);

        //将背景的缓冲区绘制到屏幕上

        buf_g=getGraphics();

        buf_g.drawImage(backdrop,0,0,this);

        repaint();  //重新绘制

        display_score();  //显示玩家得的分数

        L.draw(); //绘制导弹发射架

        showStatus(PLANE ATTACK);

        //事件循环

        for(;;){

            ti=System.currentTimeMillis();

            //如果有多余的PLANE飞行空间的话可以增加一架PLANE

            if((Pv.size()<NP)&&(Math.random()>(Pv.size()=0?0.90:0.98))){

                newPlane.play(); //播放警报声

                P=new plane(this);

                P.set_Color(PlaneColor);

                //在相应的条件下提高PLANE的下降速度

                if(score>10&&Math.random()>0.7){

                    P.vy-=1;

                    //在PLANE向量中加一名成员

                    Pv.addElement(P);

                }

            }

            //在背景上绘制爆炸画面,结束后将其删除

            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);

                }

            }

            //移动导弹的发射架

            L.move();

            //如果导弹存在,移动导弹

            if(M.achive()==true){

                M.move;

            }

            //移动每个PLANE

            for(int i=0;i<Pv.size();++i){

                Pv=(PLANE)Pv.elementAt(i);

                if(Pv.active()&&M.active()&&collision(M)){

                    ++score; //增加玩家的得分

                    explosion.stop();

                    display_score();

                    explosion.play();

                    if((NP<5)&&(score%10)==1){

                        //每击落10架PLANE便增加PLANE最大出现数目,直到数目为5

                        ++NP;

                    }

                    //碰撞发生后,将导弹从背景上清除,并使其active属性为false

                    M.active(false);

                    M.erase();

                    //将被击中的PLANE从背景上清除,并使其属性为false

                    P.active(false);

                    P.erase();

                    //显示爆炸场面

                    E=new Explosion(this,P.px,P.py);

                    //在爆炸向量中添加一员

                    Ev.addElement(E);

                }

                //如果PLANE没有被击中,则显示出来,否则,将其从PLANE向量中删除

                if(P.active()){

                    P.draw();

                }else{

                    Pv.removeElementAt(i);

                }    

                //如果有一个PLANE成功着陆,则玩家失败

                if((P.py-P.h/2)<=0){

                    game_over=true;

                    display_game_over();

                    return;

                }

            }

            //如果导弹发射架移动了,重画发射架

            if(L.has_moved()||((M.py-M.h)<(L.py+L.h))||(!M.active())){

                L.draw();

            }

            //如果导弹的active属性值为true,则重画导弹

            if(M.active()==true){

                M.draw();

            }

            //万一CPU速度太快,要循环维持在20ms以上

            ti=System.currentTimeMillis()-ti;

            ti=20-ti;

            ti=ti>0?10+ti:10;

            Thread.yield();

            //处理线程sleep函数的异常

            try{

                Thread.sleep();

            }catch(InterruptedException e){

            }

            //每100次循环重新绘制一次

            if((count=++count%500)==0){

                repaint();

            }

        }

    }(续载)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009