- 本帖最后由 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…