📄 netenemysprite.java
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.*;import java.util.*;public class NetEnemySprite extends Sprite implements Runnable{ public static boolean gameover=false;//游戏结束 private static boolean interrupt;//坦克运动是否暂停 ,加在run中 public static void setInterrupt(boolean interrupt) { NetEnemySprite.interrupt = interrupt; } public static int enemyNum = 6;//当6只坦克的lifes都为0时win public static boolean isWin(){//被enemyManager调用 if(enemyNum<=0)return true; return false; } private int lifes;//生命数,第一关2条,第二关3条,在EnemyManager类设置 private int type;//坦克类型,1普通,2绿色,3红色 private int HP;//HP值 //private int birthPlace;//初始和复活时的位置,由EnemyManager类决定 public void setHP(int HP) { this.HP = HP; } public int getHP() { return HP; } private static int X1=5,Y1=5,X2,Y2=5,X3,Y3=5; private int curDirection;//现在的方向 private int nextDirection;//下一方向 private int SPEED=1;//坦克速度// private boolean isNew = false;//是否刚复活 private Sprite explodeSprite;//爆炸精灵 // private ChangeDirectionThread changeDirectionThread; //private ShootThread shootThread; private Random r = new Random(); //实用的引用 private LayerManager layerManager; private NetBattleCanvas bc; private NetBulletSprite bullet; private NetKingSprite kingSprite;//保护物 private NetTentSprite tentSprite;//帐篷 //检测碰撞 private static int screenWidth,screenHeight; private NetEnemySprite[] es; private NetUserSprite us[]; private NetPetSprite ps[]; private TiledLayer Things; private TiledLayer Water; private TiledLayer Trees; public NetEnemySprite(Image image,LayerManager layerManager,NetBulletSprite bullet, int type,NetBattleCanvas bc,GameDesign gd,NetKingSprite kingSprite,NetTentSprite tentSprite) { super(image); curDirection=Canvas.DOWN; nextDirection=Canvas.DOWN; defineReferencePixel(image.getWidth()/2,image.getHeight()/2);//+1之后,坦克就不会在顶端发炮即炸了 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; this.bullet = bullet; this.type = type; this.HP=0; //isNew = true; this.bc = bc; screenWidth = bc.getWidth(); screenHeight = bc.getHeight(); X2 = screenWidth/2; X3 = screenWidth-5; this.kingSprite = kingSprite; this.tentSprite = tentSprite; es = bc.getEnemySprites(); us = bc.getUserSprites(); ps = bc.getPetSprites(); try{ switch(NetBattleCanvas.level){ case 1:this.Things = gd.getThings(); this.Water = gd.getWater(); this.Trees = gd.getTrees(); break; case 2:this.Things = gd.getThings1(); this.Water = gd.getWater1(); this.Trees = gd.getTrees1(); break; case 3:break; } }catch(IOException e){e.printStackTrace();} //以下线程在构造方法中,所以只创建一次,用restart创建会因HP问题产生线程多余 //行走的线程 Thread t = new Thread(this); t.start(); //改变方向的线程 // changeDirectionThread = new ChangeDirectionThread(); // changeDirectionThread.start(); //发射子弹的线程 // shootThread = new ShootThread(); // shootThread.start(); } public int collides(){//跟别人碰撞了 0,没事 2,障碍物 坦克 边界 king pet //遍历帐篷 if(tentSprite.isVisible()){ if(this.collidesWith(tentSprite,true))return 2; } //遍历king else{ if(this.collidesWith(kingSprite,true))return 2; } //遍历pet for(int i=0;i<ps.length;i++){ if(ps[i].isAlive()) if(this.collidesWith(ps[i],true)){ return 2;//跟pet碰撞 } } //遍历所有除自己以外的敌人坦克 for(int i=0;i<es.length;i++){ if(es[i].getHP()>0 && this != es[i]) if(this.collidesWith(es[i],true)){ return 2;//跟坦克碰撞 } } //遍历所有玩家坦克 for(int i=0;i<us.length;i++){ if(us[i].getHP()>0) if(this.collidesWith(us[i],true)){ return 2;//跟坦克碰撞 } } //遍历障碍物 if(this.collidesWith(Things,true)||this.collidesWith(Trees,false) ||this.collidesWith(Water,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 explodes(){//爆炸 //坦克精灵不可见 setVisible(false); layerManager.remove(this); //线程没结束, HP = 0; //画出爆炸效果 explodeSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()); layerManager.insert(explodeSprite, 0); explodeSprite.setVisible(true); Sound.instance.enemyExplodePlayer(); try { Thread.sleep(50); //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); if(lifes<=0)enemyNum--;//这只坦克彻底死了 //new 出法宝 if(this.type == 2 && lifes==1){//绿色,new出炸弹 Image image = null; try{ image = Image.createImage("/tank/aBomb.png"); }catch(IOException e){e.printStackTrace();} new NetTalismanSprite(image,5,this.getRefPixelX(),this.getRefPixelY(),bc,this.layerManager); } else if(this.type == 2){//绿色,new出坦克 Image image = null; try{ image = Image.createImage("/tank/aTank.png"); }catch(IOException e){e.printStackTrace();} new NetTalismanSprite(image,6,this.getRefPixelX(),this.getRefPixelY(),bc,this.layerManager); } else if(this.type == 3 && lifes==1){//红色,new出星星 Image image = null; try{ image = Image.createImage("/tank/aStar.png"); }catch(IOException e){e.printStackTrace();} new NetTalismanSprite(image,4,this.getRefPixelX(),this.getRefPixelY(),bc,this.layerManager); } else if(this.type == 3){//红色,new出红十字 Image image = null; try{ image = Image.createImage("/tank/aBlood.png"); }catch(IOException e){e.printStackTrace();} new NetTalismanSprite(image,1,this.getRefPixelX(),this.getRefPixelY(),bc,this.layerManager); } } //发射子弹 ,在run里调用 public void fire(){ this.bullet.restart(this.getRefPixelX(), this.getRefPixelY(), curDirection); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -