您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-js:小技巧及注意事项汇总

2016-06-15 17:18 549 查看
以下是我使用cocos2d-js以来总结的一些经验,如果有错误或更好的解决办法还请大家指导。

1、创建EditBox后该控件父类上的所有控件位置都会被重置为(0, 0),解决办法:(1)在创建完该控件的父类上的所有控件后开启一次性调度器重新设置这些控件的位置;(2)或者在onEnter()中重新设置这些控件的位置;

2、如果在使用EditBox的层上新建层,新建的层会盖不住EditBox,解决办法:可以把两个层建立在同一父类上,新建层后将使用EditBox的层隐藏,不能隐藏的移到屏幕外;

3、对EditBox设置setVisible(true)后它会马上获得焦点,并弹出输入法。如果项目需要iOS版本,并且有对EditBox设置setPlaceHolder属性,那么需要再对EditBox设置setInputMode属性,不然EditBox第一次获得焦点时占位符不会消失且变得异常大;

4、EditBox中的文字发生变化的响应事件为editBoxTextChanged(sender, text),在EditBox执行了setDelegate(this)后,直接在this对应的上下文中重写该事件方法即可;
5、PageView的监听事件和触摸事件在手机上都无效,PageView的getCurPageIndex()方法在手机上无法使用,需替换为getCurrentPageIndex() ;

6、plist文件在哪使用就在哪加载,重复执行cc.spriteFrameCache.addSpriteFrames()也只会加载一次,不要将很多plist放在一起加载,会非常卡,特殊情况再特殊处理;

7、LayerMultiplex中的层,只在创建LayerMultiplex时初始化一次,之后进入相应层只进入onEnter(),离开进入onExit(),如果其中的层初始化的东西很多,影响加载速度了,可以设置标记控制这些层在ctor()不执行初始化代码,等到第一次onEnter()再执行且仅执行一次初始化代码;

8、判断一个节点a是否存在,不要直接用if(a)判断,a被创建之后即使执行removeFromParent()后这个变量依然存在,但节点已经不在了,所以需要判断的节点在创建后执行setName("a"),用if(this.getChildByName("a"))来判断是否存在(this代表节点a的父类)。如果不这么做,在浏览器上不会出错,打包到手机后会有问题;(有时打包后提示找不到对象,retain后才正常可能是这个原因导致)

9、场景对象中定义的全局变量(即在ctor()上面定义的变量),使用前最好再初始化一次,不然可能下次初始化场景后这些变量却保存了原来的值;

10、大量使用的相似界面,可以定义一个全局的层,要用这些界面的时候就继承这个全局层;

11、LabelTTF控件可以在字符串中用\n换行,但Text控件不行;

12、通过cc.director.getRunningScene()可以拿到当前所在的场景;
13、Button和ImageView等控件setScale9Enabled(true)后无法再通过loadTextures改变图片;

14、节点的层级关系最好可以定义一个枚举统一管理,不然到最后层级关系会容易比较乱;

15、项目中的颜色、字体等界面属性可以定义全局变量来统一使用或修改;

16、毫秒时间a可以通过new Date(a)来转换,以便使用Date的各种方法;

17、ControlSwitch添加在ListView中有BUG,无法正常使用;

18、使用本地存储时,要注意:(1)cc.sys.localStorage.setItem()的参数不要使用全局变量;(2)判断本地存储是否有数据用if(cc.sys.localStorage.getItem("a")),不能用if(cc.sys.localStorage.getItem("a") != null)。不然打包到手机后会出问题,且不报错。另外不要将emoji表情存到本地,不然读取的时候程序代码会不再往下执行,如果无法避免存入emoji表情,那就在程序中自己加入异常处理,一旦读本地存储后程序代码不再往下执行,就清除本地存储数据;

19、在Xcode中调试时,cc.log()不会输出,要用console.log(),但这个的参数对类型有比较多的限制,类型不符的话会报错;

20、如果在循环中创建Button控件并定义其点击事件时,事件内如果需要使用循环变量的值(例如i),可使用匿名函数添加其点击事件,将i通过函数参数传递,例如:

(function (i) {
    button.addClickEventListener(function () {
        switch (i){
            case 0 :
                //
                break;
            default :
                //
                break;
        }
    });
})(i);
否则循环变量的值会因为循环的执行而改变,出现错误;

21、将层隐藏后该层不会再被渲染,对于不会经常变化又需要经常显示和隐藏的层,可以不必每次都创建和移除,直接用setVIsible()控制就好;

22、透明屏蔽层用以下代码即可:

var TransparentLayer = cc.Layer.extend({
ctor:function () {
this._super();

var listener = cc.EventListener.create({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches: true,
onTouchBegan: function (touch, event) {
return true;
}
});
cc.eventManager.addListener(listener, this);
this._listener = listener;
},

onExit: function () {
cc.eventManager.removeListener(this._listener);
this._super();
}
});
23、在触摸事件中判断触摸点是否在控件区域内使用cc.rectContainsPoint(this._widget.getBoundingBox(), touch.getLocation());

24、很多规则图形可以通过DrawNode画出来,不需要使用图片;

25、手机上默认音量调节按钮调节铃声大小,只有在有声音播放时才会变为调整媒体音量,所以如果想使一个没有背景音乐的游戏运行时可以调节媒体音量,就循环播放一个无声音乐或者将音乐音量调节为0后循环播放任意一个音乐;

26、背景重复贴图需要使用精灵,调用setTextureRect(cc.rect(0, 0, x, y))方法和getTexture().setTexParameters(cc.LINEAR, cc.LINEAR, cc.REPEAT, cc.REPEAT)方法,并且要注意图片资源的宽高必须是2的n次幂;

27、使用Text控件时如果要改变文字的颜色,先调用setString()再去改变文字颜色,否则不会有变化;

28、android横竖屏切换:

//通知android改成竖屏
jsb.reflection.callStaticMethod(className, methodName, "(Ljava/lang/String;)V", str);
var size = cc.view.getFrameSize();
cc.view.setFrameSize(size.height, size.width);
//更改分辨率成竖屏的分辨率
cc.view.setDesignResolutionSize(720, 1280, cc.ResolutionPolicy.SHOW_ALL);

29、字体的描边、加粗效果可以使用自带字体完成,无需添加字体文件,代码如下:(加粗可以直接描边使颜色与文字颜色相同即可)

var def = new cc.FontDefinition(); // 声明文字定义
def.fontName = "Verdana"; // 字体
def.fontSize = 36; // 字号大小
def.textAlign = cc.TEXT_ALIGNMENT_CENTER; // 文字对齐
def.fillStyle = cc.color(255, 255, 255); // 字体(内部)颜色

def.strokeEnabled = true; // 开启文字描边效果
def.strokeStyle = cc.color(0, 0, 0); // 描边的颜色
def.lineWidth = 3; // 字体的宽度

def.defadowEnabled = true; // 开启阴影效果
def.shadowOffsetX = 12; // 阴影X轴效果
def.shadowOffsetY = 12;

var label = new cc.LabelTTF("文字显示内容",
4000
def);
label.setPosition(cc.winSize.width / 2, cc.winSize.height / 2);
this.addChild(label);

30、使用cc.loader.loadImg(url, {isCrossOrigin: false}, function(err, img){})下载网络图片时,img只能通过精灵加载。另外要将project.json里的"renderMode"设置为1;

31、Button控件如果需要点击放大的效果,则只设置normalImage参数,不要设置selectedImage和disableImage参数即可;

32、iOS版本中可能出现每个场景中第一次声音播放无效的问题,原因未知,解决方法可以在每个场景第一次执行播放声音代码时连续执行两次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-js