很多人说cocos2dx官网坑,到底坑在哪

【转载】cocos2d-x的一些坑
【转载】本人小白,完全是站在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来决定的。
所以引出了下面这条记录
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。其他不详细说,但是还不习惯的有
透明值不叫alpha叫不透明opacity,意思要反过来
argb(rgbo)值是0-255这样的,不是0-1,而更不是#FFAB12,0x这样16进制的,不知道有没有方法转换,反正我自己已经写了个方法来做这一步转换
锚点有点坑爹,不过慢慢也发现有优点,希望我观念可以兼容,因此和本文一样,也是突然不爽写出来记录一下,希望慢慢会改变想法
imihuang补充,在CCFadeIn这类Action上也在栽了大坑,以为他会遍历container里面的所有内容,虽然看了源码,但是认为他不会犯那么低级的错误,最后我认栽了,他是没有遍历的,在CCNode之上,有些东西有遍历在Visit的时候,有些却没有遍历,这种不太规范的写法让开发者频繁栽坑,等有空我会把它列出来。比如更改锚点会遍历么?更改透明度会遍历么?更改Scale会遍历么?你心里有肯定的答案?
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4376人阅读
cocos2d-x(16)
问题一:setup.py 之后, ANT目录为什么创建不成功?
ANT目录要指定到bin下面,NDK和SDK则指定要根目录即可
问题二:cocos run -p android 之后,运行应用的时候,报错:so文件无法加载?
在安卓工程目录下面的jni里面有个Application.mk,在这个文件里面添加一行 APP_ABI := armeabi armeabi-v7a x86,注意,这样在编译so文件的时候,会有些久
问题三:运行的时候,为什么程序闪退?
这个问题的原因比较多,需要先确定安卓工程使用的sdk(用eclipse直接可以看到),不要太旧了,现在一般是4.2.2就可以了
问题四:运行在模拟器genymotion上的时候,为什么程序闪退?
据说genymotion只是模拟的是x86芯片的安卓手机,所以在问题二那个里面必须确定加了x86
问题五:用eclipse编译java代码的时候,会发现继承的Cocos2dxActivity.java的onCreate()里面获取metadata为空,为什么?
这个不要紧,它并没有真正去加载so文件,真正加载so文件是在Cocos2dxHelper.java里面的init()方法
问题六:编译so文件的时候报build
android project reports error: android/asset_manager.h: No such file or directory,怎么解决?
打开安卓工程目录下的project.properties,将&target=android-8改为target=android-9
问题七:编译so文件的时候,修改了安卓工程目录下的jni里面的Application.mk文件,为什么编译没有起作用?
要重新关闭命令行,然后重新打开,再编译,至少mac下面,windows下,还未验证,需要这样做才行
问题八:把别人编译好安卓版本的工程拷贝到自己的电脑,编译为什么会失败?
这个的原因有2个:
第一:需要删除安卓工程目录下面的obj目录,因为这个里面有编译好的xxx.o文件,这个是别人编译生成了,你自己编译,需要重新生成(如果安卓工程的绝对路径有修改,也需要做这个操作,否则安卓编译不过)
第二:修改安卓工程目录下local.properties里面sdk.dir的值,为你本地安卓sdk的目录
问题九:cocos run的时候,报错:
/cocos2d-x/external/freetype2/prebuilt/android/Android.mk:cocos_freetype2_static: LOCAL_SRC_FILES points to a missing file,(其中freetype2也可能是lua等)是什么原因?
其实这个问题,并不是cocos2dx的坑,而是版本管理工具svn的坑,它的设置里面忽略了.a文件,导致其他人提交的cocos2dx工程里面/cocos2d-x/external 下面的所有.a文件缺失了,所以,你自己重新new一个cocos2dx工程,把/cocos2d-x/external
下面的.a文件拷贝到对应的目录然后编译就ok了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23646次
排名:千里之外
原创:14篇
转载:27篇
(1)(1)(3)(1)(3)(1)(4)(4)(9)(14)大年初一写代码,纪念一下:)
cocos2dx,内存管理方式如下:
所有Ref继承而来的类,皆放入AutoreleasePool,每一帧释放一次,如果引用计数为0,则delete。
因此,Ref在每帧的工作,就是先ref+1,后ref-1,让它ref-1的是AutoreleasePool,而让它ref+1的就各有方式了。最常见的就是CCNode,每帧为子节点retain的方式。
一般这是不会有问题的。如果你有需求在类中保存一个Ref对象,而它并非一个子节点,如RenderTexture,则必须记住自己写代码retain。
此处有一个容易出错的地方:如果你对这个Ref的create本身是在某个Update中做的,那应该当场retain一次。因为Update调用完AutoreleasePool紧接着就会release,直接导致Ref被删除,没机会坚持到下次update。
如果代码中使用了自己维护的Ref对象,而发生了莫名其妙的崩溃,不妨看看是不是这个问题。
阅读(...) 评论()

我要回帖

更多关于 cocos2dx视频教程 的文章

 

随机推荐