【问题标题】:Problems with SKAction.runBlock() in SwiftSwift 中 SKAction.runBlock() 的问题
【发布时间】:2016-06-18 15:18:59
【问题描述】:

这是我正在开发的一个简单 SpriteKit 游戏的一些代码:

let square = SKShapeNode()
let square2 = SKShapeNode()

override func didMoveToView(view:SKView) {
    var moveSquare: SKAction
    moveSquare = SKAction.moveTo(CGPoint(x: someNumber, y:otherNumber), duration: NSTimeInterval(3))

    square.runAction(SKAction.sequence([moveSquare1, SKAction.runBlock(checkIfSquareMatches(square)),SKAction.removeFromParent()]))
    square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock(self.addChild(self.square2)) ,moveSquare, SKAction.removeFromParent()]))
}

func checkIfSquareMatches(shape:SKShapeNode) {...}

所以我有两个错误,一个在 square.runAction 行,另一个在 square2.runAction 行。第一个说

“无法将'()'类型的值转换为预期的参数类型'dispatch_block_t'(又名'@convention(block) () -> ()')”

第二个说的和上面一样,只是它说的是“type '()'”

“键入'Void'(又名'()')”

由于“(又名'()')”,我认为这是同一件事。

为什么会出现这些错误,我该如何解决?我在 stackoverflow 上看到了一篇关于在 SKAction.runBlock() 中运行函数的问题的帖子,但解决方案指出问题是您无法在 runBlock 中返回值,但我的函数没有返回任何值;它只会改变一些变量的值,所以我看不出问题。谢谢。

【问题讨论】:

    标签: swift sprite-kit skaction


    【解决方案1】:

    当你将 sn-ps 放在 runBlock 语句中时,它们需要放在花括号 {} 中,除非它们是没有参数的简单 func 调用

    改成

    square.runAction(SKAction.sequence([moveSquare1, SKAction.runBlock( { self.checkIfSquareMatches(self.square) } ),SKAction.removeFromParent()]))
    square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock( { self.addChild(self.square2 } )) ,moveSquare, SKAction.removeFromParent()]))
    

    }

    错误消失了

    请注意,您必须使用 self 引用变量。在 runBlock 调用中

    【讨论】:

    • 谢谢!这使得程序工作,但是正方形仍然没有被添加到场景中(addchild(square2) 似乎并没有实际添加正方形)。没有更多的错误,但代码没有做它应该做的事情。知道为什么吗?
    • 顺便说一句,我相当肯定它实际上没有被添加,因为我打开了节点计数,并且如果 addChild() 工作,则没有尽可能多的节点。此外,第一个 SKAction.runAction 中的 SKShapeNode 正方形(与 square2 的属性完全相同)被添加到动作之外,它工作得非常好,所以正方形没有任何问题。
    • 你让 square2 运行一个动作 square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock( { self.addChild(self.square2 } )) ,moveSquare,SKAction. removeFromParent()])) 但它还没有添加到场景中,所以它不能运行一个动作。应该是 self.runAction
    • 我按照你说的修改了它,但它仍然没有被添加到场景中。一段时间后它现在也崩溃了,说我试图添加一个已经有父节点的节点(因为上面的那些动作是另一个重复的 SKAction 的一部分),所以我尝试添加另一个 runBlock ,在moveSquare 动作,但由于同样的原因它仍然崩溃。我认为它已经到了我可以为此发布一个新问题的地步。
    • 没关系,我想我已经知道为什么会这样了。感谢您的帮助!
    猜你喜欢
    • 2016-03-07
    • 2016-02-20
    • 2015-12-25
    • 2021-04-15
    • 2015-07-07
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多