2013-08-06 15 views
8

浮動小数点ヘルプバブルを作成して、ゲームの基本機能を紹介したいと考えています。このバブルは、下の図に示すように、私が説明したいアクタの上に浮かなければなりません。これを実現するためにlibGDXの表のActorのステージ座標を取得する

Floating instruction bubble.

、私は、この場合、左ボタンには、俳優の座標をしたい、と私は他のすべての前でステージにバブル俳優を追加することができます。最後の部分は簡単ですが、テーブルのようにボタンの実際の座標を取得するのには苦労しています。

二つのボタンは、このような表に追加されます。

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); 

は、これは(sysoutsの順に)私を与えます: [0.0,0.0]および[40.0,130.0]。最後の位置は実際には画面の青い部分を塗りつぶした表の位置です。だから、この場所は明らかに、テーブルがアクターを配置するために何かを失い、使用できません(私はテーブルの位置にすぎません)。

(私も表さT、ここ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 

私はテーブル内のグループ/アクターの実際の位置を得ることはできません。

どうすればいいですか?

+1

私の答えに加えて、初めて俳優がレンダリングされる前に俳優の位置を取得しようとしているのだろうか?フレームワークが正しくレイアウトを行うまでに場所を取得しようとすると、間違った座標が得られます。私の例では、レイアウトが実行された後にイベントリスナーを使用して正しい位置を取得することでこれを軽減します。 – Jyro117

+0

私は 'Stage'の別の' Table'の中の 'VerticalGroup'の中に' Table'を持っています。私は以下の答えに従ったが、うまくいかなかった。問題は、私が開始テーブルの位置を割り当てる前に要素が配置されていないことに終わった。その答えのステージの位置の翻訳は必要ありませんでした。 'table.getX()'は、レイアウトが起こった後に、私が必要としたステージの場所を私に与えました。 – bazola

+0

@ Jyro117そのチップをありがとう。私は同じ問題を抱えていた。私が俳優のポジションを早期に計算するかもしれないことに気づくのに時間がかかりました。 – WeirdElfB0y

答えて

20

私はあなたが混乱したところを理解していると思います。実際には、アクターのステージ座標を取得するのは非常に簡単です(スクリーンアライメント、回転していない、スケールされていないアクターを想定)。

あなたがする必要があるのはこれです:あなたは間違って何をしている

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」メッセージが必要なのは、ステージ上のアクタの位置がわかるからです。

+0

'a.getX()、a.getY()'の出力は '0,0'なので、OPはあなたが提案している通りになっていますか? – DannyMo

+0

私は0,0があなたにステージコーズを与えることを示す完全な例で私の答えを更新しました。 OPは、彼の出力が異なるように異なる何かをしているかもしれない。 – Jyro117

+0

ハハ、ええ、ゼロがトリックでした!それは馬鹿だった。ありがとう、非常に包括的な答えです。 –

関連する問題