Cocos2d-x と pd-for-android その4

前回の課題、pd から送られてくるクリック(metro を利用したテンポ情報)に同期させて、cocos2d-x 側でスプライトをアニメーションさせるってヤツに取り組んでいたのですが、思いのほか手間取る。

前回は、
cocos2d-x(タッチイベント) -> java -> pd-for-android(発音)
をクリアしたので、

今回は、
pd-for-android(metroのクリック) -> java -> cocos2d-x(スプライトのアニメーション)
に挑戦中。

一応、色々な解説サイト様を参考にコンパイル・エラーは出なくなったものの、アプリを実行すると、そんなネイティブ・メソッドないよーと言われて終~了~を幾度と無く繰り返す。

こちら様の最後の回答のやり方 で回避できました。

AppActivity.java

protected void onCreate(Budle savesInstanceState){
(略)
}
public static native void methodName(arg1, arg2, ・・・・);
(略)

dispatcher = new PdUiDispatcher();
PdBase.setReceiver(dispatcher);

dispatcher.addListener("senderName", new PdListener.Adpter(){
    @Override
    public void receiveFloat(String source, final float x){
        methodName(arg1, arg2, ・・・・・);
    }
});



HelloWorldScene.cpp

void Java_org_cocos2dx_cpp_AppActivity_methodName(JNIEnv* env, jobject thiz, jstring arge1, jfloat arg2, ・・・・){

    const char* str = env->GetStringUTFChars(arg1, 0);
    (等、必要な処理の記述)

}



HelloWorldScene.h

class HelloWorld : public cocos2d::Layer{
(略)
};
extern "C"{
    void Java_org_cocos2dx_cpp_AppActivity_methodName(JNIEnv* env, jobject thiz, jstring arg1, jfloat arg2, ・・・・);
}



汎用性を持たさせたるために、java 側から、Pd のセンダー名と送られてきた値を引数として取って、cocos2d-x 側の関数で処理を振り分けるようにしたかったのですが、これが良く分からず。

こちら様の javaからcocos2d-xにコマンドを送る のHelloWorldScene.h 、 HelloWprldScene.cpp を参考に、sharedScene を使うことで、なんとか関数を呼び出すことが出来ました。

しかし、良く理解してないままなので、今後どういう影響がでるかは未知数。

またしても、問題を先送りするのであった。

スポンサーサイト

Cocos2d-x と pd-for-android その3

さてさて、相変わらずバカげたミスで、コンパイル・エラーがとれないよー! してたワタクシ。

こちら様の cocos2d-xでjniを使ってみる を参考に、JniHelper を使ったら音が出ましたー!
いや、めでたい。

参考にしたサイト様をほぼ丸写しですが、Pd 側のレシーバーを指定して、float のデータを送りたかったので、こんな感じに改造。

InterfaceJNI.cpp

void InterfaceJNI::func_sendfloat(const char* value1, float value2){

  JniMethodInfo t;
    if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func_sendfloat", "(Ljava/lang/String;F)V")){

      jstring stringArg1 = t.env->NewStringUTF(value1);

      t.env->CallStaticFloatMethod(t.classID, t.methodID, stringArg1, value2);
      t.env->DeleteLocalRef(stringArg1);
      t.env->DeleteLocalRef(t.classID);
    }
}



AppActivity.java

  public static void func_sendfloat(String receiver, float value){
    PdBase.sendFloat(receiver, value);
  }



HelloWorldScene.cpp

void HelloWorld::sendFloat(const char* rcv, float val){

  InterfaceJNI::func_sendfloat(rcv, val);

}



で、HelloWorldScene.cpp で、適宜(今回はボタンが押されたかどうかの判定するところ)、this->sendFloat("レシーバー名", float値) してやれば大丈夫でした。

さて、次は Pd 側からレシーブしたデータで、cocos側を制御ってのに挑戦かな。
するってーと、テンポに合わせてキャラを動かしたりできるって寸法よ。


Cocos2d-x と pd-for-android その2

コチラの記事 で書いたことを引き続き調査してみたところ、やはり EasyNDK はCocos2d-x Ver.3 では使われていない模様。
まだ、未検証だけど、普通に JNI 的なことをしたほうが簡単っぽい。

というわけで、sendFloat("receiver", 1) すると音が出て、sendFloat("receiver", 0) すると音が止まる簡単な pd パッチを組んでテスツ。


