cocos2d显示吐槽

本人小白,完全是站在flash2d开发经验上对cocos2d的一些理解,而本文只是为了在学习过程中记录一些需要注意的地方供自己倒头来再细看,当中的抱怨和唠叨语意不通,望忽略,如果有错或者有更佳方案,望指出

1。关于zorder,真是一个鸡肋
cocos2d中的zorder很莫名其妙,这个框架对zorder的维护基本上是完全交给开发者的,所以不是很人性,不知道是为了效率还是如何。
同一个parent中的所有children,zorder有可能全部都一样,也就是:
如果addchild的时候不手动维系zorder,将会所有children都会是0,children的zorder不是一个自动维护的有序序列
那么cocos2d在渲染上是如何判断层次的呢?大家可以看看CCNode::visit()这个函数,原理大概如下:
先依据zorder和orderOfArrival来sort一下所有children
渲染分三部:
1.遍历m_pChildren,先渲染zorder为负数的
2.渲染自己
3.遍历m_pChildren,渲染zorder为非负
也就是children的层次是由children的zorder和orderOfArrival来决定的。
所以引出了下面这条记录

(后记:
目前发现这样的zorder的一个好处是:
某些情况,希望把一些ccnode永远addchild到最顶,不受后来addchild进来的影响的时候,可以把这个ccnode的zorder设置一个很大的值,之后就可以完全不理了。)

2。关于addChildAt
这里的addChildAt的api名字是来自flash的,flasher应该很清楚这个api的意思是什么,而且非常经常用到,他的作用是很方便的把某个child插入到显示列表的某一层(或者深度),而cocos2d没有吗?
cocos2d有一个重载的api:
void CCNode::addChild(CCNode *child, int zOrder)
但是如我上述的理解,coco2d中zorder是一个很鸡肋的功能,所以比如cocos2d中我想把一个child A addchild到某layer的最底层,该如何做呢?前提是一堆children我addchild的时候都没手动维护zorder的,全部都是0,所以我执行layer.addChild(A,0)显然是没效果的(不要把zorder写成-1,否则以后你会很蛋疼的),很无奈,不得不写一个接口来修改zorder和orderOfArrival还有m_pChildren的顺序才行。

3。关于addChild
这里的addChild就是普通的addChild,但是我也得吐槽一下
大家深入到addChild的实现方法中,不容易就发现,如果想把某A addChild到某layer中去的时候,如果A已经被addChild过了(包括layer中已经addChild了A了这种情况),cocos2d是会抛错的。。。
flash中 a已经被addChild到layerB了,但是layerA->addChild(a)会自动removeChild a 再addChild到layerB
而如果a已经被addChild到layerA,再执行一次layerA->addChild(a)则会把a提高到layerA最上层
多人性化并且符合思维

4。关于CCLayer
CCLayer不可以当是一个DisplayObjectContainer只能当是一个Container,因为他不能设置所有Children的透明度(该死的叫不透明度),所以自然CCFadeIn是没效果的。
有些人说可以自己写一个派生类继承CCLayer和CCRGBAProtocol然后实现CCRGBAProtocol里面的接口,遍历Children来设置透明度啊,而fadein fadeout不是都有效果了?
我想说的是啊,但是比如一个child原来的透明度就已经是半透明了,这个layer设置不透明值为255,那么岂不是把我child原来的透明值都更改了?这样是不可取的,所以我放弃了,只能心里面千万记住:CCLayer只是个容器。CCLayer只是个容器。CCLayer只是个容器。CCLayer只是个容器。。。。。。

5。关于CCScaleBy
我在用CCMoveBy之类的,了解到是指增量就是前后变化是加的关系,但是CCScaleBy却是乘的关系,我被坑死了

6。关于AutoRlease自动释放机制。
大家都知道Cocos2d加入了一些类似oc的引用计算管理,本人对as3的引用引用内存管理非常熟悉,然后感觉这个cocos2d 引用释放机制真的像东施效颦。举个简单例子,如果某个角色对象类中有一个类型为CCSprite的手枪成员对象,如果我此刻通过CCSprite::create()创建了这个手枪对象,但是不想立刻addChild它,因为这个角色刚开始是空手的,那么就得注意了,因为下一帧这个手枪就会被这个机制自动销毁了,因为CCSprite::create()后他的引用数是0,你要么就addchild,要么就用数组之类的管理他,要么就自己手动retain,估计最后就成了oc那帮人一直诟病的问题,retain,release满天飞。

99。其他不详细说,但是还不习惯的有
透明值不叫alpha叫不透明opacity,意思要反过来
argb(rgbo)值是0-255这样的,不是0-1,而更不是#FFAB12,0×00123456这样16进制的,不知道有没有方法转换,反正我自己已经写了个方法来做这一步转换
锚点有点坑爹,不过慢慢也发现有优点,希望我观念可以兼容,因此这遍旧blog文和本文一样,也是突然不爽写出来记录一下,希望慢慢会改变想法

etc….



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)