[Cocos2d-x]Cocos2d-x 3.3 正式版リリース

Cocos2d-x 3.3 の正式版がリリースされたようです。

http://www.cocos2d-x.org/news/387

ここを見る感じだと3D機能の強化が多いようですかね。

近々自分のプロジェクトもバージョンアップしてみようと思います。

[UE4]AActor::Tick()を使用する際の設定メモ

AActorを継承したクラスで、Tick()を使用する際の設定メモです。
コンストラクタで以下のようにしてあげるとTick()が毎フレ呼ばれるようになります。

AHoge::AHoge(const class FPostConstructInitializeProperties& PCIP)
	: Super(PCIP)
{
	// Tickを毎フレ呼び出せるようにする
	PrimaryActorTick.bCanEverTick = true;
	// Tickグループの設定(デフォルトはTG_PrePhysicsです)
	PrimaryActorTick.TickGroup = TG_PrePhysics;
}

void AHoge::Tick( float DeltaSeconds )
{
	Super::Tick( DeltaSeconds );
}

Cocos2d-x 3.2 の開発環境構築手順

3.0から放置していましたが、3.1をすっとばして、Cocos2d-x 3.2 の開発環境手順をまとめました。

ぎじゅつめも | Cocos2d-x開発環境の構築

3.0 で作成しているローカルのプロジェクトを3.2にアップデートする作業をしないとだめなんですが、それはまた後日・・・。

(C++11)テンプレート使用時の primary-expression token なビルドエラー対応方法メモ

C++11のテンプレートメソッド内で別のテンプレートを呼び出している箇所で、特定のコンパイラでコンパイル時、
error: expected primary-expression before ‘>’ token
なエラーに悩んでしまったので解決方法をメモします。
今まで見たことないので多分C++11からの仕様だと思います。

コードは以下のような感じになります。


// テンプレートなクラス
template<typename T1>
class TemplateClass
{
public:
	template<typename T2> T2 func() { return T2(); }
};

// テンプレートな関数
template<typename T1, typename T2>
void templateFunction()
{
	TemplateClass<T1>	t;
	t.func<T2>();		// < ここでエラーがでます
}

// templateFunctionをコール
void main()
{
	templateFunction<int,float>();
}

上記のコードをビルドするとこんなエラーが出ます。

hoge.cpp: In function 'void templateFunction()':
hoge.cpp:xxx:xxx: error: expected primary-expression before '>' token
   t.func<T2>();
            ^
hoge.cpp:xxx:xxx: error: expected primary-expression before ')' token
   t.func<T2>();
              ^

VisualStudioでは出ずに、gccで出ます。
templateFunction()内の

t.func<T2>();

を以下のように書き換えるとビルドエラーが解消されます。

t.template func<T2>();

Cocos2d-x 3.0 rc0 の開発環境構築手順

Cocos2d-x 3.0 rc0 がリリースされました。
beta2から、そこまで大きな変更は多分ないと思いますが、セットアップ方法やプロジェクト新規作成方法の手順などが少し変わりました。

とりあえずHelloWorldまでの手順をWindows版、Android版共にWikiにまとめました。

ぎじゅつめも – Cocos2d-x開発環境の構築

setup.pyの導入により、前よりわかりやすくなったかもしれませんね。

さて、beta2で作成したプロジェクトをrc0に対応しないと・・・

静的コンストラクタ

クラスの静的コンストラクタを実現する方法を紹介します。
起動時に一度だけ行いたい処理を書く時などに便利です。
ただし、他のstaticなオブジェクトと同じく、初期化順番は保証されない点は注意してください。

ヘッダはこんな感じ。

class Hoge
{
private:
	//! 静的コンストラクタ用のprivateな構造体
	struct Construct
	{
		Construct()
		{
			// ここに初期化処理を書きます
			sm_hoge = 0;
		}
	};
private:
	static Construct	sm_construct;	//!< 静的コンストラクタ
	static int			sm_hoge;
};

cpp側はこんな感じになります。

Hoge::Construct	Hoge::sm_construct;
int				Hoge::sm_hoge = 0;

ご覧のとおり、今回のパターンだとsm_hogeはもともと0で初期化しているので静的コンストラクタで処理している内容に意味はなかったりします。