template/docs/dev/hero/hero-follower-interfaces.md

8.0 KiB
Raw Blame History

需求综述

对勇士跟随者相关接口进行结构性重构。核心动机是让跟随者复用勇士已有的位置与渲染接口(IHeroLocationIHeroRendering),而非为跟随者定义独立的位置/渲染类型。这样跟随者与勇士共享同一套移动与渲染模型,简化接口层级,避免重复定义。

重构四个接口:IHeroLocationIHeroRenderingIHeroFollowerIHeroFollowersController。前两者是勇士与跟随者共用的基础接口,后两者专属于跟随者管理。同时需要将旧的 HeroMoveController 类拆分为 HeroLocationHeroRenderingHeroFollowersController 三个独立类,HeroFollower 为新实现类,并修改 HeroState 适配新接口。

接口设计分析

IHeroLocation

接口综述

勇士位置接口,代表一个可移动对象在游戏世界中的坐标与朝向,并挂载移动器负责移动控制。该接口继承 ISaveableContent<IHeroLocationSave> 实现存档读档,继承 IObjectMovable 获得基础位置读写能力。存档格式为 IFacedTileLocator(包含 xydirection)。移动能力由 IObjectMover<this> 提供,支持行走、跳跃、瞬移、朝向控制等全部需求。

接口分析

  • IHeroLocation.mover:预期频率高频。几乎所有移动操作都经由 mover 进行,在剧情演出与逻辑中频繁出现。典型使用场景:演出中让角色沿指定路线移动。

IHeroRendering

接口综述

勇士渲染信息接口,存在于数据端,存放无需进入渲染端即可管理的渲染相关数据。当前仅包含透明度(alpha),后续可能扩展。继承 ISaveableContent<IHeroRenderingSave> 实现存档读档,继承 IHookable<IHeroRenderingHooks> 支持透明度变化时触发回调。旧实现中的 image 作为纯渲染端概念被移除。

接口分析

  • IHeroRendering.alpha:预期频率低频。直接读取透明度值的需求极少。
  • IHeroRendering.setAlpha:预期频率低频。设置透明度仅在特殊效果中出现,一座塔中调用次数有限。

IHeroFollower

接口综述

跟随者接口,包含跟随者的渲染信息与位置信息。直接复用 IHeroRenderingIHeroLocation,使跟随者拥有与勇士完全一致的移动与渲染能力。存档格式 IHeroFollowerSave 嵌套包含 IHeroRenderingSaveIHeroLocationSave。对比旧 IHeroFollower = { num, identifier, alpha } 的纯数据结构,新接口让跟随者从静态数据升级为拥有完整移动能力的独立对象。

接口分析

  • IHeroFollower.rendering:预期频率低频
  • IHeroFollower.location:预期频率低频

跟随者本身就是一个使用场景极低的需求,大多数游戏中都不会使用到一两次,所以几乎所有跟随者相关接口都应该是低频。

IHeroFollowersController

接口综述

跟随者控制器接口,负责跟随者的增删查改与聚集操作。继承 IHookable<IHeroFollowersControllerHooks>,提供添加、移除、聚集三个事件的钩子支持。对比旧实现:索引取代 identifier 作为查找方式,setFollowerAlpha 移除(改为通过 follower.rendering.setAlpha 操作),addFollowernum 参数合并了旧的图块数字与标识符。

接口分析

  • IHeroFollowersController.addFollower:预期频率低频
  • IHeroFollowersController.getFollower:预期频率低频
  • IHeroFollowersController.getFollowersById:预期频率低频
  • IHeroFollowersController.getAllFollowers:预期频率低频
  • IHeroFollowersController.removeFollower:预期频率低频
  • IHeroFollowersController.removeAllFollowers:预期频率低频
  • IHeroFollowersController.gatherFollowers:预期频率低频
  • IHeroFollowersController.gatherFollowersSync:预期频率低频

预期体量

