package com.hurteng.stormplane.plane; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.SystemClock; import com.hurteng.stormplane.bullet.Bullet; import com.hurteng.stormplane.bullet.MyBlueBullet; import com.hurteng.stormplane.bullet.MyPurpleBullet; import com.hurteng.stormplane.bullet.MyRedBullet; import com.hurteng.stormplane.constant.ConstantUtil; import com.hurteng.stormplane.constant.DebugConstant; import com.hurteng.stormplane.constant.GameConstant; import com.hurteng.stormplane.factory.GameObjectFactory; import com.hurteng.stormplane.interfaces.IMyPlane; import com.hurteng.stormplane.myplane.R; import com.hurteng.stormplane.object.GameObject; import com.hurteng.stormplane.view.MainView; import java.util.ArrayList; import java.util.List; /** * 玩家的飞机 */ public class MyPlane extends GameObject implements IMyPlane { private static final boolean Random = false; private float middle_x; private float middle_y; private long startTime; // 开始时间 private long endTime; // 结束时间 private boolean isChangeBullet; // 更换子弹类型 private Bitmap mPlane; private Bitmap mPlaneExplosion; private List<Bullet> bullets; // 子弹列表 private MainView mainView; private GameObjectFactory factory; private boolean isInvincible; // 是否无敌 private boolean isDamaged; // 是否受损 private int bulletType;//当前子弹类型 private boolean isMissileBoom; //导弹是否被引爆 public MyPlane(Resources resources) { super(resources); initBitmap(); this.speed = GameConstant.MYPLANE_SPEED; isInvincible = false; isChangeBullet = false; isDamaged = false; isMissileBoom = false; factory = new GameObjectFactory(); bullets = new ArrayList<Bullet>(); changeBullet(ConstantUtil.MYBULLET); bulletType = ConstantUtil.MYBULLET; } public void setMainView(MainView mainView) { this.mainView = mainView; } @Override public void setScreenWH(float screen_width, float screen_height) { super.setScreenWH(screen_width, screen_height); object_x = screen_width / 2 - object_width / 2; object_y = screen_height - object_height; middle_x = object_x + object_width / 2; middle_y = object_y + object_height / 2; } @Override public void initBitmap() { mPlane = BitmapFactory.decodeResource(resources, R.drawable.myplane); mPlaneExplosion = BitmapFactory.decodeResource(resources, R.drawable.myplaneexplosion); object_width = mPlane.getWidth() / 3; object_height = mPlane.getHeight(); } @Override public void drawSelf(Canvas canvas) { if (isDamaged) { drawExplosion(canvas); } else { drawPlane(canvas); } } /** * 绘制机体 * * @param canvas */ private void drawPlane(Canvas canvas) { int x = (int) (currentFrame * object_width); canvas.save(); canvas.clipRect(object_x, object_y, object_x + object_width, object_y + object_height); canvas.drawBitmap(mPlane, object_x - x, object_y, paint); canvas.restore(); if (isInvincible) { currentFrame++; if (currentFrame >= 3) { currentFrame = 0; } } else if (isAlive) { if (bulletType == ConstantUtil.MYBULLET) { currentFrame = 0; } else if (bulletType == ConstantUtil.MYBULLET1) { currentFrame = 1; } else if (bulletType == ConstantUtil.MYBULLET2) { currentFrame = 2; } } } /** * 绘制爆炸时的机体 * * @param canvas */ private void drawExplosion(Canvas canvas) { int x = (int) (currentFrame * object_width); canvas.save(); canvas.clipRect(object_x, object_y, object_x + object_width, object_y + object_height); canvas.drawBitmap(mPlaneExplosion, object_x - x, object_y, paint); canvas.restore(); if (bulletType == ConstantUtil.MYBULLET) { currentFrame++; if (currentFrame >= 2) { currentFrame = 0; } } else if (bulletType == ConstantUtil.MYBULLET1) { currentFrame++; if (currentFrame >= 4) { currentFrame = 2; } } else if (bulletType == ConstantUtil.MYBULLET2) { currentFrame++; if (currentFrame >= 6) { currentFrame = 4; } } } @Override public void release() { for (Bullet obj : bullets) { obj.release(); } if (!mPlane.isRecycled()) { mPlane.recycle(); } if (!mPlaneExplosion.isRecycled()) { mPlaneExplosion.recycle(); } } /** * 射击逻辑 * * @param canvas * @param planes */ @Override public void shoot(Canvas canvas, List<EnemyPlane> planes) { for (Bullet bullet : bullets) { if (bullet.isAlive()) { // 绘制子弹 bullet.drawSelf(canvas); // 检测子弹是否击中敌机 checkAttacked(planes, bullet); } } } /** * 检测子弹是否击中敌机 * * @param planes * @param bullet */ private void checkAttacked(List<EnemyPlane> planes, Bullet bullet) { for (EnemyPlane enemyPlane : planes) { boolean isCollide = enemyPlane.isCanCollide() && bullet.isCollide(enemyPlane); if (isCollide) { attackedEnemyPlane(bullet, enemyPlane); break; } } } /** * 击中敌机的逻辑处理 * * @param bullet * @param plane */ private void attackedEnemyPlane(Bullet bullet, EnemyPlane plane) { // 记录敌机的受损状态 plane.attacked(bullet.getHarm()); if (plane.isExplosion()) { // 根据击毁的不同敌机增加相应的分数(同时播放爆炸音乐) mainView.addGameScore(plane.getScore()); if (plane instanceof SmallPlane) { mainView.playSound(2); } else if (plane instanceof MiddlePlane) { mainView.playSound(3); } else if (plane instanceof BigPlane) { mainView.playSound(4); } else { mainView.playSound(5); } } } /** * 初始化子弹 */ @Override public void initBullet() { for (Bullet obj : bullets) { if (!obj.isAlive()) { obj.initial(0, middle_x, middle_y); break; } } } /** * 更换子弹 * * @param type */ @Override public void changeBullet(int type) { bulletType = type; bullets.clear(); if (isChangeBullet) { if (type == ConstantUtil.MYBULLET1) { for (int i = 0; i < 6; i++) { MyPurpleBullet bullet1 = (MyPurpleBullet) factory .createMyPurpleBullet(resources); bullets.add(bullet1); } } else if (type == ConstantUtil.MYBULLET2) { for (int i = 0; i < 4; i++) { MyRedBullet bullet2 = (MyRedBullet) factory .createMyRedBullet(resources); bullets.add(bullet2); } } } else { for (int i = 0; i < 4; i++) { MyBlueBullet bullet = (MyBlueBullet) factory.createMyBlueBullet(resources); bullets.add(bullet); } } } /** * 判断特殊子弹是否超时 */ public void isBulletOverTime() { if (isChangeBullet) { endTime = System.currentTimeMillis(); if (endTime - startTime > GameConstant.MYSPECIALBULLET_DURATION) { isChangeBullet = false; startTime = 0; endTime = 0; changeBullet(ConstantUtil.MYBULLET); } } } /** * 设置飞机的无敌时间 * * @param time */ public void setInvincibleTime(long time) { if (DebugConstant.INVINCIBLE) { isInvincible = true; SystemClock.sleep(time); isInvincible = false; } } /** * 检测是否为无敌状态 * * @return */ public boolean isInvincible() { return isInvincible; } /** * 设置导弹状态 * * @param isBoom */ public void setMissileState(boolean isBoom) { isMissileBoom = isBoom; } /** * 检测导弹状态(是否已经引爆) * * @return */ public boolean getMissileState() { return isMissileBoom; } /** * 设置是否为受损状态 * * @param arg */ public void setDamaged(boolean arg) { isDamaged = arg; } /** * 检测是否为受损状态 * * @return */ public boolean getDamaged() { return isDamaged; } public void setStartTime(long startTime) { this.startTime = startTime; } @Override public boolean isChangeBullet() { return isChangeBullet; } @Override public void setChangeBullet(boolean isChangeBullet) { this.isChangeBullet = isChangeBullet; } @Override public float getMiddle_x() { return middle_x; } @Override public void setMiddle_x(float middle_x) { this.middle_x = middle_x; this.object_x = middle_x - object_width / 2; } @Override public float getMiddle_y() { return middle_y; } @Override public void setMiddle_y(float middle_y) { this.middle_y = middle_y; this.object_y = middle_y - object_height / 2; } }