libGDXのチュートリアルの翻訳-パート3(scene2dパッケージ)

これは、libGDXチュートリアル翻訳シリーズの3番目の記事です。

最初の記事はこちらです。

2番目の記事はこちらです。



scene2d





scene2dパッケージは、2次元シーンのグラフを実装するためのクラスです。これは、階層的に関連するアクターのグループを管理するのに役立ちます(アクターは、描画可能で入力イベントを処理できるエンティティです-約Translator)。 このパッケージは、コントロールの処理、親アクタを基準とした座標系でアクタを回転およびスケーリングする機能を備えた描画のサポートを提供します。 このパッケージは、特定の間隔(トゥイーン)でアクターのアクションを制御するフレームワークも提供します。 scene2d.uiパッケージは、グラフィカルユーザーインターフェイスの構築に役立つアクターを提供します。



パッケージの重要なクラス





Stageクラスには、アプリケーションがアクターを追加できる「ルート」グループがあります。 Stageクラスには、独自のカメラと独自のスプライトパッカー(SpriteBatch)があります。 カメラの表示領域は、画面サイズと同じに設定されます。 Stageクラスがレンダリングされると、SpriteBatchはルートグループをレンダリングします。 ただし、StageはInputProcessorインターフェイスを実装し、入力イベントをルートグループに送信します。



Groupクラスは、他のアクターを含むアクターです。 グループのローテーションとスケーリングは、それに応じて子会社に反映されます。 Groupクラスは、描画および入力イベントを適切な子アクターに委任します。 子が独自の座標系でこれらの座標を受け取るように、入力イベントの座標を変換します。



Actorクラスは、シーングラフノードを表す基本的な機能を提供します。 位置、サイズ、スケールに関する情報、回転、親コンポーネント(原点)があります。 また、アクターには名前を付けることができます。これにより、この名前でアクターを見つけることができ、デバッグに役立ちます(名前とともにアクターの階層を表示できます)。



ステージクラスのセットアップ





Stageクラスにはビューポートがあります。 コンストラクターで指定できますが、アプリケーションのサイズを変更するときにこの領域を設定することをお勧めします。 コンストラクターは、stretchと呼ばれるブール値パラメーターも受け入れます。 このパラメーターがtrueに設定されている場合、画面サイズがステージ表示領域のサイズと一致しない場合、描画中のStageクラスは画像を画面サイズに拡大(圧縮)します。 このパラメーターがfalseの場合、ステージビューポートのサイズは画面解像度に合わせてトリミングされます。 resize()メソッドでビューポートを構成する場合、このパラメーターの値は重要ではありません。



Stageクラスにはactと呼ばれるメソッドがあり、最後のフレームが描画されてから経過した時間がかかります。 このメソッドを呼び出すと、他のアクターのactメソッドが呼び出され、アクターは特定の間隔で特定のアクションを実行できます。 Stageクラスのactメソッドの呼び出しはオプションです。



private Stage stage; public void create () { stage = new Stage(0, 0, true); } public void resize (int width, int height) { stage.setViewport(width, height, true); } public void render () { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); stage.act(Gdx.graphics.getDeltaTime()); stage.draw(); } public void dispose() { stage.dispose(); }
      
      







俳優





抽象クラスActorを拡張し、シーングラフの描画、クリックの決定、およびコントロールの処理のためのメソッドを実装します。



描画




Stageクラスのpaintメソッドが呼び出されると、ルートグループのpaintメソッドが呼び出されます。 次に、ルートグループは子アクターの描画メソッドを呼び出します。 アクターを描画するには、draw()メソッドを実装します:



 TextureRegion region; public void draw (SpriteBatch batch, float parentAlpha) { batch.setColor(1, 1, 1, parentAlpha); batch.draw(region, x, y, width, height); }
      
      







SpriteBatch。親アクター(ルートグループ)によって既に構成されたアクターを受け取り、アクターをルートグループの左下隅に対して正しく表示します。 これらは、アクターの位置、彼のサイズ、スケーリングに関する情報、回転などのパラメーターです。 これにより、適切な場所に俳優を非常に簡単に描画できます。 上記のコードでは、パラメーターx、y、幅、高さはActorクラスのパブリックフィールドです。



特定のアクターのvisibleパラメーターがfalseに設定されている場合、ルートグループはその上でdraw()メソッドを呼び出しません。



draw()メソッドに渡されるparentAlphaパラメーターは、親コンポーネントの透明色の値です。 このパラメーターを指定すると、ルートグループと子アクターは半透明(半透明)になります。



