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となる。

以上でぇぇぇぇぇす。