[Swift] SpriteKitで野球ゲームをつくってみる01_ override func touchesBegan(touches: NSSet, withEvent event: UIEvent)


SpritKitで野球ゲームをつくっています。

画面右下の「バッティングボタン」を押したときに赤丸を
表示させて、赤丸とボールが衝突したときにボールが
前に飛ぶということをしたいと思います。

「override func touchesBegan(touches: NSSet, withEvent event: UIEvent)」で
赤丸を実行しているのですが、ずっと「バッティングボタン」を押していると
赤丸は表示されたままになってしまいます。
どうしたら「バッティングボタン」を押しっぱなしにした時には
すぐに赤丸が消えるようになるのでしょう。。。??

import SpriteKit

class GameScene: SKScene,SKPhysicsContactDelegate {

var batter = SKSpriteNode()
var pitcher = SKSpriteNode()
var ball = SKSpriteNode()
var maru = SKSpriteNode()

var last:CFTimeInterval!

let ballCategory:       UInt32 = 0x1 << 0
let maruCategory:       UInt32 = 0x1 << 1
let pitcherCategory:    UInt32 = 0x1 << 2


override func didMoveToView(view: SKView) {

    self.physicsWorld.gravity = CGVectorMake(0.0, -2.0)
    self.physicsWorld.contactDelegate = self


    //pitcher
    var pitcherTexture = SKTexture(imageNamed: "pitcher")
    pitcherTexture.filteringMode = SKTextureFilteringMode.Nearest

    pitcher = SKSpriteNode(texture: pitcherTexture)
    pitcher.setScale(1.0)
    pitcher.position = CGPointMake(self.frame.size.width * 0.05, self.frame.size.height * 0.5 )

    pitcher.physicsBody = SKPhysicsBody(circleOfRadius: pitcher.size.height/2.0)
    pitcher.physicsBody?.dynamic = false
    pitcher.physicsBody?.allowsRotation = false
    pitcher.physicsBody?.friction = 1.0
    pitcher.physicsBody?.mass = 1000000000.0

    pitcher.physicsBody?.categoryBitMask = pitcherCategory


    self.addChild(pitcher)



    //battingbtn
    var battingbtnTexture = SKTexture(imageNamed: "batting")

    var battingbtn = SKSpriteNode(texture: battingbtnTexture)
    battingbtn.setScale(1.0)
    battingbtn.position = CGPointMake(self.size.width/2 + 100, 150)
    battingbtn.name = "maru"

    maru.physicsBody?.categoryBitMask = maruCategory
    maru.physicsBody?.collisionBitMask = ballCategory

    self.addChild(battingbtn)


}

func shoot() {


    var BallTexture = SKTexture(imageNamed: "ball")
    ball = SKSpriteNode(texture: BallTexture)
    ball.position = CGPointMake(self.pitcher.position.x + 50, self.pitcher.position.y )

    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2.0)
    ball.physicsBody?.mass = 100.0
    ball.physicsBody?.affectedByGravity = false
    ball.physicsBody?.dynamic = true
    self .addChild(ball)

    ball.physicsBody?.applyImpulse(CGVectorMake(150000, 0))
    ball.physicsBody?.restitution = 1.5
    ball.physicsBody?.categoryBitMask = ballCategory
    ball.physicsBody?.contactTestBitMask = maruCategory
}

func hit() {

    var maruTexture = SKTexture(imageNamed: "maru")
    maru = SKSpriteNode(texture: maruTexture)
    maru.position = CGPointMake(self.size.width/2 + 400, self.pitcher.position.y  )
    maru.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(maruTexture.size().width, maruTexture.size().height))
    maru.physicsBody?.dynamic = false
    maru.physicsBody?.allowsRotation = false

    self .addChild(maru)

}


override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        if nodeAtPoint(location).name == "shoot" {
            shoot()
        }

    }

    for touch: AnyObject in touches {

        let location = touch.locationInNode(self)

        if nodeAtPoint(location).name == "maru" {
                  println("maru")
            hit()
        }
    }
}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    maru.removeFromParent()

}

override func update(currentTime: CFTimeInterval) {

    if !(last != nil) {
        last = currentTime
    }

    if last + 1 <= currentTime {

        self.shoot()

        last = currentTime
    }


}



func dakyu(){
    ball.runAction(SKAction .moveTo(CGPointMake(100,600), duration:0.5))

}


func didBeginContact(contact: SKPhysicsContact!) {

    var firstBody, secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if firstBody.categoryBitMask & ballCategory != 0 &&
        secondBody.categoryBitMask & maruCategory != 0 {
            secondBody.node?.removeFromParent()
            dakyu()

    }

}

}