2017-11-23 33 views
0

私はこの質問で助けを探しています。 私はクラス名BallNodeSKShapeNodeを持っています。私のコードの中には、スクリーンの上から3秒ごとにスポーンボールという機能もあります。今、ボールの位置を1秒ごとに特定する関数を設定したいので、ball.position.y > 200がコンソールにメッセージを出力する場合は、ノードの最後の位置を取得

これは、ボールがこの位置にある場合(落ちていないときでも)、別の機能を呼び出すことを目的としています。私はTimerupdate(_ currentTime: CFTimeInterval)SKActionを経由して、それを実行しようとしましたが、私は成功しなかったと私は本当に何をすべきか見当がつかない...

アップデート - 私の現在のコード:

var timeType1: CFTimeInterval = 0.0 
var timeType2: CFTimeInterval = 2.0 

override func update(_ currentTime: CFTimeInterval) { 

    if (currentTime - timeType1 > timeType2){ 
     print("time") 
     self.checkBallsPosition() 
     self.timeType1 = currentTime 
    } 
    self.enumerateChildNodes(withName: "color.BallNode") { node, _ in 
     self.checkBallsPosition() 
    } 
} 

    func checkBallsPosition() { 
    self.enumerateChildNodes(withName: "BALL") { (node: SKNode, nil) in 
     let x = self.createTopBorder() 
     x.isHidden = true 
     let wait2 = SKAction.wait(forDuration: 1) 
     let action2 = SKAction.run { 
     let position = Double(node.position.y) 
     if position < 200 { 

     } 
     else if position > 200 { 
      print("bolbo") 
      node.removeFromParent() 
     } 
     } 
     self.run(SKAction.sequence([wait2,action2])) 

     } 
} 

私がしようと何のthatsこれまでのところ、問題は私がボールを手に入れたいと言ったからです最後にポジションです。ボールが画面の下に落ちるので、最後の位置は画面の下の境界線に触れるとき、または別のボールに触れるときでなければなりません。私がupdateに設定した場合は、1秒おきにボールの位置を取得します。別の問題は、ボールの位置が常に(衝突が発生したとき)別のボールに依存して変化し得ることである。

更新#2 - 他の機能:

func spawnBalls() { 
    let wait = SKAction.wait(forDuration: 3) 
    let action = SKAction.run { 
     self.createBall() 
    } 
    run(SKAction.repeatForever((SKAction.sequence([wait, action])))) 
} 

func createBall(){ 
    let ball = BallNode(radius: 65) 
    print(ball.Name) 
    print(ball._subName!) 

    ball.position.y = ((frame.size.height) - 200) 
    let ballXPosition = arc4random_uniform(UInt32(frame.size.width)) 
    ball.position.x = CGFloat(ballXPosition) 
    ball.physicsBody?.categoryBitMask = PhysicsCategory.ball 
    ball.physicsBody?.collisionBitMask = PhysicsCategory.ball 
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.topBorder 
    ball.delegate = self 
    addChild(ball) 

} 
+0

はあなたのコードを投稿ので、我々は間違って起こっているかを見ることができ、あなたは簡単に私の質問を更新update' –

+0

'でこれをチェックすることができるはずです、あなたは私がそれを解決するために助けることができますか? – omerc

答えて

0

あなたが使用しているコード全体を投稿しませんでした。どのようにあなたのボールを産んでいるのか分からず、どのように階層があり、どのように動かしているのかわからないので、ここで再現することはできません。

私はそれを正しく理解しているかどうかはわかりませんが、あなたがやっていることよりも単純かもしれないと思います。以下のコードがあなたに役立つかどうかを確認してください。私はボールをSKActionで落としています(あなたも物理学でそれを行うことができます)。

private let ballSpeed : CGFloat = 400 
private let ballRadius : CGFloat = 10 

private func spawnBall(atPoint pos : CGPoint){ 
    let b = SKShapeNode(circleOfRadius: ballRadius) 
    b.name = "ball" 
    b.position = pos 
    addChild(b) 
    b.run(SKAction.moveTo(y: -size.height, duration: TimeInterval((pos.y+size.height)/400))) 
} 

override func update(_ currentTime: TimeInterval) { 
    super.update(currentTime) 
    enumerateChildNodes(withName: "ball") { (node, _) in 
     if node.position.y < 0 { 
      node.removeFromParent() 
     } 
    } 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches{ 
     let pos = touch.location(in: self) 
     spawnBall(atPoint: pos) 
    } 
} 
+0

あなたのコードで何を探していますか...ボールが0より下になるたびに、シーンから削除されます。私がしたいのは、位置y> 400のボールのたびに新しいノードが画面に現れるということです。問題は、ボールが落ちるということです。つまり、ボールが落ちる(そして落下が終わる前に、ボールが底部または別のボールに触れることによって)このノードが表示されます。このノードは、ボールが物理プロパティを終了してからまだ位置がy> 500である場合にのみ表示されることを望みます。コードでは、すべてのスポーンボールで最後の位置を取得せずに発生します。 – omerc

+0

ちょうど私のcreateBallとspawnBall関数が含まれていることを私の質問を更新する..見てみて、おそらくあなたは私の質問をよりよく理解しています... – omerc

+0

こんにちは、@PietroPepe - あなたは何か考えていますか? – omerc

関連する問題