Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用spritekit swift在swift中创建游戏主菜单_Ios_Swift_Swift3_Sprite Kit_Skscene - Fatal编程技术网

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")
     }