2017-04-07 11 views
1

ランダムに生成されたノードがビューの下に垂直に移動しています。ここでSwift SpriteKitには画面幅内にノードが含まれています

は、これを行うためのコードです:

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) 

私の唯一の問題はmeteOffsetは、スプライトの中心を使用して、したがって、それは時折50%ほどがビューの外にあるので、生成できるということです。

私はまた

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

を試みたが、どちらも視野にスプライトの全体を保つないました

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

を試してみました。これどうやってするの?

答えて

0

最初の位置は、流星の高さの半分に差し込まれたフレーム高さのサブ範囲の間であることが必要です。

あなたは持っている必要があります:あなたは、その後に直接位置を設定することができます

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

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

同じ水平位置(あなたはそれが同様にランダムにする場合)のために行きますランダムXY座標

redmete.position = CGPoint(x:randomXPosition, y:randomYPosition) 

流星が端に近すぎるようにしたくない場合は、c verticalRangeとhorizo​​ntalRangeの値をさらに小さくするには、固定オフセットを減算するか、端数を掛けてください。

+0

:せrandomXPosition = meteorWidth/2 + arc4random()%のhorizo​​ntalRangeを。 "%"は "UInt32"と "CGFloat"タイプのオペランドには適用できません –

+0

数式を読みやすくするために数値型キャストを記述しませんでした。必要に応じて、CGFloatにキャストする必要があります。 –

+0

私はCGFloatにキャストしましたが、これはまだ問題を解決しませんでした。私は多くの組み合わせを試しましたが、何もできません。何かがあれば、ノードはさらに時間をかけて画面から外れるようになります –

0

を解決:これは、このコード行に失敗だ

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) 
関連する問題