【问题标题】:SKAction not running on SKSpriteNodeSKAction 未在 SKSpriteNode 上运行
【发布时间】:2017-07-12 12:15:30
【问题描述】:

我的SKShapeNode 上的SKAction 不起作用,代码没有被执行,节点也没有移动,即使控制台正在记录“Snake 正在移动”。是因为节点是 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()
                }
            })
        ])))
    }
}

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

【问题讨论】:

  • “不工作”是什么意思 - 究竟发生了什么?
  • @SteveIves 已编辑。
  • 我会说(从简短的角度来看)他正在处理错误的节点。他首先创建一个节点并添加它,然后获取另一个节点并尝试对其执行操作,但该节点不在节点树中。
  • @Whirlwind。我想你是正确的。 myNode 是一个计算属性。 self.addChild(myNode) 添加一个节点,但没有 myNode 属性。然后myNode.run 计算一个新节点,但在尝试对其运行操作之前不将其添加到场景中。但无论如何它是一个不同的节点。
  • @Fayyouz 实际上,您没有一个名为 myNode 的节点。您有一个计算属性 myNode,每次引用它时,都会返回一个新的、不同的 SKShapeNode。

标签: ios swift sprite-kit


【解决方案1】:

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

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

将您的 myNode 定义更改为:

var myNode : SKShapeNode!

并在didMove(to view: 中添加:

myNode = SKShapeNode(rectOf: snake.componentSize)
myNode.position = snake.head
myNode.fillColor = .red

【讨论】:

  • 6 票赞成!?严重地?我无法想象很多人会因为使用计算属性为其节点而遇到问题。
【解决方案2】:

我遇到了一个几乎与此相同的问题,我在引用节点中有无响应的子节点。原来引用的节点默认为 isPaused 为真(找到答案线程here

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

referencedNode.isPaused = false

【讨论】:

  • 这可能不是 OP 的问题,但这是我的问题。参考节点很棒......除非它们不是。
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多