使用SpriteKit / Views和ViewController显示级别

时间:2016-02-17 04:31:55

标签: swift sprite-kit swift2

我正在Swift中制作游戏,并希望允许用户选择一个关卡(点按它)来播放该特定关卡。每个级别都是屏幕上的一个框,其中包含级别编号。因此,如果该区域有20个级别,您将在屏幕上看到20个框,其中包含级别#和名称以及您获得的星号数。我对这方面的最佳方法感到困惑。我看到两种方式:

  1. 您创建了一个拥有UICollectionView的viewcontroller,并将其作为数据源提供给它,并在那里处理on tap事件。当你点击它时,我可以对相应的游戏场景(SKScene)做一个presentScene来处理正常的游戏绘图。

  2. 我使用for ..循环直接将级别渲染为屏幕上的SKSpriteNodes(级别框)并执行addChild并设置每个精灵的位置。因为我可以有20个级别,所以我每行绘制约5个,因为我的猜测是适合我试过的仿真器的大多数设备。似乎我正在重新创建UICollectionView自动执行的操作,而且最重要的是我需要做一些技巧,如定位和偏移等。

  3. 现在我正在做上面的方法#2,因为看起来大多数Swift游戏教程都不使用故事板或视图控制器,而只是专注于使用SKScenes构建所有内容并拥有一个视图控制器,其工作就是出现一个场景。据我所知,我走向了这个方向。

    这里的正确方法是什么?

    谢谢!

1 个答案:

答案 0 :(得分:1)

您的任何一种方法都可以使用,但您必须确定最适合特定方案的方法,因此“正确的方法”取决于您。六个月前我有同样的问题,到目前为止,以下解决方案对我来说完美无缺:

在SKScene中使用SKSpriteNodes的好处

我发现您可以编写一个自定义SKNode子类,我将其命名为SpriteKitButton,其中包含自定义代码和动画,使SKSpriteNode行为像UIButton一样用于{{1} },它允许您在按下时添加更好看的动画等。

我主要更喜欢这种方法,因为自定义精灵按钮与UIButton一样容易初始化,并且会加载相应的SpriteKit加载它们并随之消失。

这使我只能使用SKScene,而不必处理加载SKScenesUIViewControllers以及加载UIViews

因此,您只需要调用SKScenes来改变场景,并且您将拥有行动的精灵,感觉就像是按钮。

这是一个让你入门的提示:

1)创建一个新的swift文件并添加以下内容:

self.view?.presentScene...

2)在SKScene中创建一个新按钮,如下所示:

import SpriteKit

class SpriteKitButton: SKNode {

    var button: SKSpriteNode!
    var buttonUnpressedTexture: SKTexture!
    var buttonPressedTexture: SKTexture!
    var action: (String) -> Void

    init(buttonUnpressedImage: String, buttonPressedImage: String, buttonAction: (String) -> Void) {

        //Initialize your button here
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    }
}

使用 let artboardButton = SpriteKitButton(buttonUnpressedImage: "artboardButtonUnpressed.png", buttonAction: openArtboard) artboardButton.position = CGPoint(x: ..., y: ...) artboardButton.zPosition = 0.0 artboardButton.userInteractionEnabled = true self.addChild(artboardButton) //Add a function to handle what to do when the button is pressed func openArtboard() { } 子类内部的各种touches方法来处理触摸时按钮要执行的操作。如何处理按钮处理时的操作完全取决于您。

您也可以使用SKNode循环一次加载20个左右的按钮。

请务必将for中的按钮设为nil。