スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CocosBuilder + PhysicsEditor + Chipmunk

開発メモ。

Chipmunkの当たり判定を作るのは面倒ですので、ツールを使うことがあります。

PhysicsEditorは有料ですが、無料でも10シェイプまでなら出力可能なので、これを使ってます。
本当は開発系のブログをやってる人なら無料でライセンスが貰えるのですが、アダルトサイトなので申請してないです。ついでにchipmunkなのは前回と同じ理由で、最初から使えるから。CocosBuilderは今回関係ないけど、Javascriptで使えるようにする際にCocosPlayerも一緒に改造しておくとデバッグが安易なので。

というわけで、まずは問題点。

・JSB(javascript binding)はまだ、決められたファイル以外の読み込みが出来ない
・plistを読み込んだとしても、パーサーが無い
・日本語の資料がほとんど無い

というわけで、僕のやっている方法を。
JSBに自分で作ったObjectiveCのコードを追加する方法は以前ご紹介しましたが、今回は面倒なので、CocosBuilderのJSB部分に追記して改造します。

まず、今回改造元のソースはコチラ。

CocosBuilder-3.0.alpha5-src

この中で作業しているものと仮定します。

まずは PhysicsEditor に同封されていた

Loaders/generic-chipmunk-plist/GCpShapeCache.h
Loaders/generic-chipmunk-plist/GCpShapeCache.m

を以下フォルダにコピー。

~/CocosBuilder/libs/cocos2d-iphone/external/CCBReader/CCBReader

ソースをCCBReader.hと.mに直接追記でもいいですよ。
ちなみに PhysicsEditor のバージョンは1.0.10でした。

そして、void*型が使えないっぽいので、一部修正。
まぁdataくらいjs側で指定してもいいよね。

-(cpBody*) createBodyWithName:(NSString*)name inSpace:(cpSpace*)space withData:(void*)data;

-(cpBody*) createBodyWithName:(NSString*)name inSpace:(cpSpace*)space;

ソースもエラーが無いように修正して下さい。

//body->data = data;

次に、ファイル読み込み部分でパスが合うように修正。

-(BOOL) addShapesWithFile:(NSString*)plist

の先頭部分ですね。

 /*NSString *path = [[NSBundle mainBundle] pathForResource:plist
  ofType:nil
  inDirectory:nil];*/
 NSString* path = [[CCFileUtils sharedFileUtils] fullPathForFilename:plist];

という感じでしょうか。

次に、JSB用の設定ファイルを修正します。

~/CocosBuilder/libs/cocos2d-iphone/external/JavaScript/jsbindings/configs/CocosBuilderReader/CocosBuilderReader_jsb.ini

この中の該当部分に適当に追記していきます。

classes_to_parse = の最後に
, GCpShapeCache
を追加。

class_properties = の最後に
GCpShapeCache = reserved_slots:2,
を追加。

method_properties = の最後に
GCpShapeCache#createBodyWithName:inSpace: = manual,
を追加。

struct_properties = の最後に
cpBody = opaque,
cpSpace = opaque,
を追加。

次に、同フォルダ内の
gen_CocosBuilderReader_bridgesupport.sh

にchipmunkのヘッダも追加し、以下のように修正。

