6.9 多层背景滚动效果
在Cocos2D-X引擎当中存在一个比较独立的类CCParallaxNode,它为开发者提供了多层背景滚动的实现效果。这也是一种常用于滚轴游戏中的技术方法。如果读者有过坐火车的经验,其实现的原理则很容易理解。在火车旅行当中,人们在路途中无所事事的时候,总会习惯地望向窗外,看着窗外一棵棵飞过的树木,一座座行走的山脉,仿佛曾经的过往,若有所思。此时读者回想一下窗外的情景,为什么树木的移动要比山脉更快呢?
这就是一个简单的常识。山脉里观察者的视觉更远,其速度变化不明显。此时回到游戏的背景画面上。思考一下,如何在游戏中模拟这种现实的效果呢?无非就是让远处的背景比近处的背景移动得更慢一些。这样就能够为玩家带来远近的视觉差效果。而类CCParallaxNode就是提供了这样的功能。它能够让自身的子节点按照不同的速度来跟随父类对象的移动。来看看代码6-9。
代码6-9 ParallaxTest示例项目
1. Parallax1::Parallax1()
2. {
3. // 最顶层,一个图片精灵对象
4. CCSprite* cocosImage = CCSprite::create(s_Power);
5. // 放大精灵对象的尺寸
6. cocosImage->setScale( 2.5f );
7. // 设置锚点为(0,0)
8. cocosImage->setAnchorPoint( ccp(0,0) );
9.
10.
11. // 中间层拼接地图对象
12. CCTileMapAtlas *tilemap = CCTileMapAtlas::create(s_TilesPng, s_LevelMapTga, 16, 16);
13. tilemap->releaseMap();
14.
15. //设置锚点为(0,0)
16. tilemap->setAnchorPoint( ccp(0, 0) );
17.
18. // 设置纹理的抗锯齿
19. tilemap->getTexture()->setAntiAliasTexParameters();
20.
21.
22. // 背景层另一个图片精灵
23. CCSprite* background = CCSprite::create(s_back);
24. //放大精灵对象的尺寸
25. background->setScale( 1.5f );
26. //设置锚点为(0,0)
27. background->setAnchorPoint( ccp(0,0) );
28.
29.
30. // 创建多层滚动的对象
31. CCParallaxNode* voidNode = CCParallaxNode::create();
32.
33. // 下面添加三个子节点
34.
35. // 添加背景层并设置坐标为(0.4x, 0.5y)
36. voidNode->addChild(background, -1, ccp(0.4f,0.5f), CCPointZero);
37.
38. // 添加地图层并设置坐标为(2.2x, 1.0y)
39. voidNode->addChild(tilemap, 1, ccp(2.2f,1.0f), ccp(0,-200) );
40.
41. // 添加顶层图片并设置坐标为(3.0x, 2.5y)
42. voidNode->addChild(cocosImage, 2, ccp(3.0f,2.5f), ccp(200,800) );
43.
44.
45. // 创建一些动作类让地图能够自由移动
46. CCActionInterval* goUp = CCMoveBy::create(4, ccp(0,-500) );
47. CCActionInterval* goDown = goUp->reverse();
48. CCActionInterval* go = CCMoveBy::create(8, ccp(-1000,0) );
49. CCActionInterval* gogoBack = go->reverse();
50. CCFiniteTimeAction* seq = CCSequence::create(goUp, go, goDown, goBack, NULL);
51. voidNode->runAction( (CCRepeatForever::create((CCActionInterval*) seq) ));
52.
53. addChild( voidNode );
54. }
上面这段代码包含了一个类CCParallaxNode的对象和三个子节点对象。这三个子节点对象,其中一个为拼图地图,两个为精灵对象。三个子节点都设置了不同的位置以及跟随的参数。当然还有子节点的Z坐标。这决定了它们之间的遮挡关系。如图6-22所示,来看一眼程序的运行结果吧!最好的体验感觉还是读者亲自运行示例程序吧!