示例#1
0
  public void tick(GameObjectManager manager, ActionQueue queue) {

    /*
     * CHECK COLLISION WITH EXPLOSIONS
     */
    for (GameObject object : manager.getByType(GameObjectType.EXPLOSION)) {
      if (checkCollisionWith(object)) {
        state = BombermanState.DEAD;

        queue.put(new Action(ActionType.DESTROY, new Object[] {id}));
        return;
      }
    }

    /*
     * PICK UP POWERUP
     */
    for (GameObject object : manager.getByType(GameObjectType.POWER_UP)) {
      if (checkCollisionWith(object)) {
        switch (((GPowerUp) object).getPowerUpType()) {
          case BOMB:
            maxBombs++;
            break;
          case POWER:
            bombPower++;
            break;
          case SPEED:
            speedCooldown = 5 * 30;
            position.incrementX(position.getX() % 8);
            position.incrementY(position.getY() % 8);
            break;
          default:
            break;
        }

        queue.put(new Action(ActionType.DESTROY, new Object[] {object.getId()}));

        break;
      }
    }

    /*
     * SPEED COOLDOWN
     */

    if (speedCooldown > 0) {
      speedCooldown--;
      speed = 8;
      if (speedCooldown == 0) {
        position.incrementX(position.getX() % 4);
        position.incrementY(position.getY() % 4);
        speed = 4;
      }
    }

    /*
     * BOMB COOLDOWN
     */
    if (--bombCooldown <= 0) {
      if (bombs < maxBombs) {
        bombs++;
      }
      bombCooldown = 30 * 3;
    }

    /*
     * UPDATE POSITION
     */
    if (w) {
      Position oldPosition = position.clonePos();
      position.decrementY(speed);
      for (GameObject object :
          manager.getByType(GameObjectType.SOLID_BLOCK, GameObjectType.DESTROYBALE_BLOCK)) {
        if (checkCollisionWith(object)) {
          position = oldPosition;
        } else {
          state = BombermanState.UP;
          updatePosition = true;
        }
      }
    }
    if (a) {
      Position oldPosition = position.clonePos();
      position.decrementX(speed);
      for (GameObject object :
          manager.getByType(GameObjectType.SOLID_BLOCK, GameObjectType.DESTROYBALE_BLOCK)) {
        if (checkCollisionWith(object)) {
          position = oldPosition;
        } else {
          state = BombermanState.LEFT;
          updatePosition = true;
        }
      }
    }
    if (s) {
      Position oldPosition = position.clonePos();
      position.incrementY(speed);
      for (GameObject object :
          manager.getByType(GameObjectType.SOLID_BLOCK, GameObjectType.DESTROYBALE_BLOCK)) {
        if (checkCollisionWith(object)) {
          position = oldPosition;
        } else {
          state = BombermanState.DOWN;
          updatePosition = true;
        }
      }
    }
    if (d) {
      Position oldPosition = position.clonePos();
      position.incrementX(speed);
      for (GameObject object :
          manager.getByType(GameObjectType.SOLID_BLOCK, GameObjectType.DESTROYBALE_BLOCK)) {
        if (checkCollisionWith(object)) {
          position = oldPosition;
        } else {
          state = BombermanState.RIGHT;
          updatePosition = true;
        }
      }
    }
    if (enter) {
      if (bombs > 0 && canPlace) {
        boolean collision = false;
        for (GameObject object : manager.getByType(GameObjectType.BOMB)) {
          if (checkCollisionWith(object)) {
            collision = true;
            break;
          }
        }
        if (!collision) {
          Position pos =
              new Position((position.getX() + 32) / 64 * 64, (position.getY() + 32) / 64 * 64);
          Action action =
              new Action(
                  ActionType.CREATE_BOMB, new Object[] {pos, IDGenerator.getId(), bombPower, id});
          queue.put(action);
          bombs--;
          canPlace = false;
          System.out.println("placed");
        }
      }
    }

    if (updatePosition == false) {
      switch (state) {
        case DOWN:
          state = BombermanState.IDLE_DOWN;
          updatePosition = true;
          break;
        case LEFT:
          state = BombermanState.IDLE_LEFT;
          updatePosition = true;
          break;
        case RIGHT:
          state = BombermanState.IDLE_RIGHT;
          updatePosition = true;
          break;
        case UP:
          state = BombermanState.IDLE_UP;
          updatePosition = true;
          break;
        default:
          break;
      }
    }
  }