月別アーカイブ: 2015年2月

cocos2d-x v3 > adMob バナー広告を表示

・ AdMob ID を取得する
・ google-play-service SDK を組み込む
・ class AppActivity を以下のように修正する。

import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.net.Uri;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.google.android.gms.ads.*;

public class AppActivity extends Cocos2dxActivity {
	private static AdView adView;
    private final int lp = LinearLayout.LayoutParams.WRAP_CONTENT; 
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState); 
        
        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);	//	320x50	標準のバナー
        adView.setAdUnitId("ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX");  //  AdMob ID
         
        FrameLayout.LayoutParams adParams = new FrameLayout.LayoutParams(lp,lp);
        adParams.gravity = (Gravity.BOTTOM|Gravity.CENTER); 
        addContentView(adView, adParams);
         
        AdRequest adRequest = new AdRequest.Builder().build();
         
        adView.loadAd(adRequest);
    }
}

・マニュフェストに以下を追加する

 <meta-data android:name="com.google.android.gms.version"
 android:value="@integer/google_play_services_version"/>

 <activity android:name="com.google.android.gms.ads.AdActivity"
 android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

※ v3.4 にアップデータとしたら、cocos compile でビルドすると、configChanges に screenSize を指定すると、ビルドエラーが出るようになった。
これを解決するには project.properties の target を 13 以上にするとよい。
この解決方法は 愛ふぉん太郎 氏にご教授していただいた。あらためて御礼申し上げます。

cocos2d-x v3 Android > パッケージを追加する

cocos2d-x Android 版に AdMob を追加するときなどは、プロジェクトにパッケージを追加しなくてはいけない。
そうでないと、ビルド時に「パッケージcom.google.android.gms.adsは存在しません」みたいなエラーが発生する。

以下は Eclipse を使って、プロジェクトに google-play-services パッケージを追加する方法
[1] Eclipse でプロジェクトをインポートする
プロジェクト/proj.java を指定するといいぞ。
[2] プロジェクトのプロパティを開き、左のリストから Android を選び、右下の【Add…】を押す

temp

[3] google-play-services SDK が既にインストールされていれば、一覧に表示されるそれを選択して【OK】を押す

temp

以上でビルドエラーは出なくなるはずだ。

で、この情報はいったいどこに格納されているのか。。。謎だ

 

cocos2d-x v3 > BGM

BGMを再生するには、以下のようにするといいぞ

  1. resource 下に mp3 ファイルを入れる
  2. #include “SimpleAudioEngine.h” を書く
  3. CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic( “BGMファイル名.mp3” ); で、BGMをプリロードしておく
  4. CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(ボリューム); でボリュームを指定。ボリュームは、範囲 [0, 1] の float 型
  5. CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("BGMファイル名.mp3", true); で再生開始。第2引数はループ再生するかどうかのフラグ
  6. CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(); で再生停止

 

cocos2d-x v3 > 効果音

効果音を再生するには、以下のようにすればよろし

[1] resource 下に mp3 ファイルを入れる
[2] #include “SimpleAudioEngine.h” を書く
[3] CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(“ファイル名.mp3”); を書く

いじょ

ファイヤーアルパカ>色相を変えて別パターンを作ろう

temp

上図の様に、左側の青のパターンを作った後、右のだいだいのパターンを作りたい場合、「色相」機能を使うといいぞ。

アルパカで レイヤー > 色相 メニューを選択すると、以下のダイアログが表示される。

temp

このダイアログの「色相」のスライダーを 180 にすると、青の逆の色相のだいだいになるぞ。

02/21 までの週間PV数の推移と今後の予測

temp

上図は、本サイトの最近12週間の週間PV数のグラフ。
今度こそ 14,000 を超えるかと思ったが、13,962 → 13,603 → 13,926 と、3週間前にも及ばなかった。
おいらのサイトは土日祭日のPV数が平日の半分程度だ。なので google 検索でのクリック率が一時的にでも下がると、順位が下がり、そのためにその次の週もPV数が伸びないという現象のように思える。

temp

temp

temp

cocos2d-x v3 > JNI

JNI を使って、C++ から Java のスタティック関数を呼び出すには、以下の2つの作業を行う。

  1. Java でクラスとスタティック関数を追加する
  2. java 関数をコールするためのC++関数を追加

以下、上記の内容を詳しく説明する。

1. Java でクラスとスタティック関数を追加する

スタティック関数をお手軽に追加するのでよければ、proj.android/src/org/cocos2dx/cpp/AppActivity.java に追加する

.....
import org.cocos2dx.lib.Cocos2dxActivity;
public class AppActivity extends Cocos2dxActivity {
    // ← ここにスタティック関数を追加
}

例えば、ビープ音を鳴らす関数 beep() を追加したいのであれば、以下のように記述する

.....
import org.cocos2dx.lib.Cocos2dxActivity;
import android.media.AudioManager;
import android.media.ToneGenerator;
public class AppActivity extends Cocos2dxActivity {
  static void beep()
  {
      ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_SYSTEM,
                                                      ToneGenerator.MAX_VOLUME);
      toneGenerator.startTone(ToneGenerator.TONE_PROP_BEEP);
  }
}

2. java 関数をコールするためのC++関数を追加

