cocos2d-x 多层背景滚动效果

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所示,来看一眼程序的运行结果吧!最好的体验感觉还是读者亲自运行示例程序吧!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值