cocos2d-html5转js-binding 西子全程记录!!!

  • 本帖最后由 aliketo 于 2012-10-8 16:24 编辑 *

边转边写遇到啥问题就写啥,嘿嘿,坑很多,额。。。。。 兄弟们有点心理准备

0.打开window控制台,这样可以看到错误的信息跟log.
1.修改入口文件,html5的入口文件不能用了,具体可以参考jsbind的demo中的main.js. helper.js也用到,定义一些html5没有的方法
2.js文件需要转成utf8格式。。。坑
3.this.schedule(this.GameUpdate, 1 / 60);这种绑定更新函数的写法不行了,要用this.scheduleUpdate(),然后重载update
4. 从cc.xxx派生出来的类要在构造函数中_associateWithNative 绑定
5. 所有javascript对象,json/window/navigator/canvas/Dom…等,都不能使用,binding不支持,坑爹啊,刚刚手工写了个解析 json对象的函数。xml正在写。js-binding有个C++版本的json解析函数,不过用着老是崩溃,有会用的通知下俺哈
6. js-binding没有支持Sprite的getTexture函数,需要自己加入函数,还有很多函数都不支持,照着这种方法绑定就可以了
JSBool js_cocos2dx_CCSprite_getTexture(JSContext *cx, uint32_t argc, jsval *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t proxy; JS_GET_NATIVE_PROXY(proxy, obj);
cocos2d::CCSprite
cobj = (cocos2d::CCSprite )(proxy ? proxy->ptr : NULL);
TEST_NATIVE_OBJECT(cx, cobj)
if (argc == 0) {
cocos2d::CCTexture2D
ret = cobj->getTexture();
jsval jsret;
js_proxy_t *proxy = js_get_or_create_proxycocos2d::CCTexture2D(cx, ret);
jsret = OBJECT_TO_JSVAL(proxy->obj);
JS_SET_RVAL(cx, vp, jsret);
return JS_TRUE;
}
JS_ReportError(cx, “wrong number of arguments: %d, was expecting %d”, argc, 0);
return JS_FALSE;
}
然后在regist中绑定
JS_FN(“getTexture”, js_cocos2dx_CCSprite_getTexture, 0, JSPROP_PERMANENT | JSPROP_SHARED),

7.html5有的cc.SizeMake/ cc.RectMake都没有,需要在helper.js中定义一次
8.输入框cc.TextFieldTTF,js-binding中没有对应的类,这个麻烦大了,未解决。

今天就搞了这么多,明天继续

