📄 bulletssprite.java
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.IOException;/** * @author 张伟林 扩展自己的精灵类 * 此为子弹类,具有子弹的移动方向,移动量,子弹的碰撞等属性 */public class BulletsSprite extends Sprite implements Runnable{ private int x, y; private int fx;// 子弹的 private int sd;// 子弹的 public int user; private boolean lift = false;// 生命 int row, column;// 行与列 Sprite sprite; public BulletsSprite(Image image, int frameWidth, int frameHeight) { super(image, frameWidth, frameHeight);// 继承Sprite类中的属性 } public void start(int mx, int my, int mfx, int msd, int master)// mfx为方向的值,它有四个方向 // //msd为移动量 master为使用者 { // mx,my为座标 if (!lift)// 还有命存在 { setPosition(mx + 6, my + 6);// mx,my为座标 fx = mfx;//初始化方向 sd = msd;//和移动量 user = master; lift = true;// 保证调用一次就不调用了 setVisible(lift);// 妙啊,当生命在时就可见,不在时就自动的不可见 Thread t = new Thread(this); t.start(); } } public void run() { while (lift) { long times_s = System.currentTimeMillis();// 开始时间 forward(sd, fx);// fx为方向,它有四个方向,sd为移动量 undo(); // 检测子弹碰撞! long times_e = System.currentTimeMillis();// end时间 long times = times_e - times_s;// 时间间隔 if (times > 86) { times = 86; } try { Thread.sleep(86 - times); } catch (InterruptedException ie) { ie.printStackTrace(); } } }//------------------子弹的移动量与移动方向 b_fx为方向---------------- public void forward(int b_sd, int b_fx) { if (b_fx == 1)//1为向左 { fineMove(b_sd, 0);// 参数为移动量 } else if (b_fx == 2) { fineMove(b_sd, 0); } else if (b_fx == 3) { fineMove(0, b_sd); } else if (b_fx == 4) { fineMove(0, b_sd); } } //---------------------检测是否碰撞------------------------- public void undo() {//------------------打中砖块-------------- if (this.collidesWith(MicroTankCanvas.mBoard, true))//是否打到砖块 { System.out.println("打到了 "); row = (this.getY() + 1) / 15; // 15是每张贴图(小砖块)的像素(长=宽=15) column = (this.getX() + 1) / 15;//除以15就可以落在整行与整列上 System.out.println(row+" "+column); // MicroTankCanvas.explosion.start(this.getX(),this.getY());//调用爆炸方法 MicroTankCanvas.mBoard.setCell(column, row, 0);//第3个参数为0,则表示透明,此为对某个单元格操作 setVisible(false);//打中后当前子弹就不可见了 this.lift = false;//打中后,此子弹就没命了,定为false,就可以继续发下一颗 Thread.yield(); } //-----------------打中敌方坦克------------------------------- else if ((collidesWith(MicroTankCanvas.eTank, true)) && (user == 1))//user为使用者 {// MicroTankCanvas.explosion.start(getX(),getY());//调用爆炸方法 System.out.println("1 使用者为1 "); MicroTankCanvas.eTank.elift = false;//坦克没命了 MicroTankCanvas.eTank.setVisible(false);//坦克不可见 MicroTankCanvas.mLayerManager.remove(MicroTankCanvas.eTank);//MicroTankCanvas.eTank为layer型 MicroTankCanvas.eTank.stop();//此线程暂停一下,怎么感觉这句的用处也不怎么大啊 this.setVisible(false);//子弹的生命没了,也不可见了 this.lift = false; MicroTankCanvas.enum = MicroTankCanvas.enum - 1;//敌方生命减 Thread.yield(); if (MicroTankCanvas.enum > 0) { MicroTankCanvas.createETank();//只要敌方还有命,坦克再生 } else { // 进入下一关 } } //----------------敌方打中我方坦克------------------------ else if ((collidesWith(MicroTankCanvas.mTank, true)) && (user == 0)) {// MicroTankCanvas.explosion.start(getX(),getY());//调用爆炸方法// System.out.println("2 使用者为0"); MicroTankCanvas.mTank.setVisible(false); MicroTankCanvas.mLayerManager.remove(MicroTankCanvas.mTank); this.setVisible(false); this.lift = false; MicroTankCanvas.num = MicroTankCanvas.num - 1; Thread.yield(); if (MicroTankCanvas.num > 0) { System.out.println("打中我方 可再生坦克"); MicroTankCanvas.createTank(); } else { // 结束游戏 System.out.println("打中我方 over"); MicroTankCanvas.gameover = true; } } } public void stop() { Thread.yield(); }//--------------------子弹的移动 参数为移动量,其中必有一个为0--------------- private void fineMove(int kx, int ky) { int bx = getX();// 获取当前位置 int by = getY(); bx += kx;// 此也很精妙,当一个不为0时,另外一个一定为0 by += ky; if (by < 0 || by > MicroTankCanvas.h)// 竖直方向出界 { this.setVisible(false);// 出界就不可见了 lift = false;// 它的生命也没有了 Thread.yield();// yield为当前线程暂停而让其它的线程继续 } if (bx < 0 || bx > MicroTankCanvas.w)// { this.setVisible(false); lift = false; Thread.yield(); } setPosition(bx, by);// 移动子弹 }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -