私はあなたが混乱したところを理解していると思います。実際には、アクターのステージ座標を取得するのは非常に簡単です(スクリーンアライメント、回転していない、スケールされていないアクターを想定)。
あなたがする必要があるのはこれです:あなたは間違って何をしている
public static Vector2 getStageLocation(Actor actor) {
return actor.localToStageCoordinates(new Vector2(0, 0));
}
(actor.getXを(使用して(表に俳優の位置を取得しようとしている)とactor.getYされます))、その場所をステージに変換します。それはあなたが俳優の場所を追加するので、テーブルの場所を与えることになります。あなたの俳優の中の新しい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() {}
}
出力、一度btnSeaをクリックし、ウィンドウを閉じ、一度btnLabをクリック:
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」メッセージが必要なのは、ステージ上のアクタの位置がわかるからです。
私の答えに加えて、初めて俳優がレンダリングされる前に俳優の位置を取得しようとしているのだろうか?フレームワークが正しくレイアウトを行うまでに場所を取得しようとすると、間違った座標が得られます。私の例では、レイアウトが実行された後にイベントリスナーを使用して正しい位置を取得することでこれを軽減します。 – Jyro117
私は 'Stage'の別の' Table'の中の 'VerticalGroup'の中に' Table'を持っています。私は以下の答えに従ったが、うまくいかなかった。問題は、私が開始テーブルの位置を割り当てる前に要素が配置されていないことに終わった。その答えのステージの位置の翻訳は必要ありませんでした。 'table.getX()'は、レイアウトが起こった後に、私が必要としたステージの場所を私に与えました。 – bazola
@ Jyro117そのチップをありがとう。私は同じ問題を抱えていた。私が俳優のポジションを早期に計算するかもしれないことに気づくのに時間がかかりました。 – WeirdElfB0y