最近一个项目,web下测试正常,在jsb环境下bug多多,记录解决方案以备后查
一、cc.PhysicsSprite创建的物理精灵在添加到layer后,移动layer,在jsb环境下贴图不随着layer移动而移动
解决方案:将创建PhysicsSprite的精灵贴图整合进一张大图中,使用SpriteBatchNode加载,将创建的sprite添加进SpriteBatchNode中
this.spriteSheet = new cc.SpriteBatchNode(res.sltq0_png);
var ballSprite = new cc.PhysicsSprite(resTexture.ball_png);
this.spriteSheet.addChild(ballSprite,100);
二、cc.PhysicsSprite创建的物理精灵在jsb下无法通过runAction的方式进行moveTo、moveBy、rotateXX等
解决方案:PhysicsSprite物理精灵貌似无法直接通过runAction的方式位移或是旋转(不涉及位置改变的cc.flipX等操作是可以的)。如果是无法旋转,可以通过设置
body的角速度解决body.setAngVel(10)。涉及改变位置的action可以通过定时器的方式折中实现
三、cc.PhysicsSprite创建的物理精灵在jsb下无法通过setPositionX或setPositionY修改位置
解决方案:(吐血的bug)物理精灵无法单一的修改某一个轴的坐标即通过setPositionX或setPositionY修改位置,不理解为何会出现这样低级的bug,可以通过
sprite.setPosition(cc.p(newX,newY))或是直接设置body修改body.setPos(cc.p(newX,newY));
四、按照官方API:schedule(callback, interval, repeat, delay, key)设置定时器,5个参数全传入时在web下没问题,传入第5个参数key时在jsb下定时器不生效。
解决方案:尼玛吐血三升啊,废话一下,之前参照《Cocos2d-js开发之旅》这本书关于定时器的章节做了一个不变慢的定时器,当时按照书中的例子所有的定时器都没有传key这个参数,
我当时将这个不变慢的无限执行的定时器附加在gameLayer上,因为业务需要又在gameLayer上用了一个scheduleOnce的定时器,结果scheduleOnce执行完后直接把我的无限执行定时器也给
取消了(web环境会出现,jsb环境不存在这个现象),最后参照API传入了key这个参数解决问题,但是在jsb下,传入key参数会让定时器失效,所以,如果在web环境下,最好传入key参数,jsb环境不要传入key参数。