2016年3月31日木曜日

cocos2d-x v3.10にアップデートして行ったEclipseの設定

どうも、俺です。
cocos2d-xをv2.2.6からv3.10にアップデートしたので、忘れないうちにメモ。

EclipseじゃなくてAndroidStudio使おうぜ、という指摘もあると思いますが、
EclipseでもAndroidStudioでも、両方でビルド出来るようにしたいのです。

まず、v2系で使っていたbuild_native.shはbuild_native.pyに置き換わり、スクリプトの中身を自分で変更しなくても良くなりました。
jni/Android.mkは適宜編集が必要です。


EclipseのRun実行時にbuild_nativeが自動で走らない。

そうです、なぜか自動でbiuld_nativeが走ってくれないので、その設定をば。
プロジェクトを選択し「Properties」>「Builders」を選択。
その中にあるCDT Builderにチェックが入っていないのでチェックします。



これに気づくまでは、手動で./build_native.pyを叩いていたのですが、
なぜかそうすると、libcocos2dx.jar(v3.10)とgoogle-play-services_lib.jarが毎回削除されてしまっていたので、
それぞれのプロジェクトも手動で「Build Project」する必要がありました。。


sh: cocos: command not found的なエラーが出る。

ビルド時にこのエラーが出て先にすすめません。
build_native実行時に呼ばれるcocosコマンドが見つからないそうなので、設定してやります。
先と同じく、プロジェクトを選択し「Properties」から「C/C++ Build」>「Environment」を選択します。
右側の「Add...」から
  • ANDROID_SDK_ROOT = 「ANDROID_SDKのパス」
  • ANT_ROOT = 「ANTのパス」
※例) /usr/local/Cellar/ant/1.9.5/libexec/bin
  • COCOS_CONSOLE_ROOT = 「cocosコマンドのあるパス」
※例) /PATH/TO/COCOS2DX/v3.10/tools/cocos2d-console/bin
  • PATH = 「${PATH}:${COCOS_CONSOLE_ROOT}:${ANDROID_SDK_ROOT}」
を設定します。


今のところ、このくらいです。
また出てくれば追記していきます。

2016年3月29日火曜日

C++で簡易マルチスレッド (C++98 / C++03)

どうも、俺です。

今日はC++を使ってのマルチスレッド実装をメモメモ。
※C++11より前のバージョンの話です。C++11ではもっと簡単に実装できます。


// mutexの定義。排他制御。
pthread_mutex_t mutex;

// Hogeクラスのコンストラクタ
HogeClass::HogeClass()
{
}

// マルチスレッド呼ばれる関数を定義
static void *hogeThreadFunc(void *param)
{
  pthread_mutex_lock(&mutex);

  // 何か重たい処理を行う。
  ....................

  pthread_mutex_unlock(&mutex);
  pthread_mutex_destroy(&mutex);

  return 0;
}

// スレッドを生成して呼び出すメソッド
static void HogeClass::hogeMethod()
{
  // スレッドID(識別子)
  pthread_t threadId;

  pthread_mutex_init(&mutex, NULL);

  // スレッド生成
  pthread_create(&threadId, NULL, hogeThreadFunc, NULL);
  pthread_detach(threadId);
}


こんな感じです。
複数のスレッドからいろんなインスタンスにアクセスするような場合は、
もっと慎重に排他制御を行う必要があると思います。


以上でぇぇぇぇぇす。

2016年3月17日木曜日

[cocos2d-x] C++で年月日時分秒を取得

どうも、俺です。

cocos2d-xを使っていて、C++で年月日を取得するtips。

time_t now = time(NULL);
struct tm *nowtime = localtime(&now);

・年 ... nowtime->tm_year+1900
・月 ... nowtime->tm_mon+1
・日 ... nowtime->tm_mday
・時 ... nowtime->tm_hour
・分 ... nowtime->tm_min
・秒 ... nowtime->tm_sec
で値が取れるので、

CCString *ymd = CCString::createWithFormat("%04d/%02d/%02d", nowtime->tm_year+1900, nowtime->tm_mon+1, nowtime->tm_mday);
int ymdInt = ymd->intValue();

とやると、
例えば20160317となる。

以上でぇぇぇぇぇす。

2015年12月24日木曜日

error: Error retrieving parent for item: No resource found that matches the given name '@android:style/ Theme.Material.Light.DialogWhenLarge.NoActionBar'.

どうも、俺です。

eclipseを使ってAndroidアプリ開発中に、
組み込んだgoogle-play-serviceでタイトル通りのエラーがでたときの対応。

error: Error retrieving parent for item: No resource found that matches the given name '@android:style/ Theme.Material.Light.DialogWhenLarge.NoActionBar'.

eclipseの設定をイジってしまったのだと思いますが、どこをどうイジったのか全く覚えておりません。
修正を色々試みたところ、
StackOverflowに似たようなエラーで困っている人発見!

今回の僕の場合、
appinvite_style.xmlに記述されている
Theme.Material
APIレベル21以上で利用できる、とのことなので、
google-play-serviceプロジェクトの
プロパティ>Android>Project Build Target
をAPI21にして修正完了。


以上でぇぇぇぇぇぇぇぇす。。

2015年12月22日火曜日

cocos2d-x CCRenderTextureでゲーム中のスクショを撮るときの注意点

どうも、俺です。

cocos2d-x (v2.2.6)でTwitter投稿用に画面のキャプチャを撮る処理を実装
したのですが、
キャプチャした時にCCParticleSystemでパーティクルを表示していると画面が真っ黒になってしまう問題に遭遇しました。
※すべてのパーティクルでなる訳ではありません。むしろ一部のパーティクルでのみ発生。
※iOSでのみ確認しましたが、恐らくAndroidでも同様のはず..。


赤いプレイヤーのうしろにある炎がパーティクルです。

キャプチャーの撮影処理は、
CCRenderTexture *AppDelegate::takePicture()
{
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture *texture = CCRenderTexture::create((int)size.width,
                                                       (int)size.height,
                                                       kCCTexture2DPixelFormat_RGBA8888,
                                                       GL_DEPTH24_STENCIL8_OES);
    
    texture->setPosition(ccp(size.width * 0.5f, size.height * 0.5f));
    
    texture->begin();
    CCDirector::sharedDirector()->getRunningScene()->visit();
    texture->end();
    
    return texture;
}
のように処理しています。

この処理のままパーティクル描画ある画面をキャプチャすると、、

このように、パーティクル部分が黒くなってしまいます。

これは利用している炎のパーティクルのccBlendFunctionを変更することで対応できます。
今回の場合は、
    ccBlendFunc blend;
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_ONE;
    _myFireParticle->setBlendFunc(blend);
    
    CC_SAFE_RELEASE_NULL(_screenShot);
    CCRenderTexture *screenShot = AppDelegate::takePicture();
    CC_SAFE_RETAIN(_screenShot);
    
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_DST_ALPHA;
    _myFireParticle->setBlendFunc(blend);

このようにすることで対応できました。
※_myFireParticleは炎のCCParticleSystemインスタンス。

利用するccBlendFuncは、元のパーティクルが崩れない最も適したもので色々試してみてください。


以上でぇぇぇぇぇぇぇぇす。