12.精靈進階之理論篇,精靈進階理論篇

來源:互聯網
上載者:User

12.精靈進階之理論篇,精靈進階理論篇
12.精靈進階篇

前言:
在實際遊戲開發中,龐大的內容被切割成多個情境(SKScene),而單個情境由各式節點群組成,例如:SKLabelNodeSKSpriteNodeSKLightNodeSKVideoNode等,它們繼承於SKNode這個“老父親”,但自身又習出一身本領,專門從事某一方面工作。然而,SKSpriteNode這個“兒子”表現尤為突出,他是情境的基石(basic building blocks),構成了絕大部分,因此首先咱先來對它探究一二,至於其他節點,後文陸續給出。

01.本文

主角SKSpriteNode,不禁要問如何建立?回答是隨性,你可以將其繪製為一個有紋理(何為紋理,點擊這裡)的長方形,也可以是一個上色、無紋理的長方形.想比較而言,紋理精靈較為常用,試想下,為了讓內容更為生動、絢麗,我們會聘請設計師幫我們設計人物,背景等圖片,遊戲將其以紋理形式載入,我們就可以用它們來建立一個個有紋理的精靈,然後添加到情境中。

02.建立一個有紋理的精靈

建立有紋理精靈的最簡單方式是同時產生紋理(texture)和精靈(sprite)。首先你要將設計好的圖片匯入到app中,然後在應用運行時載入它們。下面提供代碼例子:

    let spaceship = SKSpriteNode(imageNamed:"rocket")//注 這裡同時建立了rocket紋理和精靈    spaceship.postion = CGPointMake(100,100)    self.addChild(spaceship)

當以這種樣式代碼建立精靈時,儘管你只設定了紋理(如果還不理解,你可以將其理解成可複用的圖片吧!)和位置屬性,但是其他預設屬性都將自動設定。如下:

  • 精靈所建立的frame屬性一定於紋理的size屬性相匹配,理解如下,frame無非就是一個明確了置放位置的矩形(100,100,200,300),放置在(100,100)這個點,寬度200,高度300。而紋理無非就是一張圖片,所謂匹配就是,frame這個矩形剛剛能包裹住這個圖片。粗淺理解。
  • 精靈渲染時,以矩形地區為單位來渲染,也就是frame。此外精靈以position(上面代碼)置中,例如position設定為(400,400),而紋理的大小為(300,200),那麼frame的放置點應該這麼計算,因為postion就是矩形的中心點,那麼矩形左下角那個點就是(400-300/2,400-200/2)=(250,300),frame即(250,300,300,300)。
  • The sprite texture is alpha blended into the framebuffer.暫時不理解
  • SKTexture對象從建立到附著於精靈上呈現到情境想必大家或多或少有點理解了。深入討論紋理對象,當精靈放置於情境中時呈現時,紋理對象就會自動載入texture data;反之精靈被移除後,Sprite Kit自而然而就會刪除texture data了。這不禁讓人想到記憶體自動管理,貌似簡化了不少,但這並不意味你就可以當一個甩手掌柜,你仍然需要手動來管理這些asset
03.定製一個紋理精靈

我們能夠修改每個精靈的屬性來”私人定製”,看下面四個不同階段的方式:

  • 使用錨點(Anchor)來移動精靈的架構(Frame)。
  • 調整精靈的大小。有時候我們將紋理應用到精靈上時卻發現紋理太大了,這時候我們需要調整精靈的大小了。
  • 給紋理著色後附著到精靈上。
  • 使用其他混合模式將精靈中的內容與幀緩衝中的內容相聯絡。

通常來說,我們配置一個精靈就是執行以上四個階段,置放位置、調整大小、著色和混合,當然這些都是基於紋理精靈來說的。

04.使用錨點來移動精靈的位置

預設來說,精靈的frame以及texture,將被置中放置到positon上,有點拗口,不過換種說法就是,放置一個點(300,300)到情境中,現在有一個矩形200*200,它的中心點和先前放置的點(300,300)重合,這樣就理解了何為置中。如此一來紋理總能將中心位置處的“最美一面”呈現給大家,然而有時候,我們可能希望將紋理其他部分的圖片放置於節點的position上。

精靈節點中有一個屬性叫做anchorPoint,稱之為錨點或者錨點。它的作用是決定將frame(看做是一個矩形地區)中的某一個點放置到精靈的position上。錨點是在單位座標系中明確指定,請看。單位座標系的原點被放置在(0,0),與之相對的(1,1)被放置於右上方,註:在單位座標系,範圍只有0-1。預設情況下,精靈的錨點是(0.5,0.5),即frame的中心點。

如何修改一個精靈的錨點呢?

    //切記錨點是在單位座標系中決定,範圍0-1    rocket.anchorPoint = CGPointMake(0.5,1.0)

如:

05.調整精靈的大小

精靈的frame屬性由其他三種屬性的值決定:

  • 精靈的size屬性持有sprite的基本尺寸(也就是未經過放縮的)。前文提到過一個初始化精靈執行個體的方法,如此精靈的屬性值就等於精靈紋理的尺寸!
  • sprite的基本尺寸是能夠調整大小的,通過設定xScaleyScale屬性值即可,它們都是SKNode的傢伙,而SKSpriteNode繼承自它,自然也有這屬性嘍!

舉例來說,如果一個精靈的基本屬性為32x32像素,如果設定xScale值為1.0,yScale值為2.0,那麼frame就變成了32x64,灰常簡單。

06.給精靈著色

使用colorcolorBlendFactor屬性給紋理上色,之後將紋理附著到精靈上。預設的colorBlendFator是等於0.0(最高1.0),意味著紋理是未經上色的。你嘗試慢慢增加這個數值,從0.0、0.1、0.3慢慢增加,你會發現你設定的color會越來越”濃鬱”!

    //步驟一:設定顏色    monsterSprite.color = SKColor.redColor()    //步驟二:設定混合屬性    monsterSprite.colorBlendFator = 0.5

貌似不是很給力,我們來做一個漸層色的動畫吧!

    var pulseRed = SKAction.sequence([        //在0.15秒鐘慢慢著色到1.0程度!        SKAction.colorizeWithColor(SKColor.redColor(),                     colorBlendFactor: 1.0, duration: 0.15)        SKAction.waitForDuraton(0.1)        SKAction.colorizeWithColorBlendFactor(0.0,duration:0.15)    ])    monsterSprite.runAction(pulseRed)
07.Blending The Sprite into the Framebuffer

暫時理解是兩個紋理之間的混合,至於混合程度設定由alpha value決定。設定額外的混合模式來類比燈光代碼如下:

    lightFlareSprite.blendMode = SKBlendModeAdd

這裡我很抱歉,暫時理解不是很清楚,以後補上!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.