2012-09-11 34 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