やりたいことは、cocos2d-x でボタンを1個表示して、そのボタンが押されたら、Java 側の sendFloat する関数を呼び出して発音させるだけ。


とりあえず、ターミナルから cocos new ~ で新しいプロジェクトを作って、いつもの手順

で、ボタンを表示して、押されたときに一瞬拡大縮小して画像が切り替わるようなアニメーションを付けたりする。
CC_CALLBACK_2(アニメする関数, this); の「アニメする関数」に引数を渡すのはどうやるんじゃろで、1日悩む。
ネット検索して「お、これならイケるか」と思っても、大抵「deprecated」と言われるのね・・・。
あと、中国語サイトが引っかかりすぎ問題。

そして、本丸の AppActivity.java への pd-for-android の組み込み。
sendFloat する関数を作る前に、とりあえず、PdCore の初期化と、.pd ファイルの読み込みだけを試してみる。
まぁ、この辺は定型文に近いし・・・。

で、コンパイル。

java.io.FileNotFoundException: /data/data/<パッケージ名>/files/xxxxx.pd

うーん、.pd ファイルがないとか言われている模様。

良く分からないので、assets フォルダの中の res フォルダにも raw フォルダを作って、.pd ファイルをぶち込んでみたけど変化なし。

AppActivity.java の package 指定が org.cocos2dx.cpp になっているからかしらん。
なんとなく、/data/data/org.cocos2dx.cpp/ にいそうな気がするのよねん。

さて、どうやって調べよう。


[ 追記 ]
ぎょへー! 単なる .pd ファイル名のタイプミスだったー!!
コンパイルは通ったので、これから JNI を使って、sendFloat して音が出るかテスト。

挫折禁止

