2015-11-06 45 views
1

我想知道如何取消隐藏我的节点,但一旦不隐藏出现在与原来不同的地方。如何重新在不同的地方重生一旦隐藏

let x3 = rect.origin.x + CGFloat(arc4random()) % rect.size.width 
let y3 = rect.origin.y + CGFloat(arc4random()) % rect.size.height 
let randomPoint3 = CGPointMake(x3, y3) 
self.greencircle.position = randomPoint3 
self.addChild(greencircle) 
let wait3 = SKAction.waitForDuration(2.0) 
greencircle.hidden = true 
let wait23 = SKAction.waitForDuration(1.0) 
greencircle.hidden = false 

所以一旦“绿圈”取消隐藏你如何保证在不同的位置产卵到以前的和重复?

+0

这是你正在尝试做:隐藏节点,改变它的位置到一些随机位置,显示节点?并重复该序列一定次数?此外,是否只想为绿色圆圈节点或多个节点做到这一点? – Whirlwind

+0

是的,但是rect随机重新生成rect = rect = CGRectMake(8,293,165,218)是我想要做的,但是我也有不同的节点在那个位置也是,它会更容易结合起来一起? – MattB

+0

不知道我是否理解了评论的第二部分,但是我为您写了一个简单的示例,它将为您提供基本的想法,即如何隐藏,移动到随机点并取消隐藏节点。另外,我链接了一篇关于“在随机位置产卵节点但不重叠”的好帖子,您可能会觉得它很有用。祝你好运,快乐黑客! :) – Whirlwind

回答

0

要在给定的矩形内的随机点生成一个节点,你可以用这个方法(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(){ 
    //... 
} 

} 

最终的结果是为了看像这样: random spawning

+0

Thanyyou这么多只是一件事,虽然(weakSelf!.rectangle.calculateAccumulatedFrame()表示它没有名为矩形的成员,所以我必须使矩形等于什么吗? – MattB

+0

@MattB签出编辑:)我已经添加了一个示例来显示矩形的定义位置(它是GameScene的属性)。我也改变了randomPointWithinRectangle方法。如果您有其他问题,请随时提问。正如我所说,这在我的身边起作用,但是基于你的Swift版本(如果你是最新的),你可能需要稍微改变一下代码。 – Whirlwind

+0

@MattB我用touchesMoved移动一个矩形的代码被故意留下,因为它与你的原始问题无关。 – Whirlwind