预期代码体量合计约 250300 行。分析如下:

  • HeroLocation:需实现 IObjectMovableISaveableContent,并创建内部 ObjectMover 子类,预计 7090 行。
  • HeroRendering:仅管理 alpha 的存取和钩子触发,预计 2535 行。
  • HeroFollower:组合 HeroRenderingHeroLocation 并实现存档读档,预计 3545 行。
  • HeroFollowersController:维护跟随者列表和增删查改聚集操作,预计 120150 行。

涉及文件

需要修改的文件

@user/data-base/hero/types.ts

  • 重构 IHeroLocation 接口:改为继承 ISaveableContent<IHeroLocationSave>IObjectMovable,仅保留 mover 成员。
  • 新增 IHeroLocationSave 类型别名。
  • 重构 IHeroRendering 接口:新增继承 ISaveableContent<IHeroRenderingSave>IHookable<IHeroRenderingHooks>
  • 新增 IHeroRenderingSave 接口。
  • 新增 IHeroRenderingHooks 接口。
  • 新增 IHeroFollowerSave 接口。
  • 重构 IHeroFollower 接口:改为组合 renderinglocation,继承 ISaveableContent<IHeroFollowerSave>
  • 重构 IHeroFollowersController 接口:修改为上文中的新设计。
  • 新增 IHeroFollowersControllerHooks 接口。
  • 修改 IHeroState 接口:新增 locationrenderingfollowers 成员,移除旧的 moverattachMovergetHeroMover
  • 修改 IHeroStateSavelocator 类型改为 IHeroLocationSavefollowers 类型改为 readonly IHeroFollowerSave[]
  • 删除旧的 IHeroMoveControllerIHeroMoveControllerHooks 接口及旧 IHeroFollowerHeroAnimateDirection 枚举。

@user/data-base/hero/mover.ts

删除此文件,内容拆分至 location.tsrendering.tsfollowersController.ts

@user/data-base/hero/location.ts

新建文件。

  • 实现 HeroLocation 类:基于新 IHeroLocation 接口。
  • 内部创建 ObjectMover<this> 子类实例,挂载为 mover

@user/data-base/hero/rendering.ts

新建文件。

  • 实现 HeroRendering 类:基于新 IHeroRendering 接口。
  • 实现 setAlpha:更新值并触发 onSetAlpha 钩子。

@user/data-base/hero/follower.ts

新建文件。

  • 实现 HeroFollower 类:组合 HeroRenderingHeroLocation 实例,实现新 IHeroFollower 接口。
  • 内部保存 num,供 getFollowersById 查询匹配。

@user/data-base/hero/followersController.ts

新建文件。

  • 实现 HeroFollowersController 类:基于新 IHeroFollowersController 接口。
  • 内部持有勇士 IHeroLocation 引用,供聚集操作使用。
  • 实现 addFollower(num):创建 HeroFollower,加入列表,触发 onAddFollower 钩子。
  • 实现 getFollower(index):按索引返回跟随者,越界返回 null
  • 实现 getFollowersById(num):返回匹配 num[index, follower] 迭代器。
  • 实现 getAllFollowers():返回跟随者列表。
  • 实现 removeFollower(index):按索引移除跟随者,触发 onRemoveFollower 钩子,动画结束后兑现。
  • 实现 removeAllFollowers():清空跟随者列表,触发钩子,动画结束后兑现。
  • 实现 gatherFollowers():将所有跟随者移动至勇士位置并同步朝向,动画结束后兑现。
  • 实现 gatherFollowersSync():立即将所有跟随者瞬移至勇士位置并同步朝向。

@user/data-base/hero/state.ts

修改 HeroState 类。

  • 修改构造函数参数并新增 locationrenderingfollowers 成员,替代旧的 mover
  • 删除 attachMovergetHeroMover 方法。
  • 修改 saveState:通过 location.saveStaterendering.saveState 及各跟随者的 saveState 获取存档数据。
  • 修改 loadState:通过 location.loadStaterendering.loadState 恢复位置与渲染,重建跟随者列表。

@user/data-base/hero/index.ts

  • 新增导出 location.tsrendering.tsfollower.tsfollowersController.ts
  • 移除 mover.ts 的导出。