JNI をコールするラッパーをC++で定義するといいだろう。
ここでは、interfaceJNI.h, interfaceJNI.cpp を作成し、プロジェクトに追加するものとする。
別ファイルにするのではなく、既存のファイルに以下のコードを追加してもよい。

“interfaceJNI.h” では、ラッパー関数の宣言を行う。
先の例の beep() を呼び出す関数 beep() を宣言する。
必須ではないが、この例では名前空間を JNI としておく。

namespace JNI {
  void beep();
};

“interfaceJNI.cpp” では、JNI::beep() の実装を行う。
その前に以下のおまじないを書いておく。
最後の JNICLASSNAME は、先に java 側で書いた beep 関数のパッケージ名を示す。
先の beep() は AppActivity 内のスタティック関数として定義したが、別のパッケージを作りその中で定義した場合は、当然クラス名を変更する必要がある。

#include "interfaceJNI.h"
#include "platform/android/jni/JniHelper.h"
#include 
// 呼び出すメソッドが書かれているパッケージ名とjavaクラス名
#define JNICLASSNAME "org/cocos2dx/cpp/AppActivity"

ついで、実装は以下のようになる。

namespace JNI {
  void beep()
  {
    JniMethodInfo methodInfo;
    if(JniHelper::getStaticMethodInfo(methodInfo, JNICLASSNAME, "beep", "()V")){
      methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
      methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
  }
}

JniMethodInfo は JNI メソッド情報構造体である。
そのオブジェクトを生成し、JniHelper::getStaticMethodInfo() でメソッドを検索する。
第1引数に JNI メソッド情報構造体を、第2引数にJNIクラス名を、第3引数に Java スタティック関数名を、第4引数に関数引数と返り値型のシグネチャを指定する。
今回の beep() は引数無し、戻り型は void なので “()V” と指定している。
※ シグネチャに詳細については後述する。
そして、methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID); で JNI 経由で java 関数を呼び出し、methodInfo.env->DeleteLocalRef(methodInfo.classID); でメモリのクリーンナップを行う。

以上が定義できていれば、プロジェクトの任意の位置から、以下のコードで java 関数を呼び出すことが出来る。

#include "interfaceJNI.h"
.....
  JNI::beep();

・int 型のメソッドを呼ぶ場合は CallStaticIntMethod() を使用する
・関数引数は、第3引数以降に指定する

例として int add(int a, int b) を呼ぶ場合は、以下のように記述する。

  int add(int arg1, int arg2) {
    JniMethodInfo methodInfo;
    if(JniHelper::getStaticMethodInfo(methodInfo, JNICLASSNAME, "add", "(II)I")){
      int rv = methodInfo.env->CallStaticIntMethod(methodInfo.classID, methodInfo.methodID, arg1, arg2);
      methodInfo.env->DeleteLocalRef(methodInfo.classID);
      return rv;
    } else
      return -1;
  }

cocos2d-x v3.4 win32 UserDefault.xml のありか

3.3 で仕様変更があったようで、win32 デバッグモードでは UserDefault.xml がデバッグディレクトリに作成されなくなった。
元のように作成されるようにするには、cocos2d/cocos/platform/win32/CCFileUtils-win32.cpp の string FileUtilsWin32::getWritablePath() の中の //#ifndef _DEBUG, //#endif // not defined _DEBUG の 行コメントの // を削除するといいぞ。

string FileUtilsWin32::getWritablePath() const
{
    .....
    // Debug app uses executable directory; Non-debug app uses local app data directory
#ifndef _DEBUG
        // Get filename of executable only, e.g. MyGame.exe
        char *base_name = strrchr(full_path, '\\');
        .....
#endif // not defined _DEBUG

cocos2d-x v3.4 Android 用ビルドの泥縄的対処

win32 向けビルドは正常に終了するのだが、cocos compile -p android -m release でアンドロイド用ビルドを行うと、以下のエラーが発生するようになってしまった。

./obj/local/armeabi/objs/cocos2dcpp_shared/__/__/Classes/piece.o:piece.cpp:
vtable for Piece: error: undefined reference to ‘cocos2d::Sprite::setDisplayFrameWithAnimationName(std::string const&, int)’

原因がよくわからないのだが、以下のように setDisplayFrameWithAnimationName() を明示的にオーバライドしてあげたら、一応ビルドできるようになったでござるぞ。

class Piece : public cocos2d::Sprite
{
	.....
public:
	void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex);	
};

ただ、根本的な解決法ではないと思われるので、要調査でござるぞ。

02/14 までの週間PV数の推移と今後の予測

temp

上図は最近12週間の本サイトの週間PV数の推移グラフだ。
水曜日が祭日だったために、13,962 → 13,603(-2.57%)と若干減少した。
-9% 程度を予測していたが、減少は思いの外少なかった。
今週は+5%ほど増加し、今度こそ 14,000PV/週を超えると予測しておく。

temp

上図は、本サイトのPV数稼ぎ頭たちのグラフ。

temp

上記は比較的最近追加したページたちのグラフ。
伏兵の static がここに来て伸びてきている。GRCでチェックすると、「C++ static」の順位がいつの間にか5位になっていたでござるぞ。

temp

グラフがごちゃごちゃして非常に見づらいので、1月以降に作成したページのグラフを分けておいた。