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

📄 critter.java

📁 Critter_Crunch_J2ME 游戏源
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
      if((m_state & STATE_WESTWARD) != 0) {
         if(m_x <= m_destination_x) stop();
         else                       m_next_x -= m_speed;
      }
      if((m_state & STATE_EASTWARD) != 0) {
         if(m_x >= m_destination_x) stop();
         else                       m_next_x += m_speed;
      }
      if((m_state & STATE_SPAT) != 0) {
         c = Level.getLowest(m_board_x);
         if(m_type == TYPE_ITEM && (m_id == ITEM_SEED || m_id == ITEM_PEPPER)) {
            while(c != null && !c.mutable() && ((c.m_state & STATE_EATING) == 0) && c.m_board_y != 0) {
               c = Level.boardRetrieve(c.m_board_x, c.m_board_y - 1);
            }
         }
         if(m_y == m_destination_y || (c != null && Engine.collide(c.getBox(), getBox()))) endSpit(c);
      }
      if((m_state & STATE_CLIMBING) != 0) {
         if(m_y <= m_destination_y) {
            m_state &= ~STATE_CLIMBING;
            m_state |= STATE_DONE_CLIMB;
            Level.s_board_state |= (Level.BOARD_EAT_CLIMBERS);
         }
      }
      if((m_state & STATE_CHEWING) != 0) {
         if(m_timer == 0) {
            m_state &= ~STATE_CHEWING;
            if((m_state & STATE_CHILI_BLAST) != 0) {
               makeFull();
               Level.s_board_state |= (Level.BOARD_EXPLODE_CHILIS);
               
               // fire effect
               Particles.create(Particles.TYPE_FIRE_LEFT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
               Particles.create(Particles.TYPE_FIRE_RIGHT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
            }
            else {
               if(full()) {
                  if(m_id == CREATURE_TNT) sentence();
                  else                     Level.s_board_state |= (Level.BOARD_EXPLODE_FULL);
               }
               else {
                  setIdleAnim();
                  if((m_state & STATE_POISONED) != 0) {
                     m_state |= STATE_FLASHING;
                     toxicPoison(TIME_POISON_TIMER);
                  }
               }
            }
         }
      }
      if((m_state & STATE_EATING) != 0) {
         if(m_timer == 0) {
            m_state &= ~STATE_EATING;
            c = Level.boardRetrieve(m_board_x, m_board_y - 1);
            
            if( ((m_state & STATE_FOOD_CHAIN) != 0) && ((m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && c != null && c.mutable()) {
               c.m_state |= STATE_FOOD_CHAIN;
               if((m_state & STATE_BONUS) != 0) c.m_state |= STATE_BONUS;
               Particles.create(Particles.TYPE_FOOD_CHAIN_TEXT, Particles.LAYER_HUD, c.m_x<<Engine.FP_SHIFT, (c.m_y+Level.SQUARE_H)<<Engine.FP_SHIFT);
               eat(c);
               
               // throw in extra process call when eating a red Critter in a 
               // food chain to synch him up with any Critters below.
               process();
            }
            else {
               if( ((m_state & STATE_FOOD_CHAIN) != 0) && ((m_size & SIZE_BIG) == SIZE_BIG || m_id == CREATURE_TNT)) {
                  makeFull();
                  Level.s_combo = 2;
               }
               if(!full() && (m_state & STATE_CHILI_BLAST) == 0) m_state &= ~STATE_IMMOBILE;
               m_state |= STATE_CHEWING;
               //#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
               setAnim(Anims.GREEN_CHEWING);
               //#endif
               m_timer = (short)TIME_CHEW;
            }
         }
      }
      if((m_state & STATE_SPAWN_DROP) != 0) {
         if(//m_board_x == Level.s_player.m_board_x &&
            Engine.collide(getBox(), Level.s_player.getBox())) {
            //#if Nokia_3100 || Nokia_3100_Unobfuscated
//#             if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_3) || m_id == Critter.ITEM_COIN) {
//#                Engine.printLine("playing gem grab 1");
//#                Engine.playSound(Engine.SOUND_GRAB_GEM);
//#             }
//#             else {
//#                Engine.playSound(Engine.SOUND_GRAB_POWERUP);
//#             }
            //#endif
            pickup();
         }
      }
      if((m_state & STATE_BONUS) != 0) {
         
         Particles.create(Particles.TYPE_SPECIAL_GLOW, Particles.LAYER_MIDGROUND, (m_x<<Engine.FP_SHIFT),(m_y<<Engine.FP_SHIFT));
      }
      
      // process special timer stuff.
      //if(Level.s_type != Level.TYPE_TUTORIAL && Level.s_state == Level.STATE_ACTIVE) 
      if(m_special_timer > 0) m_special_timer--;
         
      if((m_state & STATE_TOXIC) != 0) {
         if(m_special_timer == TIME_TOXIC_FLASH) {
            m_state |= STATE_FLASHING;
         }
         else if(m_special_timer == 0) {
            if((m_state & STATE_TOXIC) != 0) {
               Level.s_board_state |= (Level.BOARD_POISON);
            }
         }
         
         Particles.create(Particles.TYPE_TOXIC_HAZE, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), (((m_board_x+1)*(m_board_y+1))+Engine.s_engine.m_state_timer)%Particles.TOXIC_HAZE_FRAMES);
         
      }  
      if((m_state & STATE_POISONED) != 0) {
         if(m_special_timer == 0) {
            if(!full()) toxicMorph();
         }
      }  
      if((m_state & STATE_BLOCKER_PUFF) != 0) {
         if(m_special_timer == 0) {
            m_state &= ~STATE_BLOCKER_PUFF;
            setIdleAnim();
         }
      }
      
      if (m_type == TYPE_ITEM) {
         //#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Razr
         if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_9) || m_id == ITEM_COIN) {
            Particles.create(Particles.TYPE_GEM_SPARKLE, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), m_id);
         }
         //#endif
      }
      
   }

   //#ifndef NO_SCREEN_SHAKING
   // return an offset of the indicated axis based on screen-shaking logic.
   public int shake(int axis) { return Engine.getShake(Engine.SHAKE_CRITTERS, axis); }
   //#endif
   
   // process this Critter's death sequence.
   public void die() {

      //if(m_id == CREATURE_GREEN) Level.s_greens--;
      //else if(m_id == CREATURE_RED) Level.s_reds--;
      //else if(m_id == CREATURE_BLUE) Level.s_blues--;
      //Level.s_Critter_count--;
      if(m_board_x >= 0 && m_board_x < Level.s_board[0].length && m_board_y >= 0 && m_board_y < Level.s_board.length) Level.s_board[m_board_y][m_board_x] = null;
      Level.removeExtra(this);
   }

   // return an array representing the on-screen bounding box of the Entity.
   public int [] getBox() {
      
      int x = m_x + S_BOX[BOX_X];
      int y = m_y + S_BOX[BOX_Y];
      int w = x + S_BOX[BOX_WIDTH];
      int h = y + S_BOX[BOX_HEIGHT];
      return new int [] { x, y, w, h };
   }
   
   // set the indicated animation state.
   public void setAnim(int state) {
      
      m_anim_state = (short)(state + m_id);
      m_frame = 0;
   }
   
   
   
   /****************************************************************************
    ** Miscellaneous Methods
    ***************************************************************************/

   // check to see if this Critter is one of the basic green/red/blue creatures.
   public boolean basic() { return (m_type == TYPE_CREATURE && (m_id == CREATURE_GREEN || m_id == CREATURE_RED || m_id == CREATURE_BLUE || m_id == CREATURE_ORANGE || m_id == CREATURE_PURPLE)); }

   // check to see if this Critter is any way dying or about to die.
   public boolean mutable() { 
   
      return ( ((m_state & STATE_BEING_EATEN) == 0) &&
               ((m_state & STATE_DYING) == 0) && 
               ((m_state & STATE_POPPING) == 0) );
   }
   
   // check to see if this creature can be poisoned.
   public boolean poisonable(int type) { 
      
      Critter c = Level.boardRetrieve(m_board_x, m_board_y - 1);
      
      return (Level.onScreen(m_board_x, m_board_y) && 
              mutable() && 
              basic() &&
              //(c == null || c.m_id != CREATURE_GREEN) &&
              //((type & m_size) == m_size) &&
              ((m_state & STATE_TOXIC) == 0) &&
              ((m_state & STATE_POISONED) == 0) ); 
   }
   
   // check to see if the Critter is almost-full.
   public boolean almostFull() { return m_consumed == REGULAR_FULL - 1; }
   
   // check to see if the Critter is full and needs to pop.
   public boolean full() { return m_consumed >= REGULAR_FULL; }
   
   // make this creature be full.
   public void makeFull() { m_consumed = REGULAR_FULL; }

   // make this creature a bonus one.
   public boolean bonusify(long state) {
      
      if(basic() && mutable() && ((m_state & STATE_TOXIC) == 0) && ((m_state & STATE_POISONED) == 0) ) {
         m_state |= (STATE_BONUS | state);
         return true;
      }
      
      return false;
   }
   
   // check if any eating should occur.
   public void eat(Critter c) {
      
      if(c == null || c.m_type != TYPE_CREATURE || !c.mutable() || !Level.onScreen(c.m_board_x, c.m_board_y)) return;

      Critter tmp = this;
      int count = 0;

      while(tmp != null && 
            ((c.m_state & STATE_DONE_CLIMB) == 0) &&
            (( ((c.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && ((tmp.m_size & SIZE_SMALL) == SIZE_SMALL) ) || 
             ( ((c.m_size & SIZE_BIG) == SIZE_BIG)       && ((tmp.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) ) ||
             c.m_id == CREATURE_TNT || 
             (tmp.m_size == SIZE_ALL))) {

         count++;
         tmp.m_state |= (STATE_ASCENDING | STATE_IMMOBILE | STATE_BEING_EATEN);
         //#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
         if(tmp.m_type == TYPE_CREATURE) tmp.setAnim(Anims.GREEN_SCARED);
         //#endif
         if(tmp.almostFull()) c.makeFull();
         if(tmp.m_type == TYPE_ITEM && tmp.m_id == ITEM_PEPPER) c.m_state |= STATE_CHILI_BLAST;
         if((tmp.m_state & STATE_BONUS) != 0)                   c.m_state |= STATE_BONUS;
         if((tmp.m_state & STATE_DROP_MELON) != 0)              c.m_state |= STATE_DROP_MELON;
         if((tmp.m_state & STATE_DROP_PEPPER) != 0)             c.m_state |= STATE_DROP_PEPPER;
         if((tmp.m_state & STATE_DROP_ONION) != 0)              c.m_state |= STATE_DROP_ONION;
         if((tmp.m_state & STATE_TOXIC) != 0)                   c.toxicMorph();
         tmp.m_destination_y -= Level.SQUARE_H * count;
         tmp.m_speed = (byte)SPEED_CLIMB;

         // check for a food chain.
         if((tmp.m_state & STATE_DONE_CLIMB) == 0) {
            Critter chainer = Level.onScreen(c.m_board_x, c.m_board_y - 1) ? Level.boardRetrieve(c.m_board_x, c.m_board_y - 1) : null;
            if( ((c.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && ((c.m_state & STATE_CHILI_BLAST) == 0) && c.mutable() && 
               chainer != null && ((chainer.m_size & SIZE_BIG) == SIZE_BIG || chainer.m_id == CREATURE_TNT) && chainer.mutable()) {
               c.m_state |= STATE_FOOD_CHAIN;
               break;
            }
         }

         // get next Critter.
         tmp = Level.boardRetrieve(tmp.m_board_x, tmp.m_board_y + 1);
      }

      if(count > 0) {
         if((c.m_state & STATE_EATING) == 0) {
            c.m_state |= (STATE_EATING | STATE_IMMOBILE);
            if((m_state & STATE_TOXIC) != 0) c.toxicMorph();

⌨️ 快捷键说明

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