2017-07-15 21 views
1

SpriteKitでは、ユーザーが回転させるホイールのように、スプライトを軸(たとえば、スプライトの中心を通る軸)に沿って回転させる必要があります。軸に沿ってスプライトを回転する

私はapplyTorque機能を使用しようとしましたが(角張っているだけで線形ではない力を加えるために)、私は画面上の異なる動きによって引き起こされる異なる力を扱うことができません適用する)。

この問題をどのように処理するかを教えてもらえますか?

+0

あなたは「別の動きによって引き起こされる異なる力を扱うことにより、何を意味していますo画面? – Fluidity

+0

申し訳ありませんが、私はこれを意味します:あなたが押すとスワイプするとホイールから始めて回転させる必要があります。スワイプが長い場合、ユーザは大きなスピンを持ちたいと考えているのに対し、スワイプが短い場合は、少しスピンしたいと思う。この2つの状況を区別し、これに基づいてトルクを適用する方法が必要です。 – ThugMazzola

+0

私はこれを行う方法を知っています。 'UIPanGestureRecognizer'(またはtouchesMovedやFriendと似た独自のものを実装する)だけで、認識オブジェクトの' .velocity'をチェックし、それに基づいてトルクを適用するだけです。私はあなたが今日はないかもしれないが、私の答えを更新することができます。 – Fluidity

答えて

0

あなたは右/左スワイプどのくらいの速に応じてボールを回転させるの答えです:

class GameScene: SKScene { 

    let speedLabel = SKLabelNode(text: "Speed: 0") 
    let wheel  = SKShapeNode(circleOfRadius: 25) 

    var recognizer: UIPanGestureRecognizer! 

    func pan(recognizer: UIPanGestureRecognizer) { 
    let velocity = recognizer.velocity(in: view!).x 

    // Play with this value until if feels right to you. 
    let adjustor = CGFloat(60) 

    let speed = velocity/adjustor 
    wheel.physicsBody!.angularVelocity = -speed 
    } 

    // Scene setup: 
    override func didMove(to view: SKView) { 
    removeAllChildren() 

    physicsBody = SKPhysicsBody(edgeLoopFrom: frame) 

    wheel.fillColor = .blue 
    wheel.physicsBody = SKPhysicsBody(circleOfRadius: 25) 
    wheel.physicsBody!.affectedByGravity = false 
    let wheelDot = SKSpriteNode(color: .gray, size: CGSize(width: 5, height:5)) 
    wheel.addChild(wheelDot) 
    wheelDot.position.y += 20 
    wheel.setScale(3) 

    speedLabel.setScale(3) 
    speedLabel.position.y = (frame.maxY - speedLabel.frame.size.height/2) - 45 

    recognizer = UIPanGestureRecognizer(target: self, action: #selector(pan)) 
    view.addGestureRecognizer(recognizer) 

    addChild(wheel) 
    addChild(speedLabel) 
    } 

    override func didSimulatePhysics() { 
    speedLabel.text = "Speed: \(abs(Int(wheel.physicsBody!.angularVelocity)))" 
    } 
} 
+0

素晴らしい!それはまさに私が必要なものです! – ThugMazzola

0

ここでは、画面の左右を押すかどうかによって時計回りまたは反時計回りにホイールを回転させる基本的な例を示します。速度を上げるためにホールド:ここ

class GameScene : SKScene { 

    enum Direction { case left, right } 

    var directionToMove: Direction? 

    let wheel = SKShapeNode(circleOfRadius: 25) 
    let speedLabel = SKLabelNode(text: "Speed: 0") 

    override func didMove(to view: SKView) { 
    // Scene setup: 
    anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    removeAllChildren() 

    physicsBody = SKPhysicsBody(edgeLoopFrom: frame) 

    wheel.fillColor = .blue 
    wheel.physicsBody = SKPhysicsBody(circleOfRadius: 25) 
    wheel.physicsBody!.affectedByGravity = false 
    let wheelDot = SKSpriteNode(color: .gray, size: CGSize(width: 5, height:5)) 
    wheel.addChild(wheelDot) 
    wheelDot.position.y += 20 
    wheel.setScale(3) 


    speedLabel.setScale(3) 
    speedLabel.position.y = (frame.maxY - speedLabel.frame.size.height/2) - 45 

    addChild(wheel) 
    addChild(speedLabel) 
    } 

    // Change this to touchesBegan for iOS: 
    override func mouseDown(with event: NSEvent) { 
    // Change this to touches.first!.location(in: self) for iOS. 
    let location = event.location(in: self) 

    // Determine if touch left or right side: 
    if location.x > 0 { 
    directionToMove = .right 
    } 
    else if location.x < 0 { 
     directionToMove = .left 
    } 
    } 

    override func mouseUp(with event: NSEvent) { 
    // Stop applying gas: 
    directionToMove = nil 
    print("lol") 
    } 

    override func update(_ currentTime: TimeInterval) { 
    // This is how much speed we gain each frame: 
    let torque = CGFloat(0.01) 

    guard let direction = directionToMove else { return } 

    // Apply torque in the proper direction 
    switch direction { 
    case .left: 
     wheel.physicsBody!.applyTorque(torque) 
    case .right: 
     wheel.physicsBody!.applyTorque(-torque) 
    } 
    } 

    override func didSimulatePhysics() { 
    // Speedometer: 
    speedLabel.text = "Speed: \(abs(Int(wheel.physicsBody!.angularVelocity)))" 
    } 
} 
+0

これは良い出発点です!この場合、iOSではキャンバスが(0,0)から始まるため、左方向は決して呼び出されません。しかし、私は車輪に適用されているさまざまな力を処理する方法が必要です – ThugMazzola

+0

アンカーポイントを0.5 0.5に設定してください申し訳ありません私はsksファイルを持っていました@ThugMazzola – Fluidity

関連する問題