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

📄 bulletsprite.java.bak

📁 j2me的坦克大战 元代码 单机版和蓝牙联网版
💻 BAK
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.*;class BulletSprite extends Sprite implements Runnable{    //add    private int count=0,dx=1,dy=1;        public boolean daohang=false;    public static boolean gameover=false;//游戏结束    private static boolean interrupt;//子弹运动是否暂停  ,加在run中        public static void setInterrupt(boolean interrupt) {        BulletSprite.interrupt = interrupt;    }    private boolean isBadorGood;//玩家子弹还是敌人子弹,敌人fasle 玩家true    private int HP;//子弹的威力    public int SPEED=2;//子弹速度    public void SpeedUp(){        SPEED=3;    }    private int direction;//子弹方向    public boolean alive;//子弹发出还是没有,作用:控制线程run,被explodes(),restart()调用    private Sprite explodeSprite;//爆炸精灵    //实用的引用    private LayerManager layerManager;    //碰撞检测使用    private int screenWidth,screenHeight;    private KingSprite kingSprite;//保护物    private TentSprite tentSprite;//帐篷    private EnemySprite[] es;    private UserSprite us[];    private BulletSprite ubs[];//所有玩家的子弹    private PetSprite ps[];    private TiledLayer Things;    //private TiledLayer Water;    private TiledLayer Trees;     public int getHP() {        return HP;    }    public boolean isAlive() {        return alive;    }         public BulletSprite(Image image,LayerManager layerManager,int HP,boolean isBadorGood,            BattleCanvas bc,GameDesign gd,KingSprite kingSprite,TentSprite 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(BattleCanvas.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 colidesNew(){//导航炮弹        if((count++)%12==0){               //偶尔根据玩家0的位置改变方向            if(this.getRefPixelX()<us[0].getRefPixelX() && this.getRefPixelY()<us[0].getRefPixelY()){dx=1;dy=1;}            else if(this.getRefPixelX()<us[0].getRefPixelX() && this.getRefPixelY()>us[0].getRefPixelY()){dx=1;dy=-1;}            else if(this.getRefPixelX()<us[0].getRefPixelX() && this.getRefPixelY()==us[0].getRefPixelY()){dx=1;dy=0;}            else if(this.getRefPixelX()>us[0].getRefPixelX() && this.getRefPixelY()<us[0].getRefPixelY()){dx=-1;dy=1;}            else if(this.getRefPixelX()>us[0].getRefPixelX() && this.getRefPixelY()>us[0].getRefPixelY()){dx=-1;dy=-1;}            else if(this.getRefPixelX()>us[0].getRefPixelX() && this.getRefPixelY()==us[0].getRefPixelY()){dx=-1;dy=0;}            else if(this.getRefPixelX()==us[0].getRefPixelX() && this.getRefPixelY()<us[0].getRefPixelY()){dx=0;dy=1;}            else if(this.getRefPixelX()==us[0].getRefPixelX() && this.getRefPixelY()>us[0].getRefPixelY()){dx=0;dy=-1;}            //else {this.explodeWithoutDraw();this.us[0].explodes();}         }        this.move(dx, dy);        //遍历玩家        if(this.collidesWith(us[0],false)){            this.explodeWithoutDraw();this.us[0].explodes();        }        //遍历玩家子弹        if(ubs[0].isAlive())                   if(this.collidesWith(ubs[0],false)){                        this.explodeWithoutDraw();//子弹无效果的爆炸                        ubs[0].explode();//对方子弹也爆炸                        Sound.instance.enemyExplodePlayer();                        SPEED =2;                        count=0;                   }        //遍历帐篷            if(tentSprite.isVisible()){                   if(this.collidesWith(tentSprite,true)){                      this.explodeWithoutDraw();//子弹无效果的爆炸                      tentSprite.explode();                    }            }            //遍历king            else{                    if(this.collidesWith(kingSprite,true)){                                          this.explode();//子弹有效果的爆炸                        kingSprite.hurt();                    }            }         //遍历边界        if(this.getX()<0 || this.getY()<0 ||                this.getX()>screenWidth-this.getWidth() ||                this.getY()>screenHeight-this.getHeight()){                this.explode();//子弹有效果的爆炸        }        this.nextFrame();         try {                    Thread.sleep(30);            } catch (InterruptedException ex) {                    ex.printStackTrace();            }              }        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();        Sound.instance.enemyExplodePlayer();        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;       daohang = false;       //添加到画布管理器       alive = true;       setVisible(true);       layerManager.insert(this,0);          }        public void run(){        while(!gameover){            if(!interrupt){                if(alive){                    if(daohang==false){//不导航                        //走一步                        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();                    }else{//导航                        this.colidesNew();                    }                }            }            try {                    Thread.sleep(5);            } catch (InterruptedException ex) {                    ex.printStackTrace();            }         }//while    }    }

⌨️ 快捷键说明

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