2017-04-07 1 views
1

Ich habe zufällig Knoten hervorbringen, die sich vertikal nach unten bewegen.Swift SpriteKit enthalten Knoten innerhalb der Bildschirmbreite

Hier ist der Code, dies zu tun:

let meteTexture = SKTexture(imageNamed: "redmete.png") 
    let movementAmount = arc4random() % UInt32(self.frame.width) 
    let meteOffset = CGFloat(movementAmount) - self.frame.width/2 
    let meteTime = arc4random_uniform(4) + 3; 
    let moveMete = SKAction.move(by: CGVector(dx: 0, dy: -2 * self.frame.height), duration: TimeInterval(meteTime)) 

    redmete = SKSpriteNode(texture: meteTexture) 
    redmete.position = CGPoint(x: self.frame.midX + meteOffset, y: self.frame.midY + self.frame.height/2) 

Mein einziges Problem ist, dass die meteOffset die Mitte des Sprites verwendet daher es gelegentlich so 50% laichen können oder so ist der Ansicht heraus.

Ich habe

versucht
let movementAmount = arc4random() % UInt32(self.frame.width - meteTexture.size().width/2) 

ich auch

habe versucht
let meteOffset = CGFloat(movementAmount) - meteTexture.size().width/2 - self.frame.width/2 

Aber weder in der Ansicht, die die Gesamtheit des Sprite zu halten. Wie kann ich das machen?

Antwort

0

Sie möchten, dass die Anfangsposition zwischen dem Teilbereich Ihrer Rahmenhöhe liegt, der um die Hälfte der Höhe des Meteors versetzt ist.

Sie müssten haben:

let meteorHeight = meteTexture.size().height 
let verticalRange = self.frame.height - meteorHeight 
let randomXPosition = meteorHeight/2 + arc4random() % verticalRange 

Das Gleiche gilt für die horizontale Position geht (wenn Sie wollen, dass auch zufällig sein):

let meteorWidth  = meteTexture.size().width 
let horizontalRange = self.frame.width - meteorWidth 
let randomYPosition = meteorWidth/2 + arc4random() % horizontalRange 

Anschließend können Sie die Position direkt mit die zufälligen XY-Koordinaten

Wenn Sie nicht wollen, dass der Meteor zu nah an den Rändern erscheint, dann c Reduziere den Wert von verticalRange und horizontalRange weiter, indem du einen festen Offset subtrahierst oder mit einem Bruch multiplizierst.

+0

Es ist auf dieser Zeile Code Fehler: randomXPosition = meteorWidth/2 + arc4random()% horizontalRange lassen. "%" kann nicht auf Operanden vom Typ "UInt32" und "CGFloat" angewendet werden. –

+0

Ich habe den numerischen Casting-Code nicht geschrieben, um die Formel lesbar zu halten. Sie müssen gegebenenfalls zu CGFloat wechseln. –

+0

Ich warf auf CGFloat, aber das behob das Problem immer noch nicht. Ich habe viele Kombinationen ausprobiert, kann aber nichts zur Arbeit bringen. Wenn überhaupt, werden die Knoten immer weiter vom Bildschirm entfernt –

0

GELÖST:

let meteTexture = SKTexture(imageNamed: "redmete.png") 
    let movementAmount = arc4random() % UInt32(self.frame.width/2) 
    let meteOffset = CGFloat(movementAmount) + meteTexture.size().width/2 - self.frame.width/2 
    let meteTime = arc4random_uniform(4) + 3; 
    let moveMete = SKAction.move(by: CGVector(dx: 0, dy: -2 * self.frame.height), duration: TimeInterval(meteTime)) 

    redmete = SKSpriteNode(texture: meteTexture) 
    redmete.position = CGPoint(x: self.frame.midX + meteOffset, y: self.frame.midY + self.frame.height/2) 
Verwandte Themen