Spritekitで、nodeにzRotationをかけると物理的位置がずれます
下記のようにSKSpriteNodeを作って、physicBodyを設定するとちゃんと動きます。
(例えば、これとは別の丸いnodeを作って、下記のslopeの上に落とすと、ちゃんと接触します。)
let slope = SKSpriteNode(color: UIColor.yellow, size: CGSize(width: 100, height: 10))
slope.position = CGPoint(x: 0, y: 100)
slope.physicsBody = SKPhysicsBody(rectangleOf: slope.frame.size)
slope.physicsBody?.isDynamic = false
self.scene?.addChild(slope)
しかし、このslopeノードを斜めにしようとして、
slope.zRotation = CGFloat(10.0 * M_PI / 180.0)
を追加して実行すると、
slopeオブジェクトの見た目とは少し上にphysicalな透明なオブジェクトができてしまい、
slopeノードの上からボールを落とすと、見た目上のslopeノードの板に接触する前に、透明な板にぶつかって転がります。
zRotationを使うと、このようなずれが生じるものなのでしょうか?
今回やりたいことは、斜めの板を作って、上からボールを落とすと板の表面を転がる、ということですが、どのようにすればできるか教えてください。
解決しました。下記のように、zRotationを「physicsBodyの設定の前」に記述していたのが不具合の原因でした。
回答者様のコード例のように、physicsBodyを設定した後でzRotationの設定記述することで、問題なく動作しました。ありがとうございました。
不具合のコード例:
override func didMove(to view: SKView) {
backgroundColor = UIColor.blue
let slope = SKSpriteNode(color: UIColor.yellow, size: CGSize(width: 100, height: 10))
slope.position = CGPoint(x: 50.0, y: 100)
slope.zRotation = CGFloat(10.0 * M_PI / 180.0) //ここで記述したら不具合でした
slope.physicsBody = SKPhysicsBody(rectangleOf: slope.frame.size)
slope.physicsBody?.isDynamic = false
addChild(slope)
}