特效类即是GridAction类,其实就是基于网格的3D动作类。需开启OpenGL的深度缓冲,否则容易3D失真。
下边是一个snippet,创建网格对象,并将其添加到当前layer;同时,将进行3D特效的对象,添加到网格对象上。
gridNodeTarget = NodeGrid::create(); addChild(gridNodeTarget);// add to current layer auto bg = Sprite::create("background.png"); bg->setPosition(Vec2(visibleSize.width/2, visibleSize.height /2)); gridNodeTarget->addChild(bg); sprite = Sprite::create("hero.png"); sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); gridNodeTarget->addChild(sprite);
下边是3D特效类的使用,在此不再展示效果。
void MyAction::goMenu(Ref* pSender) { Size visibleSize = Director::getInstance()->getVisibleSize(); log("Tag = %i",this->getTag()); switch (this->getTag()) { case kFlipX3D: // X轴3D翻转,参数为持续时间 gridNodeTarget->runAction(FlipX3D::create(3.0f)); break; case kPageTurn3D: // 翻页特效,第一个参数为持续时间,第二个参数为网格大小 gridNodeTarget->runAction(PageTurn3D::create(3.0f, Size(15,10))); break; case kLens3D: // 凸透镜特效,第一个参数为持续时间,第二参数为网格大小,第三个参数为透镜中心,第四个参数为透镜半径 gridNodeTarget->runAction(Lens3D::create(3.0f, Size(15,10),Vec2(visibleSize.width/2,visibleSize.height/2),240)); break; case kShaky3D: // 晃动特效,第一个参数为持续参数,的哥参数为网格大小,第三个参数为晃动范围,第四个参数为Z轴晃动 gridNodeTarget->runAction(Shaky3D::create(3.0f, Size(15,10),5,false)); break; case kWaves3D: // 3D波动特效,第一个参数为持续时间,第二个参数为网格大小,第三个参数为波动次数,第四个参数为振幅 gridNodeTarget->runAction(Waves3D::create(3.0f, Size(15,10),5,40)); break; case kJumpTiles3D: // 3D瓦片跳动特效,第一个参数为持续时间,第二个参数为网格大小,第三个参数为次数,第四个参数为振幅 gridNodeTarget->runAction(JumpTiles3D::create(3.0f,Size(15,10),2,30)); break; case kShakyTiles3D: // 3D瓦片晃动特效,第一个参数为持续时间,第二个参数为网格大小,第三个参数为晃动范围,第四个参数为是否伴有Z轴晃动 gridNodeTarget->runAction(ShakyTiles3D::create(3.0f,Size(16,12),5,false)); break; case kWavesTiles3D: // 3D瓦片波动特效,第一个参数为持续时间,第二个参数为网格大小,第三个参数为波动次数,第四个参数为振幅 gridNodeTarget->runAction(WavesTiles3D::create(3.0f,Size(15,10),4,120)); break; } }
其实,3D效果无非是通过范围控制将2D的效果变得更逼真,更接近现实世界。