0

我试图在设置的位置生成多个 SKSpriteNode,但是当我添加多个节点时,它们只是在彼此之上生成?有没有办法不让这种情况发生?

我还遇到了必须刷新页面才能为节点获取新位置的问题。有没有办法,如果节点在页面上消失,它将在设置的坐标内的新位置产生?

let rect = CGRectMake(x: 90, y: 360, width: 200, height: 200)
let x = rect.origin.x + CGFloat(arc4random()) % rect.size.width
let y = rect.origin.y + CGFloat(arc4random()) % rect.size.height
let randomPoint = CGPointMake(x, y)
self.redcircle.position = randomPoint
self.addChild(redcircle)
self.bluecircle.position = randomPoint
self.addChild(bluecircle)
4

2 回答 2

0

您需要 2 个随机点才能将它们放在另一个地方。您使用一个位置的 2 个节点,原因randomPoint总是相同的。

编辑(评论中的问题):

你必须使用 min(x, y) 和 max(x, y)

    let x = random(CGRectGetMinX(self.frame), max: CGRectGetMaxX(self.frame))
    let y = random(CGRectGetMinY(self.frame), max: CGRectGetMaxY(self.frame))

let randomPoint = CGPointMake(x, y)
self.redcircle.position = randomPoint
self.addChild(red circle)

这里是随机函数:

func random() -> CGFloat {
        return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
    }

    func random(min: CGFloat, max: CGFloat) -> CGFloat {
        return random() * (max - min) + min
    }
于 2015-07-28T10:38:46.633 回答
0

您可以更轻松地创建一种基于给定矩形生成随机点的方法。或在给定矩形内生成精灵的方法,如下所示:

import SpriteKit


class GameScene: SKScene {

   let rect =  CGRect(x: 90, y: 360, width: 200, height: 200)

    override func didMoveToView(view: SKView) {


        let debug = SKSpriteNode(color: SKColor.redColor(), size: rect.size)

        debug.alpha = 0.2

        debug.position = rect.origin

        let origin = SKSpriteNode(color: SKColor.redColor(), size:CGSize(width: 5, height:5))

        debug.addChild(origin)

        self.addChild(debug)

    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

       let sprite = spawnSpriteAtRandomPositionWithinRect(rect)


       self.addChild(sprite)


       println("Sprite spawned at position x,y( \(sprite.position.x), \(sprite.position.y))")
    }

    func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{

        return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
    }

    func spawnSpriteAtRandomPositionWithinRect(rectangle:CGRect)->SKSpriteNode{


        let x = randomBetweenNumbers(rectangle.origin.x - rectangle.size.width / 2.0 , secondNum: rectangle.origin.x + rectangle.size.width/2.0)
        let y = randomBetweenNumbers(rectangle.origin.y - rectangle.size.height / 2.0 , secondNum: rectangle.origin.y + rectangle.size.height/2.0)

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

        sprite.position = CGPoint(x: x, y: y)


        return sprite
    }

}

实际上不需要名为debug的Sprite ,但它可以直观地显示给定的矩形。

于 2015-07-28T11:52:59.780 回答