簡體   English   中英

在libGDX中獲取表中Actor的Stage坐標

[英]Getting Stage coordinates of Actor in Table in libGDX

我想創建一個浮動幫助泡泡來介紹我的游戲的基本功能。 這個氣泡應浮在我希望它解釋的Actor之上,如下圖所示。

浮動指令泡沫。

為了實現這一點,我想要Actor的坐標,在這種情況下是左按鈕,然后我可以將泡泡Actor添加到舞台上的其他所有內容。 最后一部分很簡單,但我正在努力檢索按鈕的實際坐標,就像它在表格中一樣。

這兩個按鈕被添加到表中,如下所示:

t.add(btnLab).expandX().center();
t.add(btnSea).expandX().center();

我嘗試過最明顯的方法:

Vector2 loc = new Vector2(a.getX(), a.getY());
System.out.println("Loc: " + loc);
a.localToStageCoordinates(loc);
System.out.println("Loc: " + loc);

這給了我(按sysout的順序):[0.0,0.0]和[40.0,130.0]。 最后一個位置實際上是表格的位置,它填充了屏幕的藍色區域。 因此,這個位置顯然錯過了Table放置Actor的功能,並且無法使用(因為我最終只得到了Table的位置)。

(我也試過在這里使用t.localToStageCoordinates,這是表。結果相同。)

我嘗試的另一個解決方案是遞歸搜索所有父母:

private static Vector2 getLoc(Actor a) {
    return getLoc(new Vector2(a.getX(), a.getY()), a.getParent());
}

private static Vector2 getLoc(Vector2 loc, Actor g) {
    System.out.println("Location: " + loc + ", Actor: " + g);
    loc.x += g.getX();
    loc.y += g.getY();
    if(g.getParent() == null) return loc;
    return getLoc(loc, g.getParent());
}

不幸的是,這給了我同樣的東西。 sysouts提供以下內容:

Location: [0.0:0.0], Actor: Table 40.0,130.0 944.0x508.0
Location: [40.0:130.0], Actor: Group 0.0,0.0 0.0x0.0
Location: [40.0:130.0], Actor: Group 0.0,0.0 0.0x0.0

所以我似乎無法獲得表格中各組/參與者的實際位置。

我該怎么做?

我想我明白你困惑的地方。 獲取演員的舞台坐標實際上非常簡單(假設屏幕對齊,未旋轉,未縮放的演員)。

你需要做的就是:

public static Vector2 getStageLocation(Actor actor) {
    return actor.localToStageCoordinates(new Vector2(0, 0));
}

你做錯了是試圖獲取actor相對於表的位置(通過使用actor.getX()和actor.getY()),然后將該位置轉換為舞台。 這將最終為您提供表的位置,因為它將添加actor的位置。 你真正想知道你的演員里面的新Vector2(0,0)在哪里。 這告訴你演員的左下角在哪里。 如果你想要左上角你將使用新的Vector2(0,actor.getHeight()),並以類似的方式使用其他角落。

此外,如果您正在處理活動並想知道活動的舞台位置,您只需執行以下操作:

@Override public void touchUp(final InputEvent event, final float x, final float y, final int pointer, final int button) {
    if (pointer == Buttons.LEFT) {
        Gdx.app.log("Event", "x: " + event.getStageX() + " y: " + event.getStageY());
    }
}

有關更完整的示例,請查看以下代碼:

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;

public class ActorStage implements ApplicationListener {
    private Stage stage;
    private Skin skin;

    @Override public void create() {
        Gdx.app.log("CREATE", "App Opening");

        this.stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
        Gdx.input.setInputProcessor(this.stage);

        this.skin = new Skin(Gdx.files.internal("skin/uiskin.json"));
        this.skin.hashCode();

        final Table table = new Table();
        table.setFillParent(true);

        final Button btnLab = new TextButton("Lab", skin);
        final Button btnSea = new TextButton("Sea", skin);


        setupButton(table, btnLab);
        setupButton(table, btnSea);

        this.stage.addActor(table);

        Gdx.gl20.glClearColor(0f, 0f, 0f, 1);
        Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    }

    private void setupButton(Table table, final Button button) {
        table.add(button).expandX().center();

        button.addListener(new ClickListener() {
            @Override public void clicked(InputEvent event, float x, float y) {
                Gdx.app.log("XY", "[" + x + ", " + y + "]");
                Gdx.app.log("Event", "[" + event.getStageX() + ", " + event.getStageY() + "]");
                Gdx.app.log("Actor", "[" + button.getX() + ", " + button.getY() + "]");

                Vector2 loc = new Vector2(button.getX(), button.getY());
                Vector2 stageLoc = button.localToStageCoordinates(loc);
                Gdx.app.log("ActorStage", "[" + stageLoc.x + ", " + stageLoc.y + "]");

                Vector2 zeroLoc = button.localToStageCoordinates(new Vector2());
                Gdx.app.log("ZeroStage", "[" + zeroLoc.x + ", " + zeroLoc.y + "]");
            }
        });
    }

    @Override public void render() {
        this.stage.act();

        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.gl20.glEnable(GL20.GL_BLEND);

        this.stage.draw();
    }

    @Override public void dispose() {
        Gdx.app.log("DISPOSE", "App Closing");
    }

    @Override public void resize(final int width, final int height) {
        Gdx.app.log("RESIZE", width + "x" + height);
        Gdx.gl20.glViewport(0, 0, width, height);
        this.stage.setViewport(width, height, false);
    }

    @Override public void pause() {}

    @Override public void resume() {}
}

單擊btnLab一次,單擊btnSea一次然后關閉窗口,輸出:

CREATE: App Opening
RESIZE: 800x600
XY: [18.0, 13.0]
Event: [200.0, 296.0]
Actor: [182.0, 283.0]
ActorStage: [364.0, 566.0]
ZeroStage: [182.0, 283.0]
XY: [6.0, 23.0]
Event: [588.0, 306.0]
Actor: [582.0, 283.0]
ActorStage: [1164.0, 566.0]
ZeroStage: [582.0, 283.0]
DISPOSE: App Closing

正如您所看到的,您想要“ZeroStage”消息,因為它可以為您提供舞台上演員的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM