一旦取消隐藏,如何在不同的地方重新产卵

时间:2015-11-06 19:37:08

标签: swift sprite-kit nodes skaction

我想知道如何取消隐藏我的节点,但一旦取消隐藏出现在与原始节点不同的位置。

Node<X>

所以,一旦“绿色圆圈”出现问题。没有隐藏你如何保证在与前一个不同的位置产卵并重复?

1 个答案:

答案 0 :(得分:0)

要在给定矩形内的随机点生成节点,您可以使用以下方法:

 func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{
    return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
}

func randomPointWithinRectangle(rectangle: CGRect) -> CGPoint {

    var point : CGPoint = CGPoint()

     point.x = randomBetweenNumbers(rectangle.origin.x + sprite.size.width / 2, secondNum: rectangle.origin.x + rectangle.size.width - sprite.size.width / 2)

    point.y = randomBetweenNumbers(rectangle.origin.y + sprite.size.width / 2, secondNum: rectangle.origin.y + rectangle.size.height - sprite.size.width / 2)


    return point

}

接下来的事情是隐藏/取消隐藏部分...请注意,我目前使用过时的Swift版本:D,对我有用的东西可能不适合你。但逻辑是一样的。

要实现这一点,您可以使用SKAction序列,如下所示:

func startSpawningSprites(){

let wait = SKAction.waitForDuration(0.5)

let fadeOut = SKAction.fadeOutWithDuration(0.5)

let fadeIn = SKAction.fadeInWithDuration(0.3)

//Use weak reference to self to prevent retain cycle. in Swift 2.0 you should use appropriate syntax.
weak var weakSelf = self

let changePosition = SKAction.runBlock({

      weakSelf!.sprite.position = weakSelf!.randomPointWithinRectangle(weakSelf!.rectangle.calculateAccumulatedFrame())
})

let sequence = SKAction.sequence([wait, fadeOut, changePosition, wait, fadeIn])

sprite.runAction(SKAction.repeatAction(sequence, count:10))

}

在这里,代码非常直接,它完成了我上面所说的(隐藏,移动和取消隐藏节点)。矩形变量被定义为一个属性,只是为了便于调试。

关于你问题的其他部分......我不确定我是否理解......但我可以尝试一下。如果您关心节点之间的重叠并且想要避免它,则必须检查给定点是否存在节点(nodeAtPoint方法可能有用)。从理论上讲,这可能是资源消耗。如果有兴趣,请阅读更多here

修改

回答你的评论中的问题:

变量精灵和矩形被定义为GameScene的属性:

class GameScene:SKScene{

let sprite = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 30, height: 30))

//just for debugging purposes
let rectangle = SKSpriteNode(color: SKColor.orangeColor(), size: CGSize(width: 150, height: 150))

override func didMoveToView(view: SKView) {

    setupScene()


    startSpawningSprites()
}


func setupScene(){

    sprite.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
    sprite.zPosition = 4
    sprite.name = "sprite" //later on, you can access or enumerate node(s) by name

    addChild(sprite)

    rectangle.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
    rectangle.alpha = 0.5
    rectangle.zPosition = 3
    rectangle.name = "rectangle"
    addChild(rectangle)

}

func startSpawningSprites(){
     //...
}

}

最终结果如下: random spawning