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

📄 tanksprite.java

📁 这是我在原来单位的时候写的一个坦克大战的J2ME游戏的代码,可以给其他作J2ME游戏的人作个参考
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
				
				undo();
				bCollided=true;
			}
			break;
		default:
			break;
		}
		
		 
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return bCollided;
 }
 


  private void enemy_process() {
		// 沿某个角度运行,碰撞后改变坦克运行方向
		int iAngel = 0;
		boolean bCollided = false;

		switch (GameLogic.m_gameLevel) {
		case GameLogic.GAME_LEVEL_EASY:
			bCollided = enenmy_easy_process();
			break;
		case GameLogic.GAME_LEVEL_NORMAL:
			bCollided = enemy_middle_process();
			break;
		case GameLogic.GAME_LEVEL_HARD:
			break;
		default:
			break;
		}

		if (GameLogic.collidesWith(this, m_tankOwner) || true == bCollided) {
			if (GameLogic.GAME_LEVEL_EASY == GameLogic.m_gameLevel) {
				iAngel = getReverseAngel(m_currentAngel);
				move(iAngel, 4);
			}
			if (GameLogic.GAME_LEVEL_NORMAL == GameLogic.m_gameLevel) {
				/**
				 * if enemy tank collides with user tank,continue its original
				 * direction
				 */
				if (true == m_underAttack) {
					m_underAttackFrame = 0;// adjust its tracking path the case
				} else if (true == m_backToNormal) {
					{
						m_backFrame = 0;
					}
				}
				else{
					iAngel = getReverseAngel(m_currentAngel);
					move(iAngel, 4);
				}

			}
		} else {
			if (GameLogic.GAME_LEVEL_EASY == GameLogic.m_gameLevel) {
				move(m_currentAngel, 2);
			}
			if (GameLogic.GAME_LEVEL_NORMAL == GameLogic.m_gameLevel) {
				if (true == m_underAttack || true == m_backToNormal) {
					;
				} else {
					move(m_currentAngel, 2);
				}
			}
		}

	}


  // FSM releated functions
  /**
	 * (1)在主线程中循环调用。 (2)根据当前tank状态作处理. if(firing) 子弹继续运行。 else 不做处理。
	 * 
	 * (3)处理子弹的返回状态。 if(bullet is not alive) 重新设置tank的状态。tank可以重新发射了。
	 * 
	 */
  private void process() {
    try {
      if (false == isVisible()) {
        setVisible(true);
      }
      //运行enemy tank的移动LOOP
      if (m_tankOwner == GameLogic.ENEMY_TANK) {
        enemy_process();
        GameLogic.collidesWith(this, m_tankOwner);
      }

      int iBulletAvailable = m_bulletCount;

      for (int i = 0; i < m_bulletCount; i++) {
        //子弹已经停止运行
        if (GameLogic.GAME_STATE_READY == m_bullet[i].getGameState() ||
            m_bullet[i].getGameState() < 0) {
          iBulletAvailable--;
        }
        m_bullet[i].run();
      }
      //该组子弹全部消失了
      if (0 == iBulletAvailable) {
        m_bulletLocked = false;
        m_curretBullet = 0;
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public void run() {

    if (!m_threadAlive) {
      return;
    }

    switch (m_currentState) {
      case GameLogic.GAME_STATE_READY:

        //准备下一组子弹;
        m_curretBullet = 0;
        m_bulletLocked = false; //允许发射子弹
        m_timerTask = null;
        setVisible(true);
        break;
      case GameLogic.GAME_STATE_LOOP:
        process();
        break;
      case GameLogic.GAME_STATE_END:
        stop();
        break;
      case GameLogic.GAME_STATE_PAUSE:
        displayScene();
        break;
      default:
        break;
    }
  }

   private  void releaseLighteningSprite() {


      if (null != m_lighteningImageSprite) {
        GameLogic.m_layerManager.remove(m_lighteningImageSprite);
      }

    m_lighteningImageSprite = null;
  }

  private  void displayLighteningScene() {

    int x = getRefPixelX();
    int y = getRefPixelY();

    try {



      if (false == m_lighteningImageSprite.isVisible()) {
        m_lighteningImageSprite.setVisible(true);

      }

      m_lighteningImageSprite.setRefPixelPosition(x, y);
      m_tankLightFrame++;

      if (NUM_OF_LIGHT_FRAMES >= m_tankLightFrame) {
        m_lighteningImageSprite.nextFrame();
      }
      else {
        m_tankLightFrame = 0;
        m_lighteningImageSprite.setVisible(false);
        m_bLighteningStarted=false;

        if(0==m_tankBlood){
          reset();//new life

        }
        else{
          start();
        }
      }

    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }


  private void createLighteningSprite() {
    try {
      final int LIGHTENING_IMAGE_WIDTH = 89;
      final int LIGHTENING_IMAGE_HEIGHT = 278;
      //lightening image



      m_lighteningImageSprite = new Sprite(GameLogic.m_lighteningImage,
                                              LIGHTENING_IMAGE_WIDTH,
                                              LIGHTENING_IMAGE_HEIGHT);
      m_lighteningImageSprite.defineReferencePixel(52, 278);
      m_lighteningImageSprite.setVisible(false);
      GameLogic.m_layerManager.insert(m_lighteningImageSprite, 0);

    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }





  public void startBombScene(){
    if(true==m_bBombStarted){
      return;
    }
    m_bBombStarted=true;
    m_tankBombFrame=0;
    
    /**
     * bomb sound
     */
    if(GameLogic.m_soundOn==true){
    	GameLogic.m_player.threadPlay();
    }
    
    pause();
  }

  public void startLighteningScene(){
    //is lightening ,
    if(true==m_bLighteningStarted){
      return;
    }

    m_bLighteningStarted=true;
    m_tankLightFrame=0;
    pause();
  }

  private  void displayBombScene(int x, int y) {

    try {
      if(null==m_bombSprite){
        return ;
      }

      m_tankBombFrame++;

      if (false == m_bombSprite.isVisible()) {
        m_bombSprite.setVisible(true);
      }
      if(true==isVisible()){
        setVisible(false);
      }

      m_bombSprite.setRefPixelPosition(x, y);

      if (m_tankBombFrame <= NUM_OF_BOMB_FRAMES) {
        m_bombSprite.nextFrame();
      }
      else {
        reset();
        m_bBombStarted=false;
        m_tankBombFrame=0;
        m_bombSprite.setVisible(false);
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }


  private void displayScene(){
    try {
        if(true==m_bBombStarted){
            displayBombScene(getRefPixelX(),getRefPixelY());
        }
        if(true==m_bLighteningStarted){
            displayLighteningScene();
        }
        //when tanks are displaying scenes remains in the pause state
        if(m_bBombStarted==true||true==m_bLighteningStarted){
          pause();
        }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }


  protected void reset() {
    m_tankBombFrame = 0;
    //reset user tank's status
    m_tankBlood = GameLogic.tank_type[m_tankType][GameLogic.
        TANK_PROPERTY_BASIC_BLOOD]; //current life's blood
    m_bombCount = GameLogic.tank_type[m_tankType][GameLogic.
        TANK_PROPERTY_BOMB_COUNT]; //the bomb count of current life
    m_bulletCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_FREQUENCY];
    m_bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_SPEED];
    m_tankSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_MOVE_PIXEL];

    m_currentState = GameLogic.GAME_STATE_READY;

    if (m_tankOwner == GameLogic.ENEMY_TANK) {
      m_currentDirection = GameLogic.TANK_DIRECTION_DOWN;
      m_currentAngel = Sprite.TRANS_ROT180;
      m_underAttack=false;
      m_underAttackFrame=0;
      m_destRow=0;
      m_destCol=0;
      m_bulletDelayFrame=0;
      
      m_backToNormal=false;
      m_backFrame=0;

      int x_pos = 0, y_pos = 0;
      x_pos = GameLogic.m_enemyStartPlace[m_tankIndex][GameLogic.
          ENEMY_TANK_LOCATION_PROPERTY_COL] *
          GameLogic.MAP_CELL_WIDTH
          + GameLogic.MAP_CELL_WIDTH / 2;
      y_pos = GameLogic.m_enemyStartPlace[m_tankIndex][GameLogic.
          ENEMY_TANK_LOCATION_PROPERTY_ROW] *
          GameLogic.MAP_CELL_HEIGHT
          + GameLogic.MAP_CELL_HEIGHT / 2 + GameLogic.MAP_CELL_HEIGHT;

      setRefPixelPosition(x_pos, y_pos);
    }
    else {
      m_currentDirection = GameLogic.TANK_DIRECTION_UP;
      m_currentAngel = Sprite.TRANS_NONE;
      setRefPixelPosition(GameLogic.HEADQUARTERS_IMAGE_LOCATION_X -
                          GameLogic.TANK_WIDTH / 2,
                          (GameLogic.MAP_CELL_WIDTH + GameLogic.MAP_HEIGHT -
                           GameLogic.TANK_HEIGHT / 2)); //user tank start place
      /**handle the enemy tanks that have been attacked;
       * 1.if(the user tank is destroyed) all the attacked enemies stop tracking the user tank; 
       * 2.the enemy tank return to the restricted area;
       */
      if(null!=m_enemiesAttacked){
    	  for(int i=0;i<m_enemiesAttacked.size();i++){
    		  int enemyIndex=((Integer)m_enemiesAttacked.elementAt(i)).intValue();
    		  if(null!=GameLogic.m_enemySprite[enemyIndex]){
    			  GameLogic.m_enemySprite[enemyIndex].setUnderAttackFlag(false);
				  //change the enemy tank state from under attack to normal
				  GameLogic.m_enemySprite[enemyIndex].setBackToNormalFlag(true);
    		  }
    	  }
      }
    }

    /**
     * make all the tank related property uneffective
     * (1)missile
     * (2)double points
     * (3)strength bomb
     */
    if(m_bulletType==GameLogic.BULLET_TYPE_MISSILE){
      changeBullet(GameLogic.BULLET_TYPE_COMMON);
      m_missileCount=0;
    }
    m_invicible = m_doublePoints = false;
    m_init = false;
    m_bulletDamage = GameLogic.tank_type[m_tankType][GameLogic.
        TANK_PROPERTY_BASIC_ATTACT];
    m_bulletDamageAddTimes = 0;


    mLastWasTurn = false;
    // setFrame(m_defaultDirectionImage);
    getCurrentFrame();
    nextFrame();

    //reset user tank's bullets' status
    m_curretBullet = 0;
    //this tank's related bullet status reset to default
    for (int i = 0; i < m_bulletCount; i++) {
      m_bullet[i].reset();
    }
    setVisible(false);
  }

  private void releaseBombScene(){
    try {

      if(null!=m_bombSprite){
        GameLogic.m_layerManager.remove(m_bombSprite);
		m_bombSprite=null;
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private void createBombScene() {
      try {


        m_bombSprite = new Sprite(GameLogic.m_bombImage, BOMB_IMAGE_WIDTH,
                                  BOMB_IMAGE_HEIGHT);
        m_bombSprite.defineReferencePixel(BOMB_IMAGE_WIDTH / 2,
                                          BOMB_IMAGE_HEIGHT / 2);
        m_bombSprite.setVisible(false);
        GameLogic.m_layerManager.insert(m_bombSprite, 0);
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
    }

  protected void init(){
    defineReferencePixel(m_frameWidth / 2, m_frameHeight / 2);
    m_bulletCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_FREQUENCY];
    m_tankBlood = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_BLOOD];
    m_bombCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BOMB_COUNT];;//the bomb count of current life
    m_tankLife  = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_TANK_LIFE];//life left;
    m_bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_SPEED];//life left;
    m_tankSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_MOVE_PIXEL];//life left;
    m_tankPoints = 0;

    /**
     * tank display scene
     */
    m_tankBombFrame=0;
    m_tankLightFrame=0;

    mKX = mKY = mLastDelta = 0;
    m_startPositionX = m_startPositionY = 0;

    mLastWasTurn = m_bulletLocked = false;
    m_currentState = GameLogic.GAME_STATE_READY;

    m_currentDirection = GameLogic.TANK_DIRECTION_UP;
    m_currentAngel = Sprite.TRANS_NONE;
    m_curretBullet = 0;//第一颗子弹INDEX 为0


    m_init = false;
    m_invicible = false;
    m_doublePoints = false;
    m_bulletDamageAddTimes = 0;

    if(GameLogic.TANK_RETIRED <= m_tankType&& GameLogic.TANK_BABY>=m_tankType){
      m_defaultDirectionImage = GameLogic.RETIRED_TANK_IMAGE_UP_STILL;
      m_bulletOwner = GameLogic.USER_TANK_BULLET;
      m_tankOwner = GameLogic.USER_TANK;
      
      //for test
      m_invicible=true;
      if(m_tankType==GameLogic.TANK_BABY){
        createBabyBullet();
      }else{
        createCommonBullet();
      }
    }else if(GameLogic.TANK_ENEMY_TYPE1 == m_tankType ||
             GameLogic.TANK_ENEMY_TYPE2 == m_tankType ||
             GameLogic.TANK_ENEMY_TYPE3 == m_tankType ){
      m_defaultDirectionImage = GameLogic.TANK_ENEMY_TYPE1_IMAGE_DOWN_STILL;
      m_bulletOwner = GameLogic.ENEMY_TANK_BULLET;
      m_tankOwner = GameLogic.ENEMY_TANK;
      createCommonBullet();
      m_bulletDelayFrame=0;
    }

    //determine default direction image according to enemy tank type

    if (m_tankOwner == GameLogic.ENEMY_TANK) {
     m_currentAngel = Sprite.TRANS_ROT180;////enemy tank move down at first
     m_currentDirection = GameLogic.TANK_DIRECTION_DOWN;
     m_bulletOwner = GameLogic.ENEMY_TANK_BULLET;
     m_tankLife = 1;//enemy tank only have one life
   }

    m_missileCount=0;

    setFrame(m_defaultDirectionImage);
    getCurrentFrame();
  }

  //(1)发射的时候,跟踪器随机锁住敌方坦克
//(2)三发导弹逐一击中目标.
//(3)
  private void createMissiles() {
    m_bulletType = GameLogic.BULLET_TYPE_MISSILE;
    try {
      m_bullet = new BulletSprite[m_bulletCount];


      int bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.
          TANK_PROPERTY_ATTACT_SPEED];
      m_bulletDamage = GameLogic.BULLET_MISSILE_DAMAGE;

      for (int i = 0; i < m_bulletCount; i++) {
        m_bullet[i] = new BulletSprite(GameLogic.m_bulletImage_missile, MISSILE_WIDTH,
                                       MISSILE_HEIGHT,
                                       bulletSpeed, m_bulletDamage,
                                       m_bulletOwner, m_tankIndex, m_bulletType);
        BattleCanvas.m_layerManager.insert(m_bullet[i], 0);
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();

⌨️ 快捷键说明

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