【问题标题】:How to import multiple swift games under one framework and create a main menu for them?如何在一个框架下导入多个 swift 游戏并为其创建主菜单?
【发布时间】:2017-08-02 19:17:24
【问题描述】:

我想实现一个游戏平台,并分别实现了三个 swift 游戏(通过使用单视图项目)。现在我想实现一个包含三个按钮的主菜单:游戏 A、游戏 B 和游戏 C。当用户按下按钮时,对应的游戏将开始。你能告诉我如何用更少的努力做到这一点吗?像 Java 一样,我们可以为每个项目创建一个 jar 并稍后在其他 Java 项目中调用它们。 swift中有类似的方法吗?谢谢。

【问题讨论】:

  • 明白,不管你怎么做,它仍然是应用商店中的一个应用(或捆绑ID)。
  • 我们希望它成为一个应用程序。你知道一些方法吗?
  • 如果你想在 App Store 上使用它。我建议 - 在进一步深入之前 - 调查 App Store 政策、iOS 应用沙盒和定价。我能想到的唯一方法仍然是一个应用程序或捆绑包 ID 和一个非常大的项目,其中应用程序中的每个游戏都是 IAP 或应用内购买。但说真的,在浪费大量精力和时间之前,请阅读 Apple 在其应用商店中允许的内容。还有一件事——看看那里有什么——如果你找到了你想要的一个很好的例子,找出它是如何完成的。

标签: ios swift xcode swift3 sprite-kit


【解决方案1】:

如果您拥有所有代码,请创建一个独特的项目。您应该在每个 buttonTapped 方法中创建一个 segue。为此,在 Storyboard 中创建一个 segue(从一个 VC 拖到另一个),然后单击它并为其指定一个标识符。在 buttonTapped 方法中使用 performSegueWithIdentifier("your_identifier") 就是这样。

编辑: 好的,我会尝试更具体地帮助您。要创建您想要的应用程序,您将需要同一个项目中的所有代码(全部关于三个游戏)。 因此,在 Xcode 中,您必须创建四个 viewController(三个用于游戏,另一个用于菜单)。为此,请转到您的 Main.storyboard 文件(默认情况下在创建项目时拥有它)并拖动 viewController 视图(右下)。然后,您必须为它们中的每一个创建一个自定义类(从 UIViewController 继承)。然后再次在 storyBoard 中为每个 viewController 选择自定义类(您创建的类)。

谈论segues,您可以学习如何创建它们here。 这基本上是一种在视图控制器之间移动的方式。当你创建一个你必须使用performSegueWithIdentifier("yourSegueIdentifier", sender: nil) 将该代码放在按钮的 buttonTapped 方法中(了解所有相关信息here)。

好吧,如果您有什么不明白的地方,请告诉我。祝你好运!

【讨论】:

  • 嗨。我是ios的初学者。你能告诉我更多吗?或者是否有一些关于如何做到这一点的视频或材料?谢谢!
【解决方案2】:

您可以创建一个 SpriteKit 场景作为游戏的主菜单,并使用三个不同的按钮来过渡到每个游戏场景。您可以使用 SKLabelNode 创建标题,并使用 Sprite 或 Shape Node 作为场景的按钮。

我体验过将 UIButtons 和 UILabels 添加到 SpriteKit 场景中,在定位它们的问题上会变得非常技术性。由于 UI 对象位于视图上,而不是直接位于 SpriteKit 场景上。您可以将 SKSpriteNode 用作按钮,将 SKLabelNode 用作标题,用于菜单场景。

Sprite 套件场景放置在 UIView 上,并根据您定义的缩放模式进行缩放。 Apple 的默认缩放模式 .aspectFill 不需要调整 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")
 }

如果您想要不同形状或独特形状的按钮,您可以将 ShapeNode 子类化而不是 SpriteNode 并实现相同的功能,下面是一个如何将圆形 ShapeNode 创建为按钮的示例。

     import Foundation
     import SpriteKit

     class SKShapeButton: SKShapeNode {

    init(circleOfRadius: CGFloat) {
       super.init()

    let diameter = circleOfRadius * 2.0
    self.path = CGPath(ellipseIn: CGRect(origin: CGPoint.init(x: 0.0 - circleOfRadius, y: 0.0 - circleOfRadius), size: CGSize(width: diameter, height: diameter)), transform: nil)
    self.isUserInteractionEnabled = true
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

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
}

 }

然后在你的游戏场景中创建它的一个实例。

      override func didMove(to view: SKView) {

    let shapeButton = SKShapeButton(circleOfRadius: 50)
    shapeButton.fillColor = .red

    shapeButton.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
    self.addChild(shapeButton)
     }

要过渡到您的每个游戏场景,您可以实现 Game View Controller swift 文件中的代码,该代码呈现提供的游戏场景。

      if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "GameScene") {
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFill

            // Present the scene
            view.presentScene(scene)
        }

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多