9.API不统一 cc.Node.getBoundingBox函数jsbinding中不存在,-x中有函数boundingBox同等功能,可以自己绑定,
getBoundingBoxToWorld不存在同样功能函数,需要的话自己重写份吧
10.cc.Rect.CCRectUnion 函数jsbinding中没有,类似这种的可以把-html5中的拷贝一份到helper.js中即可,或者整个载入函数所在的js文件
cc.Rect.CCRectUnion = function (rectA, rectB) {
var rect = cc.rect(0, 0, 0, 0);
rect.origin.x = Math.min(rectA.origin.x, rectB.origin.x);
rect.origin.y = Math.min(rectA.origin.y, rectB.origin.y);
rect.size.width = Math.max(rectA.origin.x + rectA.size.width, rectB.origin.x + rectB.size.width) - rect.origin.x;
rect.size.height = Math.max(rectA.origin.y + rectA.size.height, rectB.origin.y + rectB.size.height) - rect.origin.y;
return rect
};
11. API不统一,很悲剧的发现jsbind的rect结构是 { { x: x, y: y, width: w, height: h } };
, -html5是{ origin: { x: x, y: y }, size: { width: w, height: h } };,没理法只能改jsbind或者-html5所有用到rect的地了
12. 把修改jsbind的(改-html5代价太大)这个帖上来,以后发现API不统一的可以这样修改 jsbinding
CCRect jsval_to_ccrect(JSContext cx, jsval v) {
JSObject tmp;
JSObject
pOrigin;
JSObject
pSize;
jsval originValue,sizeValue;
jsval jsx, jsy, jswidth, jsheight;
double x, y, width, height;
JS_ValueToObject(cx, v, &tmp);
JS_GetProperty(cx, tmp, “origin”, &originValue);
JS_ValueToObject(cx, originValue, &pOrigin);
JS_GetProperty(cx, pOrigin, “x”, &jsx);
JS_GetProperty(cx, pOrigin, “y”, &jsy);
JS_ValueToNumber(cx, jsx, &x) ;
JS_ValueToNumber(cx, jsy, &y) ;
JS_GetProperty(cx, tmp, “size”, &sizeValue);
JS_ValueToObject(cx, sizeValue, &pSize);
JS_GetProperty(cx, pSize, “width”, &jswidth);
JS_GetProperty(cx, pSize, “height”, &jsheight);
JS_ValueToNumber(cx, jswidth, &width) ;
JS_ValueToNumber(cx, jsheight, &height) ;

return cocos2d::CCRect(x, y, width, height);

}
把这个函数替换原始的,还有ccrect_to_jsval函数别忘记
jsval ccrect_to_jsval(JSContext* cx, CCRect& v) {
JSObject *tmp = JS_NewObject(cx, NULL, NULL, NULL);

if (!tmp) return JSVAL_NULL;

jsval orgin = ccpoint_to_jsval(cx,v.origin);
jsval size = ccsize_to_jsval(cx,v.size);
JSBool ok =JS_DefineProperty(cx, tmp, “origin”,orgin,NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT )&&
JS_DefineProperty(cx, tmp, “size”,size,NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT );
if (ok) {
return OBJECT_TO_JSVAL(tmp);
}
return JSVAL_NULL;
}

