了解Spritekit运行块,变量不符合预期

时间:2017-03-17 14:28:46

标签: swift sprite-kit skaction

我正在寻找一些帮助,以便了解speedToPoint变量在1行动时始终为wait的原因。

这是我写的SKSpriteNode扩展的一部分,用于使鸟飞到预定义矩形中的随机点。 speedToPoint也会在1到4之间随机化,并用作moveTo操作的持续时间。但是,我还需要在动作序列中使用TimeInterval作为我的等待块。

speedToPoint确实在运行区中被随机化(我已经确认)。如何在序列的下一部分的等待块中使用相同的随机数?

var speedToPoint:TimeInterval = 1

self.run(SKAction.repeatForever(
     SKAction.sequence([
        SKAction.run{
            speedToPoint = TimeInterval(Globals.sharedInstance.randomF(min: 1, max: 4))
            var pointX = Globals.sharedInstance.randomF(min: left,max: right)
            let pointY = Globals.sharedInstance.randomF(min: top,max:bottom)

        while abs(self.position.x.distance(to: pointX)) < 200 {
            pointX = Globals.sharedInstance.randomF(min: left,max: right)
        }

        self.xScale = pointX < self.position.x ? -1 : 1

        self.run(SKAction.move(to: CGPoint(x:pointX,y:pointY),duration: speedToPoint))
    },
    SKAction.wait(forDuration: speedToPoint)])
),withKey: "inFrame")

为了澄清,我真正要做的是让鸟飞到一个点,一旦它到达那一点,飞到另一个点。我仍然把我听到的动作序列包裹起来,以及他们是否真的等待完成继续前进。从我所读到的内容中可以看出,但不适用于任何move行为。这就是wait在那里的原因。也许还有另一种方式?

1 个答案:

答案 0 :(得分:2)

SKAction一旦创建,就无法修改,并且意味着可以重复使用,例如。您无法修改持续时间参数,也无法更改其他传递的参数。这意味着如果需要更改,则必须重新创建它。当然,您可以更改现有操作的速度属性,也可以暂停操作,但在修改现有操作时几乎就是这样。

要解决您的问题,您可以执行下一步:

1)创建一个将精灵移动到特定位置的动作

2)一旦完成动作,你就会创建一个新的动作

你可以使用递归这样做(只需复制并粘贴代码以查看它是如何工作的):

import SpriteKit


class GameScene: SKScene, SKPhysicsContactDelegate {


    private var bird = SKSpriteNode(color: .purple, size: CGSize(width: 100, height: 100))

    override func didMove(to view: SKView) {

        addChild(bird)
        recursive()

    }

    func recursive(){

        let sequence = SKAction.sequence([

           SKAction.move(to: self.randomPoint(inRect: self.frame), duration: TimeInterval(self.random(between: 1, and: 3))),

            SKAction.run({[unowned self] in NSLog("Block executed"); self.recursive()})
            ])

        self.bird.run(sequence, withKey: "aKey")
    }

    func random(between minimum: CGFloat, and maximum: CGFloat) -> CGFloat{

    return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(minimum - maximum) + min(minimum, maximum)
}

    func randomPoint(inRect rect:CGRect)->CGPoint{


        let x = random( between: -rect.size.width / 2.0 , and: rect.origin.x + rect.size.width/2.0)
        let y = random(between: -rect.size.height / 2.0 , and: rect.origin.y + rect.size.height/2.0)

        return CGPoint(x: x, y: y)


    }

}

要停止此操作,请删除与其关联的密钥。