androidでゲームアプリ制作

androidでゲームアプリ制作

androidアプリ開発の記録です.
覚書メインです。
書かれている内容が確実に正しいという保証はありません。

Amebaでブログを始めよう!
前回の記事で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を利用したアプリを作ることができました。疲れた。。。



ButtonやTextViewを画面に表示させたスレッドとは別のスレッドから、
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とは何か?