⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ictankcanvas.java

📁 本j2me坦克游戏是在Nokia平台下开发的
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        }
      }
      if (timeCount == 40) {
        // now how many enemy tankers are alive
        liveCount = 0;
        for (i = 0; i < maxEnemy; i++) {
          if (enemyAlive[i]) {
            liveCount++;
          }
        }

        timeCount = 0;
        if (maxEnemy < maxShowEnemy && maxEnemy < numEnemy) {
          maxEnemy++;

          //enemy[maxEnemy-1] = new Enemy(kind);
          //System.out.println("numPos1="+numPos);
          enemy[maxEnemy - 1] = enemy[numPos];
          numPos++;

          enemy[maxEnemy - 1].alive = true;
          enemyAlive[maxEnemy - 1] = true;
          int pos = (maxEnemy - 1) % 3;
          switch (pos) {
            case 0:
              enemy[maxEnemy - 1].posX = mapOffsetX + mapWidth / 2 -
                  enemy[maxEnemy - 1].frameWidth / 2;
              enemy[maxEnemy - 1].posY = mapOffsetY + enemy[maxEnemy -
                  1].frameHeight;
              break;

            case 1:
              enemy[maxEnemy - 1].posX = mapOffsetX;
              enemy[maxEnemy - 1].posY = mapOffsetY + enemy[maxEnemy -
                  1].frameHeight;
              break;

            case 2:
              enemy[maxEnemy - 1].posX = mapOffsetX + mapWidth - enemy[maxEnemy -
                  1].frameWidth;
              enemy[maxEnemy - 1].posY = mapOffsetY + enemy[maxEnemy -
                  1].frameHeight;
            default:
              break;
          }
          //if in the timer process, the new born tanker should also be timered
          if (ifTimer) {
            enemy[maxEnemy - 1].ifTimer = true;
          }
          for (int i0 = 0; i0 < maxEnemy - 1; i0++) {
            if (enemyAlive[i0]) {
              if (enemy[i0].isobjCollide(enemy[maxEnemy - 1].posX,
                                         enemy[maxEnemy - 1].posY)) {
                enemy[maxEnemy - 1].alive = false;
                enemyAlive[maxEnemy - 1] = false;
                enemy[maxEnemy - 1].ifTimer = false;
                maxEnemy--;
                numPos--;
                break;
              }
            }
          }
        }
      }
      //----add new enemy finished here

      for (i = 0; i < maxEnemy; i++) {
        if (enemyAlive[i]) {
          enemy[i].paint(g);

          // Check tank collision
          for (j = 0; j < maxEnemy; j++) {
            if (i == j) {
              continue;
            }
            if (enemy[j].alive) {
              //collide with enemy
              if (enemy[i].isobjCollide(enemy[j].posX, enemy[j].posY)) {
                enemy[i].direction = (enemy[i].direction ^ 7) & 3;
                if (enemy[i].direction == 0) {
                  enemy[i].direction = 4;
                }
              }
            }
          }

          //collide with hero
          if (enemy[i].isobjCollide(hero.posX, hero.posY) && (hero.status == 1)) {
            enemy[i].direction = (enemy[i].direction ^ 7) & 3;
            if (enemy[i].direction == 0) {
              enemy[i].direction = 4;

            }
            if (!cap) { //when there is no cap protection
              hero.status = 7;
              hero.direction = hero.direction & 0x0f;
              hero.count = 8;
            }
            else {
              hero.direction = (hero.direction ^ 7) & 3;
            }
          }

          if (bullet[0].alive &&
              (bullet[0].isobjCollide(enemy[i].posX, enemy[i].posY,
                                      enemy[i].frameWidth, enemy[i].frameHeight)) &&
              (!bullet[0].bombFlag)) {
            sD[0].stop();
            sD[1].stop();
            sD[0].play(1);

            //account the number of the beat tanker
            switch (enemy[i].kind) {
              case 0:
                normalNum++;
                break;
              case 1:
                redNum++;
                break;
              case 2:
                if (enemy[i].lifeCount == 1) {
                  greenNum++;
                }
                break;
              case 3:
                superNum++;
                break;
              default:
                break;
            }
            //add by johnson
            if (enemy[i].kind == 1) {
              reDraw = true;
              symboll.formerSymbolX = symboll.symbolX;
              symboll.formerSymbolY = symboll.symbolY;
              Random r = new Random();
              //restore later
              int num = Math.abs(r.nextInt() % 6) + 1;
              //int num = 3;
              symboll.symbolState = num;
              symboll.symbolX = Math.abs(r.nextInt() % (mapWidth - 50)) +
                  mapOffsetX;
              symboll.symbolY = Math.abs(r.nextInt() %
                                         (mapHeight - 50)) + mapOffsetY;
            }
            //end adding

            if (enemy[i].kind == 2) {
              enemy[i].lifeCount--;
              // System.out.println("enemy[i].lifeCount="+enemy[i].lifeCount);
              if (enemy[i].lifeCount != 0) {
                bullet[0].alive = false;
                g.fillRect(bullet[0].posX, bullet[0].posY, bullet[0].frameWidth,
                           bullet[0].frameHeight);
              }
            }

            if (enemy[i].lifeCount <= 0) {
              bullet[0].BposX = enemy[i].posX;
              bullet[0].BposY = enemy[i].posY;

              bullet[0].bombFlag = true;
              bullet[0].bombCount = 8;
              enemyAlive[i] = false;
              numEnemy--;

              enemyover = true;
            }

            if (numEnemy == 0) {
              gameWin = true;
              overtimer.timeCounter = 0;
            }

            g.fillRect(enemy[i].posX, enemy[i].posY, enemy[i].frameWidth,
                       enemy[i].frameHeight);

            if (enemy[i].lifeCount <= 0) {
              if (i != maxEnemy - 1) {
                enemy[i].posX = -1000;
                enemy[i].posY = -1000;
              }
            }

          }
        }
        else {
          if (numEnemy >= maxEnemy ||
              (numEnemy > 0 && liveCount < maxEnemy && liveCount < numEnemy)) {
            //add by johnson

            liveCount++;
            Random r = new Random();
            j = Math.abs(r.nextInt() % 3);

            enemy[i] = enemy[numPos];
            numPos++;
            switch (j) {
              case 0:
                enemy[i].posX = mapOffsetX + mapWidth / 2 -
                    enemy[0].frameWidth / 2;
                enemy[i].posY = mapOffsetY + 2;
                break;

              case 1:
                enemy[i].posX = mapOffsetX;
                enemy[i].posY = mapOffsetY + 2;
                break;

              case 2:
                enemy[i].posX = mapOffsetX + mapWidth - enemy[2].frameWidth;
                enemy[i].posY = mapOffsetY + 2;
              default:
                break;
            }

            enemy[i].alive = true;
            enemyAlive[i] = true;

            if (enemy[i].kind == 2) {
              enemy[i].lifeCount = 3;
            }
            if (ifTimer) {
              enemy[i].ifTimer = true;
            }
            // maxEnemy++;

            for (int i0 = 0; i0 < maxEnemy; i0++) {
              if (enemyAlive[i0] && (i != i0)) {
                if (enemy[i0].isobjCollide(enemy[i].posX, enemy[i].posY)) {
                  enemy[i].alive = false;
                  enemyAlive[i] = false;
                  numPos--;
                  break;
                  //          maxEnemy--;
                }
              }
            }
            //      System.out.println("produce a new tanker ok.");
          }
        }

      }

      if (bullet[0].alive) {
        if (bullet[0].isbomb) {
          sD[0].stop();
          sD[1].stop();
          sD[0].play(1);
          bullet[0].isbomb = false;
        }
        bullet[0].paint(g);
      }
      else {
        hero.shootFlag = false;
        bulletAlive[0] = false;
      }

      hero.paint(g);

      for (i = 1; i < maxBullet; i++) {
        if (bulletAlive[i]) {
          bullet[i].paint(g);
          if (!bullet[i].alive) {
            bulletAlive[i] = false;
            for (j = 0; j < maxEnemy; j++) {
              if (enemy[j].bulletNo == i && enemy[j].shootFlag == true) {
                enemy[j].shootFlag = false;
              }
            }
          }

          //shoot hero bullet
          if (bulletAlive[0] &&
              bullet[i].isobjCollide(bullet[0].posX, bullet[0].posY,
                                     bullet[0].frameWidth,
                                     bullet[0].frameHeight) &&
              (hero.status == 1) && (!bullet[i].bombFlag) &&
              (!bullet[0].bombFlag)) {
            bullet[i].alive = false;
            bullet[0].alive = false;
            bulletAlive[0] = false;
            bulletAlive[i] = false;

            g.fillRect(bullet[i].posX, bullet[i].posY, bullet[i].frameWidth,
                       bullet[i].frameHeight);
            g.fillRect(bullet[0].posX, bullet[0].posY, bullet[0].frameWidth,
                       bullet[0].frameHeight);
          }

          //shoot hero
          if (bullet[i].isobjCollide(hero.posX, hero.posY, hero.frameWidth,
                                     hero.frameHeight) && (hero.status == 1) &&
              (!bullet[i].bombFlag)) {
            bullet[i].alive = false;
            bulletAlive[i] = false;

            g.fillRect(bullet[i].posX, bullet[i].posY,
                       bullet[i].frameWidth, bullet[i].frameHeight);
            if (!cap) {
              //when hero is shoot, its star reset to 0
              bullet[0].starNum = 0;
              hero.status = 7;
              hero.direction = hero.direction & 0x0f;
              hero.count = 8;
            }
          }
        }
      }

      //repaint the grass
      /* for ( i = 0; i < mapHeight/3; i += 2 ){
           for (j = 0; j < mapWidth / 3; j += 2) {
               switch (mapInfo[ (i * mapWidth / 3) + j]) {
                   case 3:
                       g.drawImage(tile4, mapOffsetX + j * 3,
                                   mapOffsetY + i * 3, g.TOP | g.LEFT);
                       break;
                   default:
                       break;
               }
           }
       }*/
      if (grassPaint) {
        reDraw(3, g);
      }

      if (gameWin || gameLose) {
        // Load the winlose image
        try {
          /*if (gameWin)
              winlose = Image.createImage("/win.png");
                           if (gameLose)
              winlose = Image.createImage("/lose.png");*/
          if (gameLose) {
            bullet[0].starNum = 0; //reset the bullet speed
          }
        }
        catch (Exception exception) {
          System.out.println(exception);
        }

        bullet[0].paint(g);

        //title_x = winlose.getWidth()/2 ;
        //title_y = winlose.getHeight()/2 ;


        /*     for ( i = 1; i < maxBullet; i ++ ){
                 if ( bulletAlive[i] )
                 bullet[i].paint(g);
             }*/

        if (gameLose) {
          canmove = false;

        }
        if (overtimer.timeCounter == 5) {
          title_w = 0;
          title_h = 0;
          gameSubStatus = 1;
          firstTime = true;
          gameStatus = 4;
        }
      }
    }
  }

  private void resultPaint(Graphics g) {
    switch (gameSubStatus) {
      case 1:
        if (firstTime) {
          g.setColor(0x3f, 0x3f, 0x3f);
          g.fillRect(0, 0, width, height);
          g.setColor(0x0);
          g.fillRect(mapOffsetX, mapOffsetY, mapWidth, mapHeight);
          firstTime = false;
          ictimer.timeCounter = 0;
        }
        g.setColor(0xff8080);
        g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
                               Font.SIZE_MEDIUM));
        //  g.drawString("HI SCORE:20000", width/2, (height-ic.getHeight()-fontHeight)/2-3, g.TOP|g.HCENTER);

        g.drawString("最高分:20000", width / 2, mapOffsetY + 5, g.TOP | g.HCENTER);
        g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
                               Font.SIZE_SMALL));
        g.drawString("关数:" + level, width / 2, mapOffsetY + 7 + fontHeight,
                     g.TOP | g.HCENTER);
        g.drawImage(ImageHelper.enemyUp, width / 2 + 25,
                    mapOffsetY + 10 + 2 * fontHeight, 20);
        g.drawImage(ImageHelper.enemyUpRed, width / 2 + 25,
                    mapOffsetY + 20 + 3 * fontHeight, 20);
        g.drawImage(ImageHelper.enemyUpIron, width / 2 + 25,
                    mapOffsetY + 30 + 4 * fontHeight, 20);
        g.drawImage(ImageHelper.enemyUp, width / 2 + 25,
                    mapOffsetY + 40 + 5 * fontHeight, 20);
        g.drawString("得分", mapOffsetX + mapWidth / 4 + 10,
                     mapOffsetY + 10 + 2 * fontHeight, g.TOP | g.HCENTER);
        g.drawString("得分", mapOffsetX + mapWidth / 4 + 10,
                     mapOffsetY + 20 + 3 * fontHeight, g.TOP | g.HCENTER);
        g.drawString("得分", mapOffsetX + mapWidth / 4 + 10,
                     mapOffsetY + 30 + 4 * fontHeight, g.TOP | g.HCENTER);
        g.drawString("得分", mapOffsetX + mapWidth / 4 + 10,
                     mapOffsetY + 40 + 5 * fontHeight, g.TOP | g.HCENTER);

        int total = superNum + greenNum + redNum + normalNum;
        int totalMark1 = superNum * 400 + greenNum * 300 + redNum * 200 +
            normalNum * 100 + bonusMark;
        if (gameWin) {
          totalMark = totalMark + totalMark1;
        }
        else {
          totalMark = 0;
        }
        switch (ictimer.timeCounter) {
          case 7:
            ictimer.timeCounter = 0;
            gameSubStatus++;
          case 6:
            g.drawString("总共", mapOffsetX + mapWidth / 4 + 15,
                         mapOffsetY + 70 + 5 * fontHeight, g.TOP | g.HCENTER);
            g.drawString(String.valueOf(total),
                         mapOffsetX + 3 * mapWidth / 8 + 20,
                         mapOffsetY + 70 + 5 * fontHeight, g.TOP | g.HCENTER);
            g.drawString(String.valueOf(totalMark1), mapOffsetX + mapWidth / 8,
                         mapOffsetY + 70 + 5 * fontHeight, g.TOP | g.HCENTER);

          case 5:
            g.drawLine(mapOffsetX + mapWidth / 20

⌨️ 快捷键说明

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