【Cocos2d-x 3.0】 XcodeとVisualStudio で共通のコードを使うために
ども、s0_maです。Mac(Xcode)である程度開発したものを、Windows(VisualStudio)でコンパイルしようとしたところ手こずりました。cocos2d-xのサンプルプログラムが動くのは確認していたのですが、ファイルの指定の仕方や文字コードなんかで微妙に違ったようです。
以下は、Xcodeでは正しくコンパイルできていたcocos2d-xプロジェクトをgitでWINDOWS上VisualStudioにもってきて動作させようとした際に起こったものです。
症状1
void VillageMapLayer1::callback1(Ref* pSender, Point pos){ FiniteTimeAction* move = CCMoveTo::create( 1.0f, pos); piece->runAction(Sequence::create(move, CallFunc::create([this](){ auto l = DialogLayerB::create(); l->setPortrait("ame.png"); vector<string> texts; texts.push_back("あいうえお"); l->setText(texts); this->addChild(l,5); l->show(); }) , NULL)); }
- warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください
- error C2059: 構文エラー : ')'
- error C2001: 定数が 2 行目に続いています。
- error C1075: 左側 かっこ '(' に対応するものが 'c:\users\s0_ma\tenclaps\nmd\classes\hoge.cpp' で見つかる前に EOF が検出されました。
原因
初めて遭遇した際にはエラーにだけ目が行ってしまっていて、同時に出ていたwarningにまで気が回らなかった。
"warning C4819"はUnicode(BOM無し)のファイルに対してでるwarningのようです。日本語がなければwarningだけで済むものの、日本語が入ると日本語がある部分以降改行前までが解釈されなくなってしまうようです。
対処
文字コードを変えて保存しなおす。メニュー→ファイル→名前をつけて保存 で上書き保存のタブからエンコード付きで保存を選択する。 保存形式はUnicode(UTF-8 シグネチャ付き)
現在、windows側からファイルを一括で変換できる方法orVisualStudioでBOMなしを読ませる方法を模索中。。。
症状2
ソースコードの文字コードも合っている(utf-8)し、コンパイルも通っているのに日本語が文字化け/表示されない
CCLOG("output: %s", "ほげほげ");
出力
output: ??????
原因
Visual Studioは、デフォルトでは実行ファイル内の文字列をShift-JISにして書き出してしまうらしい。
対処
調べたところ、以下のおまじないをコード冒頭に追記するよ良いらしい。
#pragma execution_character_set("utf-8")
また、c++11では
CCLOG("output: %s", u8"ほげほげ");
なんてこともできるようになるらしいけれど、まだ使っているVisualStudioExpress2013もcocos2d-x3.0も対応していないようなので、#pragmaを書くのが唯一の方法なのかな。
症状3
batchNodeBtnDisabled = SpriteBatchNode::create("btn045_09.png");
コンパイルは通ったが、いざ実行する段になってデバッガーが、 + ハンドルされない例外が 0x0068AD41 (MyGame.exe) で発生しました: 0xC0000005: 場所 0x00000030 の読み取り中にアクセス違反が発生しました。 + cocos2d: fullPathForFilename: No file found at btn045_09.png. Possible missing file.
原因
実は上記ファイル、"Resources/btn045/btn045_09.png"に存在していた。Xcodeの場合、プロジェクトに追加するとプロジェクトで見えているPathで呼び出し可能(内部でリンクしている?)だったのだが、VisualStudioはそうではないらしい。
対処
Resources以下の正しいパスに書き換える。上記の場合なら
batchNodeBtnDisabled = SpriteBatchNode::create("btn045/btn045_09.png");
このケースではVisualStudeioにXcodeを合わせれば良いのかな。