📄 bulletsprite.java.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 + -