Ios 如何在屏幕上注册点击以重新启动游戏

Ios 如何在屏幕上注册点击以重新启动游戏,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我需要的所有东西都在下面注释,我有一个功能,当我点击它时,游戏应该重新启动。重启功能可以自行工作,但我只希望在用户点击屏幕后重启。如果你需要对代码的某些部分做一些澄清,只需在下面进行评论。请你告诉我我做错了什么,谢谢 import SpriteKit import GameplayKit class GameScene: SKScene { var ball = SKSpriteNode() var enemy = SKSpriteNode() var main =

我需要的所有东西都在下面注释,我有一个功能,当我点击它时,游戏应该重新启动。重启功能可以自行工作,但我只希望在用户点击屏幕后重启。如果你需要对代码的某些部分做一些澄清,只需在下面进行评论。请你告诉我我做错了什么,谢谢

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    var ball = SKSpriteNode()
    var enemy = SKSpriteNode()
    var main = SKSpriteNode()

    var topLbl = SKLabelNode()
    var btmLbl = SKLabelNode()

    var score = [Int]()

    func pauseGame() { // PAUSE GAME FUCTION
        self.isPaused = true
        self.physicsWorld.speed = 0
        self.speed = 0.0
        self.scene?.view?.isPaused = true
    }

    func test(gestureRecognizer: UITapGestureRecognizer) { // MY FUNC TO RESTART THE GAME
        let skView = self.view!
        skView.presentScene(scene)
    }

    override func didMove(to view: SKView) {

        topLbl = self.childNode(withName: "topLabel") as! SKLabelNode
        btmLbl = self.childNode(withName: "btmLabel") as! SKLabelNode
        ball = self.childNode(withName: "ball") as! SKSpriteNode

        print(self.view?.bounds.height)

        enemy = self.childNode(withName: "enemy") as! SKSpriteNode
        enemy.position.y = (self.frame.height / 2) - 50

        main = self.childNode(withName: "main") as! SKSpriteNode
        main.position.y = (-self.frame.height / 2) + 50

        let border  = SKPhysicsBody(edgeLoopFrom: self.frame)

        border.friction = 0
        border.restitution = 1

        self.physicsBody = border

        startGame()
    }

    func startGame() {
        score = [0,0]
        topLbl.text = "\(score[1])"
        btmLbl.text = "\(score[0])"
        ball.physicsBody?.applyImpulse(CGVector(dx: 10 , dy: 10))
    }

    func addScore(playerWhoWon : SKSpriteNode){

        ball.position = CGPoint(x: 0, y: 0)
        ball.physicsBody?.velocity = CGVector(dx: 0, dy: 0)

        if playerWhoWon == main {
            score[0] += 1
            ball.physicsBody?.applyImpulse(CGVector(dx: 10, dy: 10))   
        }
        else if playerWhoWon == enemy {
            score[1] += 1
            ball.physicsBody?.applyImpulse(CGVector(dx: -10, dy: -10))
        }

        if score[0] >= 10 {
            pauseGame()
            test() // HERE'S WHERE I TRY AND CALL THE FUNCTION, BUT IT's NOT WORKING     
        }
        else if
            score [1] >= 10 {
            pauseGame()
            test() // HERE'S WHERE I TRY AND CALL THE FUNCTION, BUT IT's NOT WORKING AGAIN
        }

        topLbl.text = "\(score[1])"
        btmLbl.text = "\(score[0])"
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
        for touch in touches {
            let location = touch.location(in: self)

            if currentGameType == .player2 {
                if location.y > 0 {
                    enemy.run(SKAction.moveTo(x: location.x, duration: 0.2))
                }
                if location.y < 0 {  
                    main.run(SKAction.moveTo(x: location.x, duration: 0.2))  
                } 
            }
            else {
                main.run(SKAction.moveTo(x: location.x, duration: 0.2))
            } 
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)

            if currentGameType == .player2 {
                if location.y > 0 {
                    enemy.run(SKAction.moveTo(x: location.x, duration: 0.2))
                }
                if location.y < 0 { 
                    main.run(SKAction.moveTo(x: location.x, duration: 0.2))   
                }
            }
            else{
                main.run(SKAction.moveTo(x: location.x, duration: 0.2))
            }  
        }
    }

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered

        switch currentGameType {
        case .easy:
            enemy.run(SKAction.moveTo(x: ball.position.x, duration: 1.3))
            break
        case .medium:
            enemy.run(SKAction.moveTo(x: ball.position.x, duration: 1.0))
            break
        case .hard:
            enemy.run(SKAction.moveTo(x: ball.position.x, duration: 0.7))
            break
        case .player2: 
            break
        }

        if ball.position.y <= main.position.y - 30 {
            addScore(playerWhoWon: enemy)
        }
        else if ball.position.y >= enemy.position.y + 30 {
            addScore(playerWhoWon: main)
        }
    }
}
导入SpriteKit
导入游戏工具包
类游戏场景:SKScene{
var ball=SKSpriteNode()
var敌人=SKSpriteNode()
var main=SKSpriteNode()
var topLbl=SKLabelNode()
var btmLbl=SKLabelNode()
变量得分=[Int]()
函数pauseGame(){//暂停游戏函数
self.isPaused=true
self.physicsWorld.speed=0
自身速度=0.0
self.scene?.view?.isPaused=true
}
func测试(GestureRecognitizer:UITapGestureRecognitizer){//MY func重新启动游戏
让skView=self.view!
skView.presentScene(场景)
}
覆盖func didMove(到视图:SKView){
topLbl=self.childNode(名称为:“topLabel”)为!SKLabelNode
btmLbl=self.childNode(名称为:“btmLabel”)as!SKLabelNode
ball=self.childNode(名称为“ball”)as!SKSpriteNode
打印(self.view?.bounds.height)
敌方=self.childNode(名称为:“敌方”)作为!SKSpriteNode
敌方.position.y=(self.frame.height/2)-50
main=self.childNode(名称为“main”)作为!SKSpriteNode
主位置y=(-self.frame.height/2)+50
let border=SKPhysicsBody(edgeLoopFrom:self.frame)
边界摩擦力=0
border.restoration=1
self.physicsBody=边框
startGame()
}
func startGame(){
分数=[0,0]
topLbl.text=“\(分数[1])”
btmLbl.text=“\(分数[0])”
ball.physicsBody?applyImpulse(CGVector(dx:10,dy:10))
}
func addScore(玩家指南:SKSpriteNode){
ball.position=CGPoint(x:0,y:0)
ball.physicsBody?速度=CGVector(dx:0,dy:0)
如果playerHowon==main{
分数[0]+=1
ball.physicsBody?applyImpulse(CGVector(dx:10,dy:10))
}
否则,如果playerHowon==敌人{
分数[1]+=1
ball.physicsBody?applyImpulse(CGVector(dx:-10,dy:-10))
}
如果分数[0]>=10{
pauseGame()
test()//在这里我尝试调用该函数,但它不起作用
}
否则如果
分数[1]>=10{
pauseGame()
test()//在这里,我尝试调用该函数,但它不再工作
}
topLbl.text=“\(分数[1])”
btmLbl.text=“\(分数[0])”
}
覆盖func touchesStart(touchs:Set,带有事件:UIEvent?{
接触{
让位置=触摸。位置(in:self)
如果currentGameType==.player2{
如果location.y>0{
敌人。奔跑(SKAction.moveTo(x:location.x,持续时间:0.2))
}
如果位置.y<0{
main.run(SKAction.moveTo(x:location.x,duration:0.2))
} 
}
否则{
main.run(SKAction.moveTo(x:location.x,duration:0.2))
} 
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果currentGameType==.player2{
如果location.y>0{
敌人。奔跑(SKAction.moveTo(x:location.x,持续时间:0.2))
}
如果位置.y<0{
main.run(SKAction.moveTo(x:location.x,duration:0.2))
}
}
否则{
main.run(SKAction.moveTo(x:location.x,duration:0.2))
}  
}
}
覆盖函数更新(uCurrentTime:TimeInterval){
//在渲染每个帧之前调用
开关电流游戏类型{
案例。简单:
敌人。奔跑(SKAction。moveTo(x:球。位置。x,持续时间:1.3))
打破
案例.中等:
敌人。奔跑(SKAction.moveTo(x:ball.position.x,持续时间:1.0))
打破
案例.硬:
敌人。奔跑(SKAction。moveTo(x:球。位置。x,持续时间:0.7))
打破
案例2:
打破
}
如果ball.position.y=敌方.position.y+30{
addScore(playerHowoon:main)
}
}
}

跳过手势识别器


如果游戏没有进行,只需从
touchesend
调用重启代码。

据我所知,
SKScene
符合
UIResponder
协议,因为您使用的是
touchesbeated
touchesMoved
方法。该协议还具有
touchesend(Set,with:UIEvent?
方法。 基本上,您需要添加以下内容:

override func touchesEnded(Set<UITouch>, with: UIEvent?)
{
    let skView = self.view!
    skView.presentScene(scene)
}

我该怎么做?正如我应该修改什么代码一样,我是一个相对的初学者。我不建议使用这种方法,这是一种廉价的快速解决方案,如果你决定在游戏中添加其他触摸功能,那么你最终会付出更多的努力。手势识别器很可能是goSorry的最佳方式,但这完全是胡说八道。这是世卫组织推荐的SKScene.@T.BenjaminLarsen中处理触摸的推荐方法?Sprite套件中没有“推荐”的触摸方式。当您想与示例/演示应用程序创建快速交互时,当您准备继续处理更高级的输入处理时,您可以使用touchesend,因为代码可能会很快变得杂乱无章。好的,推荐的可能有点夸张,但是SKScene文档特别提到了实现触摸处理的响应器方法。添加Tapz
weak var tapGesture : UITapGestureRecognizer!
override func didMoveToView(view: SKView) {
    tapGesture  = UITapGestureRecognizer(target:self,action:#selector(self.handleTap:)
    view.addGestureRecognizer(tapGesture )
}
func handleTap(sender:UITapGestureRecognizer){
    //restartLogic here
}
deinit{
    view.removeGestureRecognizer(tapGesture)
}