我是SpriteKit和游戏开发的新手,我一直在玩SpriteKit来制作太空战略游戏。
我的后端架构使用网格系统来表示宇宙,我有空案例和系统/行星/等等...
我的网格由GameplayKit GKGridGraph
支持,我使用一种算法为网格的每个节点生成一个具有随机属性的节点,我将其子类化为其添加一个自定义实体,该特定Universe案例的所有属性。
要渲染它,我只需使用SKShapeNode
和SKPriteNode
各种颜色,形状和纹理。
我枚举了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
还有其他聪明的方法吗?
答案 0 :(得分:2)
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
更新()and
removeFromParent`中的哪些节点,如果它们不再可见的话。
尽管如此,尝试优化它会变得毛茸茸。目标是在每一端只加载几个节点,这样你在移动相机时就会有一些缓冲(更少的更新)。
您可以创建一个数学函数来预先确定哪些节点与当前帧坐标相关 - 这样您就不必遍历节点 - 但这需要更多的工作和头痛 - 这是人们在游戏机上开发的东西,与高端游戏和有限的力量有关。
我建议浏览一下Direct3d / DirectX / OpenGL游戏开发书,只是为了了解一切内容......他们不难发现:走进书店,寻找最厚/最重的书 - 这将是DirectX游戏开发书。
您将看到我们如何使用SK中的30行可以在C ++和低级AV框架中使用数千行和向量计算。它将为您提供游戏开发的欣赏,理解和观点,这将有助于您的SK旅程:)