2017-02-08 10 views
2

ここで新しいコーダーはオブジェクトをドラッグ/スローするコードを作ったので、画面の一部だけがタッチ用に使用できるようにする方法を知りたかった画面の下半分に触れることができます。これは私のgamesceneコードです。私はSwift 2.0を使用しています。Spritekitビューの特定の領域でタッチを無効にする

import SpriteKit 

var sprite = SKSpriteNode!() 
var touchPoint: CGPoint = CGPoint() 

var touching: Bool = false 
class GameScene: SKScene { 
override func didMoveToView(view: SKView) { 

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    sprite = SKSpriteNode(imageNamed: "Bottle") 
    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) 
    sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) 
    self.addChild(sprite) 
    self.physicsWorld.gravity = CGVectorMake(0.0, -4.9) 

} 

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

    let touch = touches.first as UITouch! 
    let location = touch.locationInNode(self) 
    let sprite = StarNode.star(touch.locationInNode(self)) 
    touchPoint = location 
    touching = true 
    } 

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

    let touch = touches.first as UITouch! 
    let location = touch.locationInNode(self) 
    touchPoint = location 

} 

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

    touching = false 

} 

override func update(currentTime: CFTimeInterval) { 
    if touching { 
     let dt:CGFloat = 1.0/5.0 
     let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy:  touchPoint.y-sprite.position.y) 
     let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt) 
     sprite.physicsBody!.velocity=velocity 
    } 
} 

}

答えて

1

あなたは、画面の上半分にタッチを無視するように聞こえます。もしそうなら、あなたはとても似touchesBegantouchesMovedにチェックを追加することができます。

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

    let touch = touches.first as UITouch! 
    let location = touch.locationInNode(self) 

    guard location.y < self.frame.midY else { 
     return 
    } 

    let sprite = StarNode.star(touch.locationInNode(self)) 
    touchPoint = location 
    touching = true 
} 

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

    let touch = touches.first as UITouch! 
    let location = touch.locationInNode(self) 

    guard location.y < self.frame.midY else { 
     // You might want set touching to false here, depends on the rest of your code 
     return 
    } 


    touchPoint = location 
} 

新しいコードは、私は起源がであると仮定すると、タッチのY位置がシーンの半分以下の高さであることを確認を追加しました左下。チェックが失敗した場合は、関数が終了します。コードを追加して、そこでのタッチ操作を取り消すことができます。 あなたは、画面の特定の部分はアンタッチャブルになりたい場合は、あなたがCGRectを作り、タッチ位置は例えば、矩形の外に常にあることを確認できます。

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

    let touch = touches.first as UITouch! 
    let location = touch.locationInNode(self) 
    let untouchableArea = CGRect(x: 100, y: 100, width: 200, height: 150) 

    guard !untouchableArea.contains(location) else { 
     return 
    }  
    // Could do something similar in touchesMoved to guard against moving into the untouchable area 
} 
+0

ありがとうございます!しかし私には別の問題があります。私はそれがオブジェクトがタッチ対応領域から無効にドラッグされたときに、あなたがまだ触っていてもそれ自体で解放するようにしたいと思います。私はこれについてどうやって行くのですか?現在、押さえ続けると、オブジェクトは境界にとどまり、解放された場合にのみ落ちます。 – shadokyr

+0

@shadokyrあなたのコードを見ると、あなたが 'touchesEnded'関数で同じコードを呼びたいと思うと思います。これは、オブジェクトが無効領域にドラッグされたときに' touching = false'です。だから、 'touchesMoved:'の 'guard'文の' return'の前の行に、 'touching = false'を置いてみましょう。これは、指を持ち上げるのと同じ振る舞いを引き起こすはずです。 – nanothread59

+0

それは働いて、ありがとう! – shadokyr

0

アレッサンドロオルナーノの応答が動作します - 分析タッチの位置。

もう1つの方法は、「タッチブロッカー」を使用することです。 SpriteKitは一番上のタッチのみを登録するので、UIColor.clearカラーを使用するSKSpriteNodeを配置し、isUserInteractionEnabledをtrueに設定し、z位置を他のタッチ可能なコンテンツよりも高く設定します。これは、透明な領域を "食べる"ようにします。

(これは、開発中に、開発中に完全にはっきりしない透明な色を与えるため、影響を受ける領域と、スプライトがブロック領域の上にくっついているかどうかを確認できます。 )

これは、機能が簡単になり、機能をオンまたはオフにしたり、影響を受けやすい領域を簡単に変更できるという利点があります。しかし、それはまた、アレッサンドロのアプローチとはいくつかの違いがあります。例えば、その領域に上がると思われるドラッグをブロックしません。ドラッグがタッチブロッカーの領域外に設定されると、タッチブロッカーの領域上に指をドラッグしても、ドラッグされたイベントが引き続き受信されます。どちらの方法でも動作します。あなたは、あなたの特定のニーズに最も適したものを選ぶだけです。

+0

引用してくれてありがとうございましたが、答えは@ nanothread59でした –

関連する問題