2012-09-11 73 views
1

我試圖讓我在遊戲中的敵人有漲有跌;因爲我使用的是物理機身採用了雪碧上它,我不能用實體修飾符,所以我決定給身體使用.setLinearVelocity(浮法X,浮法y)的每一次方法輕輕一推它的精靈達到一定點在屏幕上。的Android(AndEngine):雪碧與身體連接上上下下

只有一個身體很好,但我需要每隔5秒產卵一次並做同樣的事情,但我不知道如何跟蹤它們...我的意思是,我不知道如何在每一個機構獨立於彼此到達y位置控制......

例如,現在的代碼是這樣的:

private void add_Box_Face() 
{ 
    float random_x = (float) (28 + (int)(Math.random() * ((this.CAMERA_WIDTH - 28*2) + 1))); 

    final Body rectangle_face_body; 

    final Sprite rectangle_face = new Sprite(random_x, this.y, this.mRectangleFaceTextureRegion, this.getVertexBufferObjectManager()); 

    rectangle_face_body = PhysicsFactory.createBoxBody(this.m_PhysicsWorld, rectangle_face, BodyType.DynamicBody, this.BOX_FIXTURE_DEF); 

    rectangle_face_body.setUserData("target"); 

      //I give the body a initial push 
    rectangle_face_body.setLinearVelocity(0, -5); 

      //I register an update handler to the sprite to control if it reaches a certain Y value 
    rectangle_face.registerUpdateHandler(new IUpdateHandler() 
    { 
     @Override 
     public void onUpdate(float pSecondsElapsed) 
     { 

       if (rectangle_face.getY() >= y-50) 
       { 
         //Here I just use a flag so that later on below I can do the push 
       MyApp.this.setLinearVelocity = true; 
       } 
     } 

     @Override 
     public void reset() 
     { 
      // TODO Auto-generated method stub 
     } 

    }); 

      //Here I register the physic connector and if the flag permits it, I push the body up 
    this.m_PhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rectangle_face, rectangle_face_body, true, false) 
    { 
     @Override 
     public void onUpdate(float pSecondsElapsed) 
     { 
      super.onUpdate(pSecondsElapsed); 

      if(MyApp.this.setLinearVelocity) 
      { 
       rectangle_face_body.setLinearVelocity(0, -3); 
       MyApp.this.setLinearVelocity = false; 
      } 



     } 
    }); 

    this.mscene.attachChild(rectangle_face); 

} 

通過這樣的代碼第一個主體按照計劃進行,它會上下移動,但一旦另一個主體彈出,它就會掉下來,另一個主體會上升,因爲布爾setLinearVelocity總是s如果真的如此,那麼就有一個向上的推動。當第三機身自帶的,第二身體下落以及和這最後一個需要它的地方去了

有了這個代碼,我沒想到別的了......不過我不知道還有什麼我可以試試...我怎麼能控制這個?

感謝提前:)

編輯:添加在anwser工作的代碼如下

回答

1

我建議你從用於更新處理程序的代碼敵人分開的代碼。創建一個階級敵人將包含雪碧和身體,保持你的敵人在一個陣列,並使其穿過敵人的陣列和不想要所有這些東西覆蓋你PhysicsWorld的方法的onUpdate。

這裏的展示這樣做的一個非常簡單的方法的代碼片段:

mEngine.registerUpdateHandler(new IUpdateHandler() { 
     @Override 
     public void reset() {} 

     @Override 
     public void onUpdate(float pSecondsElapsed) { 
      for (Enemy e : enemies) { 
       e.checkPositionAndBounce(); 
      } 
     } 
    }); 

請注意,這可能不是一個很好的主意,因爲這些代碼可能會到物理學的一個不同的線程運行引擎,這可能會導致各種問題。一個更好的方法將被重寫PhysicsWorld的方法的onUpdate:

@Override 
public void onUpdate(final float pSecondsElapsed) { 
    super.onUpdate(); 
    for (Enemy e : enemies) { 
     e.checkPositionAndBounce(); 
    } 
} 

如果您不確定的第一個片段是什麼意思,查找「匿名內部類」。

+0

感謝您的答覆,併爲您的幫助! 是的我試過使用一個數組,它的工作原理!我重寫PhyiscsWorld的方法的onUpdate,就像你說的,它似乎是即使有移動物體的一打(這是非常之多是爲了什麼我想要做的最壞的情況下)相當順利工作。 我想發佈現在的代碼,以防有人想要做同樣的事情,但由於我沒有足夠的聲譽,所以我還不能回答我的問題,而且我也不想將其添加到原來的帖子,因爲它會變得太長;再次感謝你的幫助! :) – Beriol

1

好吧,這裏是最後的工作代碼(我沒有創建檢查敵人的位置或一個類的方法,只是因爲現在我剛剛與力學瞎搞,我會創建一個新項目當我準備真正開始):

this.m_PhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false) 
{ 
    @Override 
    public void onUpdate(float pSecondsElapsed) 
    { 
     super.onUpdate(pSecondsElapsed); 

     for(int i = 0; i <= MyApp.this.mSpriteCounter; i++) 
     { 

      if (rectangle_face[i].getY() >= y-50) 
      {  
       final PhysicsConnector spritePhysicsConnector = m_PhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(rectangle_face[i]); 

       spritePhysicsConnector.getBody().setLinearVelocity(0, -3);  
      } 
     } 
    }; 

在此代碼rectangle_face []是精靈的陣列;每個精靈創建這樣的:

private void add_Box_Face() 
{ 

    float random_x = (float) (28 + (int)(Math.random() * ((this.CAMERA_WIDTH - 28*2) + 1))); 

    final Body rectangle_face_body; 


    rectangle_face[this.mSpriteCounter] = new Sprite(random_x, y, this.mRectangleFaceTextureRegion, this.getVertexBufferObjectManager()); 


    rectangle_face_body = PhysicsFactory.createBoxBody(this.m_PhysicsWorld, rectangle_face[this.mSpriteCounter], BodyType.DynamicBody, this.BOX_FIXTURE_DEF); 

    rectangle_face_body.setUserData("target"); 

    rectangle_face_body.setLinearVelocity(0, -5); 


    this.m_PhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rectangle_face[this.mSpriteCounter], rectangle_face_body, true, false)); 

    this.mscene.attachChild(rectangle_face[this.mSpriteCounter]); 

} 

就是這樣,再次感謝您的幫助:)

+0

不客氣,並感謝您回來併發布其他人使用的代碼。 – JohnEye