AndEngineのバージョンはGLES2とGLES2 Anchar Centerのどちらを使うべきか

#AndEngineのバージョン
AndEngineには現在バージョンが三つ存在します。古い順に以下の通りです。

- AndEngine GLES1
- AndEngine GLES2
- AndEngine GLES2 Anchar Center

GLES1はさすがに古すぎるため、実質GLES2とGLES2 Anchar Centerの二択から使用バージョンを選ぶことになります。
公式では最新のGLES2 Anchar Centerを推奨していますが、GLES2 と GLES2 Anchar Centerの間で天地がひっくり返るほどの仕様変更が行われているため注意が必要です。

#GLES2とGLES2 Anchar Centerで何が変わったのか

###開始座標
まずは以下の画像を見てください。
![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/92839/d201a78d-ab7f-a352-b0d4-3661ba64b57b.png)
これはある画像描写コードをAndEngine GLES2で実行したものです。一番下に地面のような茶色い範囲があり、その上に赤い四角。画面の上には白い物体が四つあります。

このコードをAndEngine GLES2 Anchar Centerで実行すると以下のようになります。コード内容は一切変更していません。
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/92839/7c78aa5c-bf06-39e9-2c1e-f243e190757b.png)

画面に表示された画像が上下逆になっているのが分かるでしょう。文字通り天地がひっくり返った状態です。
これは座標の開始位置がGLES2とGLES2 Anchar Centerで変わっていることが原因です。
GLES2では画面の左上を開始座標(0,0)として、x座標が増えると右方向へ、y座標が増えると下方向へ進みます。
![開始.png](https://qiita-image-store.s3.amazonaws.com/0/92839/8716ab1d-9ae4-dde9-6032-c6287e1df3f7.png)


一方GLES2 Anchar Centerでは画面の左下を開始座標(0,0)として、x座標が増えると右方向へ、y座標が増えると上方向へ進みます。
![開始2.png](https://qiita-image-store.s3.amazonaws.com/0/92839/1431ba3e-ab5d-6490-8b04-c27d5e54cd13.png)


###表示座標
前述のコード実行画面を見比べると、完全な上下対称ではなく表示位置に少しズレがあるのが分かるでしょうか。これは画像の表示座標についても仕様が変更されているためです。
GLES2の場合、画像の表示座標を(100,100)にすると画像の左上位置が(100,100)となります。
![position2.png](https://qiita-image-store.s3.amazonaws.com/0/92839/96562251-cc70-fdaf-c94c-167f73336c2d.png)

一方GLES2 Anchar Centerの場合、画像の表示座標にすると画像の中央位置が(100,100)となります。
![position1.png](https://qiita-image-store.s3.amazonaws.com/0/92839/96dbfb4a-233a-32c9-66ac-88e1c0196e1f.png)



###アニメーション座標
AndEngineには画像をアニメーション表示するためのいくつかの機能があります。
例えば、GLES2で以下のコードを使用すると座標(pFromX,pFromY)から座標(pToX,pToY)へ画像を移動させることができます。
```
MoveModifier modifier=new MoveModifier(pDuration, pFromX, pToX, pFromY, pToY)
```
これがGLES2 Anchar Centerだと以下のような記述になります。
```
MoveModifier modifier=new MoveModifier(pDuration, pFromX, pFromY, pToX,pToY)
```
pToX引数と pFromY引数を渡す順番が入れ替わっています。


#これら仕様変更による影響
AndEngineではドキュメントがほとんど整備されておらず、基本的にはネット上に公開されているサンプルコードを基にして使い方を学ぶことになります。そのネット上で公開されているサンプルコードの多くがGLES2向けに作成されているのです。GLES2 Anchar Centerをインクルードした状態でGLES2向けのサンプルコードを実行すると、上下が反転して座標もズレてアニメーションも見当違いの方向へ動いて行くという意味不明の動作をしてしまうのです。座標処理以外のサンプルコードであればそれほど問題はありませんが、ゲームの場合はその大部分が画像描写処理で占められているので影響は大きいでしょう。
また、作成するゲームによっては画面の左上を開始座標とした方がコードを記述しやすいという場合もあります。
一般的に言えば最新版のGLES2 Anchar Centerを使うべきなのでしょうが、学習のしやすさや作成するゲームとの相性によってはGLES2を使用することも視野に入ってくるのです。



#結局どちらのバージョンを使えば良いのか

###横スクロールゲームを作成する場合
GLES2 Anchar Centerの使用をお勧めします。重力の概念なども開始座標が下にあるほうがイメージしやすいです。
最初サンプルコードを基に使い方を学ぶ際にはGLES2をインクルードし、ある程度使い方を理解してからGLES2 Anchar Centerへ移行するというのも良いでしょう。GLES2向けに書かれたコードをGLES2 Anchar Centerに修正するというのも勉強になるはずです。

###上からマップを見下ろす形式のゲームを作成する場合
GLES2の使用をお勧めします。
見下ろし型のゲームの場合、マップチップの配置に配列を使用することが多いでしょう。
```
int map[][] ={
	{0,0,0,3},
	{0,1,0,0},
	{0,0,2,0},
	{1,0,0,0}
	};
```
0の位置には平原、1の位置には木、2の位置には枯れ木、3の位置には山を配置。
![maptip.png](https://qiita-image-store.s3.amazonaws.com/0/92839/c006537a-80f7-1853-2e98-81ec886731b0.png)
こういった手法をとっている場合は、配列の表示順に合わせて画面の左上からマップを敷き詰めた方が分かりやすくなります。左上が開始座標となるGLES2との相性が良いです。

###物理エンジンについての学習が目的の場合
GLES2 Anchar Centerの使用をお勧めします。
学習目的の場合、AndEngineのソースを見て修正するということもあるかもしれません。実はAndEngineの大元であるOpenGLの開始座標(0,0)は画面の左下となっており、GLES2内部で開始座標が画面の左上になるようにわざわざ変換しているのです。GLES2の環境でAndEngineのソースを弄っていると、意図せず上下が反転して画面表示されてしまうことがあり、とても面倒です。
またOpenGLの他にCocos2d-xも開始座標(0,0)は画面の左下となっています。将来的にそういった別環境への移行を考えているのであれば、同じ仕様のGLES2 Anchar Centerを使っていたほうが移行がスムーズになります。

###上記以外の場合
ネット上のサンプルコードをそのまま使って学習できるので、GLES2をそのまま使ったほうが手っ取り早いです。
GLES2 Anchar Centerの更新が活発であればGLES2を使い続けることで最新の環境から取り残される恐れもありますが、現状それほど活発な更新はないようなのでとりあえずは大丈夫でしょう。


<br><br><br>
なお本記事はあくまで筆者の個人的な見解であり、効果を保証するものではありません。
最終的にはご自身の意思で、GLES2とGLES2 Anchar Centerどちらを使うか慎重に選んでください。
一度GLES2で作成したゲームをGLES2 Anchar Centerで作り直すとなった場合は画像表示の関する処理はほとんど書き直すことになるため、グラフィックが大きなウェイトを占めるゲーム作成において大変な労力が必要です。



参考にしたページ
<a href="http://www.matim-dev.com/tutorials.html" target="_blank">AndEngine Tutorials</a>
<a href="http://westplain.sakuraweb.com/translate/AndEngine/" target="_blank">上記の日本語訳サイト(非公式)</a>