world.java

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

JAVA
1,063
字号
    else if (drawState == DRAW_STATE_OVER)
    {
      stopCyc++;
      if (stopCyc > 80) {
        gameScreen.close(); //释放主线程
        actor = null;
      }
    }
  }

  private void checkPropArray()
  {
    if (propArray != null) {
      for (int i = 0; i < propArray.length; i++)
      {
        if (propArray[i] != null && !propArray[i].isExist())
        {
          propArray[i] = null;
        }
        else if (propArray[i] != null)
        {
          propArray[i].cycle();
        }
      }
    }
  }

  private void renderProp(Graphics gra)
  {
    for (int i = 0; i < propArray.length; i++)
    {
      if (propArray[i] != null)
      {
        propArray[i].render(gra);
      }
    }
  }

  private void checkBombAndBlastArray()
  {
    for (int i = 0; i < MAX_BOMB_NUM; i++)
    {
      if (bombArray[i] != null)
      {
        if (bombArray[i].isBlast())
        {
          bombArray[i] = null;
          bombNum--;
        }
        else
        {
          bombArray[i].cycle();
        }
      }
     if (blastArray[i] != null)
     {
        if (blastArray[i].isLive() == false)
        {
          blastArray[i] = null;
        }
        else
        {
          blastArray[i].cycle();
        }
      }
    }
  }

  private void checkViewPoint()
  {
//    if (actor.getX() > viewX + viewWidth / 2 && viewX + viewWidth < worldWidth) {
//      viewX = actor.getX() - viewWidth / 2;
//    }
//    if (actor.getX() < viewX + viewWidth / 2 && viewX > 0) {
//      viewX = actor.getX() - viewWidth / 2;
//    }
//    if (actor.getY() > viewY + viewHeight / 2 &&
//        viewY + viewHeight < worldHeight) {
//      viewY = actor.getY() - viewHeight / 2;
//    }
//    if (actor.getY() < viewY + viewHeight / 2 && viewY > 0) {
//      viewY = actor.getY() - viewHeight / 2;
//    }
//    if (viewX < 0) {
//      viewX = 0;
//    }
//    if (viewY < 0) {
//      viewY = 0;
//    }
//    if (viewX + viewWidth > worldWidth) {
//      viewX = worldWidth - viewWidth;
//    }
//    if (viewY + viewHeight > worldHeight) {
//      viewY = worldHeight - viewHeight;
//    }
    if(actor.getX() < worldWidth - gameScreen.width / 2 && actor.getX() > gameScreen.width / 2)
    {
      viewX = actor.getX() - gameScreen.width / 2;
    }
    if(actor.getY() < worldHeight - gameScreen.height / 2 && actor.getY() > gameScreen.height / 2)
    {
      viewY = actor.getY() - gameScreen.height / 2;
    }
  }

  private void checkEnemyArray()
  {
    for (int i = 0; i < enemyArray.length; i++)
    {
      if (enemyArray[i] != null)
      {
        if (enemyArray[i].isDisuse())
        {
          enemyArray[i] = null;
          enemyNum--;
        }
        else
        {
          enemyArray[i].cycle();
        }
      }
    }
  }

  private void renderDestroy(Graphics gra)
  {

    if (hasDestroy)
    {
      for (int i = 0; i < 4; i++)
      {
        if (destroyBrickX[i] != -1 && destroyBrickY[i] != -1)
        {
          destroyBrick.draw(gra, destroyBrickX[i] - viewX
                            , destroyBrickY[i] - viewY
                            , Graphics.TOP | Graphics.LEFT);
        }
      }
    }
  }

  private void renderEnemy(Graphics gra)
  {
    for (int i = 0; i < enemyArray.length; i++)
    {
      if (enemyArray[i] != null)
      {
        enemyArray[i].render(gra);
      }
    }
  }

  private void renderGate(Graphics gra)
  {
    imageSet.draw(gra, PROP_GATE, 0, gateX - viewX, gateY - viewY
                  , Graphics.TOP | Graphics.LEFT);
  }

  private void renderMap(Graphics gra)
  {
    for (int i = 0; i < map.length; i++)
    {
      for (int j = 0; j < map[i].length; j++)
      {
        int x = j * tileWidth;
        int y = i * tileHeight;
        if (x < viewX + viewWidth + 30 && x > viewX - 30
            && y < viewY + viewHeight + 30 && y > viewY - 30)
        {
          if (map[i][j] == TILE1)
          {
            imageSet.draw(gra, TILE_1, 0
                          , x - viewX, y - viewY
                          , Graphics.TOP | Graphics.LEFT);
          }
          if (map[i][j] == TILE2)
          {
            imageSet.draw(gra, TILE_2, 0
                          , x - viewX, y - viewY
                          , Graphics.TOP | Graphics.LEFT);
          }
        }
      }
    }
  }

  private void renderMessage(Graphics gra)
  {
    //	gra.setColor(0x000000);
    //	gra.drawString("SCORE:"+score,10,10,Graphics.TOP|Graphics.LEFT);
    //	gra.drawString("LIFE:"+playerLife,80,10,Graphics.TOP|Graphics.LEFT);
    int n5 = (score % 100000) / 10000;
    int n4 = (score % 10000) / 1000;
    int n3 = (score % 1000) / 100;
    int n2 = (score % 100) / 10;
    int n1 = score % 10;
    imageSet.draw(gra, MONEY, 0, 10, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n5, 25, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n4, 35, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n3, 45, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n2, 55, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n1, 65, 5, Graphics.TOP | Graphics.LEFT);

    n3 = ( (clock / 20) % 1000) / 100;
    n2 = ( (clock / 20) % 100) / 10;
    n1 = ( (clock / 20) % 10);
    imageSet.draw(gra, CLOCK, 0, 85, 5, Graphics.TOP | Graphics.LEFT);
    if ( (clock / 20) > 30) {
      imageSet.draw(gra, NUMBER, n3, 100, 5, Graphics.TOP | Graphics.LEFT);
      imageSet.draw(gra, NUMBER, n2, 110, 5, Graphics.TOP | Graphics.LEFT);
      imageSet.draw(gra, NUMBER, n1, 120, 5, Graphics.TOP | Graphics.LEFT);
    }
    else {
      imageSet.draw(gra, NUMBER_RED, n3, 100, 5, Graphics.TOP | Graphics.LEFT);
      imageSet.draw(gra, NUMBER_RED, n2, 110, 5, Graphics.TOP | Graphics.LEFT);
      imageSet.draw(gra, NUMBER_RED, n1, 120, 5, Graphics.TOP | Graphics.LEFT);
    }

    n1 = (playerLife % 10);
    imageSet.draw(gra, HEART, 0, 150, 5, Graphics.TOP | Graphics.LEFT);
    imageSet.draw(gra, NUMBER, n1, 165, 5, Graphics.TOP | Graphics.LEFT);
  }

  public void render(Graphics gra) {
    if (drawState == DRAW_STATE_GAME) {
      gra.setColor(0xa8771c);
      gra.fillRect(0, 0, viewWidth, viewHeight);

      renderGate(gra);
      renderProp(gra);
      renderMap(gra);
      renderBomb(gra);
      renderDestroy(gra);
      renderBlast(gra);
      renderEnemy(gra);
      actor.render(gra);
      renderMessage(gra);
    }
    else if (drawState == DRAW_STATE_MESSAGE) {
      renderStageChange(gra);
    }
    else if (drawState == DRAW_STATE_OVER) {
      renderGameOver(gra);
    }
  }

  public void keyPressed(int key) {
    actor.keyPressed(key);
  }

  public void keyReleased(int key) {
    actor.keyReleased(key);
  }

  public void pause() {
    isPause = true;
    actor.pause();
  }

  public void resume() {
    isPause = false;
    actor.resume();
  }

  public void addBomb(int x, int y, int power) {
    if (x == gateX && y == gateY) {
      if (enemyNum == 0) {
        stageOver();
        return;
      }
    }
    else {
      for (int i = 0; i < MAX_BOMB_NUM; i++) {
        if (bombArray[i] == null) {
          bombArray[i] = new Bomb(this, x, y, power);
          break;
        }
      }
      bombNum++;
    }
  }

  public void addBlast(int x, int y, int power) {
    for (int i = 0; i < MAX_BOMB_NUM; i++) {
      if (blastArray[i] == null) {
        blastArray[i] = new Blast(this, x, y, power);
        break;
      }
    }
  }

  private void renderBomb(Graphics gra) {
    for (int i = 0; i < MAX_BOMB_NUM; i++) {
      if (bombArray[i] != null) {
        bombArray[i].render(gra);
      }
    }
  }

  private void renderBlast(Graphics gra)
  {
    for (int i = 0; i < MAX_BOMB_NUM; i++)
    {
      if (blastArray[i] != null)
      {
        blastArray[i].render(gra);
      }
    }
  }

  private void renderGameOver(Graphics gra)
  {
    gra.setColor(0x000000);
    gra.fillRect(line, 0, 5, 200);
    imageSet.draw(gra, GAMEOVER, 0, viewWidth / 2, viewHeight / 2
                  , Graphics.VCENTER | Graphics.HCENTER);
    line += 5;
  }

  private void renderStageChange(Graphics gra)
  {
    Graphics imageGra = stageChangeImage.getGraphics();
    imageGra.setColor(0x000000);
    imageGra.fillRect(0, 0, viewWidth, viewHeight);
    imageSet.draw(imageGra, STAGE, 0, viewWidth / 2 - 4, viewHeight / 2
                  , Graphics.VCENTER | Graphics.HCENTER);
    imageSet.draw(imageGra, NUMBER, gameMap.getCurrentStage()
                  , viewWidth / 2 + 30, viewHeight / 2 + 1
                  , Graphics.HCENTER | Graphics.VCENTER);
    imageSet.draw(imageGra, LIFE, 0, viewWidth / 2 - 4, viewHeight / 2 + 50
                  , Graphics.VCENTER | Graphics.HCENTER);
    imageSet.draw(imageGra, NUMBER, playerLife, viewWidth / 2 + 25,
                  viewHeight / 2 + 59
                  , Graphics.VCENTER | Graphics.HCENTER);

    gra.drawImage(stageChangeImage, 0, 0, Graphics.TOP | Graphics.LEFT);
  }

  public Actor getActor()
  {
    return actor;
  }

  public Enemy[] getEnemyArray()
  {
    return enemyArray;
  }

  private boolean collidesWithBomb(int tileX, int tileY, boolean isActor)
  {
   int bx = tileY * tileHeight;
    int by = tileX * tileWidth;
    for (int i = 0; i < bombArray.length; i++)
    {
      if (bombArray[i] != null)
      {
        if (bombArray[i].getX() == bx && bombArray[i].getY() == by)
        {
          if (isActor)
          {
            if (bombArray[i].getAcross())
            {
              return false;
            }
            else
              return true;
          }
          else
          {
            return true;
          }
        }
      }
    }
    return false;
  }

  private boolean collidesWithDestroyBrick(int tileX, int tileY)
  {
    if (hasDestroy == false)
    {
      return false;
    }
    int x = tileY * tileWidth;
    int y = tileX * tileHeight;
    for (int i = 0; i < 4; i++)
    {
      if (destroyBrickX[i] >= 0
          && destroyBrickX[i] == x
          && destroyBrickY[i] >= 0
          && destroyBrickY[i] == y)
      {
        return true;
      }
    }
    return false;
  }

  private boolean collidesWithProp(int tileX, int tileY)
  {
    int x = tileY * tileWidth;
    int y = tileX * tileHeight;
    for (int i = 0; i < propArray.length; i++)
    {
      if (propArray[i] != null && x == propArray[i].getX()
          && y == propArray[i].getY())
      {
        propArray[i].action();
        return true;
      }
    }
    return false;
  }

  public boolean canAcross(int tileX, int tileY, boolean isActor)
  {
    if (isActor && propArray != null)
    {
      collidesWithProp(tileX, tileY);
    }

    if (map[tileX][tileY] == TILE1)
      return false;
    if (map[tileX][tileY] == TILE2)
      return false;
    if (collidesWithBomb(tileX, tileY, isActor))
      return false;
    if (collidesWithDestroyBrick(tileX, tileY))
      return false;
    return true;
  }

  public static boolean collidesRect(int[][] a, int[][] b)
  {
    if (a.length > 4 || b.length > 4)
    {
      System.out.println("error7");
      return false;
    }
    int ax1 = a[0][0];
    int ay1 = a[0][1];
    int ax2 = a[1][0];
    int ay2 = a[1][1];
    int ax3 = a[2][0];
    int ay3 = a[2][1];
    int ax4 = a[3][0];
    int ay4 = a[3][1];
    for (int i = 0; i < b.length; i++)
    {
      if (b[i][0] >= ax1 && b[i][0] <= ax2 && b[i][1] >= ay1 && b[i][1] <= ay4)
      {
        return true;
      }
    }
    return false;
  }

  public int getEnemyNum()
  {
    return enemyNum;
  }

  public int getScore()
  {
    return score;
  }

  public void addScore(int buf)
  {
    score = buf + score;
    if (score > MAX_SCORE)
    {
      score = MAX_SCORE;
    }
  }

  public int getDrawState()
  {
    return drawState;
  }

  public void stageOver()
  {
    if (actor.isLive() == false)
    {
      playerLife--;
      if (playerLife == 0)
      {
        gameOver();
      }
      else
      {
        initStage(gameMap.getCurrentStage());
      }
    }
    else if (enemyNum == 0)
    {
      addScore( (clock / 20) * 10);
      int i = gameMap.getCurrentStage();
      if (i + 1 <= gameMap.getTotalStageNum())
      {
        initStage(i + 1);
      }
      else
      {
        gameOver();
      }
    }
  }

  public void gameOver()
  {
    stopCyc = 0;
    drawState = DRAW_STATE_OVER;
  }

  public int getBombNum()
  {
    return bombNum;
  }

  public void addPlayerLife()
  {
    playerLife++;
    if (playerLife > MAX_LIFE)
    {
      playerLife = MAX_LIFE;
    }
  }
}

⌨️ 快捷键说明

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