我遇到了一个我很难理解的SKShapeNodes问题。为了帮助解释和显示我的问题,我创建了一个测试程序。一开始我创建了这样的一行:
var points = [CGPoint(x: -372, y: 0), CGPoint(x: 372, y: 0)]
var Line = SKShapeNode(points: &points, count: points.count)
addChild(Line)
此时,我可以更改节点的位置,并打印出我期望的位置:
Line.position.y = Line.position.y - 50
print("LINEPOS =", Line.position)
打印:
LINEPOS =(0.0,-50.0)
这是有道理的,因为SKShapeNode的原始位置始终为(0,0)。但是,该计划的下一部分并没有以同样的方式运作。我让新点等于Line现在在屏幕上的坐标,让Line等于它们:
points = [CGPoint(x: -372, y: -50), CGPoint(x: 372, y: -50)]
Line = SKShapeNode(points: &points, count: points.count)
然后我再次更改Line的位置(这次我将它向下移动了200,所以位置的变化更明显),如下所示:
Line.position.y = Line.position.y - 200
print("LINEPOS =", Line.position)
打印:
LINEPOS =(0.0,-200.0)
即使它正确打印位置,很明显线条在屏幕上根本没有移动。当我让这条线等于新点时,它仍然处于同一位置。这意味着在让SKShapeNode等于一组新的点之后,它不再在屏幕上移动,而是在它所说的代码中移动。
我该如何解决这个问题?如果有人知道请帮助,因为我真的很困惑。
答案 0 :(得分:2)
试试这段代码:
import SpriteKit
class GameScene:SKScene {
override func didMove(to view: SKView) {
var points = [CGPoint(x: -372, y: 0), CGPoint(x: 372, y: 0)]
var Line = SKShapeNode(points: &points, count: points.count)
addChild(Line)
Line.position.y = Line.position.y - 50
print("LINEPOS =", Line.position)
points = [CGPoint(x: -372, y: -50), CGPoint(x: 372, y: -50)]
Line.removeFromParent()
Line = SKShapeNode(points: &points, count: points.count)
addChild(Line)
Line.position.y = Line.position.y - 200
print("LINEPOS =", Line.position)
}
}
从您的代码中,当您第二次执行Line = SKShapeNode = ...
之类的操作时,会创建新的形状,但尚未拥有父级。它不在节点树中。您所看到的是旧形状,不会从父项中删除。所以,删除那个,然后添加一个...或者,不要每次都创建一个新的形状,只是改变它的位置。
此外,这可能有点令人困惑。即使您删除了以下行:
Line.removeFromParent()
代码将编译(但你会看到两行)。
因此,即使您正在处理相同的变量以及节点只能有一个父节点的事实,如果您在创建另一个addChild(Line)
之前未从父节点中删除Line,代码仍会编译呼叫。怎么可能?
嗯,这样做是因为:
您创建一个Line,它是对SKShapeNode
的引用,它在创建后立即添加到父级。现在,因为它被添加到树中,所以有另一个引用指向它,因为它是场景的children
数组的一部分。
然后再次实例化一个Line变量,现在它显示在内存中的另一个SKShapeNode
上(但旧的SKShapeNode
仍然在树中)。这个新的SKShapeNode没有添加到树中,其父级属性为零。因此,您可以将其再次添加到树中,而无需编译器对您大吼大叫。
修改强>
要回复您关于如何更改SKShapeNode路径的评论,您可以执行以下操作:
让path = CGMutablePath()
points = [CGPoint(x: -372, y: -250), CGPoint(x: 372, y: -250)]
path.move(to: CGPoint(x: points[0].x, y: points[0].y))
path.addLine(to: CGPoint(x: points[1].x, y: points[1].y))
Line.path = path
答案 1 :(得分:0)
只需检查一次
import SpriteKit
var Line:SKShapeNode!
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
var points = [CGPoint(x: -372, y: 0), CGPoint(x: 372, y: 0)]
Line = SKShapeNode(points: &points, count: points.count)
addChild(Line)
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
Line.position.y = Line.position.y + 200
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}