Swift 如何添加30秒计时器来结束游戏回合?

Swift 如何添加30秒计时器来结束游戏回合?,swift,scenekit,Swift,Scenekit,我目前正在试验一些我在互联网上找到的关于一个游戏的代码,在这个游戏中,你必须点击一组项目,避免点击另一组。我目前正试图在游戏中添加一个计时器,使其总共持续30秒,但我真的很难做到这一点,因为我对这种编程语言非常缺乏经验 import UIKit import QuartzCore import SceneKit class GameViewController: UIViewController, SCNSceneRendererDelegate { var gameView:SCN

我目前正在试验一些我在互联网上找到的关于一个游戏的代码,在这个游戏中,你必须点击一组项目,避免点击另一组。我目前正试图在游戏中添加一个计时器,使其总共持续30秒,但我真的很难做到这一点,因为我对这种编程语言非常缺乏经验

import UIKit
import QuartzCore
import SceneKit

class GameViewController: UIViewController, SCNSceneRendererDelegate {

    var gameView:SCNView!
    var SceneGame:SCNScene!
    var NodeCamera:SCNNode!
    var targetCreationTime:TimeInterval = 0


    override func viewDidLoad() {
        super.viewDidLoad()

        View_in()
        initScene()
        initCamera()
    }

    func View_in(){
        gameView = self.view as! SCNView
        gameView.allowsCameraControl = true
        gameView.autoenablesDefaultLighting = true

        gameView.delegate = self
    }

    func initScene (){
        SceneGame = SCNScene()
        gameView.scene = SceneGame

        gameView.isPlaying = true

    }

    func initCamera(){
        NodeCamera = SCNNode()
        NodeCamera.camera = SCNCamera()

        NodeCamera.position = SCNVector3(x:0, y:5, z:10)

        SceneGame.rootNode.addChildNode(NodeCamera)
    }

    func createTarget(){

        let geometry:SCNGeometry = SCNPyramid( width: 1, height: 1, length: 1)

        let randomColor = arc4random_uniform(2
            ) == 0 ? UIColor.green : UIColor.red

        geometry.materials.first?.diffuse.contents = randomColor

        let geometryNode = SCNNode(geometry: geometry)
        geometryNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)


        if randomColor == UIColor.red {
            geometryNode.name = "enemy"
        }else{
            geometryNode.name = "friend"
        }


        SceneGame.rootNode.addChildNode(geometryNode)


        let randomDirection:Float = arc4random_uniform(2) == 0 ? -1.0 : 1.0

        let force = SCNVector3(x: randomDirection, y: 15, z: 0)

        geometryNode.physicsBody?.applyForce(force, at: SCNVector3(x: 0.05, y: 0.05, z: 0.05), asImpulse: true)
    }

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        if time > targetCreationTime{
            createTarget()
            targetCreationTime = time + 0.6
        }

        cleanUp()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first!

        let location = touch.location(in: gameView)

        let hitList = gameView.hitTest(location, options: nil)

        if let hitObject = hitList.first{
            let node = hitObject.node

            if node.name == "friend" {
                node.removeFromParentNode()
                self.gameView.backgroundColor = UIColor.black
            }else {
                node.removeFromParentNode()
                self.gameView.backgroundColor = UIColor.red
            }
        }
    }

    func cleanUp() {
        for node in SceneGame.rootNode.childNodes {
            if node.presentation.position.y < -2 {
                node.removeFromParentNode()
            }
        }
    }

    override var shouldAutorotate: Bool {
        return true
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }

}
导入UIKit
进口石英砂
导入SceneKit
类GameViewController:UIViewController、SCNScenerEnderDelegate{
var游戏视图:SCNView!
var SceneGame:SCNScene!
变量NodeCamera:SCNNode!
var targetCreationTime:TimeInterval=0
重写func viewDidLoad(){
super.viewDidLoad()
查看()
initScene()
initCamera()
}
func View_in(){
gameView=self.view as!SCNView
gameView.allowsCameraControl=true
gameView.autoenablesDefaultLighting=true
gameView.delegate=self
}
func initScene(){
SceneGame=SCNScene()
gameView.scene=SceneGame
gameView.isplay=true
}
func initCamera(){
NodeCamera=SCNNode()
NodeCamera.camera=SCNCamera()
NodeCamera.position=scinvector3(x:0,y:5,z:10)
SceneGame.rootNode.addChildNode(NodeCamera)
}
func createTarget(){
让几何体:SCNGeometry=SCNPyramid(宽度:1,高度:1,长度:1)
让randomColor=arc4random_均匀(2
)==0?UIColor.green:UIColor.red
几何体.materials.first?.diffuse.contents=randomColor
设geometryNode=SCNNode(几何体:几何体)
geometryNode.physicsBody=SCNPPhysisBody(类型:。动态,形状:无)
如果randomColor==UIColor.red{
geometryNode.name=“敌人”
}否则{
geometryNode.name=“朋友”
}
SceneGame.rootNode.addChildNode(geometryNode)
设随机方向:Float=arc4random_均匀(2)=0?-1.0:1.0
设力=SCconverctor3(x:randomDirection,y:15,z:0)
geometryNode.physicsBody?.applyForce(力,at:SCInvector3(x:0.05,y:0.05,z:0.05),asImpulse:true)
}
func渲染器(u渲染器:SCNSceneRenderer,updateAtime时间:TimeInterval){
如果时间>targetCreationTime{
createTarget()
targetCreationTime=时间+0.6
}
清理()
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
让我们先接触!
让位置=触摸。位置(在:游戏视图中)
让hitList=gameView.hitTest(位置,选项:nil)
如果让hitObject=hitList.first{
让节点=hitObject.node
如果node.name==“朋友”{
node.removeFromParentNode()
self.gameView.backgroundColor=UIColor.black
}否则{
node.removeFromParentNode()
self.gameView.backgroundColor=UIColor.red
}
}
}
func cleanUp(){
对于SceneGame.rootNode.childNodes中的节点{
如果节点.presentation.position.y<-2{
node.removeFromParentNode()
}
}
}
覆盖变量应自动旋转:布尔{
返回真值
}
覆盖变量prefersStatusBarHidden:Bool{
返回真值
}
覆盖var支持的接口方向:UIInterfaceOrientationTask{
如果UIDevice.current.userInterfaceIdiom==.phone{
返回。全部,但向上向下
}否则{
返回,全部
}
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//释放所有未使用的缓存数据、图像等。
}
}

