LibGDXの座標系には、(0,0)が左下にあります。 (この画像のように: http://i.stack.imgur.com/jVrJ0.png )
これは、主に通常の座標系(0,0は左上隅にある)で作成したゲームを移植しているためです。
私の質問:この座標系を変更する簡単な方法はありますか?
カメラを使用する場合(必要な場合)、座標系の変更は非常に簡単です。
camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
TextureRegionsやTextureAtlasを使用する場合、それに加えて行う必要があるのは、region.flip(false、true)の呼び出しだけです。
デフォルトでy-upを使用する理由(上記のように簡単に変更できます)は次のとおりです。
Y-downを使用するlibgdxの2つの場所は次のとおりです。
繰り返しますが、カメラまたはごく一部の行列演算を使用して、使用する座標系を簡単に変更できます。
上記のbadlogicが言ったことを少し拡大するために、TextureAtlas(TextureRegionsを使用)を使用している場合、カメラの動作に加えてbadlogicが言ったようにそれらを反転する必要があります。 TextureAtlasを使用している場合、アトラスを読み込んだ直後にこのコードを使用できます。
String textureFile = "data/textures.txt";
atlas = new TextureAtlas(Gdx.files.internal(textureFile), Gdx.files.internal("data"));
// Let's flip all the regions. Required for y=0 is TOP
Array<AtlasRegion> tr = atlas.getRegions();
for (int i = 0; i < tr.size; i++) {
TextureRegion t = tr.get(i);
t.flip(false, true);
}
変換を非表示にし、一度設定した後は考えない場合は、必要なすべての機能を継承するクラスを作成できますが、最初に座標を変換してから親クラスの関数に渡します。残念ながら、これには多くの時間がかかります。
あるいは、Coordinate
オブジェクト全体(または使用しているもの)に対して単純なy' = height - y
変換を行うメソッドを作成し、各操作の前に1回呼び出すこともできます。
おもしろいグラフィックライブラリ、私は言うでしょう。以下のリンクからこの評価を見つけました。
別の問題は、Libgdxの異なる部分で異なる座標系が使用されていることです。軸の原点が左下隅にある場合とy軸が上を向いている場合があり、スプライトの左上隅が下を向いている場合もあります。メッシュを描画するとき、原点は画面の中央にありました。これにより、画面上の正しい場所にすべてを配置するためにかなりの混乱と余分な作業が発生しました。
特定のメソッドをオーバーライドするSpriteBatch
を拡張するクラスを作成し、y = Gdx.graphics.getHeight() - y - height
を追加しました。シンプルだが効果的。
これが誰かに役立つかどうかはわかりませんが、OrthographicCameraを介して提案された反転した座標系を使用して、テクスチャおよびフォントを正しくレンダリングできました。私がやったことは次のとおりです。
private SpriteBatch batch;
private BitmapFont font;
private OrthographicCamera cam;
private Texture tex;
@Override
public void create () {
batch = new SpriteBatch();
font = new BitmapFont(true);
font.setColor(Color.WHITE);
cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
tex = new Texture("badlogic.jpg");
}
@Override
public void dispose() {
batch.dispose();
font.dispose();
tex.dispose();
}
@Override
public void render () {
cam.update();
batch.setProjectionMatrix(cam.combined);
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Test", 50, 50);
batch.draw(tex, 100, 100, tex.getWidth(), tex.getHeight(), 0, 0, tex.getWidth(), tex.getHeight(), false, true);
batch.end();
}
重要な注意事項は次のとおりです。
今晩、ここに戻って他の問題を修正するための編集を行っているか、これをすべて行うことで発見したかどうかを確認します。 :)