cocos2d-xのユニットテストでCCPlatformDefine not found

(前提 Xcode5.1.1 cocos2d-x3.0)

rc2版ではうまくいっていたはずなのに、3.0final版で作り直すと別のエラーが起きました。
今度はコンパイルエラーです。

まずは ‘CCPlatformDefine.h’ file not found
これへの対処としては、UnitTestのTargetのBuild Settingsの設定に追加
Search Paths : Header Search Paths に以下を追加

$(SRCROOT)/../cocos2d/cocos/2d/platform/ios

それでもplatformがわからないというエラーになるので、
Apple LLVM 5.1 Preprocessing : Preprocessor Macros : Debug に以下を追加

CC_TARGET_OS_IPHONE

cocos2d-xのユニットテストでSymbol(s) not found

(前提 Xcode5.1.1 cocos2d-x3.0rc2)

cocos2d-x + xcode でユニットテストをしたくて、テスト用のターゲットを追加。参照設定を終えて、テストコードも書いて、いざテスト実行するとテストプログラム自体のエラーで赤も緑も出やしない。

Undefined symbols for architecture XXXXX
symbol(s) not found for architecture XXXXXXX
clang: error: linker command failed with exit code 1 
(use -v to see invocation)

UnitTestのTargetでは、下記の設定を確認済(自動で設定されるはず)。

  • Linking : Bundle Loader : $(BUILT_PRODUCTS_DIR)/ABCD.app/ABCD”
  • Unit Testing : Test Host : $(BUNDLE_LOADER)

Projectでも、下記の設定を確認済

  • Apple LLVM – Code Genararion : Symbols hidden by default : No

さらに、ソースレベルでは参照できていて、Jump to Definition もできています。

ということで原因究明に手間取りましたが、ひとまず解決したので記録します。

cocos2d-x3.0で、普通にスクリプトでプロジェクト作成すると、本体プロジェクトの中に
入れ子でcocos2d_libs_xcodeproj ができています。
これの「Symbols hidden by default」がYesでした。

このために cocos2d-x側のクラスを見に行くと、前述のエラーになると思われます。
ひとまず、cocos2d_libs_xcodeproj でも下記のように変更してみると、エラーがなくなりました。

  • Apple LLVM – Code Genararion : Symbols hidden by default : No

cocos2d-x 2.2.1 プロジェクトの作成

cocos2d-x 2.2.1
osx 10.9

このバージョンでは install-templates-xcode.sh がなくなりました。
tools/xcode4_tamplate_generatorは、shの中身を見ると、すぐには使えなさそうです。
プロジェクト作成用shがあるのでこれを使います。

cd tools/projects_creator
./create_project.py -project XXX -package aaa.bbb.ccc -language cpp

projects/XXXX に、一式が作成されるので、そこを直接に編集します。
proj.ios/にxcodeのプロジェクトファイルがあります。
なお、projects/XXXXだけを他に移動しても、ライブラリがついて来ないので、コンパイルエラーになります。

gitを使いたいので、コマンドラインでgitの初期化

cd projects/XXXX
git init

cocos2d-xのCCArrayで代入操作

良くドキュメントを読めばそんな失敗はしないのですが、間違えやすいのでメモ

普通に、配列[i] = x というイメージで「insertObject」メソッドを使うと失敗します。
このメソッドは字義通り「挿入」するので、中身が順にずれていきます。
その前後に「removeObjectAtIndex」で削除すればOK。
面倒だったら、「replaceObjectAtIndex」メソッドで。

cocos2d-x:CCObjectでretain

 Objective-Cは、C++とはメモリ管理のしくみが、かなり違っています。cocos2dはもともとObjective-Cで書かれていたものですから、このしくみをエミュレートするCCObjectというクラスがあり、多くのオブジェクトがここから派生しています。自作クラスもここから派生することが多いでしょう。

というところを背景にして、以下の注意が必要です。
privateフィールドに、CCObjectのポインタ変数(多くはcreateメソッドで得た)を保持して、以後も使いまわそうとする場合、そのポインタ変数に対してretain()メソッドを呼び出しておく必要があります。これを怠ると、このポインタ変数が指すエリアはリリースされてしまい、妙な動作をしたり、実行時エラーになります。

cocos2d-x本家のwikiにも、この記載があります。

cocos2d-xで使えるHexagonタイルマップを作る

cocod2dは(cocos2d-xも)、Tiled Map Editorの出力形式(TMX)を標準サポートしているので、これが定番です。Tiled Map Editorは最初はjavaで書かれていましたが、あるときからQtになっています。ところが、このQt版はHexagon(六角形)マップに対応していません。
java版も探せば手に入りますが、幸いQt版にHexagon対応を加えたbranchを公開された方がいます。これをいただいてQtでコンパイルするわけですが、少し古いので、Qtの最新版だとそこそこコンパイルエラーが出てしまいます。なんとか修正して、ようやくTiled Map Editorが起動します。

続いて、これに喰わせるHexagonタイルセットが必要です。ひとまず開発用に無地で作ることにして、inkscapeでpngを作ります。必要な種類の六角形が並んだ一枚絵が必要です。六角形として充塡してある必要はなく、縦横碁盤目に六角形が並んでいればOK。

tileset