SKAction未在SKSpriteNode上运行

Fay*_*ouz 3 ios sprite-kit swift

SKActionSKShapeNode不工作,是没有得到执行的代码,并且节点是不动的,即使控制台登录"蛇正朝着".是因为节点是SKScene的属性,并且操作是较低范围函数的一部分?

class LevelScene: SKScene, SnakeShower {

    var snake: Snake {
        let theSnake = Snake(inWorld: self.size)
        return theSnake
    }

    override func didMove(to view: SKView) {
        self.backgroundColor = .green
        snake.delegate = self
    }

    var myNode: SKShapeNode {
        let node = SKShapeNode(rectOf: snake.componentSize)
        node.position = snake.head
        node.fillColor = .red
        return node
    }

    func presentSnake() { // function called by the snake in the delegate (self)
        self.addChild(myNode)
        startMoving()
    }

    func startMoving() {
        print("snake is moving")
        myNode.run(SKAction.repeatForever(SKAction.sequence([
            SKAction.move(by: self.snake.direction.getVector(), duration: 0.2),
            SKAction.run({
                if self.myNode.position.y > (self.size.height / 2 - self.snake.componentSize.height / 2) {
                    self.myNode.removeAllActions()
                }
            })
        ])))
    }
}
Run Code Online (Sandbox Code Playgroud)

当它们在与动作相同的函数中声明属性时,它曾经工作过

Ste*_*ves 8

myNode是计算属性.self.addChild(myNode)添加节点,但没有myNode存储属性.

myNode.run首先计算新节点而不将其添加到场景中.然后它调用运行它的动作.但由于它是一个不在场的不同节点,它永远不会运行.

将你的myNode定义改为:

var myNode : SKShapeNode!
Run Code Online (Sandbox Code Playgroud)

didMove(to view:补充:

myNode = SKShapeNode(rectOf: snake.componentSize)
myNode.position = snake.head
myNode.fillColor = .red
Run Code Online (Sandbox Code Playgroud)

  • 6票!?真的吗?我无法想象很多人因为为节点使用计算属性而导致问题. (2认同)

ris*_*uit 5

我遇到了与此几乎相同的问题,其中引用的节点中有无响应的子节点。事实证明,引用的节点默认 isPaused 为 true(此处找到答案线程)

解决方案是将 isPaused 属性更改为 false。

referencedNode.isPaused = false
Run Code Online (Sandbox Code Playgroud)