再次触摸时如何删除scnplane? [英] How to remove scnplane when touching again?

查看:15
本文介绍了再次触摸时如何删除scnplane?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当用户点击平面时,我可以添加新的 scnplane.但是现在,点击同一个 scnplane 它会再次添加新的 scnplane 而不是删除.

I can able to add new scnplane when user tap on plane. But now, tap on same scnplane it adds again new scnplane instead of removing.

最初检测到参考图像时,它会在菜单卡的侧面列出蛋糕,其中包含图像、名称和评级.用户点击评级,它会列出用户评级.

Initially when reference image is detected , It will list cake in side of menu card with image, name and ratings. And user tap on rating, it will list user ratings.

这是我试过的代码:

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

    //1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
    guard let currentTouchLocation = touches.first?.location(in: self.sceneView),
        let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node else { return }


    if let lableName = hitTestNode.name {
        print("touch working")
        if lableName == "lableNode"{


            makeCakeOnNode(hitTestNode)



        } else if lableName == "AllLabelNode" {

            makeCakeOnNode1(hitTestNode)

        } else if lableName == "fruitNode" {

            makeCakeOnNode2(hitTestNode)

        }

    }
}


func makeCakeOnNode(_ node: SCNNode){

    let planeGeometry = SCNPlane(width: 0.18  , height: 0.15)

    planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0)




    planeNode0 = SCNNode(geometry: planeGeometry)
    planeNode0?.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))

                    let overlayNode = self.getNode(withImageName: "menu")
                    print("overlay::\(overlayNode)")

    let newPlane = SCNPlane(width: 0.15, height: 0.10)
    newPlane.firstMaterial?.diffuse.contents = UIImage(named: "cake_detail")

    let newPlaneNode = SCNNode(geometry: newPlane)
    newPlaneNode.eulerAngles.x = -.pi / 2
    newPlaneNode.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))

    node.addChildNode(planeNode0!)
    planeNode0?.addChildNode(overlayNode)
    planeNode0?.addChildNode(newPlaneNode)
    if planeBool == true {

        planeNode1?.isHidden = true
        planeNode2?.isHidden = true
        planeNode0?.isHidden = false
        planeBool = false

    } else {

        print("plane removed")
        planeNode0?.isHidden = true
        planeNode1?.isHidden = true
        planeNode2?.isHidden = true

        planeBool = true
    }


}

推荐答案

您可以使用的一种方法是为您添加的每个节点创建一个全局变量,例如:

One approach you can use, is to create a global variable for each of the nodes you are adding e.g:

 var labelNode: SCNNode?
 var allLabelNode: SCNNode?
 var fruitNode: SCNNode?

然后你可以进行一个测试,看看它们是否是nil.如果节点是 nil,则创建它,否则将其删除,例如:

Then you can perform a test to see if they are nil. If the node is nil, then create it, else remove it e.g:

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

    //1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
    guard let currentTouchLocation = touches.first?.location(in: self. self.sceneView),
        let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node
        else { return }

    //2. Enumerate The Nodes We Have By Name
    switch hitTestNode.name {
    case "lableNode":

        //1. If The LabelNode Doesnt Exist Create It
        if labelNode == nil{
            //Create The Node Here
        }else{
           labelNode?.removeFromParentNode()
           labelNode = nil
        }

    case "AllLabelNode":

        //2. If The LabelNode Doesnt Exist Create It
        if allLabelNode == nil{
            //Create The Node Here
        }else{
            allLabelNode?.removeFromParentNode()
            allLabelNode = nil
        }

    case "fruitNode":

        //3. If The LabelNode Doesnt Exist Create It
        if fruitNode == nil{
            //Create The Node Here
        }else{
            fruitNode?.removeFromParentNode()
            fruitNode = nil
        }

    default:
        return
    }

}

请注意,Touches 方法可能应该重构,但它应该足以为您指明正确的方向......

Please note that the Touches method should probably be refactored, but it should be more than enough to point you in the right direction...

这篇关于再次触摸时如何删除scnplane?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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