SpriteKit Gesture

I am wondering if anyone may be able to help advise how I can change the following code, essentially I am trying to incorporate X2 gamescene buttons that do the following func:


1) Tap to fly (This I have working)

2) Tap to shoot a projectile from Player position (I do not have working).



My problem is I currently have the fly func set when touched anywhere on the screen.. I have tried the following :

This is in reference to my GameScene : I thought in order to split this out I would need a node on the screen to reference this function. This does not error in the console but does not appear in the GameScene.




In GameScene, I have declared a button within didmove func:


// Button to trigger shooting node from player:


  let btnTest = SKSpriteNode(imageNamed: "Crater")
btnTest.setScale(0.2)
btnTest.name = "Button"
btnTest.zPosition = 10
btnTest.position = CGPoint(x: 100, y: 200)
self.addChild(btnTest)

2. In the Playerclass I have the following,


var shooting = false


var shootAnimation = SKAction()

var noshootAnimation = SKAction()


Init func:


self.run(noshootAnimation, withKey: "noshootAnimation")


let projectile = SKSpriteNode(imageNamed: "Crater")

projectile.position = CGPoint (x: 100, y: 50)

projectile.zPosition = 20

projectile.name = "projectile"

// Assigning categories to Game objects:

self.physicsBody?.categoryBitMask =

PhysicsCategory.plane.rawValue

self.physicsBody?.contactTestBitMask =

PhysicsCategory.ground.rawValue

self.physicsBody?.collisionBitMask =

PhysicsCategory.ground.rawValue

self.physicsBody?.applyImpulse(CGVector(dx: 300, dy: 0))

self.addChild(projectile)



// Start the shoot animation, set shooting to true:

func startShooting() {


self.removeAction(forKey: "noshootAnimation")

self.shooting = true


}

// Stop the shoot animation, set shooting to false:

func stopShooting() {


self.removeAction(forKey: "shootAnimation")

self.shooting = false

}



// This node appears in the gamescene alongside the player : 🙂




Finally back to the GameScene I have :


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

for touch in (touches) {

let location = touch.location(in: self)

let nodeTouched = atPoint(location)

if let gameSprite = nodeTouched as? GameSprite {

gameSprite.onTap()

}


// Check the HUD buttons which I have appearing when game is over…

if nodeTouched.name == "restartGame" {

// Transition to a new version of the GameScene

// To restart the Game

self.view?.presentScene(GameScene(size: self.size), transition: .crossFade(withDuration: 0.6))

}

else if nodeTouched.name == "returnToMenu"{

// Transition to the main menu scene

self.view?.presentScene(MenuScene(size: self.size), transition: . crossFade(withDuration: 0.6))

}

}

Player.startFly()

player.startShooting()

}


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

Player.stopFly()

player.stopShooting()

}


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

Player.stopFly()

player.stopShooting()

}


override func update(_ currentTime: TimeInterval) {

player.update()

}

}




Unfortunately nothing happens in the GameScene and the node doesn’t fire when the screen is pressed, with the code above is there anyway I can amend this to allow for both ‘tap to fly’ + ‘tap to shoot’ functions. I still can’t figure out how to get the button I had declared early on in the GameScene to appear in which my gesture / touch position can be localised to this node on the screen as oppose to the whole screen in which I have currently..


I can say this sounded more simple in my head to begin with than actually coding together… having a nightmare..

Please can anyone help advise where I can correct this code?

Thanks again!

Tom


---