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

📄 netbulletsprite.java

📁 j2me的坦克大战 元代码 单机版和蓝牙联网版
💻 JAVA
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.*;class NetBulletSprite extends Sprite implements Runnable{    public static boolean gameover=false;//游戏结束    private static boolean interrupt;//子弹运动是否暂停  ,加在run中        public static void setInterrupt(boolean interrupt) {        NetBulletSprite.interrupt = interrupt;    }    private boolean isBadorGood;//玩家子弹还是敌人子弹,敌人fasle 玩家true    private int HP;//子弹的威力    private int SPEED=2;//子弹速度    public void SpeedUp(){        SPEED=3;    }    private int direction;//子弹方向    private boolean alive;//子弹发出还是没有,作用:控制线程run,被explodes(),restart()调用    private Sprite explodeSprite;//爆炸精灵    //实用的引用    private LayerManager layerManager;    //碰撞检测使用    private int screenWidth,screenHeight;    private NetKingSprite kingSprite;//保护物    private NetTentSprite tentSprite;//帐篷    private NetEnemySprite[] es;    private NetUserSprite us[];    private NetBulletSprite ubs[];//所有玩家的子弹    private NetPetSprite ps[];    private TiledLayer Things;    //private TiledLayer Water;    private TiledLayer Trees;    public int getHP() {        return HP;    }    public boolean isAlive() {        return alive;    }         public NetBulletSprite(Image image,LayerManager layerManager,int HP,boolean isBadorGood,            NetBattleCanvas bc,GameDesign gd,NetKingSprite kingSprite,NetTentSprite tentSprite){        super(image,image.getWidth()/2,image.getHeight());        defineReferencePixel(image.getWidth()/4,image.getHeight()/2);        this.isBadorGood = isBadorGood;        this.HP = HP;        //this.direction在restart()中确定(坦克fire -> 子弹restart ) (like坦克管理者->坦克restart())        this.alive = false;        try {            Image explodeImage = Image.createImage("/tank/bulletExplode.png");            explodeSprite = new Sprite(explodeImage);            explodeSprite.defineReferencePixel(explodeImage.getWidth()/2,explodeImage.getHeight()/2);        }catch (IOException e) {e.printStackTrace();}        this.layerManager = layerManager;         screenWidth = bc.getWidth();        screenHeight = bc.getHeight();        es = bc.getEnemySprites();        //ebs = bc.getEnemyBulletSprites();        us = bc.getUserSprites();        ubs = bc.getUserBulletSprites();        ps = bc.getPetSprites();        this.kingSprite = kingSprite;        this.tentSprite = tentSprite;        try{            switch(NetBattleCanvas.level){                case 1:this.Things = gd.getThings();                       this.Trees = gd.getTrees();                       break;                case 2:this.Things = gd.getThings1();                       this.Trees = gd.getTrees1();                       break;                case 3:break;            }        }catch(IOException e){e.printStackTrace();}         // 子弹运动线程       Thread t = new Thread(this);       t.start();            }        public int collides(){//跟别人碰撞了(0 没事   1 跟坦克,子弹,king   2 跟障碍物)        //敌人的子弹        if(!this.isBadorGood){            //遍历帐篷            if(tentSprite.isVisible()){                   if(this.collidesWith(tentSprite,true)){                      this.explodeWithoutDraw();//子弹无效果的爆炸                      tentSprite.explode();                      return 1;                    }            }            //遍历king            else{                    if(this.collidesWith(kingSprite,true)){                                          this.explode();//子弹有效果的爆炸                        kingSprite.hurt();                        return 1;                    }            }            //遍历玩家的子弹             for(int i=0;i<ubs.length;i++){                if(ubs[i].isAlive())                   if(this.collidesWith(ubs[i],false)){                        this.explodeWithoutDraw();//子弹无效果的爆炸                        ubs[i].explode();//对方子弹也爆炸                        return 1;//跟子弹碰撞                   }             }                         //遍历所有玩家坦克           for(int i=0;i<us.length;i++){                if(us[i].getHP()>0)                    if(this.collidesWith(us[i],true)){                        if(us[i].isNew()||us[i].IsInWater()){                            //子弹有效果爆炸,坦克没事                            this.explode();                        }                        else{                                         this.explodeWithoutDraw();//子弹无效果的爆炸                                                        us[i].explodes();//坦克爆炸                                                    }                        return 1;//跟坦克碰撞                    }            }        }        //玩家的子弹        else{             //遍历帐篷            if(tentSprite.isVisible()){                   if(this.collidesWith(tentSprite,true)){                      this.explodeWithoutDraw();//子弹无效果的爆炸                      this.alive= true;//为了玩家子弹打到它后,敌人在爆,玩家不可再发.                      tentSprite.explode();                      this.alive= false;                      return 1;                    }            }            //遍历king            else{                    if(this.collidesWith(kingSprite,true)){                        this.explode();//子弹有效果的爆炸                        this.alive= true;//为了玩家子弹打到敌人后,敌人在爆,玩家不可再发.                        kingSprite.hurt();                        this.alive= false;                        return 1;                    }            }            //遍历pet            for(int i=0;i<ps.length;i++){//???????????????????                if(ps[i].isAlive())                    if(this.collidesWith(ps[i],true)){                        this.explodeWithoutDraw();                        this.alive= true;//为了玩家子弹打到pet后,敌人在爆,玩家不可再发.                        ps[i].explode();//跟pet碰撞                        this.alive= false;                    }            }            //遍历敌人的子弹(无须)            //让敌人子弹来遍历玩家子弹....                        //遍历所有的敌人坦克            for(int i=0;i<es.length;i++){                if(es[i].getHP()>0 )                    if(this.collidesWith(es[i],true)){                        if(es[i].getHP()-this.HP<=0){                            this.explodeWithoutDraw();//子弹无效果的爆炸                            this.alive= true;//为了玩家子弹打到敌人后,敌人在爆,玩家不可再发.                            es[i].explodes();//普通坦克爆炸                            this.alive = false;                        }                        else{                            es[i].setHP(es[i].getHP()-this.HP);//绿色坦克要减HP                            Sound.instance.metalPlayer();                            this.explodeWithoutDraw();//子弹无效果的爆炸                        }                        return 1;//跟坦克碰撞                    }            }         }        //遍历障碍物        if(this.collidesWith(Things,true)||this.collidesWith(Trees,true)                )            return 2;        //遍历边界        if(this.getX()<0 || this.getY()<0 ||                this.getX()>screenWidth-this.getWidth() ||                this.getY()>screenHeight-this.getHeight())        {return 2;}        return 0;    }        public void explode(){//子弹爆炸        //子弹精灵不可见        setVisible(false);        layerManager.remove(this);                //画出爆炸效果        switch(direction){           case Canvas.LEFT:explodeSprite.setRefPixelPosition(this.getRefPixelX()-4,this.getRefPixelY());break;           case Canvas.RIGHT:explodeSprite.setRefPixelPosition(this.getRefPixelX()+4,this.getRefPixelY());break;           case Canvas.UP:explodeSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()-4);break;           case Canvas.DOWN:explodeSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()+4);break;       }         layerManager.insert(explodeSprite, 0);        explodeSprite.setVisible(true);        Sound.instance.bulletExplodePlayer();        try {            Thread.sleep(5);   //keep the explode effect on screen for a short moment        }catch (InterruptedException e) {        }        while(interrupt){//如果暂停,爆炸效果仍存在            try {               Thread.sleep(10);   //keep the explode effect on screen for a short moment            }catch (InterruptedException e) {           }        }        explodeSprite.setVisible(false);        layerManager.remove(explodeSprite);        //线程没结束,但run()无效        alive = false;    }    public void explodeWithoutDraw(){//子弹爆炸,不画爆炸图(碰撞坦克时用)        //子弹精灵不可见        setVisible(false);        layerManager.remove(this);        //线程没结束,但run无效        alive = false;    }        public void restart(int x,int y,int direction){//子弹被发出       if(alive) return;//还正在发炮,就无法restart()       switch(direction){           case Canvas.LEFT:setRefPixelPosition(x-6,y);break;           case Canvas.RIGHT:setRefPixelPosition(x+6,y);break;           case Canvas.UP:setRefPixelPosition(x,y-6);break;           case Canvas.DOWN:setRefPixelPosition(x,y+6);break;       }       this.direction=direction;       //添加到画布管理器       alive = true;       setVisible(true);       layerManager.insert(this,0);          }        public void run(){        while(!gameover){            if(!interrupt){                if(alive){                    //走一步                    switch(direction){                        case Canvas.UP:move(0,-SPEED);break;                        case Canvas.DOWN:move(0,SPEED);break;                        case Canvas.LEFT:move(-SPEED,0);break;                        case Canvas.RIGHT:move(SPEED,0);break;                    }                    //碰撞了坦克,就无效果的爆炸(在检测时就做了)                    //碰撞了障碍物边界,就有效果的爆炸(在下面做,当然也可以在检测时就做)                    //可以在检测时就爆炸因为子弹反正就是爆炸,所以collide的返回值可以无须,而坦克的collide返回值必须有,用于行走                    if(this.collides()==2)this.explode();                }            }            try {                    Thread.sleep(5);            } catch (InterruptedException ex) {                    ex.printStackTrace();            }         }//while    }    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -