actor.java~7~

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

JAVA~7~
496
字号
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;

public class Actor
    implements Runnable {
  public static final int REMAIN_CYC = 40;

  public static final int MAX_POWER = 10;
  public static final int MAX_BOMB_NUM = 10;

  public static final int UP = Canvas.UP;
  public static final int DOWN = Canvas.DOWN;
  public static final int LEFT = Canvas.LEFT;
  public static final int RIGHT = Canvas.RIGHT;
  public static final int FIRE = Canvas.FIRE;

  public static final int DIR_STATIC = 0;
  public static final int DIR_UP = 1;
  public static final int DIR_DOWN = 2;
  public static final int DIR_LEFT = 3;
  public static final int DIR_RIGHT = 4;

  public static final int STATE_INIT = 1;
  public static final int STATE_PLAYING = 2;
  public static final int STATE_END = 3;

  private int posX;
  private int posY;
  private int step;
  private int width;
  private int height;
  private World world;
  private boolean live;
  private boolean disuse;
  private int direction;
  private ImageSet imageSet;
  private Sprite sprite;
  private boolean isPause;
  private int state;
  private int power;
  private int bombNum;
  private int bodyRemainCyc;

  public Actor(World world, int x, int y) {
    this.world = world;
    step = 4;
    width = 24;
    height = 32;
    imageSet = world.getImageSet();
    sprite = new Sprite(imageSet, world.ACTOR_STATIC, 0);
    isPause = false;
    power = 1;
    bombNum = 1;
    init(x, y);
    state = STATE_INIT;
  }

  public void init(int x, int y) {
    posX = x;
    posY = y;
    live = true;
    disuse = false;
    direction = DIR_STATIC;
    sprite.setCurrentState(world.ACTOR_STATIC, true);
    bodyRemainCyc = REMAIN_CYC;
  }

  public void start() {
    if (state == STATE_INIT || state == STATE_END) {
      Thread t = new Thread(this);
      t.start();
      //	System.out.println("k");
    }
    state = STATE_PLAYING;
  }

  private void swerve(int dir) { //平滑转向
    int x = posX;
    int y = posY;
    int tileX_1 = -1;
    int tileY_1 = -1;
    int tileX_2 = -1;
    int tileY_2 = -1;
    //	int[][] bufMap = world.getMap();
    switch (dir) {
      case UP:
        y = y - step;
        tileY_1 = x / world.getTileWidth();
        tileX_1 = y / world.getTileHeight();
        tileY_2 = (x + width) / world.getTileWidth();
        tileX_2 = y / world.getTileHeight();
        if (world.canAcross(tileX_1, tileY_1, true)
            && !world.canAcross(tileX_2, tileY_2, true)
            && (posX + width / 2) < tileY_2 * world.getTileWidth()) {
          left();
        }
        else if (!world.canAcross(tileX_1, tileY_1, true)
                 && world.canAcross(tileX_2, tileY_2, true)
                 && (posX + width / 2) > tileY_1
                 * world.getTileWidth() + world.getTileWidth()) {
          right();
        }
        break;
      case DOWN:
        y = y + step;
        tileY_1 = x / world.getTileWidth();
        tileX_1 = (y + height) / world.getTileWidth();
        tileY_2 = (x + width) / world.getTileWidth();
        tileX_2 = (y + height) / world.getTileHeight();
        if (world.canAcross(tileX_1, tileY_1, true)
            && !world.canAcross(tileX_2, tileY_2, true)
            && (posX + width / 2) < tileY_2 * world.getTileWidth()) {
          left();
        }
        else if (!world.canAcross(tileX_1, tileY_1, true)
                 && world.canAcross(tileX_2, tileY_2, true)
                 && (posX + width / 2) > tileY_1
                 * world.getTileWidth() + world.getTileWidth()) {
          right();
        }
        break;
      case LEFT:
        x = x - step;
        tileY_1 = x / world.getTileWidth();
        tileX_1 = y / world.getTileHeight();
        tileY_2 = x / world.getTileWidth();
        tileX_2 = (y + height) / world.getTileHeight();
        if (world.canAcross(tileX_1, tileY_1, true)
            && !world.canAcross(tileX_2, tileY_2, true)
            && (posY + height / 2) < tileX_2 * world.getTileHeight()) {
          up();
        }
        else if (!world.canAcross(tileX_1, tileY_1, true)
                 && world.canAcross(tileX_2, tileY_2, true)
                 && (posY + height / 2) > tileX_1
                 * world.getTileHeight() + world.getTileHeight()) {
          down();
        }
        break;
      case RIGHT:
        x = x + step;
        tileY_1 = (x + width) / world.getTileWidth();
        tileX_1 = y / world.getTileHeight();
        tileY_2 = (x + width) / world.getTileWidth();
        tileX_2 = (y + height) / world.getTileHeight();
        if (world.canAcross(tileX_1, tileY_1, true)
            && !world.canAcross(tileX_2, tileY_2, true)
            && (posY + height / 2) < tileX_2 * world.getTileHeight()) {
          up();
        }
        else if (!world.canAcross(tileX_1, tileY_1, true)
                 && world.canAcross(tileX_2, tileY_2, true)
                 && (posY + height / 2) > tileX_1
                 * world.getTileHeight() + world.getTileHeight()) {
          down();
        }
        break;
    }
  }

  public void cycle()
  {
    if (live) {
      sprite.cycle();
    }
    else if (!disuse)
    {
      bodyRemainCyc--;
      if (bodyRemainCyc < 0)
      {
        disuse = true;
      }
      //	System.out.println(bodyRemainCyc);
    }
  }

  public void render(Graphics gra)
  {
    //	gra.setColor(0xff00ff);
    //	gra.fillRect(posX - world.getViewX(),posY - world.getViewY(),width,height);
    if (live)
    {
      sprite.draw(gra, posX - world.getViewX()
                  , posY - world.getViewY()
                  , Graphics.TOP | Graphics.LEFT);
      gra.setColor(0xff0000);
      gra.drawRect(posX - world.getViewX(), posY - world.getViewY()
                   , width - 1, height - 1);
    }
    else if (!disuse)
    {
      imageSet.draw(gra, world.ACTOR_DEAD, 0, posX - world.getViewX()
                    , posY - world.getViewY()
                    , Graphics.TOP | Graphics.LEFT);
    }
  }

  public void up()
  {
    if (!collidesDetect(posX, posY - step)) {
      posY = posY - step;
    }
    else
    {
      swerve(UP);
    }

  }

  public void down()
  {
    if (!collidesDetect(posX, posY + step))
    {
      posY = posY + step;
    }
    else
    {
      swerve(DOWN);
    }

  }

  public void right() {
    if (!collidesDetect(posX + step, posY)) {
      posX = posX + step;
    }
    else {
      swerve(RIGHT);
    }

  }

  public void left() {

    if (!collidesDetect(posX - step, posY)) {
      posX = posX - step;
    }
    else {
      swerve(LEFT);
    }

  }

  public void fire() {
    putBomb(world.getMap());
  }

  public int getX() {
    return posX;
  }

  public int getY() {
    return posY;
  }

  public void setX(int x) {
    posX = x;
  }

  public void setY(int y) {
    posY = y;
  }

  public int getStep() {
    return step;
  }

  public void dead() {
    live = false; //释放ACTOR线程
  }

  //Collides detect with map[][]
  private boolean collidesDetect(int x, int y) {
    int x1 = x;
    int y1 = y;
    int x2 = x1 + width - 1;
    int y2 = y1;
    int x3 = x1 + width - 1;
    int y3 = y1 + height - 1;
    int x4 = x1;
    int y4 = y1 + height - 1;
    int tileX = -1;
    int tileY = -1;
    int tileH = world.getTileHeight();
    int tileW = world.getTileWidth();
    //detected up-left
    tileX = y1 / tileH;
    tileY = x1 / tileW;
    if (!world.canAcross(tileX, tileY, true)) {
      //	System.out.println("1");
      return true;
    }

    tileX = y2 / tileH;
    tileY = x2 / tileW;
    if (!world.canAcross(tileX, tileY, true)) {
      //	System.out.println("2");
      return true;
    }

    tileX = y3 / tileH;
    tileY = x3 / tileW;
    if (!world.canAcross(tileX, tileY, true)) {
      //	System.out.println("3");
      return true;
    }

    tileX = y4 / tileH;
    tileY = x4 / tileW;
    if (!world.canAcross(tileX, tileY, true)) {
      //	System.out.println("4");
      return true;
    }
    return false;
  }

  public void keyPressed(int key) {
    if (live && !isPause && world.getDrawState() == world.DRAW_STATE_GAME) {
      switch (key) {
        case UP:
          direction = DIR_UP;
          sprite.setCurrentState(world.ACTOR_RUN_UP, true);
          break;
        case DOWN:
          direction = DIR_DOWN;
          sprite.setCurrentState(world.ACTOR_RUN_DOWN, true);
          break;
        case RIGHT:
          direction = DIR_RIGHT;
          sprite.setCurrentState(world.ACTOR_RUN_RIGHT, true);
          break;
        case LEFT:
          direction = DIR_LEFT;
          sprite.setCurrentState(world.ACTOR_RUN_LEFT, true);
          break;
        case FIRE:
          fire();
          break;
      }
    }

  }

  public void keyReleased(int key) {
    if (live && !isPause) {
      switch (key) {
        case UP:
          if (direction == DIR_UP) {
            direction = DIR_STATIC;
            sprite.setCurrentState(world.ACTOR_STATIC, true);
          }

          break;
        case DOWN:
          if (direction == DIR_DOWN) {
            direction = DIR_STATIC;
            sprite.setCurrentState(world.ACTOR_STATIC, true);
          }

          break;
        case RIGHT:
          if (direction == DIR_RIGHT) {
            direction = DIR_STATIC;
            sprite.setCurrentState(world.ACTOR_STATIC, true);
          }

          break;
        case LEFT:
          if (direction == DIR_LEFT) {
            direction = DIR_STATIC;
            sprite.setCurrentState(world.ACTOR_STATIC, true);
          }

          break;
      }
    }

  }

  public void run()
  {
    while (live)
    {
      if (!isPause)
      {
        if (direction != DIR_STATIC)
        {
          switch (direction)
          {
            case DIR_UP:
              up();
              break;
            case DIR_DOWN:
              down();
              break;
            case DIR_LEFT:
              left();
              break;
            case DIR_RIGHT:
              right();
              break;
          }
        }
        try
        {
          Thread.sleep(50);
        }
        catch (InterruptedException ie)
        {
          System.out.println("error!");
        }
      }
      if (isPause)
      {
        try
        {
          Thread.sleep(1000);
        }
        catch (InterruptedException ie)
        {
          ie.printStackTrace();
        }
      }
    }
    state = STATE_END;
    //	System.out.println("s");
  }

  public void pause()
  {
    isPause = true;
  }

  public void resume()
  {
    isPause = false;
  }

  private void putBomb(int[][] map)
  {
    if (world.getBombNum() < bombNum)
    {
      int tileY = (posX + width / 2) / world.getTileWidth();
      int tileX = (posY + height / 2) / world.getTileHeight();
      if (world.canAcross(tileX, tileY, false))
      {
        world.addBomb(tileY * world.getTileHeight(), tileX * world.getTileWidth(),
                      power);
        //	System.out.println(tileX + " " + tileY);
        //	System.out.println(posX + " " + posY);
      }
    }
  }

  public int getWidth()
  {
    return width;
  }

  public int getHeight()
  {
    return height;
  }

  public boolean isLive()
  {
    return live;
  }

  public void setLive()
  {
    live = true;
  }

  public boolean isDisuse()
  {
    return disuse;
  }

  public void addPower()
  {
    if (power < MAX_POWER)
    {
      power++;
    }
  }

  public void addBombNum()
  {
    if (bombNum < MAX_BOMB_NUM)
    {
      bombNum++;
    }
  }
}

⌨️ 快捷键说明

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