1

ゲーム内の敵を上下させようとしていました。スプライトのある物理ボディを使用しているため、エンティティ修飾子を使用できないため、スプライトが特定のポイントに到達するたびに .setLinearVelocity(float x, float y) メソッドを使用してボディを少し押すことにしました。画面で。

体が1つだけでもうまくいきますが、他の敵(同じスプライト、別の体)を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 に設定されているためです。コスタントは上向きに押します。3番目の体が入ってくると、2番目の体も落ち、この最後の体が代わりに上昇します

このコードでは、他にあまり期待していませんでした...しかし、他に何を試すことができるかわかりません...どうすればこれを制御できますか?

前もって感謝します :)

編集:以下のアンサーに作業コードを追加

4

2 に答える 2

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

}

それだけです、助けてくれてありがとう:)

于 2012-09-15T09:49:10.070 に答える
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 に答える