2016-06-13 8 views
0

Ich erzeuge Y-Position für SKSpriteNode. Ich muss Y-Position generieren, aber es sollte nicht in der Position zuvor erzeugtes Bild sein, sollte nicht überlappen. Wie könnte ich dies in Swift in SpriteKit tun?Positionen für SKSpriteNode generieren

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

Also, wenn ich Ihren Code verstehe, möchten Sie im Wesentlichen die y-Position eine von 7 möglichen y-Positionen haben? –

+0

Ich muss y-Position generieren, aber es sollte nicht in der Position zuvor erzeugtes Bild sein. – pulitr

Antwort

0

Um beide überlappende Sprites und unterschiedliche Positionen zu vermeiden müssen Sie die Höhe des Sprites berücksichtigen. Etwas wie diese vielleicht:

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

Vielen Dank :) – pulitr

0

würde ich die Sprite-Position zu erzeugen versucht sein, und dann Schleife über alle vorhandenen Sprites in der Szene und sehen, ob ihr Rahmen mit dem neuen Sprites Rahmen überlappt:

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 
} 

(Schreiben Sie dies aus dem Speicher, so kann ein bisschen hantieren, um zu arbeiten).

Ein anderer Ansatz wäre, alle Knoten mit Physikkörpern zu erzeugen und zu positionieren, und die Szene so einzurichten, dass alle Knoten mit allen anderen kollidieren. Dann erlaube der Physik-Engine, mit irgendwelchen Kollisionen umzugehen, die bewirken würden, dass sie die Knoten herum bewegen, bis sich keine überschneiden. An diesem Punkt könntest du alle Physikkörper entfernen.