10

私はこの問題を 2 日間解決しようとしてきましたが、既存の解決策を見つけることをあきらめました。

libgdx の学習を開始し、いくつかのチュートリアルを完了しました。そして今、学んだことをすべて使って、単純な横スクロール ゲームを作成しようとしました。libgdx の例があることはわかっていますが、Box2d と scene2d およびアクタ、タイル マップを組み込んだものは見つかりませんでした。

私の主な問題はカメラにあります。

ステージ用のカメラが必要です (私が知る限り、アクターのメソッド draw() に渡される SpriteBatch の射影行列に使用されます。これが間違っている場合は修正してください)。また、TileMapRender 用のカメラが必要ですrender() メソッドを呼び出します。また、一部のチュートリアルでは、GameScreen に OrthographicCamera があり、必要に応じて使用されます。

OrthographicCamera オブジェクトをメソッドに渡そうとしました。ステージのカメラと TileMapRenderer のカメラをどこでも使用しようとしました。元。

OrthographicCamera ocam  = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT);
stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render
tileMapRenderer.render(ocam);
stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed

また、あらゆる場所で異なるカメラを使用しようとしました。

これらすべてを試した後、正確にいつ何が起こるかはわかりませんが、何が起こるかをリストします。

  • 画面には何も表示されていません ( 描かれているものからカメラが離れている可能性があります )
  • debugRenderer からタイル マップと等高線を確認できます (debugRender も使用しますが、カメラに干渉するとは思いません) が、アクターのスプライトは表示されません (おそらく画面外)。
  • 必要なものはすべて表示されますが、アクターと、彼に追従するはずのカメラを動かそうとすると、スプライトが本体よりも速く移動します (緑のデバッグ スクエア)。

だから私の主な質問は次のとおりです。

  • 複数のカメラがあるとどうなるかわかりません。実際にモニターで「スルー」するのはどれ?
  • 複数のカメラを使用する必要がありますか?

また、私は OpenGL ES 2.0 を使用していることに言及する必要があると考えました。

長い質問で申し訳ありませんが、私には少し複雑なので、詳しく説明する必要があると思いました。

4

1 に答える 1

18

実際には、それらすべてを同時に見ることができます。まったく別の世界を見ているかもしれませんが、全員が自分の視点を画面にレンダリングします。複数のカメラを使用することも、1 つだけを使用することもできます。1 つだけを使用する場合は、TiledMap の描画、アクタを含むステージ、およびオプションの Box2DDebugRenderer の描画の間に、射影行列を正しく更新する必要があります。

後で簡単に破棄できるので、Box2DDebugRenderer に追加の Camera を使用します。変換係数を使用して、メートルをピクセルに、またはその逆に変換すると仮定します。1:1の比率はあまり良くありません。私は常に 1m=16px から 1m=128px の間のものを使用しました。

したがって、この方法で初期化し、それをデバッグ レンダラーに使用します。

OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth() / Constants.PIXEL_PER_METER, Gdx.graphics.getHeight() / Constants.PIXEL_PER_METER);

TiledMapRenderer では、追加のカメラも使用できますが、そのカメラは画面座標でのみ機能するため、変換は行われません。

OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

TiledMap は常に (0, 0) にレンダリングされます。そのため、マップ上を移動するにはカメラを使用する必要があります。おそらく body に従うので、次の方法で更新できます。

tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER)

または、アクターに続く場合:

tiledMapCam.position.set(actor.getX(), actor.getY())

ゲーム オブジェクトを操作する必要があまりなかったので、実際のところ、Scene2d を Box2D と一緒に使用したことはまだありません。ここで、カスタム PhysicsActor を実装する必要があります。これは、Actor を拡張し、body をプロパティとして持つことで、scene2d から Box2D へのブリッジを構築します。各更新ステップで、ボディに基づいてアクタの位置、回転などを設定する必要があります。ただし、ここにはいくつかのオプションがあります。tiledMapCam を再利用して、画面座標で作業することができます。この場合、アクタを更新するときは常に Constants.PIXELS_PER_METER を乗算することを忘れないでください。または、physicsDebugCam のような同じビューポートを持つ別のカムを使用します。この場合、変換は必要ありませんが、これがいくつかのシーン 2d 固有のものに干渉する可能性があるかどうかはわかりません。

ParallaxBackground の場合は別のカメラも使用できます。UI の場合は、別のステージと別のカメラを再度使用できます... または、正しくリセットして他のカメラを再利用できます。それはあなたの選択ですが、いくつかのカメラがパフォーマンスに大きな影響を与えることはないと思います。リセットとコンバージョンを減らすことで、それが改善されることさえあります.

すべての設定が完了したら、正しいカメラを使用してすべてをレンダリングし、すべての「レイヤー」/「ビュー」を重ねてレンダリングするだけです。最初に ParallaxBackground、次に Tiledmap、次に Entity-Stage、次に Box2DDebugging ビュー、そして UI ステージです。

一般に、カメラの何かを変更した後は、呼び出しspriteBatch.setProjectionMatrix(cam.combined);て使用することを忘れないでください。cam.update()

于 2013-08-21T06:35:58.667 に答える