Ios 使用spritekit swift在swift中创建游戏主菜单
我对斯威夫特很陌生,有一个场景是我创造了一个游戏。然而,我似乎不知道如何构建菜单。如果看到这两种解决方案,可以创建另一个视图控制器或另一个场景,但它们都非常混乱和复杂。我愿意使用这些方法中的任何一种或任何其他方法,有人有任何技巧来解决这个问题吗。一些代码可能会有帮助。感谢您的帮助。方法: 下面提到的代码使用Ios 使用spritekit swift在swift中创建游戏主菜单,ios,swift,swift3,sprite-kit,skscene,Ios,Swift,Swift3,Sprite Kit,Skscene,我对斯威夫特很陌生,有一个场景是我创造了一个游戏。然而,我似乎不知道如何构建菜单。如果看到这两种解决方案,可以创建另一个视图控制器或另一个场景,但它们都非常混乱和复杂。我愿意使用这些方法中的任何一种或任何其他方法,有人有任何技巧来解决这个问题吗。一些代码可能会有帮助。感谢您的帮助。方法: 下面提到的代码使用UIStackview创建了两个部分。 您可以使用类似的方法 输出: 代码: 方法: 下面提到的代码使用UIStackview创建了两个部分。 您可以使用类似的方法 输出: 代码: 有很多
UIStackview
创建了两个部分。
您可以使用类似的方法
输出:
代码:
方法:
下面提到的代码使用UIStackview
创建了两个部分。
您可以使用类似的方法
输出:
代码:
有很多方法可以获得精灵套件中的菜单 通常人们绘制一些
SKLabelNode
,或SKSpriteNode
来构建菜单语音,或制作一个特定的SKNode
,构建这种结构
但是我想遵循关于StackView
的评论建议。
我们知道StackView
是一个UIKit
元素,它:
为布局视图集合提供了一个简化的界面
在列或行中
因此,我们可以构建一个包含所有菜单声音的垂直StackView
(请注意,下面的代码显示了一个简单的标签集合,您可以根据需要自定义StackView
视图):
输出:
在精灵套件中有许多方法可以获得菜单 通常人们绘制一些
SKLabelNode
,或SKSpriteNode
来构建菜单语音,或制作一个特定的SKNode
,构建这种结构
但是我想遵循关于StackView
的评论建议。
我们知道StackView
是一个UIKit
元素,它:
为布局视图集合提供了一个简化的界面
在列或行中
因此,我们可以构建一个包含所有菜单声音的垂直StackView
(请注意,下面的代码显示了一个简单的标签集合,您可以根据需要自定义StackView
视图):
输出:
我体验过在SpriteKit场景中添加UIButton和UILabels,这会带来非常技术性的定位问题。由于UI对象位于视图上,而不是直接位于SpriteKit场景上。对于菜单场景,可以使用SKSpriteNode作为按钮,使用SKLabelNode作为标题 精灵套件场景放置在UIView上,并根据您定义的缩放模式进行缩放。苹果默认缩放模式。aspectFill不需要调整精灵套件对象在不同手机设备屏幕大小上的定位 这是一个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")
}
}
您可以创建这个类的任意多个实例,为它们提供自己的功能,因为添加的初始化函数是其自身实例所独有的。不同于为类提供所需的协议方法,因为这将影响类的所有实例。我体验过将UIButtons和UILabel添加到SpriteKit场景中可能会遇到非常技术性的定位问题。由于UI对象位于视图上,而不是直接位于SpriteKit场景上。对于菜单场景,可以使用SKSpriteNode作为按钮,使用SKLabelNode作为标题 精灵套件场景放置在UIView上,并根据您定义的缩放模式进行缩放。苹果默认缩放模式。aspectFill不需要调整精灵套件对象在不同手机设备屏幕大小上的定位 这是一个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")
}
}
您可以创建这个类的任意多个实例,为它们提供自己的功能,因为添加的初始化函数是其自身实例所独有的。不同于为类提供所需的协议方法,因为这将影响类的所有实例。能否请您绘制一张希望实现的UI图。它可能只是一个带有方框的方框图。您可以使用
UIStackview
来实现这一点。当我到达计算机时,我会尝试发布代码。您可以同时阅读UIStackview
。@user1046037如何在SKSceneAm中放置堆栈视图对不起,我以前没有使用场景工具包。很好,我创建了一个复杂的解决方法。您可以用您希望实现的UI的图表来绘制吗。它可能只是一个带有方框的方框图。您可以使用UIStackview
来实现这一点。当我到达计算机时,我会尝试发布代码。您可以同时阅读有关UIStackview
。@user1046037如何在SKSceneAm中放置堆栈视图对不起,我以前没有使用场景工具包。很好,在我提出问题和得到答案之间,我创建了一个复杂的解决方法。我对我的问题进行了简单的解决。我创建了一个与场景大小相同的SKSprite节点,并将其移出“屏幕显示框”。然后每当我想叫它时,我就把它移到“屏幕显示框”里。这个解决方案有什么问题我应该知道。这不是一个很好的隐藏菜单的方法,你可以简单地更改alpha或isHidden
属性,zPosition
属性,但这不是一个错误的方法..我只是让它滑入动画,但是我担心的是它会减慢我的游戏速度。如果你的菜单上没有简单的精灵,不要担心。在我问问题和得到答案之间,我对我的问题做了一个简单的解决。我创建了一个与场景大小相同的SKSprite节点,并将其移出“屏幕显示框”。A.
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")
}
}
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")
}