2016-11-14 81 views
2

此問題繫有這樣的:Set SKShapeNode frame to calculateAccumutedFrame調整大小SKShapeNode幀,或者替代

是否有辦法來調整的SKShapeNode的框架。我不想調整它,(建議在這裏:Resizing a SKShapeNode)。使用任何縮放功能都會使其內容縮小並調整大小(200x200的線寬不同於50x50)

我需要拍攝一幀並將其設置爲特定尺寸。例如:

shape.frame = CGRect(...) 

由於frame是隻能獲取的,因此無法這樣做。我試圖覆蓋calculateAccumulatedFrame,但是什麼也沒做(參見上面的鏈接)。

有人可以請建議替代SKShapeNode相同的功能,而不是一半建立...或實際上改變框架的方式。我需要的基本功能是創建一個弧(在頂部鏈接的圖片中看到),並在某種類型的SKNode中具有該功能,以便我可以調整其大小,縮小等等。與SKSpriteNode一樣,您可以使用相同的功能

+0

什麼目前的答案都沒有指出,你可以替換SKShapeNode使用的CGPath。這給你一種縮放。噩夢,但可能。沒有簡單的方法來解決這個問題。你需要「假裝它,直到你做到」。 – Confused

+0

SKShapeNode是一個半熟的想法。這是不正確的繪圖。當某些東西沒有設計時,就會發生這種事情。 – Confused

回答

3

SKShapeNode是基於Core Graphics路徑(CGPath)的node

因此,沒有直接的縮放方法與縮放比例不同。 如果您使用SKSpriteNode例如,您的行爲如resizeByWidthresizeToWidth

但是關於類似形狀的節點你應該考慮把他當成你必須調整其大小CGPathUIBezierPath使用方法like

apply(_ transform: CGAffineTransform) 
通過重新構建路徑,例如

,或者直接:

let π:CGFloat = CGFloat(M_PI) 
let startAngle: CGFloat = 3 * π/4 
let endAngle: CGFloat = π/4 
myShape.path = UIBezierPath(arcCenter: CGPoint.zero, radius: 33.5, startAngle: startAngle, endAngle: endAngle, clockwise: true).cgPath 
+0

這有助於解釋一些感謝。我不能使用SKSpriteNode,但是因爲我需要編輯lineWidth,當我將形狀轉換爲紋理爲sprite時,我將無法修改線寬。也許我可以重建路徑......但是你知道一種方式可以讓重建的路徑變成動畫嗎?例如,我有一個半徑爲200的半徑,如果我想用20半徑製作同一個半徑,我可以讓它看起來像一個縮小的動畫? – Nicholas714

+0

你可以通過fadeIn和fadeOut(並移除)最老的來建立各種路徑(如循環),直到你到達你的半徑(中間路徑),但我不知道最終結果如何,但你可以試試這種方式。 –

0

I會建議在SKShapeNode之外製作一個SKSpriteNode,因爲SKShapeNode很麻煩。

let node = SKNode() 
node.addChild(shapeNode) //we do this because of the bugs with SKShapeNode 
let texture = view.textureFromNode(node, crop:node.calculateAccumulatedFrame) 

let spriteNode = SKSpriteNode(texture:texture) 

或者,我會查找方法將此紋理保存到磁盤,以便您不必每次都呈現形狀。