blast.java

来自「基于J2ME的手机游戏软件。可以控制游戏人物在地图上上下左右行走;可以在地图上放」· Java 代码 · 共 381 行

JAVA
381
字号
import javax.microedition.lcdui.Graphics;

public class Blast {
  private static final int PER_S_CYC = 20;

//	private static final int MAX_POWER = 10;

  private static final int SCAN_UP = 1;
  private static final int SCAN_DOWN = 2;
  private static final int SCAN_RIGHT = 3;
  private static final int SCAN_LEFT = 4;

  private int posX;
  private int posY;
  private int power;
  private World world;
  private int remainCyc;
  private Sprite blast_mid;
  private Sprite blast_up;
  private Sprite blast_down;
  private Sprite blast_right;
  private Sprite blast_left;
  private Sprite blast_h;
  private Sprite blast_v;
  private boolean live;
  private int tileWidth;
  private int tileHeight;
  private int[][] destroy_up;
  private int[][] destroy_down;
  private int[][] destroy_left;
  private int[][] destroy_right;

  public Blast(World world, int x, int y, int power) {
    posX = x;
    posY = y;
    this.power = power;
    this.world = world;
    remainCyc = 10;
    ImageSet imageSet = world.getImageSet();
    blast_mid = new Sprite(imageSet, world.BLAST_MID, 0);
    blast_up = new Sprite(imageSet, world.BLAST_UP, 0);
    blast_right = new Sprite(imageSet, world.BLAST_RIGHT, 0);
    blast_down = new Sprite(imageSet, world.BLAST_DOWN, 0);
    blast_left = new Sprite(imageSet, world.BLAST_LEFT, 0);
    if (power > 1) {
      blast_h = new Sprite(imageSet, world.BLAST_H, 0);
      blast_v = new Sprite(imageSet, world.BLAST_V, 0);
    }
    live = true;
    tileWidth = world.getTileWidth();
    tileHeight = world.getTileHeight();
    destroy_up = getDestroyRegion(SCAN_UP);
    destroy_down = getDestroyRegion(SCAN_DOWN);
    destroy_right = getDestroyRegion(SCAN_RIGHT);
    destroy_left = getDestroyRegion(SCAN_LEFT);
  }

  private int[][] initArray(int x, int y) { //init -1
    int[][] result = new int[x][y];
    for (int i = 0; i < result.length; i++) {
      for (int j = 0; j < result[i].length; j++) {
        result[i][j] = -1;
      }
    }
    return result;
  }

  public void cycle() {
    if (remainCyc <= 0) {
      live = false;
    }
    else {
      remainCyc--;
    }

    blast_up.cycle();
    blast_down.cycle();
    blast_right.cycle();
    blast_left.cycle();
    blast_mid.cycle();
    if (power > 1) {
      blast_v.cycle();
      blast_h.cycle();
    }
    killActor(world.getActor());
    killEnemy(world.getEnemyArray());
  }

