1

我试图让我的游戏中的敌人上上下下;因为我使用的是带有 Sprite 的物理体,所以我不能使用实体修饰符,所以我决定每次它的 sprite 到达某个点时使用 .setLinearVelocity(float x, float y) 方法稍微推动一下身体在屏幕中。

只有一个身体效果很好,但我需要让其他敌人(相同的精灵,不同的身体)每 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 总是设置为 true,所以有一个不断向上推;当第三个身体进来时,第二个身体也会倒下,最后一个身体会上升

有了这段代码,我并没有期待太多……但我不知道我还能尝试什么……我该如何控制呢?

提前致谢 :)

编辑:在下面的 anwser 中添加了工作代码

4

2 回答 2

1

我建议您将敌人的代码与更新处理程序的代码分开。创建一个包含 Sprite 和 Body 的类 Enemy,将您的 Enemies 保存在一个数组中并覆盖您的 PhysicsWorld 的 onUpdate 方法,以便它通过 Enemies 数组并对所有敌人执行您想要的操作。

这是一个代码片段,显示了一种非常简单的方法:

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();
    }
}

如果您不确定第一个片段的含义,请查找“匿名内部类”。

于 2012-09-11T15:50:54.610 回答
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[] 是一个 Sprite 数组;每个精灵都是这样创建的:

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]);

}

就是这样,再次感谢您的帮助:)

于 2012-09-15T09:49:10.070 回答