2012-10-31 18 views
0

我遇到觸摸問題。我有一些單詞精靈,我將觸摸事件(下面)綁定到他們。 連續幾次觸摸其中一個並且想要拖動,首先觸摸事件沒有響應,但是如果我等待一秒鐘,我就可以拖動。在LogCat我得到這個:觸摸事件池已用盡

12-28 17:23:58.979:V/AndEngine(23295):org.andengine.util.adt.pool.PoolUpdateHandler $ 1耗盡時,沒有1個項目尚未回收。分配了1個。

如何解決此問題?

這裏是觸摸事件代碼:

public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) 
{ 
    switch(pSceneTouchEvent.getAction()) { 
     case TouchEvent.ACTION_DOWN: 
      this.mGrabbed = true; 
      break; 

     case TouchEvent.ACTION_MOVE: 
      if(this.mGrabbed) 
       this.setPosition(pSceneTouchEvent.getX() - 18, pSceneTouchEvent.getY() - 15); 
      break; 

     case TouchEvent.ACTION_UP: 
      if(this.mGrabbed) 
      { 
       this.mGrabbed = false; 
       boolean found = false; 
       float x1,x2,y1,y2; 
       if(this.getY() < 350) 
       { 
        for(int i = 0; i < positions_list.size(); i++) 
        { 
         if((word_object_list.get(a).getName().equals(positions_list.get(i).getName())) && positions_list.get(i).isFree()) 
         { 
          x1 = word_object_list.get(a).getSprite().getX(); 
          y1 = word_object_list.get(a).getSprite().getY(); 
          x2 = positions_list.get(i).getxPosition(); 
          y2 = positions_list.get(i).getyPosition(); 
          x1 = Math.abs(x2-x1); 
          y1 = Math.abs(y2-y1); 
          x1 = (float) Math.pow(x1,2); 
          y1 = (float) Math.pow(y1, 2); 
          x1 = x1+y1; 
          x1 = (float) Math.sqrt(x1); 
          if(x1 < 20) 
          { 
           // Set hint's visibility false 
           if(i == 0 && sprite_word_hint_1 != null) 
            sprite_word_hint_1.setVisible(false); 
           if(i == random_hint_position && sprite_word_hint_2 != null) 
            sprite_word_hint_2.setVisible(false); 

           word_object_list.get(a).getSprite().setVisible(false); 
           sprite_word_true_list.get(i).setVisible(true); 
           sprite_candy_list.get(finish_state).setVisible(true); 
           finish_state ++; 

           if(finish_state == question.getWord().length()) 
           { 
            // Create new scene 
            Game_Screen.this.getEngine().registerUpdateHandler(new TimerHandler(6.5f, new ITimerCallback() { 
             public void onTimePassed(TimerHandler pTimerHandler) { 
              // TODO Auto-generated method stub 

              Game_Screen.this.getEngine().setScene(load_new_scene()); 
              remove_textures(); 
             } 
            })); 

            // Increase point 
            Game_Screen.this.getEngine().registerUpdateHandler(new TimerHandler(4.3f, new ITimerCallback() { 
             public void onTimePassed(TimerHandler pTimerHandler) { 
              // TODO Auto-generated method stub 
              int point = variables.getDatabase().get_point(variables.getCategory_level())+question.getWord().length(); 
              elapsedText.setText(""+point); 
              variables.getDatabase().set_answered(question); 
              variables.getDatabase().update_user(question, question.getWord().length(), hint_used); 
             } 
            })); 

            // Cover animation 
            sprite_cover.setRotationCenter(sprite_cover.getRotationCenterX()+20, sprite_cover.getRotationCenterY()); 
            sprite_cover.registerEntityModifier(new SequenceEntityModifier(
              new DelayModifier(1), 
              new RotationModifier(1.5f, 0, 90), 
              new DelayModifier(1.7f), 
              new RotationModifier(1, 90, -0) 
             ) 
            ); 
            // Candy animation 
            for(int j = 0; j < sprite_candy_list.size(); j++) 
            { 
             sprite_candy_list.get(j).registerEntityModifier(new SequenceEntityModifier(
               new DelayModifier(2.7f), 
               new CubicBezierCurveMoveModifier(1.5f, sprite_candy_list.get(j).getX(), sprite_candy_list.get(j).getY(), 165, 240, 166, 241, 275, 400, EaseQuadIn.getInstance()), 
               new DelayModifier(0.2f), 
               new AlphaModifier(1, 1, 0) 
               ) 
             ); 
            } 
           } 
           positions_list.get(i).setFree(false); 
           found = true; 
           break; 
          } 
         } 
        } 
       } 
       if(!found) 
       { 
        word_object_list.get(a).getSprite().registerEntityModifier(new MoveModifier(1, word_object_list.get(a).getSprite().getX(), word_object_list.get(a).getPositionX(), word_object_list.get(a).getSprite().getY(), word_object_list.get(a).getPositionY(),EaseQuadIn.getInstance())); 
       } 
      } 
      break; 

    } 
    return true; 
} 
+0

你可以嘗試從onAreaTouched方法中提取一些對象分配嗎?這可能會加快速度,並允許在更短的時間內處理更多的觸摸。 – Shellum

+0

感謝您的回覆......我從onAreaTouched方法中抽取了一些變量。我認爲它會變得更好,但應該會更好。該問題可以是關於內存分配的實體修飾符? – kgnkbyl

+0

我知道,如果您啓用了android lint檢查,它會要求您將任何新分配從onDraw中移出。我可以看到onTouch方法的相同副作用。 – Shellum

回答

0

我找到了答案。當我多次觸摸精靈時,每當它註冊一個實體修改器並且堆棧正在增長時,我應該等到它爲空。然後我添加了

this.clearEntityModifiers(); 

函數調用觸摸事件的開始,它工作正常。