总的来说,我是 SpriteKit 和游戏开发的新手,我一直在玩弄 SpriteKit 来制作一款以太空为背景的策略游戏。
我的后端架构使用网格系统来表示宇宙,我有空案例和系统/行星/等案例...
我的网格由 GameplayKit GKGridGraph 支持,我使用一种算法为网格的每个节点生成一个具有随机属性的节点,并将其子类化以向其添加一个自定义实体,该实体的所有属性特定的宇宙案例。
要渲染它,我只需使用具有各种颜色、形状和纹理的 SKShapeNode 和 SKPriteNode 。
我在我的 GKGridGraph 实例中枚举所有节点 (GKGridGraphNode ),并为每个节点生成相应的 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
还有其他聪明的方法吗?
Best Answer-推荐答案 strong>
SKTileMapNode 在 Xcode 8 中就是为此而制作的
https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps
或者,您只想加载当前 View 中和附近的节点。你需要一个算法来做到这一点,与瓷砖 map 相比,这将是一个大麻烦。
我怀疑算法会涉及检查 View 的 .frame' 中的哪些节点,然后在它们上使用 'addChild' —— 同时,将它们的引用添加到数组中,然后检查下一个 update()and removeFromParent` 如果它们不再可见..
但是,尝试优化它会变得很麻烦。目标是在每一端只加载几个节点,这样你就可以在移动相机时有一些缓冲(更少的更新)。
您可以创建一个数学函数来预先确定哪些节点相对于当前帧坐标的位置——因此您不必遍历节点——但这需要更多的工作和头痛——这就是人们在游戏机等上开发的东西,与高端游戏和有限的能力有关。
我建议浏览 Direct3d/DirectX/OpenGL 游戏开发书籍,以了解所有内容...它们并不难找到:走进书店,寻找最厚/最重的书-- 那将是 DirectX 游戏开发书。
您将看到我们如何使用 SK 中的 30 行代码来完成需要数千行代码以及 C++ 和低级 AV 框架中的向量演算。它会让你对游戏开发有一个欣赏、理解和视角,这将有助于你的 SK 之旅
关于ios - 使用 SpriteKit 渲染一个大网格,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/40849031/
|