2016-11-22 40 views
3

我試圖扭曲SKLabelNode作爲SKEffectNode(文檔說,你可以做到這一點)的孩子,但它翻轉標籤節點顛倒之前,它應用經。這可能是一個錯誤,但在此之前我的文件,我認爲我會問放在這裏......作爲SKEffectNode的子SKLabelNode上的SKWarpGeometry翻轉標籤顛倒

這裏是我的代碼:

func warpNode(_ node: SKEffectNode) 
{ 
    if #available(iOS 10.0, *) 
    { 
     let sourcePositions: [vector_float2] = 
      [ 
       vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object 
       vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object 
       vector_float2(0, 1), vector_float2(0.5, 1), vector_float2(1, 1) //top row of object 
      ] 

     let destinationPositions: [vector_float2] = 
      [ 
       vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object 
       vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object 
       vector_float2(0, 0.8), vector_float2(0.5, 0.8), vector_float2(1, 0.8) //top row of object 
      ] 

     let warpGeometryGrid = SKWarpGeometryGrid(columns: 2, rows: 2, sourcePositions: sourcePositions, destinationPositions: destinationPositions) 

     let warpGeometryGridNoWarp = SKWarpGeometryGrid(columns: 2, rows: 2) 

     node.warpGeometry = warpGeometryGridNoWarp 

     let warpAction = SKAction.animate(withWarps: [warpGeometryGridNoWarp, warpGeometryGrid, warpGeometryGridNoWarp], times: [0.25, 0.5, 0.75], restore: true) 

     node.run(warpAction!) 
    } 
    else 
    { 
     print("Need iOS >= iOS 10 to warp!!!") 
    } 
} 

let effectNode = SKEffectNode() 
effectNode.shouldEnableEffects = true     
addChild(effectNode) 

let labelNode = SKLabelNode(fontNamed: "Chalkduster") 
labelNode.text = "Label" 
effectNode.addChild(labelNode) 

warpNode(effectNode) 

此代碼應壓扁標籤的頂下來,然後將它恢復到原來的位置(就好像你推了一個球或某物),然而,它翻轉它顛倒,然後擠壓頂部(現在是底部),然後將其恢復到原始大小和位置(右側)。

編輯:基於0x141E的評論,我將SKLabelnode轉換爲SKTexture並添加了一個帶有該紋理的新SKSpriteNode。如果我在effectNode上使用了warpNode函數,則它會顛倒單詞,然後應用壓扁效果。但是,如果我直接在新的SKSpriteNode上使用warpNode函數,它將正常工作。

新的代碼如下:

func warpNode(_ node: SKSpriteNode) 
{ 
    if #available(iOS 10.0, *) 
    { 
     let sourcePositions: [vector_float2] = 
      [ 
       vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object 
       vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object 
       vector_float2(0, 1), vector_float2(0.5, 1), vector_float2(1, 1) //top row of object 
      ] 

     let destinationPositions: [vector_float2] = 
      [ 
       vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object 
       vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object 
       vector_float2(0, 0.8), vector_float2(0.5, 0.8), vector_float2(1, 0.8) //top row of object 
      ] 

     let warpGeometryGrid = SKWarpGeometryGrid(columns: 2, rows: 2, sourcePositions: sourcePositions, destinationPositions: destinationPositions) 

     let warpGeometryGridNoWarp = SKWarpGeometryGrid(columns: 2, rows: 2) 

     node.warpGeometry = warpGeometryGridNoWarp 

     let warpAction = SKAction.animate(withWarps: [warpGeometryGridNoWarp, warpGeometryGrid, warpGeometryGridNoWarp], times: [0.25, 0.5, 0.75], restore: true) 

     node.run(warpAction!) 
    } 
    else 
    { 
     print("Need iOS >= iOS 10 to warp!!!") 
    } 
} 

let labelNode = SKLabelNode(fontNamed: "Chalkduster") 
labelNode.text = "Label" 

let labelNodeTexture = SKView().texture(from: labelNode)! 
let labelNodeSprite = SKSpriteNode(texture: labelNodeTexture) 

addChild(labelNodeSprite) 

warpNode(labelNodeSprite) 

我只是消除了代碼的整體effectNode部分並添加新的精靈,並做了經紗。

+1

它看起來像一個錯誤。或者,您可以通過'SKView'的'texture()'方法將標籤轉換爲紋理,從紋理創建一個'SKSpriteNode',然後剔除該精靈。 – 0x141E

+0

一直試圖讓它工作幾個小時,對紋理圖集也沒有太大的幫助......這不幸的是SpriteKit的新特性的一個趨勢 - 非常有限。 – CloakedEddy

回答

1

編輯我的問題作爲基於0x141E的評論的答案。

+0

我在iOS 10.3.1中仍然遇到同樣的問題。在SKSpriteNode上進行扭曲效果很好,但如果在SKEffectsNode上完成則會中斷。 0x141E的轉換成SKSpriteNode的評論完美無缺。這不是我們第一次爲蘋果的錯誤尋找解決方法。可惜的是,「它正常工作」並不適用於精靈套件。人們會期望更好的品質 - 畢竟它是蘋果,而不是獨立開發商店...... – JohnV