Cocos2d-X背景重复贴图.doc

上传人:re****.1 文档编号:544923828 上传时间:2023-02-02 格式:DOC 页数:46 大小:508.50KB
返回 下载 相关 举报
Cocos2d-X背景重复贴图.doc_第1页
第1页 / 共46页
Cocos2d-X背景重复贴图.doc_第2页
第2页 / 共46页
Cocos2d-X背景重复贴图.doc_第3页
第3页 / 共46页
Cocos2d-X背景重复贴图.doc_第4页
第4页 / 共46页
Cocos2d-X背景重复贴图.doc_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《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幅图的位置摆放:/放到下一屏

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号