耐力显晶,是一種不顯山露水的執(zhí)著;是一種不懼風(fēng)不畏雨的堅(jiān)忍;是一種不圖名不圖利的忠誠贞铣。
紋理及其紋理集的簡介
在 SpriteKit框架之淺談SKNode及SKSpriteNode 這一篇文章中,曾經(jīng)說到SKSpriteNode對(duì)象的創(chuàng)建方式一共是有兩種的,一種是直接使用屠屏或者圖片名稱創(chuàng)建,一種是使用則是使用紋理創(chuàng)建,其實(shí)相比直接使用圖片名稱創(chuàng)建,使用紋理創(chuàng)建精靈更加的麻煩,但是為什么還是要有紋理這個(gè)創(chuàng)建精靈的方法呢?因?yàn)榧y理一般是配合著紋理集使用的. 一個(gè)紋理集實(shí)例是一個(gè)相關(guān)的紋理的集合胜蛉。它是通過一個(gè)保存在app包中的紋理集來加載的款筑。使用紋理集可以使紋理的加載和使用更加高效。例如腾么,如果你有一個(gè)屏幕需要繪制不同的紋理奈梳,Sprite Kit分開繪制這些紋理。如果所有的這些紋理來自同一個(gè)紋理集解虱,那么Sprite Kit可以一次就把這些紋理全部繪制完攘须。每當(dāng)你有一些紋理總是在一起繪制,你應(yīng)該把它們加到一個(gè)紋理集中.
例如下面的游戲素材中,如果我們一個(gè)一個(gè)的繪制,不僅會(huì)造成時(shí)間的浪費(fèi)而是還有空間的浪費(fèi).時(shí)間的浪費(fèi)就是來源于程序是一張一張圖片的繪制,而使用紋理集是一次性把所有的圖片繪制完成.那么空間上浪費(fèi)呢?由于使用紋理集繪制紋理是把所有圖片一次性繪制完成的,而且是繪制在一張圖片上,把很多的空間充分的利用.所以說這樣占用的空間更小.
SKTextureAtlas的使用
對(duì)于紋理圖集殴泰,那你可以把它想象為一副很大的圖片于宙,其中包括動(dòng)畫中需要使用到的各種圖片。這個(gè)圖集可以看做是一個(gè)文件悍汛,它指定了每個(gè)sprite的邊界范圍捞魁,當(dāng)在代碼中需要使用時(shí),可以將這些sprite取出來离咐。下面我們就拿一個(gè)炸彈爆炸效果的來看一下紋理集是怎么使用的.
首先,我們需要?jiǎng)?chuàng)建一個(gè)后綴為.atlas
文件夾并把所有的圖片素材添加進(jìn)去.這樣Xcode就能識(shí)別出.atlas
擴(kuò)展名谱俭,進(jìn)而自動(dòng)的將圖片合并為一個(gè)紋理圖集。如圖所示.
接下來把紋理文件夾添加到工程當(dāng)中.
上面已經(jīng)把紋理集添加到工程中了,萬事俱備只欠東風(fēng),接下來在工程中新建一個(gè)名為GameScene的場景.然后創(chuàng)建一個(gè)SKTextureAtlas對(duì)象,代碼如下.
SKTextureAtlas *iOSTextureAtlas = [SKTextureAtlas atlasNamed:@"iOS"];
紋理集創(chuàng)建完成了,該如何使用呢?SKTextureAtlas有一個(gè)屬性叫做textureNames,是一個(gè)數(shù)組類型,數(shù)組存儲(chǔ)的是各個(gè)紋理的名稱,我們可以通過這個(gè)數(shù)組取出對(duì)應(yīng)的紋理,因?yàn)槲覀円谱饕粋€(gè)爆炸效果,所以我們要把所有的紋理取出來.我們新建一個(gè)可變數(shù)組來接受所有的紋理.代碼如下.
NSMutableArray *allTextureArray = [NSMutableArray arrayWithCapacity:16];
for (int i = 0; i < iOSTextureAtlas.textureNames.count; i++) {
NSString *textureName = [NSString stringWithFormat:@"image%d.png",i*2+20];
SKTexture *texture = [iOSTextureAtlas textureNamed:textureName];
[allTextureArray addObject:textureName];
}
現(xiàn)在allTextureArray中存儲(chǔ)了所有的紋理對(duì)象,接下來,我們就創(chuàng)建一個(gè)SKSpriteNode對(duì)象,并且給它添加上動(dòng)畫,代碼如下.
SKSpriteNode *bombNode = [SKSpriteNode spriteNodeWithTexture:allTextureArray[0]];
bombNode.position = CGPointMake(self.size.width/2, self.size.height/2);
bombNode.anchorPoint = CGPointMake(0.5, 0.5);
[self addChild:bombNode];
//爆炸效果動(dòng)畫
SKAction *animationAction = [SKAction animateWithTextures:allTextureArray timePerFrame:0.08];
//repeatActionForever這個(gè)動(dòng)作的效果是讓動(dòng)畫重復(fù)執(zhí)行.
[bombNode runAction: [SKAction repeatActionForever:animationAction]];
我們看一下工程運(yùn)行之后的效果圖.
SpriteKit框架中的SKTextureAtlas相關(guān)內(nèi)容就說到這了,最后雙手奉上本文中的Demo,希望對(duì)其學(xué)習(xí)過程中有所幫助.謝謝