问题标签 [gameplay-kit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - GKGoal 避免边界障碍
我似乎很难将我的精灵节点保持在我通过以下方式设置的地图边界内:
我有一个由 iOS 9提供的按目标和行为SKNode *enemy
移动的。当前节点徘徊,并避开定义对象的障碍物。我设置了我的位掩码,以便任何障碍物都被视为类别wall,节点被告知与之碰撞(AKA 不允许通过)。SKScene
GameplayKit
GKPolygonObstacle
在我的didBeginContact:(SKPhysicsContact *)contact
我正在处理这些碰撞。一切都按计划进行,手动移动这个敌人时没有问题。
但是SKGoal *wanderGoal
,当我让敌人通过一个设置在场景中徘徊时,问题就开始了
敌人按预期随机移动,并且似乎大部分时间都避开了障碍物……但有时敌人确实穿过了地图障碍物。让我扩展一下:
地图屏障本质上是一个矩形,我设置了 2 个节点,它们充当外壳,代表这个形状的左半部分和右半部分。这些节点的厚度为 100 点,因此它们不仅仅是CGPath
参考,而是形状。它们就像这两个括号一样起作用:[](我的两半在中间是齐平的)。
我的问题是这样的:
- 如何使用带有位掩码类别的物理或目标行为来防止敌人穿过这些障碍?(或两者一起)
我知道虽然 aGKGoal
是建议的行为,但它并不能保证能够达到这个目标(但它可以有约 95% 的把握,它不会像Apple 的 AgentsCatalog所示的那样发生)。但是,我不明白的是,为什么敌人不会像目标告诉它(试图)“通过”这样的边界那样简单地沿着边界的边缘“滑行”。
当我在场景中手动移动敌人时,确实会发生这种“滑动”行为,并且当我试图将其移动通过被视为障碍物的边界时,它会向我让它移动的方向滑动(就像任何视频游戏一样有地图边界)。
所以
如果有人可以帮助我防止这种情况发生/解释如何防止敌人穿过这些(据说)“无法通行”的区域,我将不胜感激。
仅供参考:如果您不清楚我所描述的内容/我如何创建任何对象,请询问,我将提供更多信息以提供帮助。
ios - xcode 8 beta 4 中的 GKBehaviour 让 gkagent 的位置变得疯狂
所以我正在创建一个游戏,我想GKGoal
为我的GKAgent
行为添加一些内容。
所以经过几个小时的战斗,我这次从 Apple Agents Catalog下载了下一个项目,并且在 Xcode 7.3 中它可以工作。我将它重写为 Swift 并创建基本的 GKAgent,GKGoal(toWander:)
这是我的代码:
当我添加到场景中
没有行为的位置是静态的,但是当我添加它时,位置变得疯狂,并且在每次更新迭代中,值就像
- 位置 == (-10051366.0, 251672512.0)
- 位置 == (1368370.0, 259904576.0)
- 位置 == (-131583.0, 264841120.0)
它只是一个 Xcode 8 beta 错误,还是我做错了什么。我花了很多时间试图解决它。谢谢:)
swift - 选择如何在 ECS 中的组件之间拆分功能
我目前正在构建一个游戏,我想使用Gameplaykit来组织元素。
我发现了 ECS(实体组件系统)的概念,它可以将功能放入小块(称为组件)中,然后可以将其添加到实体中以赋予其功能。
我想将它与SpriteKit结合使用,我的第一个想法当然是创建一个SpriteComponent,但由于我也在使用SpriteKit的物理引擎,我想知道我应该如何制作PhysicsBodyComponent,因为这个组件可以工作将需要直接访问我的 SpriteKit 节点的物理主体,因此它将依赖于 SpriteComponent,但组件相互依赖不是错误的吗?
我该怎么做?
谢谢你。
swift - 游戏中一个 ViewController 的多个场景
我在一个场景文件(mygamescene.swift)中设置了一种游戏(特定谜题)的机制。我想以两种不同的方式(使用不同的节点纹理等)对同一个游戏进行不同的风格化,并在游戏中以不同的方式显示它们,并让它们可以从主屏幕访问。
我不清楚如何设置 MyGameViewController 以使用相同的游戏机制以不同方式呈现游戏场景。通常它是这样的:
在这里做的最好的事情是什么?我是否完全设置了两个不同的游戏场景,然后在单独的文件中子类化游戏机制(并且两个游戏场景都使用它)?如何根据菜单中选择的内容以不同方式呈现每个场景?
swift - 升级到 swift3 时,出现错误“无法覆盖 GKEntity 类型的属性”
更新到 swift3 后,注释行返回错误:Property 'entity' with type 'GKEntity!' (又名“ImplicitlyUnwrappedOptional”)不能覆盖类型为“GKEntity?”的属性
在升级之前它运行良好。知道什么是错的以及如何解决这个问题吗?
ios - presentScene 导致加载错误的视图
我有一个名为 NeighborhoodViewController 的 viewController。它将一个名为 NeighborhoodScene.sks 的场景加载到 viewController 中。这绝对没问题。我已经通过 NeighborhoodViewController 从场景中的特定节点装配了一个 segue。这两个函数控制这个:
这一切都很好。正在调用 segue。segue 是为了调出另一个名为 SearchViewController 的 VC,它应该调出自己的场景 SearchScene1.sks。
这是代码:
如果我打印出 skView 的恢复标识符,它与 SearchViewController 中的视图有关,这是完美的。在 skView.presentScene(chosenScene) 之前,这一切似乎都运行良好,此时它似乎正在随机设置 NeighborhoodViewController?如何让它调用 SearchViewController 和相关的 sks 场景——SearchScene1?
gameplay-kit - GamePlayKit GKObstacleGraph 保存和加载
GKObstacleGraph 可以保存到文件并从那里加载吗?我在这方面找不到任何东西。
我很想为我的关卡保存和加载预先计算的图表。
到目前为止我已经尝试过
但这就是我得到的:
-[GKObstacleGraph encodeWithCoder:]:无法识别的选择器发送到实例 0x6180000432d0
sprite-kit - GKScene 和 SKNode.entity
我一直在为 Xcode 8 和新的场景编辑器更新 SpriteKit/GameplayKit 项目,它允许将实体组件信息添加到场景中。我一直在将我的实体代码移动到场景中,但是我无法从相应的节点访问实体。根据 Apple 的文档:
场景中您附加了一个实体或组件的任何 SpriteKit 节点都会自动拥有一个 GKSKNodeComponent 对象来管理节点与其所代表的 GKEntity 对象之间的关系。
和
将 GKSKNodeComponent 对象添加到实体会自动更新组件的 SpriteKit 节点(SKNode 对象)的实体属性以指向该实体。
我要加载场景的新代码基本如下:
访问该GKScene
对象会返回一个正确加载的实体数组,但如果我尝试GKEntity.entity
从连接的节点访问一个实体,它会返回 nil。该节点是通过GKSKNodeComponent.node
从 中的实体访问来连接的GKScene
。
如何按预期获取GKSKNodeComponent
并GKScene
自动更新SKNode
的属性?entity
path-finding - GKObstacleGraph 如何找到最近的有效点?
在用户想要通过鼠标导航或触摸某些无法通过的地图的场景中。将点发送到GKObstacleGRpah
FindPath 时,它只返回一个空数组。
我希望该单元能够到达最近(或足够近)的可通过点。
什么是在GKObstacleGraph
.
我知道我可以得到,GKObstacle
所以我可以枚举它的顶点,我知道我的单位的位置......
但是好吧......下一步是什么?
注意:我没有使用GKAgengts
.
random - Swift 3 中更好的随机数范围
在我升级到 Swift 3 (Xcode 8) 之前,我的随机位置开始看起来像这样:
转换后停止工作,因为它已更新为:
这是因为我最终了解了 GamePlayKit:
开始:
然后,您可以使用 GamePlayKit 轻松创建新的随机变量:
您可以在苹果网站上阅读,但基本上这会在中间为您提供更多“点击”:
这将循环遍历随机值,直到它们都被消耗完,然后重新开始。
最后是完全随机的值生成器:
如何使用的示例:
这会将我的对象从最右侧的屏幕上移开,并将其放置在 Y 轴上完全随机的位置。