我遇到了一个我很难理解的问题。为了帮助解释和展示我的问题,我创建了一个测试程序。在开始时,我创建一条这样的线:
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)
它打印:
线位置=(0.0,-50.0)
这是有意义的,因为skshapenode的原始位置总是(0,0)。然而,程序的下一部分不是以同样的方式工作的。我将新点设为屏幕上直线所在位置的坐标,并让直线如下所示:
points = [CGPoint(x: -372, y: -50), CGPoint(x: 372, y: -50)]
Line = SKShapeNode(points: &points, count: points.count)
然后我再次更改线的位置(这次我将它向下移动了200,这样位置的变化就更明显了),如下所示:
Line.position.y = Line.position.y - 200
print("LINEPOS =", Line.position)
它打印:
线位置=(0.0,-200.0)
尽管它正确地打印了位置,但很明显屏幕上的线根本没有移动。它仍然和我让线等于新点时的位置一样。这意味着,在让skshapenode等于一组新的点之后,它不再在屏幕上移动,而是在代码中说它会移动。
我该怎么解决?如果有人知道请帮忙,因为我真的很困惑。
最佳答案
请尝试以下代码:
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)
调用之前,代码仍会编译。怎么可能呢?好吧,这是因为:
创建一条线,该线是对
SKShapeNode
的引用,该引用在创建后立即添加到父级。现在,因为它被添加到树中,有另一个引用指向它,因为它是场景children
数组的一部分。然后再次实例化一个line变量,现在它显示在内存中的另一个
SKShapeNode
上(但旧的SKShapeNode
仍在树中)。这个新的skshapenode没有添加到树中,它的父属性是nil。因此,您可以将其再次添加到树中,而不必让编译器对您大喊大叫。编辑:
要回复您对如何更改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
关于swift - Swift 3(SpriteKit):更改图像时SKShapeNode不移动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41215737/