2

オブジェクトをドラッグ アンド ドロップして組み立てるゲームを作りたいです。LibGDX はアクタの DragNDrop のみをサポートしていると思いますが、構造が安定していない場合にレンガを落下させるには、レンガに物理演算が必要です。

これまでのところ、ドラッグ アンド ドロップに対する私のアプローチは次のとおりです。

for(Brick b : map.getList()){

        final Image im = new Image(b.ar);

        stage.addActor(im);
        im.setPosition(b.posX, b.posY);
        im.setOrigin(b.posX, b.posY);

        im.addListener((new DragListener() {
            public void touchDragged (InputEvent event, float x, float y, int pointer) {
                    im.setOrigin(x, y);
                    im.setPosition(x, y);
                    //System.out.println("touchdragged ---> X=" + x + "  , Y=" + y);


                }

            }));
    }

map.getLists には、ペイントするすべてのレンガが含まれています。b.ar はペイントするテクスチャです。

このアプローチで[これ]が起こります。何が原因なのかわからない。

@Override
public void render(float delta) {
    spritebatch.begin();
        map.getWorld().step(1/60f, 6, 2);
        renderer.render(map.getWorld(), camera.combined);

        if(Gdx.input.justTouched()){
            Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(),0);
            camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));

            System.out.println(touchPoint);
        }


        stage.draw();
    spritebatch.end();
}

もちろん、オブジェクトをドロップしてその下に何もない場合は、(libgdx のボックス 2D エンジンを使用して) ボディを落下させたいと考えています。

前もって感謝します

4

2 に答える 2

4

リスナー コールバックの原点を画面座標に設定しています。それはうまくいきません。

原点はオブジェクトの「中心」を定義するために使用されるため、再配置すると、Libgdx はアクターのどの部分をどこに配置するかを認識します。通常、原点はオブジェクトの左下隅 (これがデフォルトだと思います) またはオブジェクトの中心です。

原点をリセットしたいので、誰かがレンガの左端をタップしてからオブジェクトの位置を変更すると、レンガのその点を再配置します (レンガの左下隅は再配置しません)。そのためには、スクリーン座標をアクターの空間の座標に変換する必要があります。

しかし、それはすべてやや厄介です。相対的な再配置を行う方が良いと思います。ブリックをsetPosition相対的に再配置するだけで絶対に配置しようとする代わりに、次のようにします。

im.setPosition(im.getX() + dx, im.getY() + dy);

それなら「原点」はどこでも構いません。

前のタッチ ポイントに基づいて、リスナーで dx と dy を計算する必要があります。

于 2013-07-26T17:49:53.327 に答える
0

ドラッグ リスナーは、イベントを発生させているアクターの原点に相対的な座標を与えるようです。原点が変化し続けるため、ドラッグ イベントに応答してそのアクタを移動する場合、これは少し奇妙です。基本的に、アクターをイベントの x 値と y 値だけ動かすと、マウスまたは指に追従することがわかりました。

改善の 1 つは、ドラッグが開始された位置を記録し、それをオフセットとして使用することです。これにより、ポインターはアクターの原点から同じ距離に留まります。

別のオプションとして、ボタンの代わりにリスナーをステージに追加することもできます。座標は、変更されていないステージの原点に対して相対的になると思います。私はそのテクニックを試していません。

ボタンを水平方向にドラッグするために使用したコードは次のとおりです。

DragListener dragListener = new DragListener() {
    private float startDragX;

    @Override
    public void dragStart(
            InputEvent event, 
            float x, 
            float y,
            int pointer) {
        startDragX = x;
    }

    @Override
    public void drag(InputEvent event, float x, float y, int pointer) {
        insertButton.translate(x - startDragX, 0);
    }
};
dragListener.setTapSquareSize(2);
insertButton.addListener(dragListener);

何かを 2 次元でドラッグしたい場合は、y 位置の x コードをコピーするだけです。

于 2014-05-12T05:21:44.593 に答える