使用overlayskscene Xcode Swift 触摸屏幕Scenekit 时应用程序崩溃 [英] App Crashs on Touch of the screen Scenekit with a overlayskscene Xcode Swift

查看:19
本文介绍了使用overlayskscene Xcode Swift 触摸屏幕Scenekit 时应用程序崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,好的,在 Overlayskscene 上的场景套件 3D 游戏中识别 HUD 触摸的最佳方法是什么.因为我有一个名为AButton"的按钮,但是当我触摸按钮或屏幕时,经过数小时的搜索游戏会崩溃,我猜问题是场景套件上的 touchbegin 不完全相处.但是,我该如何做到这一点,以便当用户触摸 HUD 上的按钮时,它不会使系统崩溃并且它实际上可以工作.你能看看我的代码并重写它吗?我是使用 touches begin 还是我们命中测试或其他什么(我以前从未使用过命中测试)?

Hey ok what is the best way to recognize touch for a HUD on a scene kit 3D game on a Overlayskscene. because i have a button called "AButton" but when ever i touch the Button or the screen the game crashes after hours of search I'm guessing the problem is the touchbegin on the scene kit don't exactly get along. But then how do i make it so that when a user touches a button on the HUD it doesn't crash the system and it actually works. can you look at my code and rewrite it. do i use touches begin or do i us hit test or something else (I never have used hit test before)?

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

handleTap:]: unrecognized selector sent to instance 0x14d547710' *** First throw call stack: (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: 方法,但您没有定义该方法.

your gesture recognizer is configured to call the handleTap: method when the user taps the view, but you don't define that method.

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

如果你想直接使用touchesBegan,那么你不需要手势识别器.

If you want to use touchesBegan directly, then you don't need the gesture recognizer.

这篇关于使用overlayskscene Xcode Swift 触摸屏幕Scenekit 时应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