You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SpriteKit游戏层中创建暂停菜单的技术实现咨询

在SpriteKit中实现悬浮式顶部暂停菜单

看起来你已经迈出了第一步——识别暂停按钮的触摸事件,接下来我帮你完善整个实现,让你能在暂停时显示顶部按钮,同时保留游戏场景的可见性:

核心思路

为了让暂停菜单不遮挡游戏场景的查看,同时保证菜单按钮可交互,我们需要分离游戏元素和UI元素:把所有游戏内容放到一个单独的节点里,暂停时只暂停这个游戏节点,而菜单按钮所在的层级保持活跃。

完整实现代码

首先在你的场景类里添加必要的属性:

// 存放所有游戏元素的容器节点,用于单独暂停
private let gameNode = SKNode()
// 暂停菜单按钮的引用,方便后续移除
private var continueButton: SKSpriteNode?
private var quitButton: SKSpriteNode?
// 标记游戏是否处于暂停状态
private var isGamePaused = false

接着在didMove(to view: SKView)里初始化游戏节点和暂停按钮:

override func didMove(to view: SKView) {
    // 将游戏节点添加到场景
    addChild(gameNode)
    
    // 这里把你的游戏元素(玩家、敌人、道具等)都添加到gameNode中
    // 示例:gameNode.addChild(playerNode)
    
    // 创建并添加暂停按钮到场景(如果还没添加的话)
    let pauseButton = SKSpriteNode(imageNamed: "pause")
    pauseButton.name = "pause"
    // 把暂停按钮放在右上角,可根据需求调整位置
    pauseButton.position = CGPoint(x: view.bounds.width - 50, y: view.bounds.height - 50)
    pauseButton.zPosition = 10
    addChild(pauseButton)
}

然后写显示和隐藏暂停菜单的方法:

// 显示顶部暂停菜单按钮
private func showPauseMenu() {
    // 创建继续按钮
    continueButton = SKSpriteNode(imageNamed: "button_continue")
    continueButton?.name = "button_continue"
    // 调整到顶部左侧,和第二个按钮保持间距
    continueButton?.position = CGPoint(x: frame.midX - 100, y: frame.maxY - 80)
    continueButton?.zPosition = 20 // 确保在游戏元素上方
    addChild(continueButton!)
    
    // 创建第二个按钮(这里以退出按钮为例,你可以换成其他功能按钮)
    quitButton = SKSpriteNode(imageNamed: "button_quit")
    quitButton?.name = "button_quit"
    quitButton?.position = CGPoint(x: frame.midX + 100, y: frame.maxY - 80)
    quitButton?.zPosition = 20
    addChild(quitButton!)
}

// 隐藏并移除暂停菜单按钮
private func hidePauseMenu() {
    continueButton?.removeFromParent()
    quitButton?.removeFromParent()
    continueButton = nil
    quitButton = nil
}

最后完善触摸事件处理逻辑:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }
    let location = touch.location(in: self)
    let tappedNode = atPoint(location)
    
    switch tappedNode.name {
    case "pause":
        if !isGamePaused {
            // 只暂停游戏节点,菜单按钮仍可交互
            gameNode.isPaused = true
            isGamePaused = true
            showPauseMenu()
        }
    case "button_continue":
        // 给按钮添加点击反馈动画(可选,提升体验)
        tappedNode.run(SKAction.sequence([
            SKAction.scale(to: 0.9, duration: 0.1),
            SKAction.scale(to: 1.0, duration: 0.1)
        ]))
        // 恢复游戏
        gameNode.isPaused = false
        isGamePaused = false
        hidePauseMenu()
    case "button_quit":
        // 按钮点击反馈
        tappedNode.run(SKAction.sequence([
            SKAction.scale(to: 0.9, duration: 0.1),
            SKAction.scale(to: 1.0, duration: 0.1)
        ]))
        // 处理退出逻辑,比如返回主菜单
        gameNode.isPaused = false
        isGamePaused = false
        hidePauseMenu()
        // 示例:切换到主菜单场景
        // let mainMenu = MainMenuScene(size: self.size)
        // self.view?.presentScene(mainMenu, transition: SKTransition.fade(withDuration: 0.5))
    default:
        // 游戏未暂停时,处理游戏内的其他触摸事件
        if !isGamePaused {
            // 你的游戏触摸逻辑写在这里
        }
    }
}

关键注意点

  • 不要直接设置self.isPaused = true,否则整个场景的所有节点都会停止响应触摸,包括暂停菜单按钮。
  • 确保菜单按钮的zPosition值比游戏元素高,这样按钮会显示在游戏场景的上方。
  • 可以给按钮添加点击动画,让交互反馈更明显,提升玩家体验。

内容的提问来源于stack exchange,提问作者user5673573

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:07:32