2016-05-06 12 views
1

私はSpriteKitにSKNodeを持っています。これは基本的には画面の周りをドラッグできるようにしたいのですが、手で触れる必要はありません!私はどこにでも画面を押すと想像してみてください。私はそれから私の指に距離を保つために私のSKNodeを、私はそれを見ることができるように私はそれをドラッグするようにしたい。SKNodeに触れることなくドラッグアンドドロップする

私はこれを動作させていますが、オブジェクトが触れるとスナップします。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in touches{ 
     let location = touch.locationInNode(self) 

     circle.position = location 


    } 
} 


override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in touches{ 
     let location = touch.locationInNode(self) 

     circle.position = location 

    } 
} 

答えて

1
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){ 

     let touch = touches.anyObject() as UITouch! 
     let touchLocation = touch.locationInNode(self) 
     let previousLocation = touch.previousLocationInNode(self) 
     let distanceX = touchLocation.x - previousLocation.x 
     let distanceY = touchLocation.y - previousLocation.y 

     circle.position = CGPointMake(circle.position.x + distanceX, circle.position.y + distanceY) 
} 
2

それはゲーム工学の古典的な基本的な問題です。

ソリューション...


まず解決策があります。指が最初にダウンしたときに、対象物の位置からのデルタであること、「グラブ」のデルタを書き留めておきますが、 〜に、指。指が新しい位置Pに毎回移動

減算


「それはそれは簡単だ」

P.

に位置オブジェクトのを設定 前にPからデルタを「つかみます」

第2の解決策:指が移動するたびに、が動くたびに、指の位置Pをまったく気にしないでください。

代わりに、前のフレームから指が移動したの差分を計算してください。

(これを計算することができるように、毎回前の位置を保存するだけです - 一部のシステムでは、以前の位置がプロパティとして使用されるため、実際には一部のシステムでは自動的にプロパティとして自動的にデルタが与えられます)

次に、ちょうどオブジェクトをそのデルタでに移動します。

ここ

class FingerFollower: SKSpriteNode { 

    var grab: CGVector = CGVector.zero 
    // "grab" is the usual term for the delta from the object 
    // to where the finger "grabbed" it... 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

     let t: UITouch = touches.first! as UITouch 
     let l = t.location(in: parent!) 

     grab = (l - position).vector 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

     let t: UITouch = touches.first! as UITouch 
     let loc = t.location(in: parent!) 

     position = loc - grab 
    } 

    // NOTE this code uses the absolutely obvious overrides for 
    // subtraction etc between vectors, which you will need in 100% 
    // of spritekit projects (Apple forgot about them) 
} 
ここ

のiOS/SpriteKitベースで第二の溶液は、正確にiOS版/ SpriteKitベースで正確に最初のソリューションですされて "それは簡単ではということだ"

class FingerFollower: SKSpriteNode { 

    func setup() { 

     // NOTE, you MUST have a "setup" call in your sprite subclasses; 
     // apple forgot to include a "didAppear" for SKNodes 
     isUserInteractionEnabled = true 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

     // note that Apple do in fact include the "previous location" 
     // in sprite kit touches. (In systems where they don't do that, 
     // you just make a note of it each time.) 

     let prev = t.previousLocation(in: parent!) 
     let quickDelta = loc - prev 
     position = position + quickDelta 
    } 
} 
+0

注 - OPはpについて質問していました(スプライトではなく)シーンのどこにでもタッチを放つ。コードは同じです。通常、スプライトにスプライトのコードがありますので、ここでそのような例を挙げました - コピーして貼り付けることができます! :) – Fattie

関連する問題