Swift 如何添加30秒计时器来结束游戏回合?
我目前正在试验一些我在互联网上找到的关于一个游戏的代码,在这个游戏中,你必须点击一组项目,避免点击另一组。我目前正试图在游戏中添加一个计时器,使其总共持续30秒,但我真的很难做到这一点,因为我对这种编程语言非常缺乏经验Swift 如何添加30秒计时器来结束游戏回合?,swift,scenekit,Swift,Scenekit,我目前正在试验一些我在互联网上找到的关于一个游戏的代码,在这个游戏中,你必须点击一组项目,避免点击另一组。我目前正试图在游戏中添加一个计时器,使其总共持续30秒,但我真的很难做到这一点,因为我对这种编程语言非常缺乏经验 import UIKit import QuartzCore import SceneKit class GameViewController: UIViewController, SCNSceneRendererDelegate { var gameView:SCN
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,是的,如果可能的话,我想私下和你谈谈,因为我仍然没有进展。我们怎样才能私下交谈呢?让我们试着在这里解决这个问题,这样每个寻找相同解决方案的人都能很容易地找到它。无论如何,如果这太过分,系统将允许我们有私人消息