Effects (特效)
介绍
特效是一种特殊的actions。它不是修改像透明度,位置,旋转或者缩放这些一般的属性,而是修改一种新的属性:grid(网格) 属性。grid属性就像矩阵,它是一个网络线,相互交叉,形成了一系列的正方形或矩形。
这种特殊的动作可以将任何CCNode的对象渲染成网格,你可以通过移动他们的顶点变换这些网格。
这里有两种œ网格:tiled 网格 和non-tiled 网格。两者的区别在于tiled的网格由独立的tile组成,但是non-tiled网格是由顶点组成。
网格有两个维度:行和列,但是每一个网格有三个维度:x,y,z.所以你可以通过变换一个tiled-grid-3D或者-grid-3D来创建一个2D或3D的特效。
你可以通过增加grid的大小来提高特效的质量,但是特效的速度将会降低。
一个大小是(16,12)的网格几乎在大多数机器上运行都很快,但是看起来效果不会很好。但是一个(32,24)的网格看起来就会
漂亮多了,但是对硬件要求又比较高。
他们怎样工作
屏幕的每一帧都会渲染成纹理,纹理将被装换成顶点数组,而这个顶点数组被网格特效变换,最后顶点数组被渲染到屏幕上。要知道更多地关于内部参考
- CCTiledGrid3D和CCTiledGrid3DAction
- ccGrid3D和CCGrid3DAction
例如,如果你的屏幕和layer上渲染了这张图片:
我们可以使用CCRipple3D动作来变换成如下样子。同样你可以看到连线的图片,它使用了一个32*24的正方形网格并且这个网格
是non-tiled(所有的tile都是一起的)。
或者我们可以使用CCFadeOutTRTiles动作变换成如下样子。同样你可以看到连线的图片,它使用一个16*12的正方形网格,并且网格是tiled的。
3D actions(3D 动作)
actions中名字带有3D后缀的,意味着它们通过修改网格的z坐标产生一个栩栩如生的3D特效。如果你要使用任何一个3D的action,你都需要先使用深度缓存。一个简单地方法就是:
// IMPORTANT: Call this function at the very beginning, before running your 1st scene
// Create a depth buffer of 24 bits
// These means that openGL z-order will be taken into account
[[CCDirector sharedDirector] setDepthBufferFormat:kDepthBuffer16];
在某些情况下,你可能想设置RGBA8888像素格式,这将使你的特效有透明度// IMPORTANT: Call this function at the very beginning, before running your 1st scene
// Use this pixel format to have transparent buffers
[[CCDirector sharedDirector] setPixelFormat:kPixelFormatRGBA8888];
grid特效索引:
- CCFlipX3D
- CCFlipY3D
- CCLens3D
- CCLiquid
- CCRipple3D
- CCShaky3D
- CCTwirl
- CCWaves
- CCWaves3D
可用的CCTiledGrid3DAction动作:
- CCFadeOutBLTiles
- CCFadeOutTRTiles
- CCFadeOutUpTiles
- CCFadeOutDownTiles
- CCJumpTiles3D
- CCShakyTiles3D
- CCShatteredTiles3D
- CCShuffleTiles
- CCSplitCols
- CCSplitRows
- CCTurnOffTiles
- CCWavesTiles3D
// execute a Waves action on sprite 1
id waves = [CCWaves actionWithWaves:5 amplitude:20 horizontal:YES vertical:NO grid:ccg(15,10) duration:5];
[sprite1 runAction: [CCRepeatForever actionWithAction: waves]];
// and execute a Shaky3D action on sprite 2
id shaky = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5];
[sprite2 runAction: [CCRepeatForever actionWithAction: shaky]];