要在给定的矩形内的随机点生成一个节点,你可以用这个方法(S):
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
}
接下来的事情就是隐藏/取消隐藏部分...请注意,我目前雨燕的过时的版本: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(){
//...
}
}
最终的结果是为了看像这样:
这是你正在尝试做:隐藏节点,改变它的位置到一些随机位置,显示节点?并重复该序列一定次数?此外,是否只想为绿色圆圈节点或多个节点做到这一点? – Whirlwind
是的,但是rect随机重新生成rect = rect = CGRectMake(8,293,165,218)是我想要做的,但是我也有不同的节点在那个位置也是,它会更容易结合起来一起? – MattB
不知道我是否理解了评论的第二部分,但是我为您写了一个简单的示例,它将为您提供基本的想法,即如何隐藏,移动到随机点并取消隐藏节点。另外,我链接了一篇关于“在随机位置产卵节点但不重叠”的好帖子,您可能会觉得它很有用。祝你好运,快乐黑客! :) – Whirlwind