苍天啊,我终于看到图像了!!!!
13.API不统一。关于touch, -html5中的layer如果想用touch,需要重写registerWithTouchDispatcher,调用addTargetedDelegate,会自动被调用。 jsbinding中registerWithTouchDispatche不会被自动调用。-html5中是onTouch…
jsbinding中是ccTouch…,修改为on才会被响应
14.一个很严重的问题,可能和垃圾回收机制有关. var p = cc.Sprite.create(); p如果不被场景addChild,就这样孤零零的,下一贞就会失效。 .
15.又一个非常不幸的东东,从cc.xxx派生的类,如果覆盖cc.xxx函数,-html5中会调用覆盖函数,而js-binding不会调用这个覆盖的函数,例如:
var CEffectRotNode = cc.Sprite.extend(
{
transform: function (ctx){
这里不管做啥都无效果
}
} 这个怎么理…怎么理呢? 大神看到快给出个注意啊。 这个已经跟大神问到原因,渲染部分完全用-x,-html中的覆盖
渲染相关函数全部分无效。只能想理法通过jsbind绑定实现了。

总结下经验, javascript中合法的,不代表js-binding中合法,cocos2d-html5中合法的也不代表js-binding中就合法,尽量只有cocos2d的核心功能。
网络部分**
如果你是直接用的websocket,那简单了,下载个C++版的zaphoyd-websocketpp,在-x中编好,直接用jsbining绑定几个相关函数,
如果是用的socket.io库,稍微麻烦点,编好zaphoyd-websocketpp后,用C++实现socket.io用到的几个函数,用jsbinding绑定个WebSocket出来,嘿嘿,理论上完全没问题,正在实现。。。 嘻嘻
1.由于boost io库跟windows冲突,所以要在项目预定义中加入WIN32_LEAN_AND_MEAN, 才能编译过,MLGBZ的,必须发泄下,socket连接服务器测试代码写在全局空间,每次都莫名崩溃,放到函数空间就正确了,浪费了老子有30个小时。恨a。。。
继续转socket…

感谢楼主填坑!

boost 在mac中完全无压力,xcode 支持object-c和C++的混编。
websockettpp的对应函数,肯定要用C++绑定到js中,不然你没法用,上次我做到连接成功就没向下做了,等jsbinding更新

  • 本帖最后由 yzdzidan 于 2012-10-23 17:42 编辑 *

楼主的文章真是雪中送炭啊!!菜鸟我还有很多问题想要请教…刚开始学这些,压力好大…
求教
1.请问JS-BINDING的COCOS2D和COCOS2D-JAVASCRIPT有什么差别?
https://github.com/ryanwilliams/cocos2d-javascript 请问这个COCOS2D-JAVASCRIPT是什么呢?还要装NODE.JS和NPM的?

http://cocos2d-javascript.org/documentation/cocos2d-javascript/v0.2.0-beta/BObject 这个COCOS2D-JAVASCRIPT又是什么呢。。?

2.我在IOS上有网页游戏想要使用COCOS2D-X的话是不是既可以用-HTML5也可以用JS-BINDING呢?
3.JS博大精深,我又刚接触,想要使用COCOS2D-X楼主能不能给个简单的例子,好让我看看同样一个小DEMO是怎么从-HTML5中移植到JS-BINDING中的呢?
4.请问有没有这种可能:在网页中只要写一套调用JS的方法,然后既可以调用COCOS2DX-HTML5又可以兼容调用COCOS2DX-JAVASCRIPT(JS-BINDING)的方法呢?
5.http://game.donews.com/news/201208/1238715.html “API同步至Cocos2d-x 2.0,意味着Cocos2d-iPhone JS binding、Cocos2d-x JS binding和Cocos2d-html5这三个引擎使用相同的API” 请问这个又是什么意思呢?为什么会有2个JS BINDING。。?

希望大佬们能给我点启示。。。好艰难啊T T

— Begin quote from ____

CG_Wang 发表于 2012-10-16 18:52 url

楼主,我感觉没必要这样去填坑了;
cocos2d x 团队正在填这些坑,他们的git-hub上面的版本中已经将很多坑填 …

— End quote

js-BINDING就是COCOS2D-x的一个子模块,这个模块可以驱动js代码。
现在最好先别转了,问题太多,等这个版本更新后应该会好很多

回复错了,呵呵,回楼上的

学习是有收获的,别人填的坑,和自己填的还是有差别的。加油!

  • 本帖最后由 CG_Wang 于 2012-11-26 16:04 编辑 *

楼主你好,我看到您最后说 如果用 websocket 的话,直接用websocketpp就可以了。
但是websocketpp里面有用到boost,boost在mac里面用起来应该是挺麻烦的吧?
现在Javascript这边的类不能重写C++这边的类的方法,那如果JS那边用到了 websocket 的onMessage、onClose 等函数怎么理?还有就是发送的数据,这些是不是都要通过JSBinding 转换一下才能使用呢?

现在在搞websocket的js绑定,没什么头绪,还希望楼主能够指点一下。。。

楼主,我感觉没必要这样去填坑了;
cocos2d x 团队正在填这些坑,他们的git-hub上面的版本中已经将很多坑填过了,你可以直接去当一个下来看一看

革命尚未成功,我等还在努力中。。。。,多谢一西子

— Begin quote from ____

csplayer 发表于 2012-10-4 10:47 url

太好了。。。我这几天都在看jsbinding,没有太多头绪。。。
cocosbuilder2.1rc2给的js例子,没有带custom c …

— End quote

还没弄到那一步,莫急,先让图形出来再弄那个,touch现在都还不好用呢

太好了。。。我这几天都在看jsbinding,没有太多头绪。。。
cocosbuilder2.1rc2给的js例子,没有带custom class的,有一个按钮设置了selector,还不生效。

我找了cocos2dx2.0.3中的代码,也没有看到例子。

大牛能给个示例吗?

非常有意义,大赞!

js-binding对cocosbuilder的支持如何呢?比如自定义类、selector等等

— Begin quote from ____

csplayer 发表于 2012-10-4 09:35 url

非常有意义,大赞!

js-binding对cocosbuilder的支持如何呢?比如自定义类、selector等等 …

— End quote

自定义的类支持