Swift 3(SpriteKit):SKShapeNode在图像更改时不移动

时间:2016-12-19 04:25:12

标签: swift sprite-kit skshapenode

我遇到了一个我很难理解的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等于一组新的点之后,它不再在屏幕上移动,而是在它所说的代码中移动。

我该如何解决这个问题?如果有人知道请帮助,因为我真的很困惑。

2 个答案:

答案 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,代码仍会编译呼叫。怎么可能?

嗯,这样做是因为:

  1. 您创建一个Line,它是对SKShapeNode的引用,它在创建后立即添加到父级。现在,因为它被添加到树中,所以有另一个引用指向它,因为它是场景的children数组的一部分。

  2. 然后再次实例化一个Line变量,现在它显示在内存中的另一个SKShapeNode上(但旧的SKShapeNode仍然在树中)。这个新的SKShapeNode没有添加到树中,其父级属性为零。因此,您可以将其再次添加到树中,而无需编译器对您大吼大叫。

  3. 修改

    要回复您关于如何更改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 */
        }
    }