}
********************************************************************************
package imageban; import java.awt.Color; import java.awt.Graphics; import java.util.Random; import tankImage.EnemyImage; /** * 敌方坦克,具有自动发炮弹,自动随机运动的工能 * * @author dell * */ public class Enemy extends Tank implements RectangleInter { Random random = new Random();//随机数对象 int changeDirectionFrequency = random.nextInt(12) + 5; int loadMissileFrequency = random.nextInt(5);// 装载子弹的间隔频率 EnemyImage enemyImage = new EnemyImage("images/enemy",3);//敌方坦克的图片 /** * 注意必须调用super(x,y),否则报错这是原因之一,另一个则是,如果不调用父类的构造器 的话,导致如果该 * 子类调用getRectange(),该方法里面的参数没有得到初始化而不能获得具体你想要的值 * * 刚开始new 出一个敌方坦克的时候,就指定(命令)它要打的我方坦克myTank(哪一个坦克), * * @param x * @param y * @param myTank * ,敌人要打的那个坦克,即为我的坦克 */ public Enemy(String imagePath,int x,int y){ super(imagePath,x,y); } /** * 在这里没有判断坦克是否死亡,就return,没有想MyTank里一样 * 因为在子弹打击敌方坦克的时候有这一句起到了类似的作用 * enemyBase.remove(i);//敌方坦克基地删除死亡的坦克,此时坦克不画出来了 */ @Override public void draw(Graphics g) { Color c = g.getColor(); g.drawImage(this.getImage(), this.getX(), this.getY(), null);// //绘画坦克 g.setColor(c); fire(g);//开炮 move();//移动 } /** * 敌方坦克的运动。运动时坦克自动调整方向 */ public void move() { super.move(); //设置坦克的方向 locateDirection(); loadMissiles();//在运动中随机装载子弹 } /* * 随机取得坦克的运动方向 */ public void locateDirection() { if (changeDirectionFrequency == 0) { changeDirectionFrequency = random.nextInt(12) + 5; int step = random.nextInt(4); Direction[] d = Direction.values(); dir = d[step]; // 为了不让敌方坦克停止,如果dir = stop则重新赋值为dir= d[--step]也就是上一步的方向 if (dir == Direction.STOP) dir = d[--step]; } changeDirectionFrequency--; this.setImage(dir); } public void setImage(Direction dir){ switch(dir){ case L: this.setImage(enemyImage.getImage(1)); break; case U: this.setImage(enemyImage.getImage(3)); break; case R: this.setImage(enemyImage.getImage(2)); break; case D: this.setImage(enemyImage.getImage(0)); break; } } /** * 装载子弹,其功能是每个一段频率让它装入一次子弹,之所以在fireMissileJiange = random.nextInt(6) * 后面加1,是应为如果是fireMissileJiange = * random.nextInt(6)==0的情况下,在往下执行会发现fireMissileJiange -- * 永远不会有fireMissileJiange ==0的情况出现了,也就装载不了弹药了,此为细节应该注意 */ public void loadMissiles() { if (this.loadMissileFrequency == 0) { loadMissileFrequency= random.nextInt(20) + 1;//随机设定装载子弹的频率 // 向弹夹里添加子弹 this.getDanJia().add(new Missile(this.getX() + this.getWIDTH() / 2 - Missile.WIDTH / 2, this.getY() + this.getHEIGHT() / 2 - Missile.HEIGHT / 2, dir)); } this.loadMissileFrequency--; } /** * 发射炮弹,也就是让子弹画出来,Graphics 类型的参数 * * @param g */ public void fire(Graphics g) { for (int i = 0; i < this.getDanJia().size(); i++) { this.getDanJia().get(i).draw(g);//从弹夹中拿出子弹 this.getDanJia().get(i).hitMyTank( MyTank.getMyTank(),g); // 如果子弹打中坦克死了,就冲弹夹中删除该子弹 if (!this.getDanJia().get(i).isAlive()) { this.getDanJia().remove(i); } } } }
**************************************************************************************
package imageban; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.io.IOException; import music.Music; import tankImage.ImageUtil; import tankImage.MyImage; /** * 我的坦克,除了拥有父类的属性之外又定义了坦克的生命值,为100 当每次中弹的时候,生命值减去20、当生命值为 WarField.WIDTH || y > WarField.HEIGHT) { alive = false; } } /** *子弹打击敌方坦克,子 * @param enemyBase敌方坦克的坦克基地。 */ public void hitEnemy(EnemysBase enemyBase,Graphics g) { enemyBase = EnemysBase.getEnemyBase();//获取一个单态实例的敌方坦克坦克基地 for(int i=0;i
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?