GKAgent

来源:互联网 发布:模拟板胡软件 编辑:程序博客网 时间:2024/05/21 22:41

GKAgent

通过设定目标和约束移动实体的组件

概括

GKAgent类是抽象的,仅定义代理的一般功能-其运动约束和包含其目标(GKGoal对象)的行为属性。实现基于代理的游戏设计,请选择适合游戏的具体子类。

• 在2D游戏世界中使用GKAgent2D类,或是相关移动都限制在2D上的3D游戏。

• 在3D游戏世界中使用GKAgent3D类。

代理即组件

因为GKAgent是GKComponent的子类,你可以使用实体/组件结构将基于代理的设计带入到游戏设计中。

要将代理集成到游戏中,请在每次要更新管理代理程序行为的模拟时调用每个代理的updateWithDeltaTime: 方法。通常,你在每次图形引擎的每一帧进行调用-比方说,在SpriteKit的update: 方法或者SceneKit渲染代理方法的renderer:updateAtTime: 进行调用。如果你的游戏使用实体/组件结构,你也可以使用GKComponentSystem在每一帧时更新所有的代理,如果没有,你必须直接调用每一个代理的updateWithDeltaTime: 方法。

根据目标进行模拟运动

每一次调用代理的updateWithDeltaTime: 方法时,代理会评估每一个在其behavior属性中列出的GKGoal对象,以查找朝向实现该目标所需的方向和速度的变化在时间增量和代理的最大速度和转弯)。然后,它使用GKBehavior对象中指定的权重来调整所有目标的行为,从而调整每个目标的影响,导致其方向和速度的总体变化。

使用这个模拟的输出来移动游戏实体有两个选择:
• 在调用完代理的updateWithDeltaTime: 方法后执行每一帧的更新,就像其他GKComponent子类的updateWithDeltaTime: 方法调用或SpriteKit的didEvaluateActions 方法调用或SceneKit的renderer:willRenderScene:atTime: 方法调用-检查每个代理的位置和旋转,然后使用这信息更新代理的每一个可视属性。

将每个代理的委托属性设置为负责该代理的可视化表示的对象。每一次代理更新位置和旋转时会调用这个对象实现的agentDidUpdate: 方法。在该方法中,你可以检查代理的属性并对可视化表示进行相应的更改。

此外一个代理的delegate可以实现agentWillUpdate: 方法来将信息提供给代理模拟。这样对于那些基于代理移动和外部物理引擎(例如SceneKit和SpriteKit中的物理引擎)结合的设计很有用,或是应用于代理的可视状态动作(如SpriteKit中的action方法)。不过,代理不能模拟类似重力这样的通过势力导致的动作,因此在这种情况下代理的计算将不再精准。

Tip

如果你使用GKSKNodeComponent来管理实体与SpriteKit的node关系,请设置GKSKNodeComponent实例为该实体的代理(agent),GameplayKit将自动同步agent和它SpriteKit中的对应对象。

注意

负责代理运动的模拟是基于现实的物理行为,然而这种模拟与SpriteKit,SceneKit或其他物理引擎子系统没有任何联系。比方说设置代理的质量,并不会影响SpriteKit中对应对象的物理体碰撞行为。

Topics

定义一个代理的行为(Defining an Agent’s Behavior)

behavior

一个有权重关系包含影响代理移动的goal集合。

约束一个代理的移动(Constraining an Agent’s Movement)

mass

代理改变速度或方向时的阻力。

maxAcceleration

代理速度或方向变化的上限。

maxSpeed

代理的最大前进速度,单位每秒。

radius

代理的半径。

同步代理的可视表现(Synchronizing an Agent’s Visual Representation)

delegate

模拟运动时进行准备或响应的对象。

管理代理属性(Managing an Agent’s Attributes)

speed

代理当前的前进速度,单位每秒。

关系

继承

GKComponent

默认遵守

NSCoding



原创粉丝点击