- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 SceneKit iOS 游戏设计架构。我在下面展示了两个粗略的高层我当前首选想法的对象图/图表。
我目前只关注高级架构,即管理 Menu/GameLevel/Config/Paused 应用程序状态之间的转换并使应用程序数据驱动,以便它可以处理多个级别等。一旦我开始工作,然后我将讨论较低级别的架构,例如对于 GameLevel 状态,我将有一个 GameLevelModel 对象来表示实际的游戏关卡逻辑。
很高兴听到哪个看起来更有希望,有什么明显的陷阱或要避免的事情吗?
版本 A) 基于 MVC,带有自定义容器和嵌套 VC
我试图在这个版本中保持接近 MVC 范式。
应用程序的行为在其不同状态(菜单/游戏级别/配置/等)之间发生显着变化,因此我将使用永久容器 View Controller ,该 Controller 将管理/转换多个嵌套 VC,按照 Apple 的父子关系“查看 iOS Controller 编程指南”。这些实际上是整个 MVC。
因为 Apple 的容器 Controller (UINavigation-、UISplitScreen-、UITabBar-)都不适合(我需要整个屏幕),所以我将拥有一个自定义容器 VC (RootViewController),它始终有一个嵌套的子 VC。每个子 VC 的 View 将始终完全覆盖容器的 View 。子 VC 之间的转换将由 RootVC 管理并由其 StateMachine 驱动。
每个子 VC(实际上是整个 MVC)在其对应的状态变为当前状态时创建,然后在被下一个状态替换且不再需要时释放。类似于 UINavigationController 如何处理它包含的 VC。
我对这种架构的唯一担心是它看起来有点沉重。 SceneKit 看起来像是设计用于 单 SCNView 并在我们需要更改 3D 内容时在多个 SCNScene 之间进行转换。这也提供了更多的过渡选项。
--------------------------
| RootViewController |
--------------------------
| | | | |
------------------ | | | | | ------------------
| GameLevelsData |----- | | | -------| SCNView |
------------------ | | | ------------------
------------------ | | |
| PlayerData |-------- | |
------------------ | |
| |
---------------- |
| StateMachine | |
---------------- |
| |
|-(*MenuState) |
|-(LevelState) |
|-(ConfigState) |
|
|
------------------------
| MenuViewController |
------------------------
----------------- | | ------------------
| MenuData |------ -------| MenuSCNView |
----------------- ------------------
(child VCs for other States, Level-/Config-/etc are created as needed)
|
------------------------
| LevelViewController |
------------------------
------------------ | | ------------------
| GameLevelModel |------ -------| LevelSCNView |
------------------ ------------------
touchesBegan/Moved/Ended
和
canBecomeFirstResponder
这样我就可以拦截触摸事件而不会使单个 Controller 和 View 膨胀。我的其他对象都不是 UIResponder。我还没有完全测试过这部分。
scnView.scene = scnScene
.所以这将需要我为自己的过渡设置动画。
--------------------------
| GameViewController |
--------------------------
| | | |
------------------ | | | | ------------------
| GameLevelsData |----- | | -------| SCNView |
------------------ | | ------------------
------------------ | | |
| PlayerData |-------- | |
------------------ | |
| |
---------------- |
| StateMachine | |
---------------- |
| ------------------
|-(*MenuState)--------- | MenuSCNScene |
|-(LevelState) | | ------------------
|-(ConfigState) | |
| |
-------------------- | |
| MenuTouchHandler |---| |
-------------------- |
----------------- |
| MenuData |---------
-----------------
(When entering, each state creates objects of corresponding
dedicated subclasses for its Model, TouchHandler and Scene)
| | |
-------------------- | | -------------------
| LevelTouchHandler |---| | | LevelSCNScene |
-------------------- | -------------------
------------------ |
| GameLevelModel |---------
------------------
最佳答案
我将根据 Apple 为 SceneKit 提供的示例代码的设计来解释我实际正在从事的真实游戏设计。
正如@HalMuelller 正确指出的那样,您需要将游戏逻辑提取到独立于平台的层中,即使您正在为一个平台编写游戏,这也是一个好主意,因为这将有助于您进行测试。
正如您在上面的类图中所见:
右侧是从 Game
开始的整个游戏逻辑。实际上作为场景和物理代理工作的类。这只是一个普通的旧 ObjC 或 Swift 类。Game
的主要职责之一类是搭建场景SCNScene
来自 SceneKit/Model IO 支持的文件或根据您的情况以编程方式。Game
类也指其他Model
类如 Animation
加载 3D 骨骼动画和 Player
包含球员数据的类,例如他的统计数据,Player
在这里指的是一些像棒球运动员一样的球员在比赛中。
还可以看到有PlayerEntity
由 BatterComponent
组成的类,这是基于 GamePlayKit
中的实体组件设计.现在BatterComponent
有一个 StateMachine
它处理击球手在各种状态之间的转换。
另一个重要组成部分是 BatterControlComponent
只有在用户击球时才添加到实体中。这也是一个依赖于平台的组件,因此您可以在 macOS/iOS 目标中独立编写它。同样,连击控制组件由状态机支持,因为状态机也可用于处理控制转换。此控件实现为 SpriteKit
场景作为 SCNScene
顶部的叠加层.
如果您正在投球,那么您可以使用 PitcherComponent
配置玩家实体。由另一个状态机支持,依此类推。
在类图的左侧,您可以看到 GameViewController
它设置了 SCNView
并实例化一个 Game
对象和此游戏对象的场景是您的游戏 View Controller 场景 View 呈现的内容。您还确保将场景 View 委托(delegate)设置为游戏对象。
您必须认真引用 Apple 的 SceneKit 示例代码和 GameKit 的示例。在 Apple 开发人员中,示例代码部分搜索:SceneKit
和 GameplayKit
.
总的来说,您必须使用普通的旧 Swift/ObjC 类和来自 GamePlayKit
的适当模式来设计一个独立于平台的游戏逻辑层。根据您的游戏要求。
关于生产使用的说明。见 this memory leak issue和 animation issues ,所以我不确定 SceneKit 是否已经准备好迎接黄金时段,但 Google 是你的 friend 。话虽如此,如果您已经在Apple平台上工作,SceneKit真的很棒编程。我相信 SceneKit 每年都在改进,在接下来的 2 个版本(WWDC 17、18)中,它应该是一个非常适合 Apple 平台的游戏引擎。根据我的经验,这些是我的 2 美元,YMMV。
关于architecture - SceneKit 游戏架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43081988/
目标是创建无限的棋盘图案。 使用SCNFloor和附加的图像,我们可以生成接近但不太像棋盘的东西。一些黑色正方形在不应该合并的位置合并。 我们尝试了Scale,WrapS,WrapT,Min filt
这看起来很简单,但我就是无法缩小!使用这些搜索词的所有在线内容都是关于在应用程序中编写效果的。我的问题不在应用程序中;我只想在用户界面中评估和编辑 SceneKit 场景中的所有对象,并在我可以看到整
我在这里遗漏了什么吗?在各种向量/矩阵函数中here ,我看不到任何简单地将 SCNMatrix4 变换应用于 SCNVector4 的函数。我当然可以通过直接写出矩阵/向量乘法来做到这一点,但这肯定
我试图了解 ArKit 中引入的不同元素与 SceneKit 中可能的等价物之间的区别: SCNNode.simdTransform对比 SCNNode.transform .在 ARKit 中,似乎
我已经实现了向 ARKit 和 SceneKit 场景添加阴影平面的多种方法之一。它工作得很好,阴影看起来很好。 问题是大部分时间这架飞机也有灰白色。换句话说,它不是完全透明的。另一方面,有时灰色的类
我在游戏执行过程中随机弹出以下错误: 我正在随机时刻创建 carNode 的多个实例,并且所有实例都具有从场景中删除节点的操作。大多数情况下,这不是问题,但在某些情况下,应用程序会崩溃并显示照片中的错
我正在使用 Metal 计算内核生成网格数据(目前是三角汤)。 是否可以高效(无需任何复制)将网格数据导入 SceneKit 以利用 SceneKit 的渲染器?网格数据会经常更新,因此避免数据复制非
我想使用 Metal 计算着色器来计算一些位置,然后将这些位置输入到 Metal 着色器中。听起来很简单,但我无法将 MTLBuffer 数据导入基于 Metal 的 SCNProgram。 计算内核
在 Xcode 8 中,SceneKit 编辑器 允许您在使用 SCNLightingModelPhysicallyBased 时为 metalness 属性设置浮点值。选项包括金属、电介质、浮点值或
我注意到,如果您有一个空场景,然后在其中加载具有基于物理照明的 3D 模型,则在对象出现时会出现一些卡顿。如果之后我再添加一个不同的对象,就不会发生口吃。 查看分析器,似乎默认 PBR 着色器正在第一
我有一个 SceneKit 游戏,我正在尝试将其与 GameplayKit 集成。 为了让 GameplayKit 正常工作,我需要通过调用 updateWithDeltaTime(seconds:)
我正在 iOS SceneKit 中使用 SCNMorpher 在从 Blender 导出为 DAE 文件的 3D 面部模型上的不同面部表情之间进行变形。变形本身效果很好。 在我第一次在变形器上调用
文档 states GameplayKit also works well for 3D games built with the SceneKit framework 但是,似乎没有提及使用Scen
我通过使用 Interface Builder 将 3D 文本拖到场景中创建了这个 SceneKit 文本。 它是这样创建的: 轴在左下方。有没有一种方法可以使用界面生成器使轴在该文本上居中? 最佳答
我正在尝试将 SwiftUI 路径添加到 Scenekit 场景(作为 SCNShape)。 我创建了:Scenekit View (图片 1)SwiftUI 路径(图 2) 然后我尝试根据以下方法调
我想之前一定有人问过这个问题,但我现在找不到,所以暂时先问一下。 当 SceneKit 动画停止时,SpriteKit 的动画覆盖在 SceneKit 上。这是出乎意料的。这就像整个 SCNView
如何绘制边框以突出显示 SCNNode 并向用户指示该节点已被选中? 在我的项目中,用户可以放置多个虚拟对象,用户可以随时选择任何对象。选择后,我应该向用户显示突出显示的 3D 对象。有没有办法直接实
我正在 Scenekit 中加载一个 .obj 模型。当我尝试加载像(水瓶)这样的小模型时,它工作得很好。但是当我尝试加载更大的模型(如沙发、 table )时,它加载完美,但超出了场景的边界。 在S
我正在编写一个 iOS 应用程序,它使用自定义几何体在 SceneKit 中渲染点云。 This post对我实现这一目标非常有帮助(尽管我将其翻译为 Objective-C),David Rönnq
必须使用什么 orthographicProjection 才能在 SceneKit 中以 1:1 SceneKit 点与屏幕点/像素比率制作 2D 应用程序? 例子:我想在屏幕上的 (200, 20
我是一名优秀的程序员,十分优秀!