2016-06-13 6 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ポジションの1つにすることが基本的には好きですか? –

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

(これをメモリから書き込むため、作業に少しでも手間がかかることがあります)。

物理機関ですべてのノードを生成して配置し、すべてのノードが他のすべてのノードと衝突するようにシーンを設定する方法もあります。次に、物理エンジンが衝突を処理し、ノードが重複しなくなるまでノードを移動させます。この時点で、すべての物理学のボディを削除することができます。

関連する問題