《Cocos2d-X背景重复贴图.doc》由会员分享,可在线阅读,更多相关《Cocos2d-X背景重复贴图.doc(46页珍藏版)》请在金锄头文库上搜索。
1、Cocos2d-X背景重复贴图CCSize winSize = CCDirector:sharedDirector()-getWinSize();/获得屏幕尺寸,这里要画个和屏幕等大的静态背景 CCRect r(0, 0, winSize.width, winSize.height); CCSprite* shelfBG = CCSprite:spriteWithFile(RES_BOOK_SHELF_BG, r);/ 创建sprite纹理指定循环图片,大小等同屏幕 ccTexParams tp = GL_LINEAR, GL_LINEAR, GL_REPEAT,GL_REPEAT;/ 主要用
2、到的是这个,水平重复平铺,垂直重复平铺 shelfBG-getTexture()-setTexParameters(&tp); shelfBG-setPosition(ccp(winSize.width/2, winSize.height/2); this-addChild(shelfBG);/ 添加sprite节点到layer图片资源宽高必须是2的n次幂,我用的是128x128(像素)程序画出来的效果:=还是割了吧=参考:http:/ IPhoneand iPad Cocos2d Game Delevopment第7章(原文中有部分无关紧要的内容未进行翻译)。对于射击类游戏,使用重力感应进行
3、游戏控制是不可接受的,采用虚拟手柄将会更恰当。出于“不重新发明轮子”的原则,我们将采用开源库SneakyInput。控制玩家的飞船进行移动只是其中一件事情。我们还需要让背景能够滚动,以造成在某个方向上“前进”的感觉。为此必须自己实现背景滚动。由于CCParallaxNode的限制,它不能无限制地滚动卷轴式背景。一、高级平行视差滚动在这个射击游戏中,我们将使用ParallaxBackground节点。同时,我们将使用CCSpriteBatchNode以提高背景图片的渲染速度。1、创建背景层下图显示了我用Seashore绘制背景层。每个背景层位于Seashore的单独的图层中,每一层可以保存为单独
4、的文件,分别命名为bg0-bg6。以这种方式创建背景层的原因在于:你既可以把各个层的背景放在一起,也可以分别把每一层存成单独的文件。所有文件大小都是480*320,似乎有点浪费。但不需要把单独把每个文件加到游戏里,只需要把它们融合在一个贴图集里。由于Zwoptex会自动去除每个图片的透明边沿,它会把这些背景层紧紧地放到一起没有丝毫空间的浪费。把背景分层的原因不仅是便于把每一层放在不同的Z轴。严格讲,bg5.png(位于最下端)和bg6.png(位于最上端)应该是相同的Z坐标,因为它们之间没有交叠,所以我把他们存在分开的文件里。这样Zwoptex会把两者上下之间的空白空间截掉。此外,把背景分层有
5、利于提高帧率。iOS设备的填充率很低(每1帧能绘制的像素点数量)。由于不同图片之间常存在交叠的部分,iOS设备每1帧经常需要在同1点上绘制多次。比如,最极端的情况,一张全屏图片位于另一张全屏图片之上。你明明只能看到最上面的图片,但设备却不得不两张图片都绘制出来。这种情况叫做overdraw(无效绘制)。把背景分层可以尽量地减少无效绘制。2、修改背景的绘制#import#importcocos2d.hinterfaceParallaxBackground :CCNodeCCSpriteBatchNode*spriteBatch;intnumStripes;CCArray*speedFactors
6、;/ 速度系数数组floatscrollSpeed;end我把CCSpriteBatchNode引用保存在成员变量里,因为它在后面会用得比较频繁。采用成员变量访问节点比通过getNodeByTag方式访问要快一点,每1帧都会节约几个时钟周期(但保留几百个成员变量就太夸张了)。#importParallaxBackground.himplementationParallaxBackground-(id) initif(self= superinit)CGSizescreenSize = CCDirectorsharedDirectorwinSize;/把game_art.png加载到贴图缓存CC
7、Texture2D* gameArtTexture = CCTextureCachesharedTextureCacheaddImage:game-art.png;/初始化CCSpriteBatchNodespritebatchspriteBatch= CCSpriteBatchNodebatchNodeWithTexture:gameArtTexture;selfaddChild:spriteBatch;numStripes=7;/从贴图集中加载7张图片并进行定位for(inti =0; i numStripes; i+)NSString* frameName = NSStringstrin
8、gWithFormat:bg%i.png, i;CCSprite* sprite = CCSpritespriteWithSpriteFrameName:frameName;sprite.position=CGPointMake(screenSize.width/2, screenSize.height/2);spriteBatchaddChild:spritez:itag:i;/再加7个背景层,将其翻转并放到下一个屏幕位置的中心for(inti =0; i numStripes; i+)NSString* frameName = NSStringstringWithFormat:bg%i.p
9、ng, i;CCSprite* sprite = CCSpritespriteWithSpriteFrameName:frameName;/放到下一屏的中心sprite.position=CGPointMake(screenSize.width/2+ screenSize.width, screenSize.height/2);/水平翻转sprite.flipX=YES;spriteBatchaddChild:spritez:itag:i + numStripes;/初始化速度系数数组,分别定义每一层的滚动速度speedFactors= CCArrayallocinitWithCapacity
10、:numStripes;speedFactorsaddObject:NSNumbernumberWithFloat:0.3f;speedFactorsaddObject:NSNumbernumberWithFloat:0.5f;speedFactorsaddObject:NSNumbernumberWithFloat:0.5f;speedFactorsaddObject:NSNumbernumberWithFloat:0.8f;speedFactorsaddObject:NSNumbernumberWithFloat:0.8f;speedFactorsaddObject:NSNumbernum
11、berWithFloat:1.2f;speedFactorsaddObject:NSNumbernumberWithFloat:1.2f;NSAssert(speedFactorscount =numStripes,speedFactors count does notmatch numStripes!);scrollSpeed=1.0f;selfscheduleUpdate;returnself;-(void) deallocspeedFactorsrelease;superdealloc;-(void) update:(ccTime)deltaCCSprite* sprite;CCARRA
12、Y_FOREACH(spriteBatchchildren, sprite)NSNumber* factor = speedFactorsobjectAtIndex:sprite.zOrder;CGPointpos = sprite.position;pos.x-=scrollSpeed* factorfloatValue;sprite.position= pos;end在GameScene中,我们曾经加载了贴图集game-art.plist:CCSpriteFrameCache* frameCache = CCSpriteFrameCachesharedSpriteFrameCache;fr
13、ameCacheaddSpriteFramesWithFile:game-art.plist;因此,实际上game-art.png已经加载。当我们在init方法中再次加载game-art.png时(我们需要获得一个CCTexture2D以构造CCSpriteBatchNode),实际上并不会再次加载game-art.png,CCTextureCache会从缓存中返回一个已经加载的CCTexture2D对象。我们没有其他办法,因为cocos2d没有提供一个getTextureByName 的方法。接下来,初始化了CCSpriteBatchNode对象,并从贴图集中加载了7张背景图。在update
14、方法中,每一层背景图的x位置每播放一帧,就减去了一点(从右向左移动)。移动的距离由scrollSpeed*一个速度系数(speedFactors数组中相应的一个数值)来计算。这样,每1层的背景会有不同的速度系数,从而会以不同的速度移动:由于各层移动速度不同,所以最终背景的右边沿会呈现出不整齐的现象:3、无限滚动在ParallaxBackground类的init方法中,我们再次添加了7张背景图并进行水平翻转。目的是让每一层背景图片的宽度在水平方向上延伸,翻转的目的则是使拼在一起的时候两张图片的对接边沿能够对齐。同时,把第2幅图片紧挨着放在第1幅图右边,从而把两张相同但互为镜像的图片拼接在一起。这是第1幅图的位置摆放:sprite.position=CGPointMake(screenSize.width/2, screenSize.height/2);这是第2幅图的位置摆放:/放到下一屏