  private int[][] getDestroyRegion(int dir) {
    int tileWidth = world.getTileWidth();
    int tileHeight = world.getTileHeight();
    int[][] bufMap = world.getMap();
    int tileX = posY / tileHeight;
    int tileY = posX / tileWidth;
    int buf = -1;
    int[][] result = initArray(power + 1, 2);
    switch (dir) {
      case SCAN_UP: //up
        for (int i = 1; i <= power; i++) {
          buf = bufMap[tileX - i][tileY];
          if (world.canAcross(tileX - i, tileY, false)) {
            result[i][0] = tileY * tileWidth;
            result[i][1] = (tileX - i) * tileHeight;
            result[0][0] = i;
          }
          else if (buf == World.TILE2) {
            result[i][0] = tileY * tileWidth;
            result[i][1] = (tileX - i) * tileHeight;
            result[0][0] = i;
            world.destroy(tileX - i, tileY);
            break;
          }
          else if (!world.canAcross(tileX - i, tileY, false) &&
                   buf != World.TILE2) {
            break;
          }
        }
        break;
      case SCAN_DOWN: //down
        for (int i = 1; i <= power; i++) {
          buf = bufMap[tileX + i][tileY];
          if (world.canAcross(tileX + i, tileY, false)) {
            result[i][0] = tileY * tileWidth;
            result[i][1] = (tileX + i) * tileHeight;
            result[0][0] = i;

          }
          else if (buf == World.TILE2) {
            result[i][0] = tileY * tileWidth;
            result[i][1] = (tileX + i) * tileHeight;
            result[0][0] = i;
            world.destroy(tileX + i, tileY);
            break;
          }
          else if (!world.canAcross(tileX + i, tileY, false) &&
                   buf != World.TILE2) {
            break;
          }
        }
        break;
      case SCAN_LEFT: //left
        for (int i = 1; i <= power; i++) {
          buf = bufMap[tileX][tileY - i];
          if (world.canAcross(tileX, tileY - i, false)) {
            result[i][0] = (tileY - i) * tileWidth;
            result[i][1] = tileX * tileHeight;
            result[0][0] = i;

          }
          else if (buf == World.TILE2) {
            result[i][0] = (tileY - i) * tileWidth;
            result[i][1] = tileX * tileHeight;
            result[0][0] = i;
            world.destroy(tileX, tileY - i);
            break;
          }
          else if (!world.canAcross(tileX, tileY - i, false) &&
                   buf != World.TILE2) {
            break;
          }
        }
        break;
      case SCAN_RIGHT: //right
        for (int i = 1; i <= power; i++) {
          buf = bufMap[tileX][tileY + i];
          if (world.canAcross(tileX, tileY + i, false)) {
            result[i][0] = (tileY + i) * tileWidth;
            result[i][1] = tileX * tileHeight;
            result[0][0] = i;

          }
          else if (buf == World.TILE2) {
            result[i][0] = (tileY + i) * tileWidth;
            result[i][1] = tileX * tileHeight;
            result[0][0] = i;
            world.destroy(tileX, tileY + i);
            break;
          }
          else if (!world.canAcross(tileX, tileY + i, false) &&
                   buf != World.TILE2) {
            break;
          }
        }
        break;
    }
    return result;
  }

  public void render(Graphics gra) {
    int viewX = world.getViewX();
    int viewY = world.getViewY();
    if (live) {
      /*	blast_mid.draw(gra,posX - viewX,posY - viewY
               ,Graphics.TOP|Graphics.LEFT);
       blast_up.draw(gra,posX - viewX,posY - tileHeight - viewY
               ,Graphics.TOP|Graphics.LEFT);
       blast_down.draw(gra,posX - viewX,posY + tileHeight - viewY
               ,Graphics.TOP|Graphics.LEFT);
       blast_right.draw(gra,posX + tileWidth - viewX,posY - viewY
               ,Graphics.TOP|Graphics.LEFT);
       blast_left.draw(gra,posX - tileWidth - viewX,posY - viewY
               ,Graphics.TOP|Graphics.LEFT);
       */
      blast_mid.draw(gra, posX - viewX, posY - viewY
                     , Graphics.TOP | Graphics.LEFT);
      //up
      for (int i = 1; i < destroy_up.length; i++) {
        if (destroy_up[0][0] == -1) { //说明该数组为空,无需渲染
          break;
        }
        if (destroy_up[i][0] >= 0 && destroy_up[i][1] >= 0) {
          if (i == destroy_up[0][0]) {
            blast_up.draw(gra, destroy_up[i][0] - viewX
                          , destroy_up[i][1] - viewY
                          , Graphics.TOP | Graphics.LEFT);
            break;
          }
          else {
            blast_v.draw(gra, destroy_up[i][0] - viewX
                         , destroy_up[i][1] - viewY
                         , Graphics.TOP | Graphics.LEFT);
          }
        }
      }
      //down
      for (int i = 1; i < destroy_down.length; i++) {
        if (destroy_down[0][0] == -1) { //说明该数组为空,无需渲染
          break;
        }
        if (i == destroy_down[0][0]) {
          blast_down.draw(gra, destroy_down[i][0] - viewX
                          , destroy_down[i][1] - viewY
                          , Graphics.TOP | Graphics.LEFT);
          break;
        }
        else {
          blast_v.draw(gra, destroy_down[i][0] - viewX
                       , destroy_down[i][1] - viewY
                       , Graphics.TOP | Graphics.LEFT);
        }
      }
      //right
      for (int i = 1; i < destroy_right.length; i++) {
        if (destroy_right[0][0] == -1) { //说明该数组为空,无需渲染
          break;
        }
        if (i == destroy_right[0][0]) {
          blast_right.draw(gra, destroy_right[i][0] - viewX
                           , destroy_right[i][1] - viewY
                           , Graphics.TOP | Graphics.LEFT);
          break;
        }
        else {
          blast_h.draw(gra, destroy_right[i][0] - viewX
                       , destroy_right[i][1] - viewY
                       , Graphics.TOP | Graphics.LEFT);
        }
      }
      //left
      for (int i = 1; i < destroy_up.length; i++) {
        if (destroy_left[0][0] == -1) { //说明该数组为空,无需渲染
          break;
        }
        if (i == destroy_left[0][0]) {
          blast_left.draw(gra, destroy_left[i][0] - viewX
                          , destroy_left[i][1] - viewY
                          , Graphics.TOP | Graphics.LEFT);
          break;
        }
        else {
          blast_h.draw(gra, destroy_left[i][0] - viewX
                       , destroy_left[i][1] - viewY
                       , Graphics.TOP | Graphics.LEFT);
        }
      }
    }
  }

