2016-06-13 65 views
0

我正在为SKSpriteNode生成Y位置。我需要生成y位置,但它不应该位于以前生成的图像的位置,不应该重叠。我如何能够在SpriteKit中的Swift中完成此操作?为SKSpriteNode生成位置

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) 
    } 
+0

所以,如果我理解你的代码,你基本上希望y位置是7个可能的y位置之一? –

+0

我需要生成y位置,但它不应该位于先前生成的图像的位置。 – pulitr

回答

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... 
} 
+0

非常感谢:) – pulitr

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 
} 

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

另一种方法是生成并定位所有具有物理体的节点,并设置场景使所有节点与其他节点碰撞。然后允许物理引擎处理任何会导致它移动节点的冲突,直到没有重叠。在这一点上,你可以删除所有的物理机构。