📄 netusersprite.java
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.*;import java.util.*;public class NetUserSprite extends Sprite implements Runnable{ private int index;//玩家0,玩家1 public static boolean gameover=false;//游戏结束 private static boolean interrupt;//坦克运动是否暂停 ,加在run中 public static void setInterrupt(boolean interrupt) { NetUserSprite.interrupt = interrupt; } private int lifes=3;//生命数 private int HP;//HP值 private int x,y;//初始和复活时的位置 public int getHP() { return HP; } private boolean isPressed =false;//是否被按键 public void setIsPressed(boolean isPressed) { this.isPressed = isPressed; } private int curDirection;//现在的方向 private int nextDirection;//下一方向 public void setNextDirection(int nextDirection) { this.nextDirection = nextDirection; } public int SPEED=1;//坦克速度 private NetBulletSprite bullet; //玩家自己的子弹 private Sprite explodeSprite;//爆炸精灵 //实用的引用 private LayerManager layerManager; private int screenWidth,screenHeight; private NetBattleCanvas bc; private NetKingSprite kingSprite;//保护物 private NetTentSprite tentSprite;//帐篷 private GameDesign gd; private NetUserSprite[] us; private NetEnemySprite[] es;//所有敌人 private NetPetSprite ps[]; private boolean isNew = false;//是否有保护层 private Sprite protectSprite;//保护层 private boolean hasShip;//true则可以进水 private boolean isInWater;//true则打到没事(因有船) private Sprite shipSprite;//船 private int count=0;//保护层计数,坦克run里面控制到5,保护层就了 //private TiledLayer Bask; private TiledLayer Things; private TiledLayer Water; private TiledLayer Trees; //线程 private Thread t; public NetUserSprite(Image image,LayerManager layerManager,NetBulletSprite bullet, NetBattleCanvas bc,GameDesign gd,NetKingSprite kingSprite,NetTentSprite tentSprite,int index) { super(image); curDirection=Canvas.UP; nextDirection=Canvas.UP; 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.HP=0; this.index = index; isNew = true; this.bc = bc; screenWidth = bc.getWidth(); screenHeight = bc.getHeight(); if(index==0){ x = screenWidth/2-20; y = screenHeight-6; }else{ x = screenWidth/2+30; y = screenHeight-6; } this.kingSprite = kingSprite; this.tentSprite = tentSprite; us = bc.getUserSprites(); es = bc.getEnemySprites(); ps = bc.getPetSprites(); this.gd = gd; try{ switch(BattleCanvas.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();} //保护层 try { Image protectImage = Image.createImage("/tank/protect.png"); protectSprite = new Sprite(protectImage); protectSprite.defineReferencePixel(protectImage.getWidth()/2,protectImage.getHeight()/2); }catch (IOException e) {e.printStackTrace();} //启动行动线程run t = new Thread(this); t.start(); //玩家自己启动, restart(); } public boolean isNew() { return isNew; } public int collides(){//跟别人碰撞了 0,没事 2,障碍物 坦克 边界 king //遍历帐篷 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 ) if(this.collidesWith(es[i],true)){ return 2;//跟坦克碰撞 } } //遍历所有的玩家坦克 for(int i=0;i<us.length;i++){ if(us[i].getHP()>0 && us[i]!=this) if(this.collidesWith(us[i],true)){ return 2;//跟坦克碰撞 } } //遍历水 if(this.collidesWith(Water,true)){ if(this.hasShip){//有船 if(!isInWater){//且之前没在水里 this.isInWater = true; this.addShip(); } } else {//没船 return 2; } }else if(isInWater){//没跟水相碰,且之前在水里 this.isInWater = false; this.removeShip(); } //遍历障碍物 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 explodes(){//爆炸 //坦克精灵不可见 setVisible(false); layerManager.remove(this); //线程没结束,但run无效 HP = 0; //画出爆炸效果 explodeSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()); layerManager.insert(explodeSprite, 0); explodeSprite.setVisible(true); Sound.instance.userExplodePlayer(); 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); //移除保护层 isNew=false; layerManager.remove(protectSprite); //再自启动 this.restart(); } //发射子弹,由按键的线程调用 public void fire(){ if(!gameover&&!interrupt)this.bullet.restart(this.getRefPixelX(), this.getRefPixelY(), curDirection); } public void setLifes(int lifes){//初始化生命数,在EnemyManager类设置 this.lifes = lifes; } public int getLifes() { return lifes; } public void restart(){//重置位置,HP值,方向 if(HP>0)return; if(lifes<=0){bc.lose();return;} setRefPixelPosition(x,y); HP=100;//HP=100 curDirection=Canvas.UP; nextDirection=Canvas.UP; setTransform(Sprite.TRANS_NONE); lifes--; hasShip = false; isInWater = false; this.bullet.setFrame(0); this.SPEED = 1; //添加到画布管理器 setVisible(true); layerManager.insert(this,0); //出生有保护层 this.addProtect(); count=1000; } public void run(){ while(!gameover){ if(!interrupt){ if(HP>0){ if(count>=1400 && count<1600){ if(this.protectSprite.isVisible())this.protectSprite.setVisible(false); else this.protectSprite.setVisible(true); } if(count++ == 1600){//20次后玩家不是新出生的了,没有保护层了 isNew=false; layerManager.remove(protectSprite); } go(); } } //加sleep,不然cpu太高 try { Thread.sleep(10); } catch (InterruptedException ex) { ex.printStackTrace(); } } } private void go(){//坦克行走 while(isPressed){ switch(nextDirection){ case GameCanvas.DOWN: //如果跟现在方向一样,不转 //如果跟现在方向不一样,转 if(nextDirection != curDirection){ this.setTransform(Sprite.TRANS_ROT180); curDirection = nextDirection; } this.move(0, SPEED); if(isNew){this.protectSprite.move(0,SPEED);} if(isInWater){shipSprite.move(0,SPEED);}//在水中(有船,且在水中) //若普通碰撞 if (this.collides() == 2){//普通碰撞 move(0,-SPEED); if(isNew){this.protectSprite.move(0,-SPEED);} if(isInWater){shipSprite.move(0,-SPEED);}//在水中(有船,且在水中) } break; case GameCanvas.UP: //如果跟现在方向一样,不转 //如果跟现在方向不一样,转 if(nextDirection != curDirection){ this.setTransform(Sprite.TRANS_NONE); curDirection = nextDirection; } this.move(0, -SPEED); if(isNew){this.protectSprite.move(0,-SPEED);} if(isInWater){shipSprite.move(0,-SPEED);}//在水中(有船,且在水中) //若普通碰撞 if (this.collides() == 2){//普通碰撞 move(0, SPEED); if(isNew){this.protectSprite.move(0,SPEED);} if(isInWater){shipSprite.move(0,SPEED);}//在水中(有船,且在水中) } break; case GameCanvas.LEFT: //如果跟现在方向一样,不转 //如果跟现在方向不一样,转 if(nextDirection != curDirection){ this.setTransform(Sprite.TRANS_ROT270); curDirection = nextDirection; } this.move(-SPEED,0); if(isNew){this.protectSprite.move(-SPEED,0);} if(isInWater){shipSprite.move(-SPEED,0);}//在水中(有船,且在水中) //若普通碰撞 if (this.collides() == 2){//普通碰撞 this.move(SPEED,0); if(isNew){this.protectSprite.move(SPEED,0);} if(isInWater){shipSprite.move(SPEED,0);}//在水中(有船,且在水中) } break; case GameCanvas.RIGHT: //如果跟现在方向一样,不转 //如果跟现在方向不一样,转 if(nextDirection != curDirection){ this.setTransform(Sprite.TRANS_ROT90); curDirection = nextDirection; } this.move(SPEED,0); if(isNew){this.protectSprite.move(SPEED,0);} if(isInWater){shipSprite.move(SPEED,0);}//在水中(有船,且在水中) //若普通碰撞 if (this.collides() == 2){//普通碰撞 move(-SPEED,0); if(isNew){this.protectSprite.move(-SPEED,0);} if(isInWater){shipSprite.move(-SPEED,0);}//在水中(有船,且在水中) } break; }//switch isPressed = false;//走一步就停一下 }//while } //关于保护层 //刚复活时,带有保护层,isNew=true,(子弹类:遇到玩家自爆,玩家没事) //在restart()时加保护层,然后400次后自灭 public void addProtect(){ //添加保护层 protectSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()); layerManager.insert(protectSprite, 0); protectSprite.setVisible(true); isNew = true; count=0; } //船 //吃到法宝后,new船出来,船会被打掉(炸弹要判断玩家是否hasShip,true就hasShip=false) public void setHasShip(boolean hasShip){ this.hasShip = hasShip; } public boolean IsInWater(){ return isInWater; } private void addShip(){ try { Image shipImage = Image.createImage("/tank/ship.png"); shipSprite = new Sprite(shipImage); shipSprite.defineReferencePixel(shipImage.getWidth()/2,shipImage.getHeight()/2); }catch (IOException e) {e.printStackTrace();} shipSprite.setRefPixelPosition(this.getRefPixelX(),this.getRefPixelY()); layerManager.insert(shipSprite, 0); shipSprite.setVisible(true); layerManager.insert(this, 0); } private void removeShip(){ shipSprite.setVisible(false); layerManager.remove(shipSprite); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -