前回の記事でAndEngine環境をEclipseで利用できるようになった。
Gitを用いてAndEngineExamplesをインポートして、サンプルを実行しようとしたけれども、なぜかエラーが出て実行できない。。
と途方に暮れて調べていたら、原因が見つかったのでメモ。
●原因1:必要なパッケージがインポート出来ていない。
前回の記事でGitを用いてインポートしたパッケージは、サンプルを実行するには足りなかったので、必要なものをさらにインポートする必要がある。
必要なパッケージ一覧
AndEngineAugmentedRealityExtension
AndEngineMODPlayerExtension
AndEngineSVGTextureRegionExtension
AndEnginePhysicsBox2DExtension(前回インポート済)
AndEngineTexturePackerExtension
AndEngineMultiplayerExtension
AndEngineLiveWallpaperExtension
AndEngineTMXTiledMapExtension
AndEngineScriptingExtension
●原因2:ソースにエラーがあった。
公開されているソースは、そのままではビルドが通らないので、修正する必要がある。
エラーが出るソースファイル
BoundCameraExample.java
SplitScreenExample.java
HullAlgorithmExample.java
TextBreakExample.java
エラー部分の修正が載っているページがあったのでメモ。
Android – Fixing AndEngineTest build errors
http://cozydev.com/?p=132
このページの通りに修正したらエラーが解消されてサンプルが実行できるようになった。
ubuntuでAndEngineを利用する方法
Androidでのゲーム開発エンジンとして、「AndEngine」と言うものを見つけました。
書店で見つけて「これは使えるのでは?」と思い、入門書を購入。
サンプルを実行しようと思ったけれども、エンジンの導入方法が本文の内容と変わっている上、サンプルがエラーだらけで実行できないという始末。
どうやら、この本が書かれて、翻訳されている間に色々仕様が変更になったりしていた様子。
調べた結果、チュートリアルの動画を見つけたが英語なので、覚書も兼ねて構築の手順を残しておこうと思います。
●環境
Ubuntuバージョン:ubuntu 12.04 LTS
Eclipseバージョン:Version:3.7.2
未日本語化
Android SDKや、AVDなど、Androidアプリを作成する基本的な構成は既に出来ているものとします。
これらに関しては日本語のページも充実していると思うので、そちらを参照してください。
また、以下の手順は環境によって若干異なる可能性がありますので、「あれ、違うかな?」と思ったら動画のチュートリアルを参考にしてください。英語ですが、画面の表示を目で追えば、なんとなく理解できるかもしれません。
●参考にしたサイト、動画
1:AndEngineのチュートリアル。英語が分かるならこれを見た方が早いかも。
AndEngine - Getting Started Tutorial - 2012 - Part 1 of 2
http://www.youtube.com/watch?v=Qj6tXOi8zwY&list=PL6131C7A9DDCF959A&index=1
AndEngine - Getting Started Tutorial - 2012 - Part 2 of 2
http://www.youtube.com/watch?annotation_id=annotation_337457&feature=iv&src_vid=Qj6tXOi8zwY&v=zVIZSKP3tR8
2:AndEngineのチュートリアルが色々載っているサイトのようです。このページのサンプルを動かしました。
Matim Development-「"Hello World" - Basic Example」
https://sites.google.com/site/matimdevelopment/-hello-world---basic-example
●Gitの用意
AndEngineライブラリをインポートするためにはGitが必要なのでインストール
1.端末で以下のコマンドを実行
$sudo apt-get install git
●EGitの用意
eclipseでgitを利用するためのEGitをインストール
1.Eclipseのメニューから「Help」「Install new software」で「Eclipse EGit」を探してインストール
「Egit」で検索したら恐らく出てくる。
2.eclipseを再起動
●AndEngineに必要なパッケージをインポート
インポートすべきものは「https://github.com/nicolasgramlich/」から手に入れることができる。
とりあえず「AndEngine」と「AndEnginePhysicsBox2DExtension」を入れる。
1.Eclipseのメニューから「File」「Import」から「Git」「Proojects from Git」で「Next」
2.「URI」を選んで「Next」
3.「URI」に「https://github.com/nicolasgramlich/AndEngine.git」と入力。
(このURIは「https://github.com/nicolasgramlich/」からブラウザでたどれる。動画参照。)そして「Next」
4.ツリーが表示されるので、GLES2のみチェックして「Next」
5.保存先聞かれるので、まあそのままで「Next」
ダウンロードされるので待機。
6.ダウンロードが完了するとインポートのウィザードを選択する。「Import existing projects」を選択して「Next」
7.インポートのウィザードが表示される。そのままで「Finish」
「AndEnginePhysicsBox2DExtension」も同様に。
この状態で、ワークベンチの左にあるパッケージエクスプローラにインポートしたプロジェクトが表示されます。
●サンプルプログラムの作成
ここから先は上記の参項にしたサイトの2.を参照してください。
1.プロジェクトの作成
適当にAndroid Projectを作成する
「New」「Android Application Project」を選択
「Application Name」を「HelloWorld」(適当)で「Next」
アイコンの選択はそのまま「Next」
「Create Activity」は「Blank Activity」を選択
「Activity Name」は多分そのままでもいいけど「HelloWorld」に変更。で「Finish」
2.作成したプロジェクトにライブラリを登録
パッケージエクスプローラに表示されている「HelloWorld」を右クリック
「properties」を選択
「Android」を選択し、右下の「Library」で「Add」を選択
「Please select a library project」と出るのでGitで入手した「AndEngine」を選択し「OK」
そして「OK」
3.ソースを編集
以下は参項にしたサイトの2.内の3.以降の手順そのまま。
デフォルトで生成されるソースを変更し、EngineOptionsとCameraを作成する。
作成したソースが以下になります(丸コピ。パッケージ名は作成したプロジェクトに合わせて変更しています)。
HelloWorld.java---------------------------------
package com.example.helloworld;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.ui.activity.SimpleBaseGameActivity;
public class HelloWorld extends SimpleBaseGameActivity {
private Camera camera;
private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
@Override
public EngineOptions onCreateEngineOptions() {
camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
EngineOptions engineOptions = new EngineOptions(true,
ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),
camera);
return engineOptions;
}
@Override
protected void onCreateResources() {
}
@Override
protected Scene onCreateScene() {
Scene scene = new Scene();
scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));
return scene;
}
}
------------------------------------
あとは、USBで実機につなげて実行すれば動きます。
これで、一応実機で動くAndEngineを利用したアプリを作ることができました。疲れた。。。
Androidでのゲーム開発エンジンとして、「AndEngine」と言うものを見つけました。
書店で見つけて「これは使えるのでは?」と思い、入門書を購入。
サンプルを実行しようと思ったけれども、エンジンの導入方法が本文の内容と変わっている上、サンプルがエラーだらけで実行できないという始末。
どうやら、この本が書かれて、翻訳されている間に色々仕様が変更になったりしていた様子。
調べた結果、チュートリアルの動画を見つけたが英語なので、覚書も兼ねて構築の手順を残しておこうと思います。
●環境
Ubuntuバージョン:ubuntu 12.04 LTS
Eclipseバージョン:Version:3.7.2
未日本語化
Android SDKや、AVDなど、Androidアプリを作成する基本的な構成は既に出来ているものとします。
これらに関しては日本語のページも充実していると思うので、そちらを参照してください。
また、以下の手順は環境によって若干異なる可能性がありますので、「あれ、違うかな?」と思ったら動画のチュートリアルを参考にしてください。英語ですが、画面の表示を目で追えば、なんとなく理解できるかもしれません。
●参考にしたサイト、動画
1:AndEngineのチュートリアル。英語が分かるならこれを見た方が早いかも。
AndEngine - Getting Started Tutorial - 2012 - Part 1 of 2
http://www.youtube.com/watch?v=Qj6tXOi8zwY&list=PL6131C7A9DDCF959A&index=1
AndEngine - Getting Started Tutorial - 2012 - Part 2 of 2
http://www.youtube.com/watch?annotation_id=annotation_337457&feature=iv&src_vid=Qj6tXOi8zwY&v=zVIZSKP3tR8
2:AndEngineのチュートリアルが色々載っているサイトのようです。このページのサンプルを動かしました。
Matim Development-「"Hello World" - Basic Example」
https://sites.google.com/site/matimdevelopment/-hello-world---basic-example
●Gitの用意
AndEngineライブラリをインポートするためにはGitが必要なのでインストール
1.端末で以下のコマンドを実行
$sudo apt-get install git
●EGitの用意
eclipseでgitを利用するためのEGitをインストール
1.Eclipseのメニューから「Help」「Install new software」で「Eclipse EGit」を探してインストール
「Egit」で検索したら恐らく出てくる。
2.eclipseを再起動
●AndEngineに必要なパッケージをインポート
インポートすべきものは「https://github.com/nicolasgramlich/」から手に入れることができる。
とりあえず「AndEngine」と「AndEnginePhysicsBox2DExtension」を入れる。
1.Eclipseのメニューから「File」「Import」から「Git」「Proojects from Git」で「Next」
2.「URI」を選んで「Next」
3.「URI」に「https://github.com/nicolasgramlich/AndEngine.git」と入力。
(このURIは「https://github.com/nicolasgramlich/」からブラウザでたどれる。動画参照。)そして「Next」
4.ツリーが表示されるので、GLES2のみチェックして「Next」
5.保存先聞かれるので、まあそのままで「Next」
ダウンロードされるので待機。
6.ダウンロードが完了するとインポートのウィザードを選択する。「Import existing projects」を選択して「Next」
7.インポートのウィザードが表示される。そのままで「Finish」
「AndEnginePhysicsBox2DExtension」も同様に。
この状態で、ワークベンチの左にあるパッケージエクスプローラにインポートしたプロジェクトが表示されます。
●サンプルプログラムの作成
ここから先は上記の参項にしたサイトの2.を参照してください。
1.プロジェクトの作成
適当にAndroid Projectを作成する
「New」「Android Application Project」を選択
「Application Name」を「HelloWorld」(適当)で「Next」
アイコンの選択はそのまま「Next」
「Create Activity」は「Blank Activity」を選択
「Activity Name」は多分そのままでもいいけど「HelloWorld」に変更。で「Finish」
2.作成したプロジェクトにライブラリを登録
パッケージエクスプローラに表示されている「HelloWorld」を右クリック
「properties」を選択
「Android」を選択し、右下の「Library」で「Add」を選択
「Please select a library project」と出るのでGitで入手した「AndEngine」を選択し「OK」
そして「OK」
3.ソースを編集
以下は参項にしたサイトの2.内の3.以降の手順そのまま。
デフォルトで生成されるソースを変更し、EngineOptionsとCameraを作成する。
作成したソースが以下になります(丸コピ。パッケージ名は作成したプロジェクトに合わせて変更しています)。
HelloWorld.java---------------------------------
package com.example.helloworld;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.ui.activity.SimpleBaseGameActivity;
public class HelloWorld extends SimpleBaseGameActivity {
private Camera camera;
private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
@Override
public EngineOptions onCreateEngineOptions() {
camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
EngineOptions engineOptions = new EngineOptions(true,
ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),
camera);
return engineOptions;
}
@Override
protected void onCreateResources() {
}
@Override
protected Scene onCreateScene() {
Scene scene = new Scene();
scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));
return scene;
}
}
------------------------------------
あとは、USBで実機につなげて実行すれば動きます。
これで、一応実機で動くAndEngineを利用したアプリを作ることができました。疲れた。。。
ButtonやTextViewを画面に表示させたスレッドとは別のスレッドから、
ButtonやTextViewの表示を変更させようとすると以下のエラーが出る。
viewroot$calledfromwrongthreadexception
例えば、ゲームプログラムで、ゲームロジックを別のスレッドでループさせる処理にしているとする。
画面には、得点を表示するためのTextViewを配置しているとする。このTextViewはXMLで記述するなどにより、プログラムのメインスレッドにより配置されている。
ゲームのループ内で得点が変化した場合、そのスレッド内からTextViewのメソッド(例えばsetText等)を実行すると上記の例外が起きてプログラムが落ちてしまう。
この問題を解決するにはHandlerというものを使う。これを使うと、メインスレッドに対して、他のスレッドから画面出力を依頼することができる。
●使い方
まず、メインスレッド内でHandlerオブジェクトを生成して、呼び出し元のスレッドから参照でき
るようにする。
そして以下のようにして、postメソッドにメインスレッドに対しての描画を実装したRunnableを渡す。
これで、エラーなく別スレッドからメインスレッドで設置したViewを操作することができる。
参考リンク
HandlerとMessage - 別スレッドでのGUI操作
AndroidのHandlerとは何か?
ButtonやTextViewの表示を変更させようとすると以下のエラーが出る。
viewroot$calledfromwrongthreadexception
例えば、ゲームプログラムで、ゲームロジックを別のスレッドでループさせる処理にしているとする。
画面には、得点を表示するためのTextViewを配置しているとする。このTextViewはXMLで記述するなどにより、プログラムのメインスレッドにより配置されている。
ゲームのループ内で得点が変化した場合、そのスレッド内からTextViewのメソッド(例えばsetText等)を実行すると上記の例外が起きてプログラムが落ちてしまう。
この問題を解決するにはHandlerというものを使う。これを使うと、メインスレッドに対して、他のスレッドから画面出力を依頼することができる。
●使い方
まず、メインスレッド内でHandlerオブジェクトを生成して、呼び出し元のスレッドから参照でき
るようにする。
private Handler mHandler;
そして以下のようにして、postメソッドにメインスレッドに対しての描画を実装したRunnableを渡す。
mHandler.post(new Runnable() {
public void run() {
scoreView.setText(String.valueOf(score));
}
});
これで、エラーなく別スレッドからメインスレッドで設置したViewを操作することができる。
参考リンク
HandlerとMessage - 別スレッドでのGUI操作
AndroidのHandlerとは何か?
