2017-11-27 15 views
-1

私は、ユーザーがタップすると、プレーヤーの周りに8つの弾丸を(45°の間隔で)発動させ、それらを外側スクリーン。弾丸を円の外側に発射させる

弾丸の発射元の円は正しいものの、画面の左下の弾丸は右上の弾丸よりも速く動いているようです。また、弾丸は横向きで、外向きではありません。

func fireSpecialWeapon() { 

    stride(from: 0, to: 2 * CGFloat.pi, by: 2 * CGFloat.pi/10).forEach { angle in 
     let bullet = SKSpriteNode(imageNamed: "bulletCircle") 
     bullet.setScale(3) 
     bullet.zRotation = angle 
     bullet.position = player.position 
     bullet.zPosition = 2 
     //move outwards to the edge of the screen 
     let distance: CGFloat = 2000 
     let endPoint = CGPoint(x: distance * cos(angle), y: distance * sin(angle)) 
     let move = SKAction.move(to: endPoint, duration: 2) 

     self.addChild(bullet) 
     bullet.run(move) 
    } 
} 
+1

あなたのコードは何をしていますか?あなたはそれがうまくいくかどうかは言わなかった。あなたはそれが難しいと言っただけです。 – Fogmeister

答えて

1

角度に基づいてエンドポイントを特定するには、trigを使用する必要があります。 distance * sinはy成分、distance * cosはx成分です。コードは次のようになります。

stride(from: 0, to: 2 * CGFloat.pi, by: 2 * CGFloat.pi/8).forEach { angle in 
    let bullet = SKSpriteNode(imageNamed: "bulletCircle") 
    bullet.setScale(3) 
    bullet.zRotation = angle 
    bullet.position = player.position 
    bullet.zPosition = 2 
    //move outwards to the edge of the screen 
    let distance: CGFloat = 500 
    let endPoint = CGPoint(x: distance * cos(angle), y: distance * sin(angle)) 
    let move = SKAction.move(to: endPoint, duration: 2) 

    self.addChild(bullet) 
    bullet.run(move) 
} 
+0

ご協力いただきありがとうございます。私はコードを変更し、何がうまくいかないか説明しようとしました。 –

0

私が気づいた最初のことは、回転計算が正しくないことです。

最初に、各弾丸の回転は、その近傍からのπ/ 4でなければなりません。

pi/Iではなく、(pi/4) * Iを使用しないでください。

ローテーションを修正する必要がありますが、それが機能していないことがすべてわからない場合は、

+0

この場合、 'moveBy'は動作しません。弾丸が垂直にのみ動く(すなわち、0°と180°で産卵する弾丸)場合、Xに対して500を移動するように指示すると、それらを横に移動させます。 –

+0

@JackRichards私は99%が弾丸ノードのスペースで移動し、親スペースではないと確信しています。弾丸ノードは回転しているので、その空間も回転しています。 xだけ移動させると、実際にはxを回転させて前方に移動します。確認する必要があります。 Brb – Fogmeister

+0

@JackRichardsああ。あなたは正しい...笑! – Fogmeister

関連する問題