2016-06-22 9 views
4

オブジェクトをクリックするとノードが消えてしまいます。オブジェクトは画面の周りを移動しており、画面の任意の場所をクリックすると現在オブジェクトが削除されます。しかし、私はそれがオブジェクトがクリックされたときにのみ削除されたい。次のようにオブジェクト(SKSpriteノード)をクリックすると消える方法

コードは次のとおりです。

import SpriteKit 
import GameplayKit 

struct Physics { 
    static let Enemy: UInt32 = 0x1 << 1 
    let BorderCategory : UInt32 = 0x1 << 2 
    let BottomCategory : UInt32 = 0x1 << 3 
    let BallCategory : UInt32 = 0x1 << 4 

} 

class GameScene: SKScene { 

    var Enemy = SKSpriteNode() 
    var gameStarted = Bool() 
    var gameState = "running" 
    var destX : CGFloat = 0.0 
    var destY : CGFloat = 0.0 
    var score = 0 

    override func didMove(to view: SKView) { 
     let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame) 
     borderBody.friction = 0 
     self.physicsBody = borderBody 
     Enemy.name = "Enemys" 

     Enemy = SKSpriteNode(imageNamed: "red2") 
     Enemy.size = CGSize(width: 60, height: 70) 
     Enemy.position = (CGPoint(x: self.frame.width/6 - Enemy.frame.width, y: self.frame.height/10)) 

     Enemy.physicsBody = SKPhysicsBody(circleOfRadius: Enemy.frame.height/2) 
     Enemy.physicsBody?.categoryBitMask = Physics.Enemy 
     //Enemy.physicsBody?.categoryBitMask = Physics.Ground | Physics.wall 
     //Enemy.physicsBody?.contactTestBitMask = Physics.Ground | Physics.wall 
     Enemy.physicsBody?.affectedByGravity = false 
     Enemy.physicsBody?.isDynamic = true 
     Enemy.physicsBody?.restitution = 1 
     Enemy.physicsBody?.friction = 0 
     Enemy.physicsBody?.angularDamping = 0 
     Enemy.physicsBody?.linearDamping = 0 


     self.addChild(Enemy) 
     let force = SKAction.applyForce(CGVector(dx: 300, dy: 300) , duration: 0.1) 
     Enemy.run(force) 
    } 


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first as UITouch! 
     let touchLocation = touch?.location(in: self) 
     let targetNode = atPoint(touchLocation!) as! SKSpriteNode 
     if(targetNode.name == "Enemys"){ 
     Enemy.removeFromParent() 
     } 

    } 
+0

問題はあなたのタッチは、画面上の単一の点にあるということです。この点は、スプライトの位置と正確に同じである可能性は小さいです... –

答えて

0

私は個人的にこれを処理する最も簡単な方法は、SKSpriteNodeをサブクラス化し、それがUIResponderの子孫であるという事実に掘ることであることがわかります。

class AlienSprite: SKSpriteNode { 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.removeFromParent() 
    } 
} 

またどこかのインスタンスでisUserInteractionEnabled = trueを設定する必要があります。あなたはタッチの下にあるノードを決定する必要が

0

は、SKNodeは、この程度のメソッドがあります。nodeAtPointnodesAtPoint

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first as UITouch! 
    let touchLocation = touch?.location(in: self) 
    if let hit = yourRootNode.nodeAtPoint(touchLocation) { 
     if hit.name=="Enemy" { 
     hit.removeFromParent(); 
     } 
    } 
} 
+0

この場合、私のrootnodeは何ですか?申し訳ありませんが、私は非常に迅速です。私はルートノードを 'Enemy'に設定しようとしましたが、「条件付きバインディングの初期化子にはSKNodeではなく操作型が必要です」というメッセージが表示されます – Tom

+0

SKScene?あなたの敵を含む適切な何か。 –

関連する問題