2016-03-30 69 views
2

所以我正在試驗雪碧套件,以建立圓形路徑,主角可以跟隨並收集硬幣。我已經成功地定位了我的角色並使他跟隨我的循環路徑。雪碧套件:如何在圓形路徑上定位精靈

我想要實現的是以下幾點:

  • 紅球是主角[完成]
  • 白色多邊形硬幣

schema

// Adding the big circle 
let runway = SKSpriteNode(imageNamed: "runway") 
runway.position = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)) 
addChild(runway) 
// Adding the player 
player = SKSpriteNode(imageNamed: "player") 
player.position = CGPointMake(CGRectGetMidX(frame) , (CGRectGetMidY(frame) + runway.size.width/2)) 
// Calculating the initial position of the player and creating a circular path around it 
let dx = player.position.x - frame.width/2 
let dy = player.position.y - frame.height/2 

let radian = atan2(dy, dx) 
let playerPath = UIBezierPath(
    arcCenter: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)), 
    radius: (runway.frame.size.width/2) - 20, 
    startAngle: radian, 
    endAngle: radian + CGFloat(M_PI * 4.0), 
    clockwise: true) 

let follow = SKAction.followPath(playerPath.CGPath, asOffset: false, orientToPath: true, speed: 200) 
player.runAction(SKAction.repeatActionForever(follow)) 

我現在的問題是,如何將我的硬幣放在同一條路徑上? 有沒有辦法使用相同的路徑生成他們的位置,或者我應該爲每個硬幣創建一個特定的路徑,並提取路徑currentPoint每次?

有沒有更簡單的方法來解決我的問題?

感謝

+0

圖像鏈接已損壞...您可以添加如何以及在哪裏創建路徑以獲得更好的答案。但總的來說,您需要知道圓形路徑的中心在哪裏,半徑是多少。基於此,您可以輕鬆計算圓周上的點(這是您正在談論的實際路徑)。 – Whirlwind

+0

我已經用一些代碼更新了我的初始文章,希望能夠幫助其他人理解我的問題。我可以看到圖像,對我來說不會破碎。奇怪的 ?! –

+0

是的,很奇怪。我無法從設備或計算機打開它。在評論中粘貼鏈接(如果你喜歡)...更新後的代碼雖然夠用了。 – Whirlwind

回答

1

就像我說的,你需要知道哪裏是路的中心(在你的情況是CGPoint(x: frame.midX, y:frame.midY)就是屏幕的「中心」),你必須知道的半徑(你有當你正在創造的路徑已經計算),你需要的角度,從中心(frame.midX,frame.midY)對圓周(coinX,coinY)點的射線,使與X軸正:

import SpriteKit 

class GameScene: SKScene { 

    let player = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 30, height: 30)) 

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

     // Adding the big circle 
     let runway = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 150, height: 150)) 
     runway.position = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)) 
     addChild(runway) 
     // Adding the player 

     player.position = CGPointMake(CGRectGetMidX(frame) , (CGRectGetMidY(frame) + runway.size.width/2)) 
     addChild(player) 
     // Calculating the initial position of the player and creating a circular path around it 
     let dx = player.position.x - frame.width/2 
     let dy = player.position.y - frame.height/2 

     let radius = (runway.frame.size.width/2) - 20.0 

     let radian = atan2(dy, dx) 
     let playerPath = UIBezierPath(
      arcCenter: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)), 
      radius: radius, 
      startAngle: radian, 
      endAngle: radian + CGFloat(M_PI * 4.0), 
      clockwise: true) 

     let follow = SKAction.followPath(playerPath.CGPath, asOffset: false, orientToPath: true, speed: 200) 
     player.runAction(SKAction.repeatActionForever(follow)) 

     let numberOfCoins = 8 
     for i in 0...numberOfCoins { 

      let coin = SKSpriteNode(color: .yellowColor(), size: CGSize(width: 10, height: 10)) 

      let angle = 2 * M_PI/Double(numberOfCoins) * Double(i) 

      let coinX = radius * cos(CGFloat(angle)) 
      let coinY = radius * sin(CGFloat(angle)) 

      coin.position = CGPoint(x:coinX + frame.midX, y:coinY + frame.midY) 
      addChild(coin) 
     } 
    } 
} 

只是一個旁註:在Sprite的工具包0弧度的角度指定正x軸。正角度是逆時針方向。來源 - Building Your Scene

+0

謝謝你..我真的很感激它。 –

+0

「構建您的場景」的鏈接現在看起來很糟糕。謝謝! – nbloqs

+1

@nbloqs啊好吧。感謝您的指點,併爲upvote!我已經修復了這個鏈接。 – Whirlwind