0

私は、オープン ソースのゲーム プラットフォームである andEngine を使用しています。画面上を連続的に移動し、画面の境界に衝突すると方向が変わるスプライトがあります。今、私はその方向を画面上のプレーヤーのタッチポイントに変更したいと思います. 私はこの部分を管理できません。PhysicsHandlerを使用して、スプライトを速度で動かします。タッチポイントを取得してスプライトの方向を設定するには、IOnSceneTouchListenerを実装する必要があることを理解しています。しかし、今は何も見つかりませんでした。これが私のコードです:

Pilot aPilot;
PhysicsHandler mPhysicsHandler;

    aPilot = new Pilot(222, 333, pilotTexures, vbom) {
        @Override
        protected void onManagedUpdate(float pSecondsElapsed) {
            /*
             * change direction when collides with boundary wall of Screen
             */
            if (this.mX < 0) {
                mPhysicsHandler.setVelocityX(AtomicEngine.DEMO_VELOCITY);

            } else if (this.mX + this.getWidth() > ResourcesManager.CAMERA_WIDTH) {
                mPhysicsHandler.setVelocityX(-AtomicEngine.DEMO_VELOCITY);
            }

            if (this.mY < 0) {
                mPhysicsHandler.setVelocityY(AtomicEngine.DEMO_VELOCITY);
            } else if (this.mY + this.getHeight() > ResourcesManager.CAMERA_HEIGHT) {
                mPhysicsHandler.setVelocityY(-AtomicEngine.DEMO_VELOCITY);
            }
            super.onManagedUpdate(pSecondsElapsed);
        }

    };
    /*
     * initialize mPhysicsHandler
     */
    mPhysicsHandler = new PhysicsHandler(aPilot);
    registerUpdateHandler(this.mPhysicsHandler);
    mPhysicsHandler.setVelocity(AtomicEngine.DEMO_VELOCITY,
            AtomicEngine.DEMO_VELOCITY);
    attachChild(aPilot);
    aPilot.setScale(3f);

そして、私のオーバーライドonSceneTouchEventメソッドは次のようになります。

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {

    if (pSceneTouchEvent.isActionDown()) {

        // need some idea here
    }else if (pSceneTouchEvent.isActionMove()) {

    }
    return false;
}

スーパーノックを待ちます。

4

1 に答える 1

2

パイロットの現在の位置 (たとえば、パイロット スプライトを呼び出しgetSceneCenterCoordinates()てシーン内の座標を取得) とタッチ イベントの位置の差を計算する必要があります。その差を念頭に置いて、角度を計算できます ( UnitCircle ) または max_velocity と距離の長さの間のパーセンテージである係数を使用してから、physicshandler を使用して新しい速度を設定します。この係数は、速度を最大速度に制限するために使用されます。

したがって、コードは次のようになります (テストしなかったので、動作しなかったかどうか尋ねてください)。

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    MainActivity.this.mCamera.convertCameraSceneToSceneTouchEvent(touchEvent);//see edit
    float touchX = touchEvent.getX();
    float touchY = touchEvent.getY();
    float[] pilotCoord = aPilot.getEntity.getSceneCenterCoordinates();
    float pilotX = pilotCoord[0];
    float pilotY = pilotCoord[1];
    float xDiff = touchX - pilotX;
    float yDiff = touchY - pilotY; // could be wrong with AnchorCenter branch

    // use the max velo divided by the distance to get the velo factor for x & y, 
    // but perhaps calculating angles is faster, dunno
    float veloFactor = MAX_VELO/sqrt(xDiff^2 + yDiff^2); 
    float xVelo = xDiff*veloFactor;
    float yVelo = yDiff*veloFactor;
    mPhysicshandler.setVelocityX(xVelo);
    mPhysicshandler.setVelocityY(yVelo);
    return true;
}

ここまでは、速度を指の方向に設定するための計算です。なんらかの (減速) 加速が必要な場合 (たとえば、指が下にある限り、パイロットは指の方向に加速 (減速) しますsetLinearVelocity(xVelo, yVelo)。速度としての速度 (速度を維持するため)

編集

CameraScene から SceneTouchEvent への touchEvent の変換は、onSceneTouchListenerHUD に を追加する場合にのみ役立ちます。現在のカメラ位置 (シーン全体) に基づくイベントの x/y 値を、シーンで発生した xy 値に変換します。

それ以外の場合は、リスナーをシーンに直接追加すると、タッチ イベントを変換する必要がなくなり、行が削除される可能性があります。

于 2013-07-08T01:40:13.580 に答える