为SKSpriteNode生成位置

时间:2016-06-13 08:08:08

标签: ios swift sprite-kit

我正在为SKSpriteNode生成Y位置。我需要生成y位置,但它不应该在先前生成的图像位置,不应该重叠。我怎么能在SpriteKit中的Swift中做到这一点?

for _ in 1...3 {
        let lower : UInt32 = 100
        let upper : UInt32 = UInt32(screenSize.height) - 100
        let randomY = arc4random_uniform(upper - lower) + lower

        obstaclesTexture = SKTexture(imageNamed: "levaPrekazka")
        obstacle = SKSpriteNode(texture: obstaclesTexture)
        prekazka = obstacle.copy() as! SKSpriteNode

        prekazka.name = "prekazka"
        prekazka.position = CGPoint(x: 0, y: Int(randomY))
        prekazka.zPosition = 10;
        prekazka.size = CGSize(width: screenSize.width / 7, height: screenSize.height / 7)
        prekazka.physicsBody = SKPhysicsBody(texture: obstaclesTexture, size: obstacle.size)
        prekazka.physicsBody?.dynamic = false
        prekazka.physicsBody?.categoryBitMask = PhysicsCatagory.obstacle
        prekazka.physicsBody?.contactTestBitMask = PhysicsCatagory.ball
        prekazka.physicsBody?.contactTestBitMask  = PhysicsCatagory.ball
        self.addChild(prekazka)
    }

2 个答案:

答案 0 :(得分:0)

要避免两个重叠的精灵和不同的位置,您需要考虑精灵的高度。或许这样的东西

let spriteHeight = 60 // or whatever
let lower  = 100
let upper = Int(screenSize.height) - 100
let area = upper - lower
let ySpacing = area/spriteHeight
var allowedYs = Set<CGFloat>()
let numberOfSprites = 3

while allowedYs.count < numberOfSprites {
    let random = arc4random_uniform(UInt32(spriteHeight))
    let y = CGFloat(random) * CGFloat(ySpacing)
    allowedYs.insert(y)
}

for y in allowedYs {
    obstaclesTexture = SKTexture(imageNamed: "levaPrekazka")
    obstacle = SKSpriteNode(texture: obstaclesTexture)
    prekazka = obstacle.copy() as! SKSpriteNode

    prekazka.name = "prekazka"
    prekazka.position = CGPoint(x: 0, y: y)
    // etc...
}

答案 1 :(得分:0)

我很想生成精灵的位置,然后遍历场景中所有现有的精灵,看看它们的帧是否与新的精灵帧重叠:

let lower : UInt32 = 100
let upper : UInt32 = UInt32(screenSize.height) - 100

obstaclesTexture = SKTexture(imageNamed: "levaPrekazka")
obstacle = SKSpriteNode(texture: obstaclesTexture)

// Generate a position for our new sprite. Repeat until the generated position cause the new sprite’s frame not to overlap with any existing sprite’s frame.
repeat {
       let randomY = arc4random_uniform(upper - lower) + lower
       prekazka.position = CGPoint(x: 0, y: Int(randomY))
} while checkForOverlap(prekazka) = true   // If it overlaps, generate a new position and check again

//Function to see if an SkSpriteNode (passed as parameter node) overlaps with any existing node. Return True if it does, else False.
Func checkForOverlap(SKSpriteNode: node) ->> bool {
   for existingNode in children {  // for every existing node
      if CGRectIntersectsRect(existingNode.frame, node.frame) {return True}  // return True if frames overlap
      }
return false   //No overlap
}

(从内存中写这个,所以可能需要一些小小的工作)。

另一种方法是使用物理实体生成和定位所有节点,并设置场景以使所有节点与所有其他节点发生碰撞。然后允许物理引擎处理任何会导致它移动节点直到没有重叠的碰撞。此时,您可以移除所有物理实体。