またしても、無料で英語版(´・ω・`)のチュートリアルを入手して、本日着手したんだけど、これが iOS/Xcode 向けの上、少々古いもよう。

英語の翻訳だけでなく、iOS/Xcode を Android/Eclipse に、Ver.2.x を Ver.3.x に翻訳しなくてはならないのであった。

早くも挫け気味。

挫折禁止

Cocos2d-x と pd-for-android など

ぼちぼち、Cocos2d-x と pd-for-android を一緒に使うことを考えてみる。

ネット検索してみると、出来たよ! という報告 は1件くらいか。

詳しくは以下の URL を見よ的な事が書いてあるようですが。

EasyNDK
How to work on Android -C++/Java
How towork on iOS - C++/Objective-C

うーん、この手法だと iOS と Android の互換性を考えなければ、JNI を使わなくても良いのだろうか?
ちょっと気になるのは、cocos2d-x.org でのドキュメント置き場。

Outdated Docs > EasyNDK ~

となっているんだけど、使えるんですかね? コレ。


爆破

なんとなく早朝に目が覚めて、これまたなんとなくテレビを点けたら、おはよう!時代劇で「続々三匹が斬る!」再放送中。
そのまま見続けてしまったら目が冴えてしまって、録画してあった深夜アニメを1時間ほど見てしまった数日前。
そのまま、数日間寝不足状態が続いていたのだが、やっと生活のリズムが戻ってきたぞ。

それはさておき、寝ぼけまなこで「三匹が斬る!」を見ていたわけですが、当時、CGが一般的に普及していたわけでもなく、爆破シーンとか「リアルにふっ飛ばしてんなぁ・・・」とか思ったわけです。

そういや、あの頃、西部警察も派手だったよなぁ・・・、ていうか、西部警察って、クライマックスをどうやって爆破シーンに持っていくかでストーリーを構成してたよなぁ。

「○○組が・・・」と暴力団がらみの話で始まって最後はドカーン!
「××国から要人が来日・・・」で、最後はドカーン!
爆煙漂う中、渡哲也の歌うテーマソングが流れればなんとなく解決した風な雰囲気に・・・。
まぁ、時代ですかねぇ。

空き家問題で法律改正しようかという昨今、特技の技術継承という点からも、石原プロに一肌脱いでもらって、撮影ついでに空き家を爆破してもらうのはどうかと思いついたりしたんですが、まぁ、これはまだ睡眠不足から立ち直ってないのかもしれない。

逆に

浅田真央の現役続行会見後の週刊文春、『本誌だけが書ける 浅田真央「現役続行」会見までの全内幕』・・・。
前週に「引退」予測記事を書いてた「本誌」だけは書くなよ・・・。

Amazon Ads を使ってみようかと その3

というわけで、Amazon Ads を使ってみようかと その2 で書いたように、Google Ads 関係をコメントアウトして試してみたところ、

AmazonMobileAds Adloader Server Message: DISABLED_APP;

とのお返事。

ネット検索してみたら、どうやら、「支払い情報」と「税に関する情報」の入力が完了しないと、サーバーからお返事貰えないみたいですね。

「支払い情報」は、振込先の銀行口座番号を入力するだけで良いんだけど、問題は「税に関する情報」。

「税に関する情報」は、アメリカの納税者番号(Taxpayer ID Number)とやらを取得しなくちゃならないみたいですね・・・。
詳しくはこちら

手っ取り早いのはファックスみたいだけど、ファックス機は持ってないんだよなぁ。

ネット検索すると、体験記がありました。

Amazonから税に関する情報提出の指令!TIN(アメリカ納税者番号)を手に入れる

うーん、ファックス送信はネットの無料サービスでいけるみたいだけど、受信のサービスはないみたいですね。
いや、ネット検索したらいくつかヒットしたけど、有料サービスばかり。
しかも、月額制が多いので、これだけのためにってわけにはいかなそう。

こちらのファックス番号を書かなければ郵送で返送してくれるのかしらん。
人柱になってみようかな・・・、ゴクリ。


ふと、ダイアル・アップ時代のファックス・モデムを思い出したりして。

Amazon Ads を使ってみようかと その2

その1 での、FATAL EXCEPTION: main は、appcompat の jar ファイルを2重に読み込んでしまったためと判明。良かった良かった。

で、まぁ、Amazon Developer の クイックスタートガイド に従って、コードを書いていったわけですが、ちょいと問題が・・・。

この Amazon のモバイル広告、何かの都合で自分のとこの広告が表示できない際に、Google の広告を表示してくれるという便利な機能がついているのですが、これが例の Google Play開発者サービス を利用するらしいんですよ。

先日、アンインストールしちゃたので、

GooglePlayServices not available due to error 1

と、インストールしてねーじゃねーか! と怒られる。

で、まぁ、古いバージョンなら動いていたので、7.0.99 をインストールすると

GooglePlayServices not available due to error 2

と、古いバージョンじゃねーか! と怒られる。


「Google Play開発者サービスが停止しました」が出ないことを祈りながら、最新版をインストールしてみたのものの、そこはそれ、そんなに都合良いことが起きるなら、ワタシももう少しマシな暮らしをしていることだろう。

というわけで、アプリは起動するものの、広告表示の箇所にエラーが出て、肝心なところをチェックできないのです。

明日は、Google 関係を全部つぶして、Amazon Ads だけで動作するかどうか試してみよう。
やること出来た、わーい・・・。

にしても、クイックスタートガイドは、確かにクイックな物なんだろうケド、結局、他のページも全部読まなきゃ組み込めないじゃないですか、これ。

新規ワークスペースに インポート → Exisiting Android Code Into Workspace したら

新規プロジェクトを作ったときには自動生成される appcompat_v7 が生成されず、手動で組み込まなきゃいけなかったので、手順を備忘録として。


詳しくは↓ここを読めって感じですが。
Support Library Setup | Android Developers

Adding libraries without resources
プロジェクトのディレクトリの直下に「lib」ディレクトリを作って、Android SDK ディレクトリ(の下層)にある .jar ファイルをコピー。
で、JAR ファイル右クリックして、ビルド・パス → ビルド・パスに追加。
でOK。

とは言いつつも、こっちのほうが見慣れてるよね、な、
Adding libraries with resources
インポート → Existing Android Code Into Workspace で、/extras/android/support/~ から必要なプロジェクトをインポート。
インポ-トされたライブラリ・プロジェクトの「lib」ディレクトリの中の .jar ファイルを右クリックして ビルド・パス → ビルド・パスに追加 する。
(appcompat だと andoid-support-v4.jar と android-support-v7-appcompat.jar 両方)
ライブラリ・プロジェクトを右クリックして、ビルド・パス → ビルド・パスの構成 の「順番およびエクスポート」で、 .jar ファイルをチェックする。
Android Dependencies からチェックを外す。
OK でライブラリの読み込み完了。

で、ライブラリを組み込みたいプロジェクトを右クリックして、プロパティ → Android → Library からライブラリを選択、といういつものやーつ。


jar ファイルがないじゃん、ビルド・パスの問題を解決しないと、ビルドしてやんないもんねーと言われ続けたのですが、上の対応をして Eclipse を再起動したらエラーが取れました。