gen_bridge_metadata -F complete --no-64-bit -c '-DNDEBUG -I. -I../../../cocos2d/. -I../../Chipmunk/include/chipmunk/.' *.h ../../../cocos2d/CCScene.h ../../Chipmunk/include/chipmunk/*.h -o ../../../external/JavaScript/jsbindings/configs/CocosBuilderReader/CocosBuilderReader.bridgesupport

次にターミナルで以下ディレクトリに移動。

~/CocosBuilder/libs/cocos2d-iphone/external/CCBReader/CCBReader

そこから、先ほどのshを実行します。
具体的には、

sh ../../JavaScript/jsbindings/configs/CocosBuilderReader/gen_CocosBuilderReader_bridgesupport.sh

になります。
同様に、

sh ../../JavaScript/jsbindings/configs/CocosBuilderReader/gen_CocosBuilderReader_complement.sh

を実行。
最後に、

../../../external/JavaScript/jsbindings/generate_jsb.py -c ../../../external/JavaScript/jsbindings/configs/CocosBuilderReader/CocosBuilderReader_jsb.ini

も実行したら、

jsb_CocosBuilderReader_*

というファイルがたくさん作られていると思います。
今回は

jsb_CocosBuilderReader_classes_registration.h
jsb_CocosBuilderReader_classes.h
jsb_CocosBuilderReader_classes.mm

の3ファイルを、

~/CocosBuilder/libs/cocos2d-iphone/external/JavaScript/jsbindings/src/auto/

内に上書きします。
ここまでは自動で出力されるものですが、createBodyWithNameは自分の知識不足も合って上手く出力されてくれないので、manual指定してました。というわけで、以下のファイルに追記。

~/CocosBuilder/libs/cocos2d-iphone/external/JavaScript/jsbindings/src/manual/jsb_CocosBuilderReader_manual.mm

追記したソースは以下の通り。

#import "jsb_chipmunk_auto_classes.h"

...

// Arguments: NSString*, cpSpace*
// Ret value: cpBody* (N/A)
JSBool JSB_GCpShapeCache_createBodyWithName_inSpace_(JSContext *cx, uint32_t argc, jsval *vp) {
 
 JSObject* jsthis = (JSObject *)JS_THIS_OBJECT(cx, vp);
 JSB_NSObject *proxy = (JSB_NSObject*) JSB_get_proxy_for_jsobject(jsthis);
 
 JSB_PRECONDITION2( proxy && [proxy realObj], cx, JS_FALSE, "Invalid Proxy object");
 JSB_PRECONDITION2( argc == 2, cx, JS_FALSE, "Invalid number of arguments" );
 jsval *argvp = JS_ARGV(cx,vp);
 JSBool ok = JS_TRUE;
 NSString* arg0; cpSpace* arg1;
 
 ok &= JSB_jsval_to_NSString( cx, *argvp++, &arg0 );
 ok &= JSB_jsval_to_opaque( cx, *argvp++, (void**)&arg1 );
 JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments");
 cpBody* ret_val;
 
 GCpShapeCache *real = (GCpShapeCache*) [proxy realObj];
 ret_val = [real createBodyWithName:(NSString*)arg0 inSpace:(cpSpace*)arg1 ];
 
 JS_SET_RVAL(cx, vp, JSB_jsval_from_c_class( cx, ret_val, JSB_cpBody_object, JSB_cpBody_class, "cpBody" ));
 
 return JS_TRUE;
}

最後に、ほんのちょっと使いやすくするため、jsにラップも追加。

~/CocosBuilder/libs/cocos2d-iphone/external/JavaScript/jsbindings/src/js/jsb_cocosbuilder.js


cc.ShapeCache = cc.ShapeCache || {};

cc.ShapeCache.addShapesFile = function(file)
{
 var sharedCache = cc.GCpShapeCache.sharedShapeCache();
 sharedCache.addShapesWithFile(file);
};
cc.ShapeCache.createBody = function(name, space)
{
 var sharedCache = cc.GCpShapeCache.sharedShapeCache();
 var body = sharedCache.createBodyWithNameInSpace(name, space.handle);
 return body
};

これで完了。
もちろん、このCocosPlayerをビルドし、シミュレータで実行しておきます。
あとは、CocosBuilderでjsファイルを作った際に、以下の命令が有効になっている感じですね。

・読み込み時
cc.ShapeCache.addShapesFile("item1.plist");
cc.ShapeCache.addShapesFile("item2.plist");

・Body作成時
var body = cc.ShapeCache.createBody("itemName", this._space);

今回はCocosPlayer側しか影響無いので、CocosBuilderの再ビルドは必要ありません。

iOSではこれでうまく行ってますが、AndroidやHTML5はまた別の話。将来的にファイル読み込みは実装する予定らしいので、それ待ちです。iOSは物理エンジン使ったゲームをサクっと作る必要があったので、僕はこのような方法を用いました。

一部力技ですが、誰かの参考になれば幸いです。
関連記事

コメントの投稿

非公開コメント

プロフィール

エロぺんぎん

管理人:エロぺんぎん
不純な動機でプログラマーになった男、エロぺんぎんです。ブラザー達を猛烈に応援したい気持ちと、自分もプログラマーとして成長したい思いで、当ブログを立ち上げました。
エロぺん動画を運営しております。

検索フォーム
Twitter
最新記事
最新コメント
カテゴリ
リンク
RSSリンク
エロぺん動画で人気の動画
人気の記事