我是SpriteKit和游戏开发的新手,我一直在与SpriteKit玩耍以制作战略游戏。

我的后端体系结构使用网格系统表示宇宙,我有空的情况以及带系统/行星/等的情况。
我的网格由GameplayKit GKGridGraph支持,我使用一种算法,该算法为网格的每个节点生成一个具有随机属性的节点,并将其子类化以向其添加自定义实体,该实体包含此特定Universe案例的所有属性。

要渲染它,我只需要使用具有各种颜色,形状和纹理的SKShapeNodeSKPriteNode

我枚举了GKGridGraphNode实例中的所有节点(GKGridGraph),并为每个节点生成了相应的SKNode(我的SKNode生成是每个GKGridGraphNode实体附加对象的组成部分),并设置了一个位置,并将其添加为一个孩子到我的主节点(我们称之为mapNode),这是一个简单的SKNode。最后,它看起来像一个网格。

它适用于30/30的网格,在滚动网格时我具有60 FPS(自定义实现,我在用户移动手指时修改mapNode位置)。
但是,当我尝试使用50/50或100/100网格时,实际上在屏幕上的节点太多,滚动无法正常进行。我知道我不应该在屏幕上添加每个节点,因此我考虑了各种策略,并希望在其中输入一些信息:

  • 除了滚动我的mapNode之外,我还可以只渲染在屏幕上看到的节点,然后在用户向左/向右/向上/向下滚动时添加/删除节点。因此,它不再真正滚动,而是对其进行仿真。我能想到它,但实际上却不是我应该如何实现它。这是正确的解决方案吗?
  • 也许我可以将所有节点渲染为一个大节点?有没有办法做到这一点?但是随后,我将松散使用诸如nodeAtPosition之类的函数,这些函数已广泛用于获取与我的节点关联的实体(自定义对象)。

  • 编辑:实际上,我当前的代码是开源的,这是我正在渲染的场景:https://github.com/Dimillian/LittleOrion/blob/master/Little%20Orion/Little%20Orion/scenes/UniverseScene.swift

    还有其他聪明的方法吗?

    最佳答案

    SKTileMapNode就是为此在Xcode 8中制作的
    https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps

    或者,您只想加载当前视图中及其附近的节点。您将需要一种算法来执行此操作,与平铺地图相比,这将是一个很大的麻烦。

    我怀疑该算法将涉及检查视图的.frame' and then using 'addChild' on them--concurrently, add a reference to them to an array, which you would check against next update()and removeFromParent`中的哪些节点(如果不再可见)。
    尝试优化它会很麻烦。目标是在每个端仅加载几个节点,以便您在移动摄像机时有一些缓冲(较少的更新)。

    您可以创建一个数学函数来预先确定相对于当前帧坐标而言哪些节点在哪里-因此您不必遍历这些节点-但这将需要更多的工作和繁琐的工作-并且这是在主机等上进行开发的人与高端游戏和有限功能有关的东西。

    我建议浏览一本Direct3d / DirectX / OpenGL游戏开发书,只是为了了解所有内容...不难发现:走进书店,寻找最厚/最重的书-将是DirectX游戏开发书。

    您将看到我们如何在SK中使用30行代码在C++和低级AV框架中需要数千行代码和矢量演算。它将带给您游戏开发的欣赏,理解和看法,这将有助于您的SK之旅:)

    关于ios - 使用SpriteKit渲染大网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40849031/

    10-15 20:56