По сути, я пытаюсь включить кнопки игровой сцены X2, которые выполняют следующие функции:
1) Тап, чтобы летать (это у меня работает) 2) Тап, чтобы выстрелить снарядом из позиции игрока (у меня не работает).
Моя проблема в том, что в настоящее время у меня установлена функция полета при касании любого места на экране. Я пробовал следующее:
Это относится к моей GameScene: я думал, что для того, чтобы разделить это, мне понадобится узел на экране для ссылки на эту функцию. Это не ошибка в консоли, но не отображается в GameScene.
// Кнопка для запуска стрельбы:
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)
Далее в классе Player у меня есть следующее:
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
}
Узел появляется в GameScene, что выглядит многообещающе, наконец, я перехожу к последнему фрагменту кода в GameScene следующим образом:
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()
}
}
К сожалению, в GameScene ничего не происходит, и узел не срабатывает при нажатии на экран, в любом случае с приведенным выше кодом я могу изменить это, чтобы разрешить обе функции «нажмите, чтобы летать» + «нажмите, чтобы стрелять». Я до сих пор не могу понять, как сделать так, чтобы кнопка, которую я объявил ранее в GameScene, отображалась, в которой моя позиция жеста / касания может быть локализована для этого узла на экране, а не для всего экрана, на котором я сейчас. .
Я могу сказать, что для начала это звучало проще в моей голове, чем кодирование вместе.