我是新来的swift,并且有一个SKScene,我在其中创建了一个游戏。我似乎无法弄清楚,但是如何构建菜单。如果看到两种解决方案创建另一个视图控制器或另一个SKScene,但它们都非常混乱和复杂。我愿意使用这些方法或任何其他方法,是否有人有任何技巧来解决这个问题。一些代码会有帮助。谢谢您的帮助。使用spritekit swift创建游戏的主菜单
回答
有很多种方法获得雪碧套件的菜单。
通常人们会画一些SKLabelNode
或SKSpriteNode
来建立菜单声音或制作一个构建这种结构的特定SKNode
。
但是我想对关于StackView
的评论提出建议。 我们知道StackView
是UIKit
元素:
提供了铺设的意见 在任一列或行集合的简化的界面。
因此,我们可以建立一个垂直StackView
包含所有菜单的声音(PS下面的代码显示标签的简单集合,你可以根据需要自定义StackView
观点):
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
}
}
}
输出:
方法:
下面提到的代码使用UIStackview
创建2个部分。 你可以使用类似的方法。
输出:
代码:
class ViewController: UIViewController {
private let baseSection = UIStackView()
private let section1 = UIStackView()
private let titleLabel = UILabel()
private let button1 = UIButton(type: .custom)
private let button2 = UIButton(type: .custom)
private let button3 = UIButton(type: .custom)
//MARK: Load view
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
//MARK: Setup views
private func setupViews() {
setupBaseSection()
setupTitleLabel()
setupButton1()
setupSection1()
setupButton2()
setupButton3()
}
private func setupTitleLabel() {
titleLabel.text = "Swirl"
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
titleLabel.textColor = #colorLiteral(red: 0.8156862745, green: 0.9137254902, blue: 0.1647058824, alpha: 1)
baseSection.addArrangedSubview(titleLabel)
}
private func setupButton1() {
button1.backgroundColor = #colorLiteral(red: 0.9098039216, green: 0.168627451, blue: 0.3921568627, alpha: 1)
baseSection.addArrangedSubview(button1)
button1.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.2).isActive = true
button1.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
private func setupButton2() {
button2.backgroundColor = #colorLiteral(red: 0.8156862745, green: 0.9137254902, blue: 0.1647058824, alpha: 1)
section1.addArrangedSubview(button2)
button2.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.1).isActive = true
button2.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
private func setupButton3() {
button3.backgroundColor = #colorLiteral(red: 0.8156862745, green: 0.9137254902, blue: 0.1647058824, alpha: 1)
section1.addArrangedSubview(button3)
button3.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.2).isActive = true
button3.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
//MARKL Set up stack views
private func setupBaseSection() {
baseSection.axis = .vertical
baseSection.distribution = .fill
baseSection.alignment = .center
baseSection.spacing = 10
baseSection.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(baseSection)
baseSection.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
baseSection.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
baseSection.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
private func setupSection1() {
section1.axis = .horizontal
section1.distribution = .equalSpacing
section1.alignment = .fill
section1.spacing = 20
baseSection.addArrangedSubview(section1)
}
}
谢谢,但我需要代码才能使它在SKScene中工作 – joshLor
为什么它必须是SSKcene?难道它不是一个单独的视图控制器作为场景上的叠加层吗?视图控制器不需要覆盖整个屏幕,甚至可以是屏幕的一部分。 – user1046037
这是真的,但我需要知道如何从视图控制器更改为SKScene – joshLor
我经历过将UIButtons和UILabels添加到SpriteKit场景可以获得非常技术性的定位问题。由于UI对象位于视图上,而不是直接位于SpriteKit场景中。您可以将SKSpriteNode用作按钮,将SKLabelNode用作标题,用于菜单场景。
Sprite工具包场景放置在UIView上,并根据您定义的缩放模式进行缩放。苹果默认缩放模式.aspectFill不需要调整位于不同Phone设备屏幕尺寸上的Sprite套件对象。
这是一个SKSpriteNode的自定义类,它具有与按钮相同的功能。
import Foundation
import SpriteKit
class ButtonLabelNode : SKSpriteNode {
let buttonPressed:() ->()
init(texture: SKTexture?, color: UIColor, size: CGSize, text: String, buttonPressed: @escaping() ->()) {
self.buttonPressed = buttonPressed
super.init(texture: texture, color: color, size: size)
let label = SKLabelNode(fontNamed: "Futura")
label.fontSize = 50
label.fontColor = SKColor.red
label.position = CGPoint.init(x: 0.0, y: 0.0)
label.zPosition = 1
label.verticalAlignmentMode = .center
label.text = text
self.addChild(label)
self.isUserInteractionEnabled = true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.alpha = 0.8
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
self.alpha = 1.0
buttonPressed()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当SpriteNode上的触摸开始时,alpha减少到0.8并回到1。0作为触摸结束,赋予其与UIButton相同的视觉效果。在被覆盖的函数'touchesEnded'中,每次按下该按钮时都会调用该函数,该函数被添加到初始化程序中,并且可以在游戏场景中初始化。
override func didMove(to view: SKView) {
let labelNode = LabelNode(texture: nil, color: .white, size: CGSize.init(width: 200, height: 100), text: "Play", buttonPressed: playButton)
labelNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
self.addChild(labelNode)
}
func playButton()
{
print("play")
}
只要你喜欢你可以让这个类的多个实例,让他们自己的功能添加的初始化函数是独一无二的自己的实例。与为类提供所需的协议方法不同,因为这会影响类的所有实例。
- 1. Swift 2游戏主菜单
- 2. 如何在xcode中使用swift创建spritekit游戏的主菜单?
- 3. 使用Spritekit设置游戏菜单
- 4. 游戏主菜单
- 5. SpriteKit中的游戏菜单系统
- 6. Swift SpriteKit游戏中心
- 7. 游戏的主菜单
- 8. 如何为简单的js游戏创建游戏菜单?
- 9. 对OpenGL游戏主菜单
- 10. 主谋游戏的主菜单
- 11. 为2D游戏创建菜单JavaFX
- 12. Xcode4:如何为游戏创建菜单?
- 13. 创建安卓游戏菜单
- 14. 如何使用swift在SpriteKit游戏中创建“分享到Facebook按钮”?
- 15. 在游戏SWIFT的主菜单上加载高分XCODE
- 16. Qt创建游戏主机
- 17. 使用Tkinter为我的游戏创建菜单
- 18. 在SpriteKit游戏中使用didBeginContact的正确方法 - Swift
- 19. 在Android中使用addContentView创建游戏菜单
- 20. Flash游戏 - 返回主菜单
- 21. 主菜单到游戏转换
- 22. SpriteKit游戏逻辑
- 23. Spritekit游戏设计
- 24. 使用Swift在Spritekit游戏中实现iAd
- 25. Android游戏菜单
- 26. Swift游戏在创建spritenodes时落后
- 27. SpriteKit游戏:移动游戏查看
- 28. 使用游戏杆或游戏手柄来遍历scene2d菜单
- 29. 使用SpriteKit滚动游戏场景
- 30. iOS中的游戏菜单
可以请您画一张您希望实现的用户界面图。它可能只是框中的框图。 – user1046037
你可以使用'UIStackview'来实现这一点。当我到达计算机时,会尝试并发布代码。在此期间您可以阅读有关“UIStackview”的内容。 – user1046037
@ user1046037我该如何在SKScene中放置一个堆栈视图 – joshLor