4

Universal-tween-engine で libgdx を使用する方法を学んでいますが、画面上のポイントにタッチする (またはデスクトップ アプリをクリックする) 方法と、タッチした場所までテクスチャを移動する方法を理解できませんでした。エンドポイントに到達するまで、タッチまたはクリックをアクティブに保ちません。

タッチ イベントが開始されると、アニメーションが開始され、グラフィックがその場所に向かって移動します。タッチとドラッグが開始されると、グラフィックは指/マウスポインターに従います。ポイントに触れると、タッチを離すまでグラフィックがそのポイントに向かって移動します。その後、タッチを離すと元の位置で停止します。

私はタッチアンドリリースを探していて、そのグラフィックをタッチしたポイントに移動させようとしていますが、おそらくトゥイーンエンジンの実装について何かを理解していません。以下にトゥイーンコードを貼り付けました。

    public void render() {

            camera.update();

            batch.setProjectionMatrix(camera.combined);
            batch.begin();
            batch.draw(texture.getTexture(), texture.getBoundingBox().x, texture.getBoundingBox().y);
            batch.end();

            Tween.registerAccessor(Plane.class, new TextureAccessor());
            TweenManager planeManager = new TweenManager();

            float newX = 0;
            float newY = 0;
            boolean animateOn = false;

            if(Gdx.input.isTouched()) {
                    newX = Gdx.input.getX();

                    newY = Gdx.input.getY();

                    animateOn = true;
            }

            if (animateOn == true && (texture.getX() != newX || texture.getY() != newY)) {
                Tween.to(texture, TextureAccessor.POSITION_XY, 10)
                    .target(newX, newY)
                    .ease(TweenEquations.easeNone)
                    .start(planeManager);

                    planeManager.update(1);

                    if (texture.getX() == newX && texture.getY() == newY) {
                        animateOn = false;
                    }
            }

    }

もともと、条件付き for 内にトゥイーン コードがあり、変数や変数isTouched()は使用しませんでした。新しい座標とアニメーションの状態のみを設定すると、ループがトゥイーンをトリガーするようになると思いました。古いコードは次のようになります。newXnewYanimateOnisTouched()

    if(Gdx.input.isTouched()) {
            newX = Gdx.input.getX();

            newY = Gdx.input.getY();

            Tween.to(texture, TextureAccessor.POSITION_XY, 10)
                .target(newX, newY)
                .ease(TweenEquations.easeNone)
                .start(planeManager);

            planeManager.update(1);
    }

も使用してみましjustTouched()たが、グラフィックはタッチしたポイントに向かってわずかにしか移動しません。

私はこれに数時間苦労してきました。誰かが私を正しい方向に向けることができれば、本当に感謝しています。

ありがとう。

4

2 に答える 2

6
Tween.registerAccessor(Plane.class, new TextureAccessor());
TweenManager planeManager = new TweenManager();

これらの 2 行は、create()メソッドではなくメソッドに入れる必要がありrender()ます。ここでは、すべてのフレームで新しいマネージャーをインスタンス化しています。必要なマネージャーは 1 つだけです。それですべてであり、大量のマネージャーは必要ありません!

また、 true の場合だけでなく、すべてのフレームでマネージャーを更新する必要がanimateOnあります。それ以外の場合は、指を押し続ける必要があります...

正しいコードは次のとおりです。そこから学んでください。トゥイーン エンジンの仕組みをよりよく理解できるでしょう :)

// Only one manager is needed, like a Spritebatch
private TweenManager planeManager;

public void create() {
    Tween.registerAccessor(Plane.class, new TextureAccessor());
    planeManager = new TweenManager();
}

public void render() {
    // The manager needs to be updated on every frame.
    planeManager.update(Gdx.graphics.getDeltaTime());

    camera.update();

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    batch.draw(texture.getTexture(), texture.getBoundingBox().x, texture.getBoundingBox().y);
    batch.end();

    // When the user touches the screen, we start an animation.
    // The animation is managed by the TweenManager, so there is
    // no need to use an "animateOn" boolean.
    if (Gdx.input.justTouched()) {
        // Bonus: if there is already an animation running,
        // we kill it to prevent conflicts with the new animation.
        planeManager.killTarget(texture);

        // Fire the animation! :D
        Tween.to(texture, TextureAccessor.POSITION_XY, 10)
            .target(Gdx.input.getX(), Gdx.input.getY())
            .ease(TweenEquations.easeNone)
            .start(planeManager);
    }
}
于 2012-07-20T08:53:27.720 に答える
2

この動作を間違った方法で実装しようとしていました。isTouchedorを使用する代わりに、fromjustTouched()を使用する必要がありました。touchDown()GestureListener

touchListener()メインの libgdx プロジェクトのメイン クラス ( ApplicationLisetener を実装するクラス) 内にGestureDetector を実装するクラスを作成し( ApplicationLisetener を実装するクラス)、x および y のキャプチャ コードを内部に配置しますtoucDown(トリガーもトリガーされていることに気付きtap()ました)。トゥイーン関数 (実際のトゥイーン、 への呼び出しregisterAccessor()、および新しいトゥイーン マネージャの作成) を のupdate()メソッドに移動しましたtouchListener()

メインの libgdx クラスtouchListener()のループ内に の update 関数への呼び出しを追加しました。render()

これが最善の方法であるとは思えませんが、将来誰かに役立つことを願っています.

于 2012-06-25T03:00:07.247 に答える