SpriteKit SKAction.runBlock传递参数问题

时间:2015-06-24 07:05:13

标签: swift sprite-kit block skaction

我正在使用SKAction.runBlock遇到一些奇怪的行为。基本上我使用以下语法:

AnAction = SKAction.runBlock({ SomeFunction(SomeParameter) })

在一个switch语句中我有100多个案例

IDTargetSprite = FindTargetSprite()
TypeSprite = FindTypeSprite(IDTargetSprite)

switch TypeAction
{
...
case eTypeAction.DropBomb.rawValue:
    ActionBuilt = SKAction.runBlock({ DropBomb(IDTargetSprite) })

case eTypeAction.DropStar.rawValue:
    dParamsAction = LoadParamsAction()
    ActionBuilt = SKAction.runBlock({ DropStar(IDTargetSprite, dParamsAction) })
...
}

这段代码包含在程序开头的循环中,我在其中查看TypeAction数组

for TypeAction in tTypeAction
{
    // execute above code
}

然后我在以后的另一个循环中执行这样的动作:

switch TypeSprite
{
case eActionTarget.SpriteA.rawValue:
    SpriteA.runAction(ActionBuilt)

case eActionTarget.SpriteB.rawValue:
    SpriteB.runAction(ActionBuilt)
}

到目前为止没什么不寻常的,除了它不起作用,当我试图理解为什么我看到传递给块的参数不好但是以一种非常奇怪的方式:有时候参数传递给函数中的block(IDTargetSprite或dParamsAction)在调用的函数内没有正确的值,它保留了他在循环的上一次迭代中所拥有的值。

在这些情况下,如果我在runBlock行之前查看参数的值,则该值是正确的但是当执行该操作时,在所调用的函数中找到的值不再正确且等于该值的值循环的上一次迭代。

我已经通过这样做了一种方式(但尚未经过广泛测试):

case eTypeAction.DropBomb.rawValue:
    TempParam = IDTargetSprite
    ActionBuilt = SKAction.runBlock({ DropBomb(TempParam) })

我必须为每个案件都有一个特定的TempParam ......

我是否遗漏了使用SKAction.runBlock或阻塞的明显内容?

1 个答案:

答案 0 :(得分:1)

通过传递常量而不是变量作为参数来找到一种快速方法。所以,如果我喜欢这样的话,它会起作用:

case eTypeAction.DropStar.rawValue:
    let dParamsAction = LoadParamsAction()
    ActionBuilt = SKAction.runBlock({ DropStar(IDTargetSprite, dParamsAction) })