視差就是從有必定距離的兩個點上觀察同一個目標所產生的方向差別。從目標看兩個點之間的夾角,叫作這兩個點的視差角,兩點之間的距離稱做基線。只要知道視差角度和基線長度,就能夠計算出目標和觀測者之間的距離。遊戲開發中利用視覺上的偏差,即一般所說的視錯覺。函數
若是咱們的遊戲中有地圖的移動,就沒法避免滾動視差。也就是說離實現越遠的地方移動速度越慢,這樣才能夠造成景深不同的視覺效果。spa
在Cocos2D-x裏面咱們可使用CCParallaxNode類來實現這種視差的效果。CCParallaxNode能夠很容易的創建一個視差層,你能夠控制每一層的視差率、位置和層級的高低。主要會有下面的幾個步驟:3d
一、建立CCParallaxNode用於存儲各類精靈和背景圖。
CCParallaxNode* voidNode = CCParallaxNode::create();
二、向CCParallaxNode添加精靈經過addChild函數來添加,而且設置相對於CCParallaxNode的移動速度的比例。
voidNode->addChild(cat, 1, ccp(3.0f,2.5f), ccp(200,800) );code
好比cat精靈的移動速度的比例爲 ccp(3.0f,2.5f),表示CCParallaxNode的X軸和Y軸分別移動一個點,則cat精靈分別移動3,2.5個點,這樣在視覺的效果上就能夠看到cat精靈的移動速度比較快。orm
三、建立 CCParallaxNode運動的動做,這樣就能夠看到在CCParallaxNode上的精靈的運動視差效果了。
CCActionInterval* goUp = CCMoveBy::create(4, ccp(0,-500) );
CCActionInterval* goDown = goUp->reverse();
CCActionInterval* go = CCMoveBy::create(8, ccp(-1000,0) );
CCActionInterval* goBack = go->reverse();
CCFiniteTimeAction* seq = CCSequence::create(goUp, go, goDown, goBack, NULL);
voidNode->runAction( (CCRepeatForever::create((CCActionInterval*) seq) ));blog
示例代碼以下:遊戲
TestLayer::TestLayer() { // 建立cat精靈 CCSprite* cat = CCSprite::create("cat.png"); //change the transform anchor point to 0,0 (optional) cat->setAnchorPoint( ccp(0,0) ); //建立 background 精靈最爲背景 CCSprite* background = CCSprite::create("background.png"); // scale the image (optional) background->setScale( 2.0f ); // change the transform anchor point (optional) background->setAnchorPoint( ccp(0,0) ); // 建立一個parallax節點用於儲存各類精靈,而後移動parallax節點以展現「視差」效果 CCParallaxNode* voidNode = CCParallaxNode::create(); // background的移動速度爲 0.4x, 0.5y voidNode->addChild(background, -1, ccp(0.4f,0.5f), CCPointZero); // cat的移動速度爲 3.0x, 2.5y voidNode->addChild(cat, 1, ccp(3.0f,2.5f), ccp(200,800) ); //移動 CCParallaxNode 產生視差效果 CCActionInterval* goUp = CCMoveBy::create(4, ccp(0,-500) ); CCActionInterval* goDown = goUp->reverse(); CCActionInterval* go = CCMoveBy::create(8, ccp(-1000,0) ); CCActionInterval* goBack = go->reverse(); CCFiniteTimeAction* seq = CCSequence::create(goUp, go, goDown, goBack, NULL); voidNode->runAction( (CCRepeatForever::create((CCActionInterval*) seq) )); addChild( voidNode ); }
運行的效果:遊戲開發