触摸带有 overlayskscene 的屏幕 Scenekit 时应用程序崩溃 Xcode Swift

App Crashs on Touch of the screen Scenekit with a overlayskscene Xcode Swift

嘿,好的,在 Overlayskscene 上的场景套件 3D 游戏中识别 HUD 触摸的最佳方法是什么。因为我有一个名为 "AButton" 的按钮,但每当我触摸按钮或屏幕时,经过数小时的搜索后游戏就会崩溃,我猜问题是场景工具包上的 touchbegin 并不完全一致。但是我该怎么做才能使当用户触摸 HUD 上的按钮时它不会使系统崩溃并且它确实可以工作。你能看看我的代码并重写它吗?我是使用 touches begin 还是我们 hit test 或其他东西(我以前从未使用过 hit test)?

handleTap:]: 无法识别的选择器发送到实例 0x14d547710' *** 首先抛出调用栈: (0x1868042d8 0x1980300e4

代码:

 import iAd
 import UIKit
 import GameKit
 import SceneKit
 import StoreKit
 import SpriteKit
 import QuartzCore
 import Foundation
 import AVFoundation
 import AudioToolbox

  //============================================================
 class GameViewController: UIViewController, ADBannerViewDelegate, SKPhysicsContactDelegate, SKSceneDelegate, SCNSceneRendererDelegate, SCNPhysicsContactDelegate{


   let FieldScene = SCNScene(named: "art.scnassets/TesingCampusField.dae")!

let GuyScene = SCNScene(named: "art.scnassets/Guy.dae")!
//-------------------HUD-SetUp-------------------------------------------------------
let overlayScene = SKScene(size: CGSizeMake(100, 100))
override func viewDidLoad() {
    super.viewDidLoad()

    let scnView = self.view as! SCNView
    scnView.overlaySKScene = overlayScene
    scnView.backgroundColor = UIColor.whiteColor()
    scnView.scene = FieldScene
    scnView.delegate = self
    scnView.overlaySKScene!.delegate = self
    scnView.overlaySKScene!.anchorPoint = CGPointMake(0, 0)
    scnView.overlaySKScene!.physicsWorld.contactDelegate = self
    scnView.overlaySKScene!.physicsWorld.gravity = CGVectorMake(0.0, 0.0)
    scnView.allowsCameraControl = false
    scnView.showsStatistics = false

    let Guy1: SCNNode = GuyScene.rootNode.childNodeWithName("Bob_014", recursively: true)!
    FieldScene.rootNode.addChildNode(Guy1)

    ButtonA.size = CGSize(width: 6, height: 9)
    ButtonA.anchorPoint = CGPointMake(-13.3, -0.5)
    ButtonA.zPosition = 0
    overlayScene.addChild(ButtonA)

    let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
    scnView.addGestureRecognizer(tapGesture)
    //--------------------------
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    FieldScene.rootNode.addChildNode(cameraNode)
    cameraNode.position = SCNVector3(x: 0, y: 5, z: 15)
    //-----------------------------------------------
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = SCNLightTypeOmni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    FieldScene.rootNode.addChildNode(lightNode)
    //-----------------------------------------------
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = SCNLightTypeAmbient
    ambientLightNode.light!.color = UIColor.darkGrayColor()
    FieldScene.rootNode.addChildNode(ambientLightNode)
    //----------------------------------------------
}
    func AButtonPressed() {
    let AButtonPressed = SKTexture(imageNamed: "GreenAButtonPressed")
    let OrignalButtonA = SKTexture(imageNamed:"GreenAButton")
    let AButtonPressedAnimation = SKAction.animateWithTextures([AButtonPressed, OrignalButtonA], timePerFrame: 0.2)
    let RunAButtonPressedAnimation = SKAction.repeatAction(AButtonPressedAnimation, count: 1)
    ButtonA.runAction(RunAButtonPressedAnimation)
    print("finishedpressing")
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    /* Called when a touch begins */

    for touch: AnyObject in touches {
        let location1 = touch.locationInNode(self.overlayScene)
        if self.overlayScene.nodeAtPoint(location1) == self.ButtonA {
            AButtonPressed()
            print("AButtonPressed")
        }
    }

您的手势识别器配置为在用户点击视图时调用 handleTap: 方法,但您没有定义该方法。

func handleTap(gestureRecognizer: UITapGestureRecognizer) {
    // do something
}

如果您想直接使用touchesBegan,则不需要手势识别器。