2011年1月26日水曜日

Androidで音を鳴らす

resフォルダの中にrawフォルダを作って、その中に音声ファイルを保存。
mediaPlayer=MediaPlayer.create(getContext(),R.raw.test_bgm);
javaファイルの中にこんな感じで音声ファイルを登録処理を書くが、eclipseはエラーを出しています。しかしそのまま保存。
そしてR.javaファイルにrawクラスとtest_bgm定数が自動で書き込まれるのを待つ。ここの自動的に書き込まれるっていう部分がまだよくわからないが、とにかくR.javaに自動的に書き込まれるようにする。自分で書き込むとビルドできなかったりした。
あとは簡単。

private MediaPlayer mediaPlayer; //プレーヤー

//サウンドの再生
public void playSound() {
  try {
    mediaPlayer=MediaPlayer.create(getContext(),R.raw.test_bgm3);
    mediaPlayer.start();
    mediaPlayer.setOnCompletionListener(this);
  } catch (Exception e) {
  }
}

//サウンドの停止
public void stopSound() {
  try {
    mediaPlayer.stop();
    mediaPlayer.setOnCompletionListener(null);
    mediaPlayer.release();
    mediaPlayer=null;
  } catch (Exception e) {
  }
}

@Override//サウンド再生終了時に呼ばれる
public void onCompletion(MediaPlayer arg0) {}

ViewとMediaPlayer.OnCompletionListenerを継承する。
コンストラクタの中で
super(context);
を書いておいて、後は音を鳴らしたいところでplaySound()を呼んでやる。stopSound()で音の終了。





2011年1月25日火曜日

Androidでキーリピート

アンドロイドでボタンを押しているあいだ(タッチしているあいだ)毎回呼ばれる処理を実装する話です。
ゲーム作るときには必須の処理だと思います。

onTouch(View v, MotionEvent me)の中でボタンが押されたら(DOWN)リピートフラグをtrueにする。ボタンが離されたら(UP)リピートフラグをfalseにする。
メインループであるonDrawFrame(GL10 gl)の中でキーリピートしているときにコールバックされるオブジェクトを登録する。
private Runnable mLongPressAction = new Runnable() {
  public void run() {//コールバックされる
  //ここにキーリピートされたときの処理を書く
  }
};

private boolean repeat = false;
public boolean onTouch(View v, MotionEvent me) {
  if(me.getAction() == me.ACTION_DOWN) {
    repeat = true;
  }
  if(me.getAction() == me.ACTION_UP) {
    repeat = false;
  }
  return false;
}

private int LONG_PRESS_DELAY = 1;//ミリ秒
private Handler mHandler = new Handler();
public void onDrawFrame(GL10 gl) {//毎回呼ばれる
  if(repeat)
  {//キーリピートされているあいだは毎回コールバックされるオブジェクトを登録
    mHandler.postDelayed(mLongPressAction, LONG_PRESS_DELAY);
  }
}





2011年1月22日土曜日

cocos2d-x Android C++

C++でAndroidとiPhoneのアプリが開発できるものがあるというのをstachibanaさんに紹介してもらいました。cocos2d-xというものです。






2011年1月20日木曜日

Android 画面サイズ取得

yossi'sさんの記事で紹介されてましたが、画面サイズを取得するには

Activity継承クラスの場合
WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = windowmanager.getDefaultDisplay();
int width = disp.getWidth();
int height = disp.getHeight();
というふうにします。

このサイズから好きな割合でボタンやテキストの大きさを作ると、どのAndroidでも統一したレイアウトが作れるんじゃないかと思います。





2011年1月18日火曜日

Android OpenGLES テクスチャ

Androidでテクスチャが表示できない状態になっちゃって、おっかしーなー、コード間違ってないような気がするのになー、と思っていたら.gif画像がダメだったみたいです。.jpgとか.pngの画像なら表示されました。






2011年1月17日月曜日

GLSurfaceView

今までGLSurfaceViewを使わないでOpenGLESの描画を行っていたけど、GLSurfaceViewを使った設計にしてみた。




2011年1月14日金曜日

android-NDK-r5

cygwinをインストールした後、android-NDK-r5のサンプルをビルドしようとしました。
しかし、わからないところがあって色々調べたら解決したことがあったので書いておきます。


bashの.bashrcに、ndkのインストール場所の設定を以下のようにexportしました。
export ANDROID_NDK_ROOT=C:/android-ndk-r5
export PATH=$PATH:/cygdrive/c/minao/android-ndk-r5


そしてネットの記事http://monoist.atmarkit.co.jp/fembedded/articles/android/02/android02b.htmlを参考に、C-Nativeライブラリをコンパイルするための環境設定シェルスクリプト「host-setup.sh」をコマンドで実行しようとしました。
しかし「host-setup.sh」がC:/android-ndk-r5/build/のフォルダの中に無かったので、環境設定シェルスクリプトは後回しにしました。


続いて、サンプルとして提供されているC-Nativeライブラリ「hello-jni」を以下のコマンドでコンパイルしようとしました。
$ make APP=hello-jni


しかし、以下のようなエラーが出ました。
Android NDK: APP variable defined to unknown appllications: hell-jni
Android NDK: You might want to use one of the following: 
build/core/main.mk:81: *** Android NDK: Aborting . Stop.


これは環境設定シェルスクリプト「host-setup.sh」を実行してないからいけないのかと思っていたのですが、そうではなくて、android-ndk-r3からandroid-ndk-r4になるときにmake APP=appnameとやっていたのが、Application.xml がある場所で ndk-build を実行する、 に変わってたようです。
そして、android-ndk-r4からandroid-ndk-r5になるときにApplication.xmlのなまえがAndroidManifest.xmlに変わったようです。


なので、cygwin を起動して、アプリの Application.xml があるところで、
ndk-build
をしてやるとビルドができました。