SpriteBatchクラスのbegin()メソッドは、特定のアクターのdraw()メソッドが呼び出されたときにすでに呼び出されています。 アクターが他の方法(ShapeRendererクラスなど)で自分自身を描画する必要がある場合、SpriteBatchクラスは完了し、スプライトのパッキングを再び開始する必要があります(begin()およびend()メソッドを呼び出す必要があります)。 もちろん、これはスプライトパッカーのバッファをクリアすることにつながるので、この機能を慎重に使用する必要があります(パフォーマンスの低下がある可能性があります-翻訳者のコメント)。 SpriteBatchクラスの投影行列と変換行列を使用できます。



 private ShapeRenderer renderer; public void draw (SpriteBatch batch, float parentAlpha) { batch.end(); renderer.setProjectionMatrix(batch.getProjectionMatrix()); renderer.setTransformMatrix(batch.getTransformMatrix()); renderer.translate(x, y, 0); renderer.begin(ShapeType.Rectangle); renderer.rect(0, 0, width, height); renderer.end(); batch.begin(); }
      
      







定義をクリック





Stage()クラスでhit()メソッドを呼び出すと、ルートグループでhit()メソッドが呼び出されます。 ルートグループは、子アクターでhit()メソッドを呼び出します。 最初の戻り値はActor型で、Stageクラスの戻り結果になります。 (つまり、アクターの階層を下って行き、アクターがクリックしたことを「考える」とすぐに、アクターは自分自身を返し、Stageクラスはこのアクターを返します。 クリックをインターセプトするには、アクターでhit()メソッドを実装します。



 public Actor hit (float x, float y) { return x > 0 && x < width && y > 0 && y < height ? this : null; }
      
      







hit()メソッドは、クリックされたアクターを返します。それ以外の場合はnullを返します。 座標は、アクターの座標系に関連して取得されます。 上記のコードは、アクターの長方形に該当するポイントをクリックすると、アクターを返すときの典型的な実装を示しています。



タッチイベント処理





制御を処理するには、touchDown()、touchDragged()、およびtouchUp()メソッドを実装します。



 public boolean touchDown (float x, float y, int pointer) { return true; } public void touchDragged (float x, float y, int pointer) { } public void touchUp (float x, float y, int pointer) { }
      
      







StageクラスのtouchDown()メソッドが呼び出されると、ルートグループのtouchDown()メソッドが呼び出されます。 ルートグループは、子アクターでhit()メソッドを呼び出します。 touchDown()メソッドは最初のアクターに対して呼び出され、ヒット()メソッドによって返されます。 このアクターのtouchDown()の呼び出しがfalseを返す場合、これはアクターがイベントを無視し、プロセスが次のアクターに続くことを意味します。 touchDown()がtrueを返す場合、アクターは入力フォーカスを取得します。 これは、もちろんもちろん無視しない限り、touchDragged()およびtouchUp()メソッドを呼び出すことを意味します。 発生が保証されているアクターに対してtouchUp()メソッドが呼び出されると、アクターは入力フォーカスを失います。



GroupクラスのtouchDown()メソッドは、touchDownメッセージを子アクターに送信します。 このメソッドがオーバーライドされる場合、ベースメソッドsuper()。TouchDown()を呼び出す必要があります。そうしないと、アクタは押すことに関するイベントを受け取りません。



オーバーライド可能なクリックを処理するための追加のメソッドも1つあります。これはtouchMoved()メソッドです。 デスクトップPCでのみ呼び出すことができ、マウスを動かすと呼び出されます。



hit()メソッドと同様に、コントロールハンドラーメソッドに渡される座標は、アクターの座標系で指定されます。



アクターのtouchableフィールドがfalseに設定されている場合、Groupクラスはこのアクターの制御を処理するメソッドを呼び出しません。



デスクトップPCでのみ発生するキーボードコントロールを処理するには、keyDown()、keyUp、およびkeyTyped()メソッドをオーバーライドします。 アクターがキーボード入力フォーカスを受け取ったときにのみ呼び出すことができます。 このフォーカスは、StageクラスのkeyboardFocus()メソッドを呼び出すことで取得およびリセットできます。



デスクトップPCでのみ発生するマウススクロールを処理するには、scrolled()メソッドをオーバーライドします。 アクターにスクロールのフォーカスがある場合にのみトリガーされます。 このフォーカスの設定とリセットは、StageクラスのscrollFocusメソッドを使用して行われます。



追加: 例のあるプロジェクト



All Articles