1

DigitalOnScreenControl を使用してプレイヤー スプライトを移動しています。しかし、問題は、プレイヤー スプライトがエミュレーター画面の外に出ることです。プレイヤー スプライトが特定の境界内で移動するように制限し、スプライトが移動するときにカメラがプレイヤー スプライトに焦点を合わせることも必要です。

私はこのコードを試しています:

public Scene onLoadScene() {

    // Auto-generated method stub
    this.mEngine.registerUpdateHandler(new FPSLogger());
    final Scene mScene=new Scene();
    mScene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));



     final int centerX=(CAMERA_WIDTH-this.mPlayerTextureRegion.getWidth())/2;
     final int centerY=(CAMERA_HEIGHT-this.mPlayerTextureRegion.getHeight())/2;

     final Sprite player=new Sprite(centerX, centerY, this.mPlayerTextureRegion);

    this.mCamera.setChaseEntity(player);
     final PhysicsHandler physicsHandler=new PhysicsHandler(player);
     player.registerUpdateHandler(physicsHandler);

     mScene.attachChild(player);

     this.mDigitalOnScreenControl=new DigitalOnScreenControl(0,CAMERA_HEIGHT-mOnScreenControlBaseTextureRegion.getHeight(),this.mCamera,this.mOnScreenControlBaseTextureRegion,this.mOnScreenControlKnobTextureRegion,0.1f,new IOnScreenControlListener() {

        @Override
        public void onControlChange(BaseOnScreenControl pBaseOnScreenControl,
                float pValueX, float pValueY) {
            // TODO Auto-generated method stub
            physicsHandler.setVelocity(pValueX*100, pValueY*100);

        }
    });


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

     mScene.setChildScene(this.mDigitalOnScreenControl);


    return mScene;
  }

正直なところ、私はandEngine開発が非常に新しいので、心から助けてください よろしくお願いします。

4

1 に答える 1

0

プレーヤーをカメラにバインドする

あなたが求めているのは、衝突処理の形式です。基本的に、プレーヤーをシーンの外に移動した場合は、プレーヤーをシーンに戻す必要があり、プレーヤーを移動した直後に、プレーヤーを移動したのと同じ更新でそれを行う必要があるため、シーン外の場所はレンダリングされません。

今言ったことを分解してみましょう。プレーヤーをここに移動します。

physicsHandler.setVelocity(pValueX*100, pValueY*100);

physicalsHandler を使用してプレーヤーを移動することは完全に合理的であり、可変フレームレートが考慮されているため、これまでのところ良い仕事です。シーンの外にある場合は、シーンに戻す必要があります。そのため、新しい方法が必要になります。プレーヤーを移動した直後にメソッド呼び出しをスローします (これを「adjustToSceneBinding()」と呼ぶので、次のようになります:

physicsHandler.setVelocity(pValueX*100, pValueY*100);
adjustToSceneBinding(player);

補足として、私はこのメソッドをプレーヤー (つまり、player.adjustToSceneBinding()) に配置したいと思いますが、プレーヤー オブジェクトは単なるスプライトです。スプライトを拡張するカスタム オブジェクトに変更して、そこに独自のコードを挿入できるようにすることをお勧めします。いずれにせよ、adjustToSceneBinding() メソッドを作成しましょう。

public boolean adjustToSceneBinding(Sprite player) {

    // Correct the X Boundaries.
    if (player.getX() < 0) {
        player.setX(0);
    } else if (player.getX() + player.getWidth() > CAMERA_WIDTH) {
        player.setX(CAMERA_WIDTH - player.getWidth());
    }
}

私がしたことを見ますか?プレーヤーの X 座標が 0 未満の場合は、それらを 0 に戻します。プレーヤーの X プラス プレーヤーの幅がカメラの幅より大きい場合は、カメラの幅からプレーヤーの幅を引いた値に戻します。プレイヤーの X 座標がスプライトの左側を表すことを忘れないでください。そのため、右側を計算するために位置に加えて幅を考慮しています。

上記のコードは左右の動きのみに対応していますが、上下に同じことを行う方法を推測させてください.

代わりにプレーヤーをマップ サイズにバインドする

さて、これまで行ってきたことは、マップの「サイズ」が画面よりも大きくない状況を意図したものでした。しかし、多くの場合、画面サイズよりも大きなマップと、プレイヤーを追いかけるカメラが必要になります。これを行うには、CAMERA_WIDTH を「マップ」の幅を表す数値で参照した上記のコードを置き換えるだけです。つまり、マップはカメラよりもはるかに大きくなる可能性があります。そこで(たとえば、カメラの幅よりも)大きな数値を使用し、カメラをプレーヤーエンティティを追跡するように設定すると(あなたが持っているように)、プレーヤーがヒットするまで動き回ることができるマップができます。マップの境界。

お役に立てれば!:)

于 2013-02-23T19:57:33.547 に答える