Spriteノードがタッチされたかどうかを検出しようとしていますが、どこから始めればいいのかわかりません。
let Pineapple = SKSpriteNode(imageNamed: "Pineappleimg")
Pineapple.userInteractionEnabled = true
Pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(Pineapple)
最初に、name
のSKSpriteNode
プロパティを文字列に設定します。
pineapple.name = "pineapple"
pineapple.userInteractionEnabled = false
touchesBegan
のScene
関数で
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch:UITouch = touches.anyObject()! as UITouch
let positionInScene = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(positionInScene)
if let name = touchedNode.name
{
if name == "pineapple"
{
print("Touched")
}
}
}
これはそれを行う1つの方法です。
サブクラスSKSpriteNode
を使用して、その内部のtouchesBegan
をオーバーライドすることもできます。
class TouchableSpriteNode : SKSpriteNode
{
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
print("touched")
}
}
それから
let pineapple = TouchableSpriteNode(imageNamed: "Pineappleimg")
pineapple.userInteractionEnabled = true
pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(pineapple)
タッチできる少数のノード(たとえば、ゲームUIの「続行」または「終了」ラベル)のみを探している場合、これは代替手段ですが、非常に単純なソリューションかもしれません。
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch = touches.first!
if myNode.containsPoint(touch.locationInNode(self)) {
print("touched")
}
}
Swift Swiftバージョン.0.2(swiftlang-800.0.63 clang-800.0.42.1)およびXCodeバージョン- 8.2.1(8C1002):
タイプ 'Set'の値にはメンバー 'anyObject'がありません
'locationInNode'は 'location(in :)'に名前が変更されました
'nodeAtPoint'は 'atPoint(_ :)'に名前が変更されました
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
let node : SKNode = self.atPoint(location)
if node.name == "myNodeName" {
print("Hello")
}
}
}
これはXcode 9.2 Swift 4.でタッチを検出します
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
let touch:UITouch = touches.first!
let positionInScene = touch.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if let name = touchedNode.name
{
if name == "playLbl"
{
print("playLbl Touched")
}
}
}
SwiftSKSpriteNode
のサブクラスにタッチ機能を埋め込む回答:
class SpriteSub: SKSpriteNode {
init() {
super.init(texture: nil, color: UIColor.red, size: CGSize(width: 50, height: 50))
isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
...
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch!")
}
}
タッチの開始時に呼び出されるtouchesBegan
メソッドを実装します。または、touchesEnded
でこれを行うこともできます。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
let touch = touches.anyObject() as UITouch
let location = touch.locationInNode(self)
let nodes = self.nodesAtPoint(location)
for node in nodes
{
if node.name == "youNodeName"
{
// Node tapped
// Do something
break
}
}
}
このコードを使用して、SKSpriteNodeのタッチを検出します
if(nodeAtPoint(location) == node){
}
Swift 3.0およびXCode 7.3.1の更新。新しいクラスに派生してシーンに挿入したSKShapeNodeがあります。このオブジェクトを検出したい場合は、次のように確認します。
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
let nodes = self.nodesAtPoint(location)
for node in nodes
{
if node is SKNodeDerivedNode
{
NSLog("Touch a SKNodeDerivedNode")
break
}
}
}
}
SKSpriteNode
をサブクラス化してもなおSpriteが動作しない場合は、_node.isUserInteractionEnabled = true
_を初期化するときに追加するのを忘れている可能性があります。
これで、ノードと対話できるようになったため、touchesBegan(_:with:)
を呼び出すことができます。
例:
_node = MySprite(texture: texture, size: size)
node.isUserInteractionEnabled = true
_
これは、Swift 4で特定のタイプのノードにタッチがあるかどうかを調べるために使用する方法です。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}
let touchPosition = touch.location(in: self)
let touchedNodes = nodes(at: touchPosition)
for node in touchedNodes {
if let nodoTouched = node as? YourNodeType {
// touched!
}
}
}