目前在做一个2D的游戏,其中有一个爆炸的效果,看了3D粒子的爆炸效果后,觉得比较炫,就不太想用2D的粒子效果。但是集成过程中发现,3D粒子效果总是会被2D背景遮挡,调整zorder也没有用。网上查了一下,说要用多相机来实现这个功能,我觉得太复杂了,我想问问有没有简单点的方法,我就想集成一个3D粒子效果,在最上层显示不被遮挡就可以,不想对现有的代码做太多的改动。先谢了!
确实需要添加一个3d相机,不然3d和2d使用同一个相机(默认)的话,会导致3d在2d后面绘制。
其实添加相机也很简单。
Size visibleSize = Director::getInstance()->getVisibleSize();
_camera = Camera::createPerspective(60.0f, (GLfloat)visibleSize.width/visibleSize.height, 0.1f, 1000);
_camera->setCameraFlag(CameraFlag::USER1);
_camera->setCameraMask((unsigned short)CameraFlag::USER1);
_camera->setDepth(10);//这句话让这个相机先绘制
_layer->addChild(_camera);
然后添加你的3d粒子,在粒子里加上一句话就行:
particle->setCameraMask((unsigned short)CameraFlag::USER1);
这样应该就能实现你要的效果了。
注意3d的位置和2d不一样,可能需要调整下粒子的坐标。
学习,学习。。
使用相机感觉比较麻烦的是每次新加一个节点,就要设置一下mask,很容易忘记设置,而且在已经设置过的节点上添加新节点,还要重新设置一次。
新节点手动设置掩码确实是一个反人类的设计。建议官方按照layer区分,不同layer使用不同的相机
这样还是不灵活,,这两天遇到同样的问题,用的是3.9,如果按照1楼的方法,那这个3d的粒子效果永远显示在2d元素的上面,如果我在显示的时候还需要有另一个2d层来盖住3d粒子效果怎么办?
想灵活的设置3d粒子效果和2d元素的层级,我目前只发现一个办法就是在场景创建一个Sprite3D的根节点,然后所有的2d层都加到这个根节点,
这样就可以通过设置setPositionZ()来灵活设置那个在前面,哪个在后面,
but…这样子又出现两个诡异的问题,,,,
第一:没有以Sprite3D为根节点创建的2d元素,如果设置摄像机的3d位置绕着2d元素转的话,是可以看到元素“背面”的,如果是图片那背面就是一个反的图片,如果是文字那背面就是一个反的文字,,,,然而,如果以Sprite3D为根节点创建2d元素,把摄像机绕到后面去会发现背面是空的,一片黑,感觉是背面没有渲染出来,,,,,这样会导致给元素设置setFlippedX(true)的时候,元素直接消失不见,把摄像机绕到元素后面却可以看到这个元素,说明setFlippedX(true)其实就是把元素的背面给你弄到正面,但是现在背面渲染不出来了!!!setScaleX(-1)也是一样的效果,。。。
第二:ListView和ScrollView的背景颜色永久不正确。、、、、、透明度也没法调,就算透明度为0,还是会显示一片透明度为255的颜色
请问最后怎么解决。
现在出现问题2d ui层上面有3d精灵
又出现一个2d ui层要盖住上一层。
此时3d精灵会穿透到新的2d ui层上面、