ios - 使用 spritekit swift 在 swift 中创建游戏主菜单

标签 ios swift swift3 sprite-kit skscene

我是 swift 的新手,并且有一个 SKScene,我在其中创建了一个游戏。但是,我似乎无法弄清楚如何构建菜单。如果看到创建另一个 View Controller 或另一个 SKScene 的两种解决方案,但它们都非常困惑和复杂。我愿意使用这些方法或任何其他方法,有没有人有解决这个问题的技巧。一些代码会有所帮助。感谢您的帮助。

最佳答案

Sprite-Kit 中有很多方法可以获取菜单。

通常人们会绘制一些SKLabelNode,或者SKSpriteNode来构建菜单声音,或者制作一个特定的SKNode来构建这种结构。

但我想听从有关 StackView 评论的建议。 我们知道 StackView 是一个 UIKit 元素:

Provides a streamlined interface for laying out a collection of views in either a column or a row.

因此,我们可以构建一个包含所有菜单声音的垂直 StackView(附:下面的代码显示了一个简单的标签集合,您可以自定义您的 StackView View 你希望):

import SpriteKit
import UIKit
protocol StackViewDelegate: class {
    func didTapOnView(at index: Int)
}
class GameMenuView: UIStackView {
    weak var delegate: StackViewDelegate?
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.axis = .vertical
        self.distribution = .fillEqually
        self.alignment = .fill
        self.spacing = 5
        self.isUserInteractionEnabled = true
        //set up a label
        for i in 1...5 {
            let label = UILabel()
            label.text = "Menu voice \(i)"
            label.textColor = UIColor.white
            label.backgroundColor = UIColor.blue
            label.textAlignment = .center
            label.tag = i
            self.addArrangedSubview(label)
        }
        configureTapGestures()
    }
    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    private func configureTapGestures() {
        arrangedSubviews.forEach { view in
            view.isUserInteractionEnabled = true
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapOnView))
            view.addGestureRecognizer(tapGesture)
        }
    }
    func didTapOnView(_ gestureRecognizer: UIGestureRecognizer) {
        if let index = arrangedSubviews.index(of: gestureRecognizer.view!) {
            delegate?.didTapOnView(at: index)
        }
    }
}
class GameScene: SKScene, StackViewDelegate {
    var gameMenuView = GameMenuView()
    private var label : SKLabelNode?
    override func didMove(to view: SKView) {
        self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
        if let label = self.label {
            label.alpha = 0.0
            label.run(SKAction.fadeIn(withDuration: 2.0))
        }
        // Menu setup with stackView
        gameMenuView.frame=CGRect(x:20,y:50,width:280,height:200)
        view.addSubview(gameMenuView)
        gameMenuView.delegate = self
    }
    func didTapOnView(at index: Int) {
        switch index {
        case 0: print("tapped voice 1")
        case 1: print("tapped voice 2")
        case 2: print("tapped voice 3")
        case 3: print("tapped voice 4")
        case 4: print("tapped voice 5")
        default:break
        }
    }
}

输出:

enter image description here

enter image description here

关于ios - 使用 spritekit swift 在 swift 中创建游戏主菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755518/

相关文章:

ios - NSTimer 计时器WithTimeInterval 不调用选择器(Swift)

ios - 检查枚举中是否存在值

swift - 如何将通用序列参数约束为 Swift 3 中的元组?

ios - 如何保持 ios 模拟器应用程序文档路径相同,不要更改每个运行的 xcode 项目

ios - 如何在 XCode7 iOS9 中断言 TextView 值?

ios - Xcode 4 图标问题!

ios - SceneKit 中的多个串行动画

objective-c - Objective-C : Issue in calculating height of individual labels

ios - Error Domain=NSCocoaErrorDomain Code=3840 在Swift5中解析JsonString时

ios - 如何通过 UITableViewCell 打开 URL