我想知道如何取消隐藏我的节点,但一旦取消隐藏出现在与原始节点不同的位置。
Node<X>
所以,一旦“绿色圆圈”出现问题。没有隐藏你如何保证在与前一个不同的位置产卵并重复?
答案 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(){
//...
}
}