您可以使用一个
计时器
对象,记录在案。当你想开始游戏时,只要设置计时器,可能在你完成所有初始化之后。设置计时器时,只需等待计时器完成后调用代码,然后运行您想要用来终止游戏的任何逻辑。

编辑

创建一个变量,表示您希望游戏结束的时间:

    var time: CGFloat = 60
然后,向场景中添加一个SCNAction,以便每秒都会减少此变量值,例如在
viewDidLoad
中:

    //One second before decrease the time
    let wait = SCNAction.wait(forDuration: 1)

    //This is the heart of this answer
   // An action that reduce the time and when it is less than 1 (it reached zero) do whatever you want

    let reduceTime = SCNAction.run{ _ in
        self.time -= 1
        if self.time < 1 {
    // Do whatever you want
    // for example show a game over scene or something else
            }
        }
    }

    SceneGame.rootNode.run(SCNAction.repeatForever(SCNAction.sequence([wait,reduceTime])))
//缩短时间前一秒
让等待=等待。等待(持续时间:1)
//这是这个答案的核心
//减少时间的操作,当时间小于1(等于零)时,执行您想要的任何操作
让reduceTime=SCNAction.run{uu}in
self.time-=1
如果self.time<1{
//你想干什么就干什么
//例如,在场景或其他内容上显示游戏
}
}
}
SceneGame.rootNode.run(SCNAction.repeatForever(SCNAction.sequence([wait,reduceTime]))
如果需要,可以在HUD上使用
SKLabel
显示剩余时间,该HUD是用作覆盖的
SKScene

您可以了解如何创建HUD


此外,您还可以使用
SCNText
,这是

嗨,我复制了SCNAction代码并将其粘贴到viewDidLoad部分,但突然出现了很多错误。你能再帮我一点忙吗。另外,“var-time:CGFloat=60”和“var-timeNode=SCNNode()”是否属于GameViewController部分?这两个变量都必须属于您的GameViewController。对于错误,我在一个操场上尝试了代码,没有问题,所以告诉我更多关于它们的信息,即使你愿意私下告诉我。另外,请检查我的编辑,你不需要鬼节点“timeNode”,你可以让你的场景根节点运行actionHi,是的,如果可能的话,我想私下和你谈谈,因为我仍然没有进展。我们怎样才能私下交谈呢?让我们试着在这里解决这个问题,这样每个寻找相同解决方案的人都能很容易地找到它。无论如何,如果这太过分,系统将允许我们有私人消息