33470


下記のようにSKSpriteNodeを作って、physicBodyを設定するとちゃんと動きます。  
（例えば、これとは別の丸いnodeを作って、下記のslopeの上に落とすと、ちゃんと接触します。）

[code]

    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)
    
[/code]

しかし、この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)  
}


CC BY-SA 3.0
2017-03-23T00:50:15.677
33468
2017-03-23T02:05:57.307
2017-03-23T02:05:57.307
17376
17376
question
swift spritekit
Spritekitで、nodeにzRotationをかけると物理的位置がずれます


おっしゃる状態が再現できません。

_ViewController.swift_

[code]

    import UIKit
    import SpriteKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let skView = view as! SKView
            let scene = GameScene(size: CGSize(width: 375.0, height: 667.0))
            scene.scaleMode = .aspectFit
            skView.presentScene(scene)
        }
    
    }
    
[/code]

_GameScene.swift_

[code]

    import UIKit
    import SpriteKit
    
    class GameScene: SKScene {
    
        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.physicsBody = SKPhysicsBody(rectangleOf: slope.frame.size)
            slope.physicsBody?.isDynamic = false
            slope.zRotation = CGFloat(10.0 * M_PI / 180.0)
            addChild(slope)
    
            let ball = SKSpriteNode(color: UIColor.red, size: CGSize(width: 32.0, height: 32.0))
            ball.physicsBody = SKPhysicsBody(rectangleOf: ball.frame.size)
            ball.physicsBody?.affectedByGravity = true
            ball.position = CGPoint(x: 90.0, y: 300.0)
            addChild(ball)
        }
    
    }
    
[/code]

ノード`ball`が円ではなく、正方形なのは、問題と直接関係ないので、容赦ください。  
上のコードをiOSシミュレータで動かしてみると、「見た目」のノード`slope`の傾斜に沿って、ノード`ball`が滑り落ちます。

> slopeオブジェクトの見た目とは少し上にphysicalな透明なオブジェクトができてしまい、  
>  slopeノードの上からボールを落とすと、見た目上のslopeノードの板に接触する前に、透明な板にぶつかって転がります。

確実にこの状態が発生するコードを、質問文を編集して、掲示してください。


CC BY-SA 3.0
2017-03-23T01:26:18.973
33470
2017-03-23T01:26:18.973
18540
33468
answer