我正在開發一個ios應用程序。我在屏幕上有一個SKSpriteNode,我從用戶那裏得到一張作爲SKTexture存儲的繪圖。我想結合這兩者並將它們作爲新的SKSpriteNode引入。如何將SKSpriteNode合併到SKTexture中以在Swift 3中形成新的SKSpriteNode?
問題:我找不到有關如何將SKSpriteNode合併到SKTexture的文檔。我確信有一種方法可以做到這一點。有人會有這樣的示例代碼?
我正在開發一個ios應用程序。我在屏幕上有一個SKSpriteNode,我從用戶那裏得到一張作爲SKTexture存儲的繪圖。我想結合這兩者並將它們作爲新的SKSpriteNode引入。如何將SKSpriteNode合併到SKTexture中以在Swift 3中形成新的SKSpriteNode?
問題:我找不到有關如何將SKSpriteNode合併到SKTexture的文檔。我確信有一種方法可以做到這一點。有人會有這樣的示例代碼?
您可能不得不使用CoreGraphics來做到這一點。使用SKTexture.cgImage()
方法將SKTextures
轉換爲CGImage
,使用CoreGraphics將它們合併,然後從結果中創建一個新紋理。 SKTexture.init(cgImage:)
方法讓你使用CGImage對象來構造紋理。
我還沒有使用Core Graphics,但是這裏有幾個鏈接到相關的讀取。我想你會希望使用CGLayer
類來告訴CoreGraphics如何堆疊紋理,並隨着時間的推移重用sprite紋理,這樣CoreGraphics可以緩存它以使速度更快。
Core Graphics使用Quartz 2D來做快速的2D圖形操作。我沒有玩過很多,但我認爲它應該是你正在尋找的東西。
參考文獻:
隨時通知我,我覺得這是很有趣!
編輯1: 你也必須在sprite上使用SKMutableTexture
。該類允許動態更改紋理數據。
不確定你的意思是「合併」。如果要使用現有的SKTexture創建一個新的SKSpriteNode那麼這可能是你正在尋找的代碼:
let newSprite = SKSpriteNode(texture: yourSKTexture)
您可以使用一個容器,將舉行兩次精靈,並從它創建一個紋理,使用SKView的texture(from:)方法,像這樣:
override func didMove(to view: SKView) {
backgroundColor = .black
let container = SKNode()
let left = SKSpriteNode(color: .purple, size: CGSize(width: 100, height: 100))
let right = SKSpriteNode(color: .yellow, size: CGSize(width: 100, height: 100))
container.addChild(left)
container.addChild(right)
left.position.x = 50
right.position.x = -50
addChild(container)
if let texture = view.texture(from: container) {
let sprite = SKSpriteNode(texture:texture)
addChild(sprite)
sprite.run(SKAction.moveTo(y: 300, duration: 5))
}
}
如果你想創建的節點部分內容的質地,那麼你可以使用SKView的texture(from:crop:)方法做一些裁剪。
如果我理解正確,我必須將它添加到場景纔可以工作?我不認爲我想這樣做。 – user594883
@ user594883如果您已經在使用精靈,我認爲它們已經添加到場景中。爲什麼你使用它們,如果他們不是場景的一部分? – Whirlwind
我想結合新的'SKTexture'和現有的'SKSpriteNode',所以我想我基本上需要將兩個紋理合併爲一個。 – user594883
也許用新的SKTexture創建一個新的SKSpriteNode,並將該Sprite節點添加爲現有的Sprite節點的子節點。根據您希望如何合併兩種紋理,您可能需要設置z位置,alpha,混合因子等。不確定這是否會影響您所尋找的效果。也許別人可以提出更好的建議。 – JohnV
效果會一樣,但我在遊戲場景中多次迭代我的nodetree。如果我將紋理添加爲單獨的SKSpriteNodes,則會很昂貴。儘管謝謝你的建議! – user594883