ゲーム開発日記　～libGDXはじめの一歩～

##libGDXスタート
さて、だいぶ前のこととなってしまいましただ、私の投稿でlibGDXのセットアップを紹介したと思います。

現在はセットアップにGradleを使用しているのですが、その紹介はとりあえず置いておきます。

今回は、セットアップ後のlibGDXハローワークの各API等を紹介していこうと思います。

##コードと実行
それではまず、以下のソースコードを開きます。

![スクリーンショット 2014-07-24 15.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/36379/474f29b6-eba3-dbbb-a31d-098e942540bd.png)

自分でプロジェクト名等を変更されたかたは違う名前になっていますが、一番上にあるプロジェクトのsrc内にあるパッケージにあると思います。
これが、libGDXハローワークのソースコードです。

ソースコードは以下のものですね

```java:MyGdxGame.java
package com.me.mygdxgame;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class MyGdxGame implements ApplicationListener {
	private OrthographicCamera camera;
	private SpriteBatch batch;
	private Texture texture;
	private Sprite sprite;
	
	@Override
	public void create() {		
		float w = Gdx.graphics.getWidth();
		float h = Gdx.graphics.getHeight();
		
		camera = new OrthographicCamera(1, h/w);
		batch = new SpriteBatch();
		
		texture = new Texture(Gdx.files.internal("data/libgdx.png"));
		texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
		
		TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);
		
		sprite = new Sprite(region);
		sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
		sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
		sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);
	}

	@Override
	public void dispose() {
		batch.dispose();
		texture.dispose();
	}

	@Override
	public void render() {		
		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		
		batch.setProjectionMatrix(camera.combined);
		batch.begin();
		sprite.draw(batch);
		batch.end();
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}
}
```

この初めのクラスは、ApplicationListenerインターフェイスを実装しています。
簡単に説明すると、AndroidにおけるActivityのようなものです。
つまり、このアプリ開始時の処理、メインループの実装、ポーズや終了、再開などの処理は主にこのクラスからスタートしていきます。

Androidアプリに触れたことがあれば、見慣れたメソッド名が並んでいると思います。
もちろん、Androidのライフサイクルと各メソッドが連動しているため、そこに処理を記述していくことになります。

ひとまずクラスのフィールドを見てみましょう

```java:
    private OrthographicCamera camera;
	private SpriteBatch batch;
	private Texture texture;
	private Sprite sprite;
```

ご覧のとおり、この４つのフィールドがあります。
今回はOrghographicCameraを見て行きましょう

##OrghographicCameraクラス
まずはOrthographicCameraクラスです。
デスクトッププロジェクトも作成してある方は、画面サイズを変更してみてください。
画面サイズに合わせて画像が拡大、縮小されると思います。
これは、このOrthographicCameraクラスによるものです。
このクラスは名前のとおり、アプリケーションを撮影するカメラの様な役割を果たします。

なぜこの昨日が必要なのかというと、端末ごとに画面解像度がちがうからです。

以下の画像を例に見てみます。

解像度480×800に320×320の画像(赤い四角)を表示した時

![解像度説明.png](https://qiita-image-store.s3.amazonaws.com/0/36379/6c0348f9-7e20-ecfb-ed35-31b929f1b38f.png)



解像度1080×1920に同じ画像を表示した時
![解像度説明2.png](https://qiita-image-store.s3.amazonaws.com/0/36379/45d67a1d-38da-e55b-42a0-126a01236001.png)


このように、同じサイズの画像が、解像度によってまったく違うサイズに見えてしまいます。

この違いを吸収してくれるのが、このOrthographicCameraクラスです。

このOrthographicCameraのサイズを指定することで、その範囲内に描画されたものを画面解像度に合わせて自動で拡大縮小してくれます。

![解像度説明３.png](https://qiita-image-store.s3.amazonaws.com/0/36379/8bbab9e1-c2f7-0b9c-21ee-dcb457d0752e.png)

試しに、
OrthographicCameraインスタンス生成時のパラメータを変更してみてください。
値によって画像が縦横に拡大、縮小されます。

最初に設定されているのは(1, h/w)になっていますね。カメラの横幅を１に、縦幅を端末解像度の縦横比にしていることになります。

その上では、Gdx.graphics.getWidth()で端末の横の解像度を、Gdx.graphics.getHeight()で縦の解像度を取得しています。

Gdxインターフェイスの各メソッドは、ファイル、グラフィック、インプット、アプリケーション、ネット、ミュージック等様々な用途で使用される、libGDXのコアとなるものですが、これらについては今後出てきた時に個別に説明していきたいとおもいます。

とりあえず、これでカメラの設定は理解出来ました。
他にもOrghographicCameraには様々な用途がありますので、そちらも今後順々に紹介していこうと思います。

また、libGDxについては下記URLでwikiとAPIリファレンスを閲覧できますので、一度御覧ください。
[libGDX wiki](https://github.com/libgdx/libgdx/wiki)
[libGDX API](https://github.com/libgdx/libgdx/wiki)

また、私の作成したアプリのコードをGitHubに公開していますので、気になる方は見てみて下さい。
https://github.com/ryutah/DEH

正直今自分でみてみるとイライラする雑なコードがたくさんあります。
何かアドバイスなどがあれば、ご教授していただければとても嬉しいです。

次回は残りのフィールドについて書いていこうと思います。