  public boolean isLive() {
    return live;
  }

  public void killActor(Actor actor) {
    int x = -1;
    int y = -1;
    int tileX = (actor.getY() + actor.getHeight() / 2) / world.getTileHeight();
    int tileY = (actor.getX() + actor.getWidth() / 2) / world.getTileWidth();

    x = posY / world.getTileHeight();
    y = posX / world.getTileWidth();
    if (x == tileX && y == tileY) {
      actor.dead();
    }
    for (int i = 1; i < destroy_up.length; i++) {
      if (destroy_up[i][0] >= 0 && destroy_up[i][1] >= 0) {
        x = destroy_up[i][1] / world.getTileHeight();
        y = destroy_up[i][0] / world.getTileWidth();
        if (tileX == x && tileY == y) {
          actor.dead();
        }
      }
    }
    for (int i = 1; i < destroy_down.length; i++) {
      if (destroy_down[i][0] >= 0 && destroy_down[i][1] >= 0) {
        x = destroy_down[i][1] / world.getTileHeight();
        y = destroy_down[i][0] / world.getTileWidth();
        if (tileX == x && tileY == y) {
          actor.dead();
        }
      }
    }
    for (int i = 1; i < destroy_right.length; i++) {
      if (destroy_right[i][0] >= 0 && destroy_right[i][1] >= 0) {
        x = destroy_right[i][1] / world.getTileHeight();
        y = destroy_right[i][0] / world.getTileWidth();
        if (tileX == x && tileY == y) {
          actor.dead();
        }
      }
    }
    for (int i = 1; i < destroy_left.length; i++) {
      if (destroy_left[i][0] >= 0 && destroy_left[i][1] >= 0) {
        x = destroy_left[i][1] / world.getTileHeight();
        y = destroy_left[i][0] / world.getTileWidth();
        if (tileX == x && tileY == y) {
          actor.dead();
        }
      }
    }
  }

  public void killEnemy(Enemy[] enemyArray) {
    for (int j = 0; j < enemyArray.length; j++) {
      if (enemyArray[j] != null) {
        Enemy enemy = enemyArray[j];
        int x = -1;
        int y = -1;
        int tileX = (enemy.getY() + enemy.getHeight() / 2) /
            world.getTileHeight();
        int tileY = (enemy.getX() + enemy.getWidth() / 2) / world.getTileWidth();
        for (int i = 1; i < destroy_up.length; i++) {
          if (destroy_up[i][0] >= 0 && destroy_up[i][1] >= 0) {
            x = destroy_up[i][1] / world.getTileHeight();
            y = destroy_up[i][0] / world.getTileWidth();
            if (tileX == x && tileY == y && enemy.isLive()) {
              enemy.dead();
            }
          }
        }
        for (int i = 1; i < destroy_down.length; i++) {
          if (destroy_down[i][0] >= 0 && destroy_down[i][1] >= 0) {
            x = destroy_down[i][1] / world.getTileHeight();
            y = destroy_down[i][0] / world.getTileWidth();
            if (tileX == x && tileY == y && enemy.isLive()) {
              enemy.dead();
            }
          }
        }
        for (int i = 1; i < destroy_right.length; i++) {
          if (destroy_right[i][0] >= 0 && destroy_right[i][1] >= 0) {
            x = destroy_right[i][1] / world.getTileHeight();
            y = destroy_right[i][0] / world.getTileWidth();
            if (tileX == x && tileY == y && enemy.isLive()) {
              enemy.dead();
            }
          }
        }
        for (int i = 1; i < destroy_left.length; i++) {
          if (destroy_left[i][0] >= 0 && destroy_left[i][1] >= 0) {
            x = destroy_left[i][1] / world.getTileHeight();
            y = destroy_left[i][0] / world.getTileWidth();
            if (tileX == x && tileY == y && enemy.isLive()) {
              enemy.dead();
            }
          }
        }
      }
    }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?