2016-06-29 7 views
2

プレイヤーがジョイスティックで動くことができるが、円の外に出ることができないようにしたい。私はジョイスティックを作ったが、私は他のものをする方法を知らない。下の画像にも私のコードにも例があります。誰かが私を助けてくれることを願っています。ジョイスティックで一定の範囲内でスプライトを移動する方法は?

class GameScene: SKScene { 

    var circuloPrincipal = SKSpriteNode(imageNamed: "circulo") 
    var circuloFondo = SKSpriteNode(imageNamed: "circuloFondo") 
    let base = SKSpriteNode(imageNamed: "circuloFondo") 
    let ball = SKSpriteNode(imageNamed: "circulo") 
    var stickActive:Bool = false 



    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

     base.size = CGSize(width: 100, height: 100) 
     base.alpha = 0.3 
     base.zPosition = 2.0 
     base.position = CGPoint(x: frame.width/2, y: frame.height/2 - 310) 
     self.addChild(base) 

     ball.size = CGSize(width: 50, height: 50) 
     ball.color = circuloPrincipal.color 
     //ball.alpha = 0 
     ball.zPosition = 3.0 
     ball.position = base.position 
     self.addChild(ball) 

     circuloPrincipal.size = CGSize(width: 35, height: 35) 
     circuloPrincipal.position = CGPoint(x: frame.width/2, y: frame.height/2) 
     self.addChild(circuloPrincipal) 
     circuloPrincipal.color = UIColor(red: 0.75, green: 0.75, blue: 0.75, alpha: 1.0) 
     circuloPrincipal.colorBlendFactor = 1.0 
     circuloPrincipal.zPosition = 3.0 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event:  UIEvent?) { 


     for touch in touches { 
      let location = touch.locationInNode(self) 

      if (CGRectContainsPoint(ball.frame, location)) { 

       stickActive = true 
      }else { 

       stickActive = false 

      } 

     } 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      let location = touch.locationInNode(self) 

      if (stickActive == true) { 


      let v = CGVector(dx: location.x - base.position.x, dy: location.y - base.position.y) 
      let angle = atan2(v.dy, v.dx) 
      let deg = angle * CGFloat(180/M_PI) 
      print(deg + 180) 

      let lenght:CGFloat = base.frame.size.height/2 - 20 
      let xDist: CGFloat = sin(angle - 1.57079633) * lenght 
      let yDist: CGFloat = cos(angle - 1.57079633) * lenght 

      ball.position = CGPointMake(base.position.x - xDist, base.position.y + yDist) 

      if (CGRectContainsPoint(base.frame, location)) { 

       ball.position = location 
      }else { 

       ball.position = CGPointMake(base.position.x - xDist, base.position.y + yDist) 

      } 


      } // termina stickActive 

     } 

    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if (stickActive == true) { 

      let move: SKAction = SKAction.moveTo(base.position, duration: 0.2) 
      move.timingMode = .EaseOut 

      ball.runAction(move) 

     } 
    } 

答えて

1

SKConstraintに見て - あなたは、ノードが、さらに別のノードから指定した距離よりも動くことができないという制約を設定することができます。この「他の」ノードを、プレイヤーが制限されているエリアの中心に設定します。 Sprite-Kitは遠くに行くとノードを自動的に元に戻します。移動後にノードが再描画される前に60fpsのゲームループに入っているので、あなたは奇妙な「ジャンプ」効果を得ることはありません。

https://developer.apple.com/reference/spritekit/skconstraint

資料には、ビットは、他のSKのドキュメントのいくつかに比べて不足しています。ここでは緑の四角「フォロー」指定した距離内に黄色の三角形を作ることだと例:

let distanceRange = SKRange(lowerLimit: 200, upperLimit: 400) 
let distanceConstraint = SKConstraint.distance(distanceRange, toNode: yellowTriangle) 
greenRect.constraints = [distanceConstraint] 

(保つためにSKNode(greenRect)のconstraintsプロパティが配列であるので、あなたはまた、オリエンテーション制約をしたい場合例えば、黄色の三角形が直面しているgreenRect)は、あなたがこのような何かコーディングします。

let distanceRange = SKRange(lowerLimit: 0, upperLimit: limitcircle.size/2) 
let distanceConstraint = SKConstraint.distance(distanceRange, toPoint: limitCircle.position) 
player.constraints = [distanceConstraint] 
:あなたの特定のたとえば

let orientRange = SKRange(lowerLimit: 0.0, upperLimit: 0.0) 
let orientConstraint = SKConstraint.orientToNode(yellowTriangle, offset: orientRange) 
greenRect.constraints = [orientatConstraint, distanceConstraint] 

を、あなたに制約を設定することをお勧めします

これは、プレーヤーが移動できない円が、limitcircleというSKNodeであり、そのアンカーポイントが(0.5、0.5)i、e、centerであることを前提としています。上記のコードは、円の中心の点から円の幅(すなわち半径)の0と1/2の間の距離にプレーヤを制限する。

+0

class func distance(_ range:SKRange、 to node:SKNode) - > Self //これは私が検索している機能ですが、何を追加しますか? –

+0

ありがとう、私はそれを試してみましょう –

+0

距離の制約は、ポイントからでも可能性があります。 toPoint:limitCircle.position –

関連する問題