0

ゲーム シーンに戻ると、プレーヤーの動きに問題があります。

コントロールでプレーヤーをコントロールできます。オン スクリーン コントロールとオン エリア タッチ スプライトの両方で実行しましたが、ゲーム シーンに戻ると両方とも失敗します。両方のコントロールは引き続き入力を受け取りますが、プレーヤーを動かしなくなりました。

これはすべて、BaseScene を拡張する GameScene で行われます

アニメーション化されたスプライトと物理ワールドを設定する方法は次のとおりです。

    //////////////////////////////////////////////////////////////////////
    //Creates and Registers Physics World
    //////////////////////////////////////////////////////////////////////
    this.mPhysicsWorld = new FixedStepPhysicsWorld(30, new Vector2(0, 0), false, 8, 1);
    this.registerUpdateHandler(this.mPhysicsWorld);

    //////////////////////////////////////////////////////////////////////
    //Creates and Adds the Animated Sprite, Sets Camera Chase Entity
    //////////////////////////////////////////////////////////////////////
    player = new AnimatedSprite(18 * 32, 43 * 32, ResourceManager.getInstance().mPlayerTextureRegion, ((DragonsReignActivity)activity).getVertexBufferObjectManager());
    camera.setChaseEntity(player);
    final FixtureDef playerFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 0.5f);
    mPlayerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player, BodyType.DynamicBody, playerFixtureDef);

    //////////////////////////////////////////////////////////////////////
    //Register Physics Connector
    //////////////////////////////////////////////////////////////////////
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(player, mPlayerBody, true, false)
    {
            //////////////////////////////////////////////////////////////////////
            //Updates Chase Entity
            //////////////////////////////////////////////////////////////////////
            @Override
            public void onUpdate(float pSecondsElapsed)
            {
                    super.onUpdate(pSecondsElapsed);
                    camera.updateChaseEntity();
            }
    });

    physicsHandler = new PhysicsHandler(player);
    player.registerUpdateHandler(physicsHandler);
    attachChild(player);
    player.setZIndex(10);

現在、コントロールを設定している方法は次のとおりです。

public void attachControls()
{
    mDigitalOnScreenControl = new DigitalOnScreenControl(0, ((DragonsReignActivity)activity).CAMERA_HEIGHT - ResourceManager.getInstance().DPADBacking.getHeight(), this.camera, ResourceManager.getInstance().DPADBacking, ResourceManager.getInstance().DPADKnob, 0.1f, ((DragonsReignActivity)activity).getVertexBufferObjectManager(), new IOnScreenControlListener() 
    {
        @Override
        public void onControlChange(BaseOnScreenControl pBaseOnScreenControl,  float pValueX,  float pValueY) 
        {
                if (pValueY == 1){
                        // Up
                        if (playerDirection != PlayerDirection.UP)
                        {
                            player.animate(new long[]{200, 200, 200}, 0, 2, true);
                            playerDirection = PlayerDirection.UP;
                        }
                }else if (pValueY == -1){
                        // Down
                        if (playerDirection != PlayerDirection.DOWN)
                        {
                            player.animate(new long[]{200, 200, 200}, 3, 5, true);  
                            playerDirection = PlayerDirection.DOWN;
                        }
                }else if (pValueX == -1)
                {
                        // Left
                        if (playerDirection != PlayerDirection.LEFT)
                        {   
                            player.animate(new long[]{200, 200, 200}, 6, 8, true);
                            playerDirection = PlayerDirection.LEFT;
                        }
                }else if (pValueX == 1)
                {
                        // Right
                        if (playerDirection != PlayerDirection.RIGHT)
                        {

                            player.animate(new long[]{200, 200, 200}, 9, 11, true);
                            playerDirection = PlayerDirection.RIGHT;

                        }
                }else{
                    if (player.isAnimationRunning())
                    {   
                        player.stopAnimation();
                        playerDirection = PlayerDirection.NONE;
                    } 
                }

                if(player.getX() >= 576 && player.getX() <= 736 && player.getY() <= 672 && player.getY() >= 576)
                {
                    PLAYER_VELOCITY = 4;
                    Log.e("Collision Box", "You are in the Box. Player Velcocity = " + PLAYER_VELOCITY);

                }
                mPlayerBody.setLinearVelocity(pValueX * PLAYER_VELOCITY, pValueY * PLAYER_VELOCITY);
        }
    });
    this.mDigitalOnScreenControl.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    this.mDigitalOnScreenControl.getControlBase().setAlpha(0.5f);
    this.mDigitalOnScreenControl.getControlBase().setScaleCenter(0, 128);
    this.mDigitalOnScreenControl.getControlBase().setScale(1.25f);
    this.mDigitalOnScreenControl.getControlKnob().setScale(1.25f);
    this.mDigitalOnScreenControl.refreshControlKnobPosition();
}

最後に、ゲーム シーンに戻る方法を次に示します。

@Override
public void onBackKeyPressed() 
{
    SceneManager.getInstance().setScene(SceneManager.SceneType.SCENE_GAME);

    camera.setChaseEntity(GameScene.player);

}

シーンに戻ったとき、コントローラーは引き続き入力を受け取りますが、キャラクターは動きません。

どんな助けでも大歓迎です

4

1 に答える 1

0
  • 体が位置を更新しているかどうかをテストします。

    1. ボディが更新され、スプライトが入力に応答しない場合は、スプライトに問題があります。
    2. スプライトに「registerUpdateHandler」を配置した理由は疑問です。すでにワールドを介して体を更新しているためです。その後、スプライトも体に応じて自動的に更新されます。
    3. そうでない場合は、世界が更新されていない可能性があります。
于 2013-09-24T05:38:43.420 に答える