1. scene的onEnter必须调用父类构造方法this._super();
2.建议用cc.DrawNode代替cc.drawingUtil
3.res.js中的变量可能与其他文件中的变量冲突
4.jsb时,this.initWithFile没有,可能是个坑,改用withFrame之类方法
5.ctor构造函数,new时调用
init初始化函数,手动调用
onEnter进入场景时调用,通常在addChild之后
onExit退出场景时调用,如有动画效果,在动画结束后调用
onExitTransitionDidStart退出场景时调用,如有动画,在动画开始时调用
如子类重写onExit,需在子类onExit中调用父类的onExit一次
cc.[Node|Layer|etc.].prototype.onExit.call(this);或cc.[Node|Layer|etc.].prototype.onExitTransitionDidStart.call(this);
似乎使用this._super()有同样效果。待确认。
6.看不见的元素必须要移除, setVisible 和removefromparent 都行,
a、移动到界面外面去了,已经看不见,实际上还在做draw操作
b、setVisible 不会做draw操作但是还会在主循环中
c、removefromparent 会从主循环中移除
d、隐藏最好用setVisible,可以减少资源消耗。
7.只有layer类才有ontouch等事件, 要给sprite添加touch事件, 就得用addTargetedDelegate去注册事件
addTargetedDelegate( this, 0, true )注册事件,后面两个参数,一个优先级,一个是否冒泡
8.如果没有预加载,一些函数可能不会有预期的效果,比如设置锚点。
9.rendertexture可用来实现擦除效果。 327300401
10.在web页面上显示log,设置IS_SHOW_DEBUG_ON_PAGE=true
11.设置渲染模式renderMode:0, //Choose of RenderMode: 0(default), 1(Canvas only), 2(WebGL only)
12.如果需要jsb,物理引擎还是用chipmunk吧。
13.如何延迟5秒调用一个函数
var wait = cc.DelayTime.create(5);
var enable = cc.CallFunc.create(function(){
this._menu1.setEnabled(true);
}, this);
this._menu1.runAction(cc.Sequence.create(wait, enable));
14.jsb时TypeError: cc.Director.getInstance(…).getTouchDispatcher is not a function
解决方法
var SubSprite = cc.Sprite.extend({
onEnter: function() {
this._super();
cc.registerTargettedDelegate(0, true, this); // Use this instead.
},
onExit: function() {
cc.unregisterTouchDelegate(this); // Use this instead.
this._super();
}
});
或者
var director = cc.Director.getInstance();
if (‘touches’ in sys.capabilities) {
//director.getTouchDispatcher().addTargetedDelegate(this, 10, true); //doest not wrk
cc.registerTargettedDelegate(0, true, this); //no such function
}
if (‘mouse’ in sys.capabilities) {
director.getMouseDispatcher().addMouseDelegate(this, 10);
}
如果使用了ccb
找到extensions/CCBReader/CCLayerLoader.cpp 把上面几个定义改下,改成这个:
#define PROPERTY_TOUCH_ENABLED “touchEnabled”
#define PROPERTY_ACCELEROMETER_ENABLED “accelerometerEnabled”
#define PROPERTY_MOUSE_ENABLED “mouseEnabled”
#define PROPERTY_KEYBOARD_ENABLED “keyboardEnabled”
15. jsb 中,sequence的参数不能使用数组,据说此代码可以解决此问题。
16. 在ccb中包含另外一个ccb,在ch5中可能会出现位置错误,但在jsb中不会。
可以尝试 把第二个CCB的root object type 由cclayer改为ccnode就好了。。 但jsb就不这样
17. layer响应mouse事件:初始化时(init)加入this.setMouseEnabled(true);然后编写事件处理函数,如onMouseMoved,具体事件参考ccmousedispatcher.js
18. 判断鼠标是否在某对象上
atEle:function(ele,mousepos)//ele为判断对象,mousepos为鼠标当前位置
{
var rm=cc.RectMake(0,0,ele.getContentSize().width,ele.getContentSize().height);
return cc.rectContainsPoint(rm,ele.convertToNodeSpace(mousepos));
}
示例代码:
//当鼠标指向StarButton时,将鼠标样式换为手
cc.Director.getInstance().getMouseDispatcher().addMouseDelegate(StartButton,0);
StartButton.onMouseMoved=function(event)
{
if(Utils.atEle(this,event.getLocation()))
{
cc.canvas.style.cursor = ‘pointer’;
}else{
cc.canvas.style.cursor = ‘default’;
}
};
当一个元素被隐藏时,其事件最好取消,否则其仍会响应相关事件,从而可能造成影响,取决于事件的具体处理方式。
比如当鼠标指向StarButton时,将鼠标样式换为手。将StarButton隐藏,显示另外一个按钮PlayButton,也让其鼠标指向时,将鼠标样式换为手。但是实际上不会,除非PlayButton的优先级比StarButton更低(优先级参数数字更高)。当事件较多时,优先级的管理会很麻烦,所以最好隐藏StarButton时,取消其鼠标事件。
事件优先级参数数字越低,越先执行,同优先级,后添加的先执行。
19.当在多个scene或layer中来回切换时,如果使用了addChild,要特别注意事件监听的地方,因为有可能在每次切换时都被注册一次,从而导致一个事件被多次注册。
每次onEnter时,子元素的事件将重新注册。
20.jsb打包放真机上运行黑屏,用ddms监视发现信息
cocos2dx/nativeactivity.cpp(13697): engine_draw_frame : No display.
解决方法
https://github.com/michaelcontento/cocos2d-x/commit/a8e513bf140c84b4d43e189e54c0cc17711567c2
21.使用cocostudio制作的界面
var uiLayer=ccs.UILayer.create();
uiLayer.scheduleUpdate();
this.addChild(uiLayer,100);
var widget=ccs.GUIReader.getInstance().widgetFromJsonFile(‘res/guitest.json’);
uiLayer.addWidget(widget);
22.cc.Director.getInstance().getScheduler().scheduleCallbackForTarget;第一个参数会在玩游戏10来分钟后闪退。。错误显示是gc的释放问题。
第一个参数传null
23.用plist创建动画
var cache = cc.SpriteFrameCache.getInstance();
cache.addSpriteFrames(s_pic_plist, s_pic_png);
var sprite= cc.Sprite.createWithSpriteFrame(cache.getSpriteFrame(‘flash_1.png’));
sprite.setPosition(0,0);
this.addChild(qizi1, 0);
var str = “”;
var animFrame = [];
for(var a = 1; a < 9; a++){
str = “flash_”+ a +”.png”;
animFrame.push(cache.getSpriteFrame(str));
}
var animation = cc.Animation.create(animFrame,0.15);
sprite.runAction(cc.RepeatForever.create(cc.Animate.create(animation)));
24.在应用一些3d效果后,会出现锯齿用可能cc.StopGrid.create可以解决
this.runAction(cc.Sequence.create(cc.CallFunc.create(function(){this.isMenuMoving=true;},this),grid1,grid1.reverse(),cc.StopGrid.create(),cc.CallFunc.create(function(){this.isMenuMoving=false;},this)));
25.jsb时如提示cc.Color4B不存在,尝试cc.c4b